Turn on Request desktop site
+
-+
-+ Enable AdBlock
++
++ Block ads
+
-+
-+ Turn off AdBlock
++
++ Turn off ad blocking
+
-+
-+ Turn on AdBlock
++
++ Turn on ad blocking
+
+
diff --git a/build/patches/Add-menu-option-to-toggle-global-Javascript-preference.patch b/build/patches/Add-menu-option-to-toggle-global-Javascript-preference.patch
index f71738e91c4ca9559da22d3e369762dc9db97a1a..b447d1acbf4534053adf07de73122248813737e8 100644
--- a/build/patches/Add-menu-option-to-toggle-global-Javascript-preference.patch
+++ b/build/patches/Add-menu-option-to-toggle-global-Javascript-preference.patch
@@ -74,7 +74,7 @@ diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/re
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
-@@ -2160,6 +2160,14 @@ public abstract class ChromeActivity
+@@ -2149,6 +2149,14 @@ public abstract class ChromeActivity
currentTab.getWebContents().getNavigationController().setUseDesktopUserAgent(
!usingDesktopUserAgent, reloadOnChange);
RecordUserAction.record("MobileMenuRequestDesktopSite");
@@ -92,7 +92,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
-@@ -1751,6 +1751,14 @@ public class ChromeTabbedActivity
+@@ -1802,6 +1802,14 @@ public class ChromeTabbedActivity extends ChromeActivity implements ScreenshotMo
NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_DOWNLOADS_MANAGER);
}
RecordUserAction.record("MobileMenuDownloadManager");
@@ -110,7 +110,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java
-@@ -242,6 +242,8 @@ public class AppMenuPropertiesDelegateImpl implements AppMenuPropertiesDelegate
+@@ -241,6 +241,8 @@ public class AppMenuPropertiesDelegateImpl implements AppMenuPropertiesDelegate
updateRequestDesktopSiteMenuItem(menu, currentTab, true /* can show */);
@@ -119,7 +119,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu
// Only display reader mode settings menu option if the current page is in reader mode.
menu.findItem(R.id.reader_mode_prefs_id)
.setVisible(DomDistillerUrlUtils.isDistilledPage(currentTab.getUrl()));
-@@ -437,6 +439,43 @@ public class AppMenuPropertiesDelegateImpl implements AppMenuPropertiesDelegate
+@@ -432,6 +434,43 @@ public class AppMenuPropertiesDelegateImpl implements AppMenuPropertiesDelegate
}
}
@@ -177,13 +177,13 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/Cust
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
-@@ -2923,6 +2923,17 @@ To change this setting, <resetlink>reset sync
<resetlink>reset sync
Find in page
+
+
-+ Enable JavaScript
++ JavaScript
+
+
+ Turn off JavaScript
diff --git a/build/patches/Add-option-to-configure-the-ad-blocker-filters-URL.patch b/build/patches/Add-option-to-configure-the-ad-blocker-filters-URL.patch
new file mode 100644
index 0000000000000000000000000000000000000000..bc4191ef260a9f0cd7dda5c78cbe717da14ecbc5
--- /dev/null
+++ b/build/patches/Add-option-to-configure-the-ad-blocker-filters-URL.patch
@@ -0,0 +1,516 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Thu, 5 Dec 2019 22:41:25 +0100
+Subject: Add option to configure the ad blocker filters URL
+
+---
+ chrome/android/chrome_java_sources.gni | 2 +
+ chrome/android/java/res/layout/adblock_editor.xml | 65 ++++++++++++++++
+ chrome/android/java/res/values/values.xml | 2 +
+ .../android/java/res/xml/adblock_preferences.xml | 25 ++++++
+ chrome/android/java/res/xml/main_preferences.xml | 11 ++-
+ .../chrome/browser/preferences/AdBlockEditor.java | 91 ++++++++++++++++++++++
+ .../browser/preferences/AdBlockPreferences.java | 53 +++++++++++++
+ .../chrome/browser/util/FeatureUtilities.java | 10 +++
+ .../java/strings/android_chrome_strings.grd | 14 ++++
+ chrome/app/generated_resources.grd | 10 +++
+ chrome/browser/android/feature_utilities.cc | 8 ++
+ chrome/browser/browser_process_impl.cc | 3 +-
+ .../browser/net/system_network_context_manager.cc | 3 +
+ chrome/common/pref_names.cc | 3 +
+ chrome/common/pref_names.h | 1 +
+ .../component_updater/adblock_updater_service.cc | 6 +-
+ .../component_updater/adblock_updater_service.h | 3 +-
+ 17 files changed, 302 insertions(+), 8 deletions(-)
+ create mode 100644 chrome/android/java/res/layout/adblock_editor.xml
+ create mode 100644 chrome/android/java/res/xml/adblock_preferences.xml
+ create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/preferences/AdBlockEditor.java
+ create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/preferences/AdBlockPreferences.java
+
+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
+@@ -1266,6 +1266,8 @@ chrome_java_sources = [
+ "java/src/org/chromium/chrome/browser/preferences/PreferenceUtils.java",
+ "java/src/org/chromium/chrome/browser/preferences/Preferences.java",
+ "java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java",
++ "java/src/org/chromium/chrome/browser/preferences/AdBlockEditor.java",
++ "java/src/org/chromium/chrome/browser/preferences/AdBlockPreferences.java",
+ "java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java",
+ "java/src/org/chromium/chrome/browser/preferences/SearchEnginePreference.java",
+ "java/src/org/chromium/chrome/browser/preferences/SearchUtils.java",
+diff --git a/chrome/android/java/res/layout/adblock_editor.xml b/chrome/android/java/res/layout/adblock_editor.xml
+new file mode 100644
+--- /dev/null
++++ b/chrome/android/java/res/layout/adblock_editor.xml
+@@ -0,0 +1,65 @@
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
+--- a/chrome/android/java/res/values/values.xml
++++ b/chrome/android/java/res/values/values.xml
+@@ -68,6 +68,8 @@
+
+
+
++ https://www.bromite.org/custom-filters
++
+
+ -1
+
+diff --git a/chrome/android/java/res/xml/adblock_preferences.xml b/chrome/android/java/res/xml/adblock_preferences.xml
+new file mode 100644
+--- /dev/null
++++ b/chrome/android/java/res/xml/adblock_preferences.xml
+@@ -0,0 +1,25 @@
++
++
++
++
++
++
++
++
++
++
++
++
+diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml
+--- a/chrome/android/java/res/xml/main_preferences.xml
++++ b/chrome/android/java/res/xml/main_preferences.xml
+@@ -61,19 +61,24 @@
+ android:order="13"
+ android:title="@string/prefs_privacy"/>
+
++
+
+
+ {
++ PrefServiceBridge.getInstance().setCategoryEnabled(ContentSettingsType.CONTENT_SETTINGS_TYPE_ADS, !(boolean) newValue);
++ return true;
++ });
++
++ mAdBlockEdit = findPreference(PREF_ADBLOCK_EDIT);
++ updateCurrentAdBlockUrl();
++ }
++
++ private void updateCurrentAdBlockUrl() {
++ mAdBlockEdit.setSummary(FeatureUtilities.getAdBlockFiltersURL());
++ }
++
++ @Override
++ public void onResume() {
++ super.onResume();
++ updateCurrentAdBlockUrl();
++ }
++}
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
+@@ -237,6 +237,14 @@ public class FeatureUtilities {
+ cacheServiceManagerForBackgroundPrefetch();
+ }
+
++ public static void setAdBlockFiltersURL(String url) {
++ nativeSetAdBlockFiltersURL(url);
++ }
++
++ public static String getAdBlockFiltersURL() {
++ return nativeGetAdBlockFiltersURL();
++ }
++
+ /**
+ * @return True if tab model merging for Android N+ is enabled.
+ */
+@@ -924,4 +932,6 @@ public class FeatureUtilities {
+ private static native String nativeGetDoHTemplates();
+ private static native void nativeSetIsInMultiWindowMode(boolean isInMultiWindowMode);
+ private static native boolean nativeIsNetworkServiceWarmUpEnabled();
++ private static native void nativeSetAdBlockFiltersURL(String url);
++ private static native String nativeGetAdBlockFiltersURL();
+ }
+diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
+--- a/chrome/android/java/strings/android_chrome_strings.grd
++++ b/chrome/android/java/strings/android_chrome_strings.grd
+@@ -898,6 +898,20 @@ Your Google account may have other forms of browsing history like searches and a
+ Captions
+
+
++
++
++ AdBlock settings
++
++
++ Edit filters URL
++
++
++ Filters URL
++
++
++ Visit help page
++
++
+
+
+ Site settings
+diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
+--- a/chrome/app/generated_resources.grd
++++ b/chrome/app/generated_resources.grd
+@@ -9505,6 +9505,16 @@ Please help our engineers fix this problem. Tell us what happened right before y
+ Never show this again.
+
+
++
++
++
++ Ad Blocking
++
++
++ Configure Ad Blocking and filters URL
++
++
++
+
+
+ Always allow ads on this site
+diff --git a/chrome/browser/android/feature_utilities.cc b/chrome/browser/android/feature_utilities.cc
+--- a/chrome/browser/android/feature_utilities.cc
++++ b/chrome/browser/android/feature_utilities.cc
+@@ -58,6 +58,14 @@ std::string GetReachedCodeProfilerTrialGroup() {
+ } // namespace android
+ } // namespace chrome
+
++static ScopedJavaLocalRef JNI_FeatureUtilities_GetAdBlockFiltersURL(JNIEnv* env) {
++ return base::android::ConvertUTF8ToJavaString(env, g_browser_process->local_state()->GetString(prefs::kAdBlockFiltersURL));
++}
++
++static void JNI_FeatureUtilities_SetAdBlockFiltersURL(JNIEnv* env, const JavaParamRef& url) {
++ g_browser_process->local_state()->SetString(prefs::kAdBlockFiltersURL, base::android::ConvertJavaStringToUTF8(env, url));
++}
++
+ static void JNI_FeatureUtilities_SetCustomTabVisible(
+ JNIEnv* env,
+ jboolean visible) {
+diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
+--- a/chrome/browser/browser_process_impl.cc
++++ b/chrome/browser/browser_process_impl.cc
+@@ -1032,7 +1032,8 @@ BrowserProcessImpl::adblock_updater() {
+ adblock_updater_ = std::make_unique(
+ g_browser_process->system_network_context_manager()->GetSharedURLLoaderFactory(),
+ std::move(scheduler),
+- g_browser_process->subresource_filter_ruleset_service());
++ g_browser_process->subresource_filter_ruleset_service(),
++ local_state()->GetString(prefs::kAdBlockFiltersURL));
+
+ return adblock_updater_.get();
+ }
+diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
+--- a/chrome/browser/net/system_network_context_manager.cc
++++ b/chrome/browser/net/system_network_context_manager.cc
+@@ -391,6 +391,8 @@ SystemNetworkContextManager::SystemNetworkContextManager(
+ ssl_config_service_manager_(
+ SSLConfigServiceManager::CreateDefaultManager(local_state_)),
+ proxy_config_monitor_(local_state_) {
++ local_state_->SetDefaultPrefValue(prefs::kAdBlockFiltersURL,
++ base::Value("https://www.bromite.org/filters/filters.dat"));
+ #if !defined(OS_ANDROID)
+ // QuicAllowed was not part of Android policy.
+ const base::Value* value =
+@@ -462,6 +464,7 @@ SystemNetworkContextManager::~SystemNetworkContextManager() {
+ }
+
+ void SystemNetworkContextManager::RegisterPrefs(PrefRegistrySimple* registry) {
++ registry->RegisterStringPref(prefs::kAdBlockFiltersURL, std::string());
+ // Register the DnsClient and DoH preferences. The feature list has not been
+ // initialized yet, so setting the preference defaults here to reflect the
+ // corresponding features will only cause the preference defaults to reflect
+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
+@@ -1871,6 +1871,9 @@ const char kAudioCaptureAllowed[] = "hardware.audio_capture_enabled";
+ // capture devices without prompt.
+ const char kAudioCaptureAllowedUrls[] = "hardware.audio_capture_allowed_urls";
+
++// Holds the URL to an indexed subresource filters file.
++const char kAdBlockFiltersURL[] = "adblock.filters_url";
++
+ // A pref holding the value of the policy used to explicitly allow or deny
+ // access to video capture devices. When enabled or not set, the user is
+ // prompted for device access. When disabled, access to video capture devices
+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
+@@ -30,6 +30,7 @@ extern const char kDownloadRestrictions[];
+ extern const char kForceEphemeralProfiles[];
+ extern const char kHomePageIsNewTabPage[];
+ extern const char kHomePage[];
++extern const char kAdBlockFiltersURL[];
+ extern const char kImportantSitesDialogHistory[];
+ #if defined(OS_WIN)
+ extern const char kLastProfileResetTimestamp[];
+diff --git a/components/component_updater/adblock_updater_service.cc b/components/component_updater/adblock_updater_service.cc
+--- a/components/component_updater/adblock_updater_service.cc
++++ b/components/component_updater/adblock_updater_service.cc
+@@ -46,12 +46,12 @@ const int initial_check_delay = 5,
+ next_check_delay = 60*60*24*7, // 1 week
+ on_demand_check_delay = 60; // minimum 1 minute between each on-demand check
+
+-AdBlockUpdaterService::AdBlockUpdaterService(scoped_refptr shared_url_network_factory, std::unique_ptr scheduler, subresource_filter::RulesetService* ruleset_service)
++AdBlockUpdaterService::AdBlockUpdaterService(scoped_refptr shared_url_network_factory, std::unique_ptr scheduler,
++ subresource_filter::RulesetService* ruleset_service, std::string filters_url)
+ : ruleset_service_(ruleset_service), shared_url_network_factory_(shared_url_network_factory), scheduler_(std::move(scheduler)) {
+ DCHECK(ruleset_service);
+
+- //TODO: retrieve filters URL from config/prefs
+- filters_url_ = "https://www.bromite.org/filters/filters.dat";
++ filters_url_ = filters_url;
+ }
+
+ AdBlockUpdaterService::~AdBlockUpdaterService() {
+diff --git a/components/component_updater/adblock_updater_service.h b/components/component_updater/adblock_updater_service.h
+--- a/components/component_updater/adblock_updater_service.h
++++ b/components/component_updater/adblock_updater_service.h
+@@ -54,7 +54,8 @@ class Observer {
+ // All methods are safe to call ONLY from the browser's main thread.
+ class AdBlockUpdaterService {
+ public:
+- AdBlockUpdaterService(scoped_refptr shared_url_network_factory, std::unique_ptr scheduler, subresource_filter::RulesetService* ruleset_service);
++ AdBlockUpdaterService(scoped_refptr shared_url_network_factory, std::unique_ptr scheduler,
++ subresource_filter::RulesetService* ruleset_service, std::string filters_url);
+ ~AdBlockUpdaterService();
+
+ // Adds an observer for this class. An observer should not be added more
+--
+2.11.0
+
diff --git a/build/patches/Add-option-to-not-persist-tabs-across-sessions.patch b/build/patches/Add-option-to-not-persist-tabs-across-sessions.patch
index 3ceae26aacf0f7673c82ed45a49c44d7df4f6c90..9e71e80828f3e463ef8cc05c08efc8d659712c78 100644
--- a/build/patches/Add-option-to-not-persist-tabs-across-sessions.patch
+++ b/build/patches/Add-option-to-not-persist-tabs-across-sessions.patch
@@ -13,7 +13,7 @@ Subject: Add option to not persist tabs across sessions
diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
--- a/chrome/android/java/res/values/values.xml
+++ b/chrome/android/java/res/values/values.xml
-@@ -66,6 +66,9 @@
+@@ -62,6 +62,9 @@
@@ -26,22 +26,22 @@ diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res
diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
--- a/chrome/android/java/res/xml/privacy_preferences.xml
+++ b/chrome/android/java/res/xml/privacy_preferences.xml
-@@ -19,6 +19,11 @@
- android:fragment="org.chromium.chrome.browser.preferences.privacy.DoNotTrackPreference"
- android:key="do_not_track"
- android:title="@string/do_not_track_title" />
-+
++
-
IMAGE
diff --git a/build/patches/Add-option-to-use-home-page-as-NTP.patch b/build/patches/Add-option-to-use-home-page-as-NTP.patch
index e6fa480fd94a8e8d3c9b47675f4d6d019c84e761..70a084f6ead948d8f5a205556fde0a096e9ec37d 100644
--- a/build/patches/Add-option-to-use-home-page-as-NTP.patch
+++ b/build/patches/Add-option-to-use-home-page-as-NTP.patch
@@ -20,12 +20,12 @@ diff --git a/chrome/android/java/res/xml/homepage_preferences.xml b/chrome/andro
@@ -7,6 +7,11 @@
xmlns:android="http://schemas.android.com/apk/res/android">
-
+
-+
@@ -106,8 +106,8 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/Hom
return true;
});
-+ ChromeSwitchPreferenceCompat mNTPIsHomepageSwitch =
-+ (ChromeSwitchPreferenceCompat) findPreference(PREF_NTP_HOMEPAGE_SWITCH);
++ ChromeSwitchPreference mNTPIsHomepageSwitch =
++ (ChromeSwitchPreference) findPreference(PREF_NTP_HOMEPAGE_SWITCH);
+ boolean isHomepageNTPEnabled = mHomepageManager.getPrefNTPIsHomepageEnabled();
+ mNTPIsHomepageSwitch.setChecked(isHomepageNTPEnabled);
+ mNTPIsHomepageSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
@@ -153,7 +153,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCre
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
-@@ -648,6 +648,9 @@ CHAR-LIMIT guidelines:
+@@ -663,6 +663,9 @@ CHAR-LIMIT guidelines:
Open this page
@@ -192,8 +192,8 @@ 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
-@@ -314,6 +314,7 @@ extern const char kDeviceWebUsbAllowDevicesForUrls[];
- extern const char kLoginExtensionApiDataForNextLoginAttempt[];
+@@ -318,6 +318,7 @@ extern const char kSettingsShowBrowserBanner[];
+ extern const char kSettingsShowOSBanner[];
#endif // defined(OS_CHROMEOS)
extern const char kShowHomeButton[];
+extern const char kNewTabPageIsHomePage[];
diff --git a/build/patches/Add-site-settings-option-for-session-only-cookies.patch b/build/patches/Add-site-settings-option-for-session-only-cookies.patch
index 49854122f87d7da279ad99a9ea2799d75e89fd1f..776213cfd410591832018079762797640c42fee5 100644
--- a/build/patches/Add-site-settings-option-for-session-only-cookies.patch
+++ b/build/patches/Add-site-settings-option-for-session-only-cookies.patch
@@ -14,7 +14,7 @@ Subject: Add site settings option for session-only cookies
diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
--- a/chrome/android/java/res/values/values.xml
+++ b/chrome/android/java/res/values/values.xml
-@@ -36,6 +36,9 @@
+@@ -32,6 +32,9 @@
01
@@ -32,14 +32,14 @@ diff --git a/chrome/android/java/res/xml/website_preferences.xml b/chrome/androi
android:defaultValue="true"
android:persistent="false" />
+
-+
- PrefServiceBridge.getInstance().isBlockThirdPartyCookiesManaged());
}
+ private void updateCookiesSessionOnlyCheckBox() {
-+ ChromeBaseCheckBoxPreferenceCompat cookiesSessionOnlyPref = (ChromeBaseCheckBoxPreferenceCompat)
++ ChromeBaseCheckBoxPreference cookiesSessionOnlyPref = (ChromeBaseCheckBoxPreference)
+ getPreferenceScreen().findPreference(COOKIES_SESSION_ONLY_TOGGLE_KEY);
+ cookiesSessionOnlyPref.setChecked(
+ PrefServiceBridge.getInstance().isCookiesSessionOnlyEnabled());
@@ -160,12 +160,12 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/web
+ }
+
private void updateNotificationsVibrateCheckBox() {
- ChromeBaseCheckBoxPreferenceCompat preference =
- (ChromeBaseCheckBoxPreferenceCompat) getPreferenceScreen().findPreference(
+ ChromeBaseCheckBoxPreference preference =
+ (ChromeBaseCheckBoxPreference) getPreferenceScreen().findPreference(
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
-@@ -880,6 +880,12 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -895,6 +895,12 @@ Your Google account may have other forms of browsing history like searches and a
Prevent third-party websites from saving and reading cookie data
@@ -199,7 +199,7 @@ diff --git a/chrome/browser/android/preferences/pref_service_bridge.cc b/chrome/
static jboolean JNI_PrefServiceBridge_GetBlockThirdPartyCookiesManaged(
JNIEnv* env,
const JavaParamRef& obj) {
-@@ -771,6 +782,20 @@ static void JNI_PrefServiceBridge_SetBlockThirdPartyCookiesEnabled(
+@@ -785,6 +796,20 @@ static void JNI_PrefServiceBridge_SetBlockThirdPartyCookiesEnabled(
GetPrefService()->SetBoolean(prefs::kBlockThirdPartyCookies, enabled);
}
diff --git a/build/patches/Add-user-setting-for-DNS-over-HTTPS-DoH-custom-URL.patch b/build/patches/Add-user-setting-for-DNS-over-HTTPS-DoH-custom-URL.patch
new file mode 100644
index 0000000000000000000000000000000000000000..3d66f7ad0d2beee54b426e0c6fb79b4695778e70
--- /dev/null
+++ b/build/patches/Add-user-setting-for-DNS-over-HTTPS-DoH-custom-URL.patch
@@ -0,0 +1,519 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Sat, 23 Nov 2019 10:55:16 +0100
+Subject: Add user setting for DNS-over-HTTPS (DoH) custom URL
+
+---
+ chrome/android/chrome_java_sources.gni | 2 +
+ chrome/android/java/res/layout/doh_editor.xml | 65 ++++++++++++++++
+ chrome/android/java/res/values/values.xml | 2 +
+ chrome/android/java/res/xml/doh_preferences.xml | 25 ++++++
+ .../android/java/res/xml/privacy_preferences.xml | 5 ++
+ .../chrome/browser/preferences/DoHEditor.java | 91 ++++++++++++++++++++++
+ .../chrome/browser/preferences/DoHPreferences.java | 52 +++++++++++++
+ .../chrome/browser/util/FeatureUtilities.java | 25 ++++++
+ .../java/strings/android_chrome_strings.grd | 11 +++
+ chrome/app/generated_resources.grd | 6 ++
+ chrome/browser/android/feature_utilities.cc | 23 ++++++
+ .../browser/net/system_network_context_manager.cc | 46 +++--------
+ chrome/common/chrome_features.cc | 4 +-
+ 13 files changed, 320 insertions(+), 37 deletions(-)
+ create mode 100644 chrome/android/java/res/layout/doh_editor.xml
+ create mode 100644 chrome/android/java/res/xml/doh_preferences.xml
+ create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/preferences/DoHEditor.java
+ create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/preferences/DoHPreferences.java
+
+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
+@@ -1251,7 +1251,9 @@ chrome_java_sources = [
+ "java/src/org/chromium/chrome/browser/preferences/ClearBrowsingDataCheckBoxPreference.java",
+ "java/src/org/chromium/chrome/browser/preferences/ExpandablePreferenceGroup.java",
+ "java/src/org/chromium/chrome/browser/preferences/HomepageEditor.java",
++ "java/src/org/chromium/chrome/browser/preferences/DoHEditor.java",
+ "java/src/org/chromium/chrome/browser/preferences/HomepagePreferences.java",
++ "java/src/org/chromium/chrome/browser/preferences/DoHPreferences.java",
+ "java/src/org/chromium/chrome/browser/preferences/HyperlinkPreference.java",
+ "java/src/org/chromium/chrome/browser/preferences/LearnMorePreference.java",
+ "java/src/org/chromium/chrome/browser/preferences/LegalInformationPreferences.java",
+diff --git a/chrome/android/java/res/layout/doh_editor.xml b/chrome/android/java/res/layout/doh_editor.xml
+new file mode 100644
+--- /dev/null
++++ b/chrome/android/java/res/layout/doh_editor.xml
+@@ -0,0 +1,65 @@
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
+--- a/chrome/android/java/res/values/values.xml
++++ b/chrome/android/java/res/values/values.xml
+@@ -88,6 +88,8 @@
+ 400
+ 200
+
++ https://www.bromite.org/doh
++
+
+ true
+
+diff --git a/chrome/android/java/res/xml/doh_preferences.xml b/chrome/android/java/res/xml/doh_preferences.xml
+new file mode 100644
+--- /dev/null
++++ b/chrome/android/java/res/xml/doh_preferences.xml
+@@ -0,0 +1,25 @@
++
++
++
++
++
++
++
++
++
++
++
++
+diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
+--- a/chrome/android/java/res/xml/privacy_preferences.xml
++++ b/chrome/android/java/res/xml/privacy_preferences.xml
+@@ -19,6 +19,11 @@
+ android:key="can_make_payment"
+ android:title="@string/can_make_payment_title"
+ android:summary="@string/settings_can_make_payment_toggle_label" />
++
+ {
++ FeatureUtilities.setDoHEnabled((boolean) newValue);
++ return true;
++ });
++
++ mDoHEdit = findPreference(PREF_DOH_EDIT);
++ updateCurrentDoHUrl();
++ }
++
++ private void updateCurrentDoHUrl() {
++ mDoHEdit.setSummary(FeatureUtilities.getDoHTemplates());
++ }
++
++ @Override
++ public void onResume() {
++ super.onResume();
++ updateCurrentDoHUrl();
++ }
++}
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
+@@ -163,6 +163,27 @@ public class FeatureUtilities {
+ nativeSetCustomTabVisible(visible);
+ }
+
++ /**
++ * Records whether custom URL for DoH is enabled with native-side feature utilities.
++ * @param url Whether custom URL is enabled or not.
++ */
++ public static void setDoHEnabled(boolean enabled) {
++ nativeSetDoHEnabled(enabled);
++ }
++
++ public static boolean getDoHEnabled() {
++ return nativeGetDoHEnabled();
++ }
++
++ public static void setDoHTemplates(String t) {
++ nativeSetDoHTemplates(t);
++ }
++
++ public static String getDoHTemplates() {
++ return nativeGetDoHTemplates();
++ }
++
++
+ /**
+ * Records whether the activity is in multi-window mode with native-side feature utilities.
+ * @param isInMultiWindowMode Whether the activity is in Android N multi-window mode.
+@@ -897,6 +918,10 @@ public class FeatureUtilities {
+ }
+
+ private static native void nativeSetCustomTabVisible(boolean visible);
++ private static native void nativeSetDoHEnabled(boolean enabled);
++ private static native boolean nativeGetDoHEnabled();
++ private static native void nativeSetDoHTemplates(String templates);
++ private static native String nativeGetDoHTemplates();
+ private static native void nativeSetIsInMultiWindowMode(boolean isInMultiWindowMode);
+ private static native boolean nativeIsNetworkServiceWarmUpEnabled();
+ }
+diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
+--- a/chrome/android/java/strings/android_chrome_strings.grd
++++ b/chrome/android/java/strings/android_chrome_strings.grd
+@@ -656,6 +656,17 @@ CHAR-LIMIT guidelines:
+ Chrome Passwords
+
+
++
++
++ Edit DoH template URLs
++
++
++ DoH template URLs
++
++
++ Visit help page
++
++
+
+
+ Edit home page
+diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
+--- a/chrome/app/generated_resources.grd
++++ b/chrome/app/generated_resources.grd
+@@ -6507,6 +6507,12 @@ the Bookmarks menu.">
+
+ Home page
+
++
++ Secure DNS
++
++
++ Configure DNS-over-HTTPS (DoH) secure DNS
++
+
+
+
+diff --git a/chrome/browser/android/feature_utilities.cc b/chrome/browser/android/feature_utilities.cc
+--- a/chrome/browser/android/feature_utilities.cc
++++ b/chrome/browser/android/feature_utilities.cc
+@@ -7,6 +7,9 @@
+ #include "chrome/android/chrome_jni_headers/FeatureUtilities_jni.h"
+
+ #include "base/android/jni_string.h"
++#include "chrome/browser/browser_process.h"
++#include "components/prefs/pref_service.h"
++#include "chrome/common/pref_names.h"
+ #include "chrome/browser/ntp_snippets/content_suggestions_service_factory.h"
+ #include "chrome/browser/profiles/profile_manager.h"
+ #include "components/ntp_snippets/content_suggestions_service.h"
+@@ -73,3 +76,23 @@ static jboolean JNI_FeatureUtilities_IsNetworkServiceWarmUpEnabled(
+ return content::IsOutOfProcessNetworkService() &&
+ base::FeatureList::IsEnabled(features::kWarmUpNetworkProcess);
+ }
++
++static jboolean JNI_FeatureUtilities_GetDoHEnabled(JNIEnv* env) {
++ std::string doh_mode = g_browser_process->local_state()->GetString(prefs::kDnsOverHttpsMode);
++ return ((doh_mode == "secure") || (doh_mode == "auto"));
++}
++
++static void JNI_FeatureUtilities_SetDoHEnabled(JNIEnv* env, jboolean enabled) {
++ if (enabled)
++ g_browser_process->local_state()->SetString(prefs::kDnsOverHttpsMode, "secure");
++ else
++ g_browser_process->local_state()->SetString(prefs::kDnsOverHttpsMode, "off");
++}
++
++static ScopedJavaLocalRef JNI_FeatureUtilities_GetDoHTemplates(JNIEnv* env) {
++ return base::android::ConvertUTF8ToJavaString(env, g_browser_process->local_state()->GetString(prefs::kDnsOverHttpsTemplates));
++}
++
++static void JNI_FeatureUtilities_SetDoHTemplates(JNIEnv* env, const JavaParamRef& templates) {
++ g_browser_process->local_state()->SetString(prefs::kDnsOverHttpsTemplates, base::android::ConvertJavaStringToUTF8(env, templates));
++}
+diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
+--- a/chrome/browser/net/system_network_context_manager.cc
++++ b/chrome/browser/net/system_network_context_manager.cc
+@@ -134,9 +134,14 @@ void GetStubResolverConfig(
+
+ std::string doh_templates =
+ local_state->GetString(prefs::kDnsOverHttpsTemplates);
+- std::string server_method;
+- if (!doh_templates.empty() &&
+- *secure_dns_mode != net::DnsConfig::SecureDnsMode::OFF) {
++ if (doh_templates.empty()) {
++ *secure_dns_mode = net::DnsConfig::SecureDnsMode::OFF;
++ doh_mode = chrome_browser_net::kDnsOverHttpsModeOff;
++ }
++
++ LOG(INFO) << "DoH templates: '" << doh_templates << "' with mode " << doh_mode;
++ if (*secure_dns_mode != net::DnsConfig::SecureDnsMode::OFF) {
++ std::string server_method;
+ for (const std::string& server_template :
+ SplitString(doh_templates, " ", base::TRIM_WHITESPACE,
+ base::SPLIT_WANT_NONEMPTY)) {
+@@ -404,40 +409,11 @@ SystemNetworkContextManager::SystemNetworkContextManager(
+ // features before registering change callbacks for these preferences.
+ local_state_->SetDefaultPrefValue(prefs::kBuiltInDnsClientEnabled,
+ base::Value(ShouldEnableAsyncDns()));
+- std::string default_doh_mode = chrome_browser_net::kDnsOverHttpsModeOff;
+- std::string default_doh_templates = "";
+- if (base::FeatureList::IsEnabled(features::kDnsOverHttps)) {
+- if (features::kDnsOverHttpsFallbackParam.Get()) {
+- default_doh_mode = chrome_browser_net::kDnsOverHttpsModeAutomatic;
+- } else {
+- default_doh_mode = chrome_browser_net::kDnsOverHttpsModeSecure;
+- }
+- default_doh_templates = features::kDnsOverHttpsTemplatesParam.Get();
+- }
++ //NOTE: DoH fallback feature to insecure mode is not evaluated
+ local_state_->SetDefaultPrefValue(prefs::kDnsOverHttpsMode,
+- base::Value(default_doh_mode));
++ base::Value(chrome_browser_net::kDnsOverHttpsModeOff));
+ local_state_->SetDefaultPrefValue(prefs::kDnsOverHttpsTemplates,
+- base::Value(default_doh_templates));
+-
+- // If the user has explicitly enabled or disabled the DoH experiment in
+- // chrome://flags, store that choice in the user prefs so that it can be
+- // persisted after the experiment ends. Also make sure to remove the stored
+- // prefs value if the user has changed their chrome://flags selection to the
+- // default.
+- flags_ui::PrefServiceFlagsStorage flags_storage(local_state_);
+- std::set entries = flags_storage.GetFlags();
+- if (entries.count("dns-over-https@1")) {
+- // The user has "Enabled" selected.
+- local_state_->SetString(prefs::kDnsOverHttpsMode,
+- chrome_browser_net::kDnsOverHttpsModeAutomatic);
+- } else if (entries.count("dns-over-https@2")) {
+- // The user has "Disabled" selected.
+- local_state_->SetString(prefs::kDnsOverHttpsMode,
+- chrome_browser_net::kDnsOverHttpsModeOff);
+- } else {
+- // The user has "Default" selected.
+- local_state_->ClearPref(prefs::kDnsOverHttpsMode);
+- }
++ base::Value(features::kDnsOverHttpsTemplatesParam.Get()));
+
+ PrefChangeRegistrar::NamedChangeCallback dns_pref_callback =
+ base::BindRepeating(&OnStubResolverConfigChanged,
+diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
+--- a/chrome/common/chrome_features.cc
++++ b/chrome/common/chrome_features.cc
+@@ -271,12 +271,12 @@ const char kDisallowUnsafeHttpDownloadsParamName[] = "MimeTypeList";
+
+ // Enable DNS over HTTPS (DoH).
+ const base::Feature kDnsOverHttps{"DnsOverHttps",
+- base::FEATURE_DISABLED_BY_DEFAULT};
++ base::FEATURE_ENABLED_BY_DEFAULT};
+
+ // Set whether fallback to insecure DNS is allowed by default. This setting may
+ // be overridden for individual transactions.
+ const base::FeatureParam kDnsOverHttpsFallbackParam{&kDnsOverHttps,
+- "Fallback", true};
++ "Fallback", false};
+
+ // Supply one or more space-separated DoH server URI templates to use when this
+ // feature is enabled. If no templates are specified, then a hardcoded mapping
+--
+2.11.0
+
diff --git a/build/patches/Allow-playing-audio-in-background.patch b/build/patches/Allow-playing-audio-in-background.patch
index e55758bdc40ac9801c47ac03ba4f2042e7afbaf6..f1cb5ed99367b769ae1e897b29275e3e5f6de87d 100644
--- a/build/patches/Allow-playing-audio-in-background.patch
+++ b/build/patches/Allow-playing-audio-in-background.patch
@@ -3,29 +3,14 @@ Date: Thu, 2 Nov 2017 18:21:16 +0200
Subject: Allow playing audio in background
---
- chrome/browser/about_flags.cc | 4 ++++
media/blink/webmediaplayer_impl.cc | 12 +++++++++++-
media/blink/webmediaplayer_impl.h | 2 ++
- 3 files changed, 17 insertions(+), 1 deletion(-)
+ 2 files changed, 13 insertions(+), 1 deletion(-)
-diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
---- a/chrome/browser/about_flags.cc
-+++ b/chrome/browser/about_flags.cc
-@@ -1603,6 +1603,10 @@ const FeatureEntry kFeatureEntries[] = {
- {"debug-packed-apps", flag_descriptions::kDebugPackedAppName,
- flag_descriptions::kDebugPackedAppDescription, kOsDesktop,
- SINGLE_VALUE_TYPE(switches::kDebugPackedApps)},
-+ {"resume-background-video",
-+ flag_descriptions::kResumeBackgroundVideoName,
-+ flag_descriptions::kResumeBackgroundVideoDescription, kOsAll,
-+ FEATURE_VALUE_TYPE(media::kResumeBackgroundVideo)},
- {"automatic-password-generation",
- flag_descriptions::kAutomaticPasswordGenerationName,
- flag_descriptions::kAutomaticPasswordGenerationDescription, kOsAll,
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
-@@ -960,6 +960,12 @@ bool WebMediaPlayerImpl::HasAudio() const {
+@@ -976,6 +976,12 @@ bool WebMediaPlayerImpl::HasAudio() const {
return pipeline_metadata_.has_audio;
}
@@ -38,7 +23,7 @@ diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_imp
void WebMediaPlayerImpl::EnabledAudioTracksChanged(
const blink::WebVector& enabledTrackIds) {
DCHECK(main_task_runner_->BelongsToCurrentThread());
-@@ -3259,7 +3265,11 @@ bool WebMediaPlayerImpl::ShouldPausePlaybackWhenHidden() const {
+@@ -3278,7 +3284,11 @@ bool WebMediaPlayerImpl::ShouldPausePlaybackWhenHidden() const {
// Audio only stream is allowed to play when in background.
// TODO: We should check IsBackgroundOptimizationCandidate here. But we need
// to move the logic of checking video frames out of that function.
@@ -54,7 +39,7 @@ diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_imp
diff --git a/media/blink/webmediaplayer_impl.h b/media/blink/webmediaplayer_impl.h
--- a/media/blink/webmediaplayer_impl.h
+++ b/media/blink/webmediaplayer_impl.h
-@@ -141,6 +141,8 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerImpl
+@@ -142,6 +142,8 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerImpl
// True if the loaded media has a playable video/audio track.
bool HasVideo() const override;
bool HasAudio() const override;
diff --git a/build/patches/Allow-website-sign-in-without-account-sign-in.patch b/build/patches/Allow-website-sign-in-without-account-sign-in.patch
index 4f3719d8b361566d27d4b705b34bd99f89cd4e29..a010e402d68150a0f16316685f90ccee0bdf5837 100644
--- a/build/patches/Allow-website-sign-in-without-account-sign-in.patch
+++ b/build/patches/Allow-website-sign-in-without-account-sign-in.patch
@@ -10,7 +10,7 @@ Disable prefs::kSigninAllowedOnNextStartup by default. The setting can be found
diff --git a/chrome/browser/signin/account_consistency_mode_manager.cc b/chrome/browser/signin/account_consistency_mode_manager.cc
--- a/chrome/browser/signin/account_consistency_mode_manager.cc
+++ b/chrome/browser/signin/account_consistency_mode_manager.cc
-@@ -145,7 +145,7 @@ void AccountConsistencyModeManager::RegisterProfilePrefs(
+@@ -152,7 +152,7 @@ void AccountConsistencyModeManager::RegisterProfilePrefs(
registry->RegisterBooleanPref(prefs::kAccountConsistencyMirrorRequired,
false);
#endif
diff --git a/build/patches/Always-respect-async-dns-flag-regardless-of-SDK-version.patch b/build/patches/Always-respect-async-dns-flag-regardless-of-SDK-version.patch
index 7dc6c9571ad06542de612fa484ec7c30a7f671a3..0ac9ef7465e8d97d1e7d59d940fee78059478d6c 100644
--- a/build/patches/Always-respect-async-dns-flag-regardless-of-SDK-version.patch
+++ b/build/patches/Always-respect-async-dns-flag-regardless-of-SDK-version.patch
@@ -11,7 +11,7 @@ Do not read experiment value for cronet async DNS configuration
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
--- a/chrome/browser/net/system_network_context_manager.cc
+++ b/chrome/browser/net/system_network_context_manager.cc
-@@ -216,7 +216,7 @@ void OnAuthPrefsChanged(PrefService* local_state,
+@@ -242,7 +242,7 @@ void OnAuthPrefsChanged(PrefService* local_state,
// Android this includes checking the Android version in the field trial.
bool ShouldEnableAsyncDns() {
bool feature_can_be_enabled = true;
diff --git a/build/patches/Always-show-home-page-settings.patch b/build/patches/Always-show-home-page-settings.patch
index ab4c9b6b5a3b136c3550c00fcd4f9de315bae6ac..5b94c7b2d970ab6d50e586e5dcde1e5d83bd32a1 100644
--- a/build/patches/Always-show-home-page-settings.patch
+++ b/build/patches/Always-show-home-page-settings.patch
@@ -19,7 +19,7 @@ This allows removing the home page button and restoring it from settings.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
-@@ -347,18 +347,6 @@ public class ProcessInitializationHandler {
+@@ -356,18 +356,6 @@ public class ProcessInitializationHandler {
deferredStartupHandler.addDeferredTask(new Runnable() {
@Override
public void run() {
@@ -106,7 +106,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/Chr
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
-@@ -207,15 +207,11 @@ public class MainPreferences extends PreferenceFragmentCompat
+@@ -206,15 +206,11 @@ public class MainPreferences extends PreferenceFragmentCompat
updateSyncAndServicesPreference();
updateSearchEnginePreference();
@@ -137,7 +137,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUti
private static Boolean sIsHomepageTileEnabled;
private static Boolean sIsNewTabPageButtonEnabled;
private static Boolean sIsBottomToolbarEnabled;
-@@ -176,7 +175,6 @@ public class FeatureUtilities {
+@@ -178,7 +177,6 @@ public class FeatureUtilities {
public static void cacheNativeFlags() {
cacheCommandLineOnNonRootedEnabled();
FirstRunUtils.cacheFirstRunPrefs();
@@ -145,7 +145,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUti
cacheHomepageTileEnabled();
cacheNewTabPageButtonEnabled();
cacheBottomToolbarEnabled();
-@@ -224,38 +222,6 @@ public class FeatureUtilities {
+@@ -228,38 +226,6 @@ public class FeatureUtilities {
return Build.VERSION.SDK_INT > Build.VERSION_CODES.M;
}
@@ -181,13 +181,13 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUti
- sIsHomePageButtonForceEnabled = null;
- }
-
- private static void cacheNetworkService() {
- boolean networkService = ChromeFeatureList.isEnabled(ChromeFeatureList.NETWORK_SERVICE);
-
+ private static void cacheServiceManagerForDownloadResumption() {
+ boolean resumptionDownloadInReducedMode =
+ ChromeFeatureList.isEnabled(ChromeFeatureList.SERVICE_MANAGER_FOR_DOWNLOAD);
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
-@@ -1774,9 +1774,6 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -1932,9 +1932,6 @@ const FeatureEntry kFeatureEntries[] = {
{"enable-chrome-duet-labels", flag_descriptions::kChromeDuetLabelsName,
flag_descriptions::kChromeDuetLabelsDescription, kOsAndroid,
FEATURE_VALUE_TYPE(chrome::android::kChromeDuetLabeled)},
@@ -200,7 +200,7 @@ diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
-@@ -136,7 +136,6 @@ const base::Feature* kFeaturesExposedToJava[] = {
+@@ -143,7 +143,6 @@ const base::Feature* kFeaturesExposedToJava[] = {
&kEphemeralTab,
&kExploreSites,
&kHandleMediaIntents,
@@ -208,7 +208,7 @@ diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/andr
&kHomepageTile,
&kHorizontalTabSwitcherAndroid,
&kIdentityDisc,
-@@ -413,9 +412,6 @@ const base::Feature kForegroundNotificationManager{
+@@ -439,9 +438,6 @@ const base::Feature kForegroundNotificationManager{
const base::Feature kHandleMediaIntents{"HandleMediaIntents",
base::FEATURE_ENABLED_BY_DEFAULT};
@@ -221,7 +221,7 @@ diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/andr
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h
--- a/chrome/browser/android/chrome_feature_list.h
+++ b/chrome/browser/android/chrome_feature_list.h
-@@ -72,7 +72,6 @@ extern const base::Feature kEphemeralTab;
+@@ -77,7 +77,6 @@ extern const base::Feature kEphemeralTab;
extern const base::Feature kExploreSites;
extern const base::Feature kForegroundNotificationManager;
extern const base::Feature kHandleMediaIntents;
diff --git a/build/patches/AudioBuffer-AnalyserNode-fingerprinting-mitigations-via-IDL.patch b/build/patches/AudioBuffer-AnalyserNode-fingerprinting-mitigations-via-IDL.patch
index d29fd405498d376db730d64624c549b61897856e..6a7fb9db879674d87006bec910e3ce493ad13e47 100644
--- a/build/patches/AudioBuffer-AnalyserNode-fingerprinting-mitigations-via-IDL.patch
+++ b/build/patches/AudioBuffer-AnalyserNode-fingerprinting-mitigations-via-IDL.patch
@@ -35,15 +35,15 @@ diff --git a/third_party/blink/renderer/modules/webaudio/audio_buffer.idl b/thir
// Channel access
readonly attribute unsigned long numberOfChannels;
- [HighEntropy, Measure, RaisesException] Float32Array getChannelData(unsigned long channelIndex);
-- [HighEntropy, Measure, RaisesException] void copyFromChannel(Float32Array destination, long channelNumber, optional unsigned long startInChannel = 0);
+- [HighEntropy, Measure, RaisesException] void copyFromChannel(Float32Array destination, long channelNumber, optional unsigned long bufferOffset = 0);
+ //[HighEntropy, Measure, RaisesException] Float32Array getChannelData(unsigned long channelIndex);
-+ //[HighEntropy, Measure, RaisesException] void copyFromChannel(Float32Array destination, long channelNumber, optional unsigned long startInChannel = 0);
- [RaisesException] void copyToChannel(Float32Array source, long channelNumber, optional unsigned long startInChannel = 0);
++ //[HighEntropy, Measure, RaisesException] void copyFromChannel(Float32Array destination, long channelNumber, optional unsigned long bufferOffset = 0);
+ [RaisesException] void copyToChannel(Float32Array source, long channelNumber, optional unsigned long bufferOffset = 0);
};
diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.cc b/third_party/blink/renderer/modules/webaudio/audio_context.cc
--- a/third_party/blink/renderer/modules/webaudio/audio_context.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_context.cc
-@@ -336,6 +336,7 @@ void AudioContext::StopRendering() {
+@@ -358,6 +358,7 @@ void AudioContext::StopRendering() {
double AudioContext::baseLatency() const {
DCHECK(IsMainThread());
DCHECK(destination());
diff --git a/build/patches/Battery-API-return-nothing.patch b/build/patches/Battery-API-return-nothing.patch
index bbebdea2ebb73dbfaea5dce5040d513d7af63017..fbd5e4c537b1487e8d98b77c8b77e998038e3f9b 100644
--- a/build/patches/Battery-API-return-nothing.patch
+++ b/build/patches/Battery-API-return-nothing.patch
@@ -10,7 +10,7 @@ Include @thestinger's fix for correct charging/unknown values
diff --git a/third_party/blink/renderer/modules/battery/battery_manager.cc b/third_party/blink/renderer/modules/battery/battery_manager.cc
--- a/third_party/blink/renderer/modules/battery/battery_manager.cc
+++ b/third_party/blink/renderer/modules/battery/battery_manager.cc
-@@ -44,45 +44,28 @@ ScriptPromise BatteryManager::StartRequest(ScriptState* script_state) {
+@@ -45,45 +45,28 @@ ScriptPromise BatteryManager::StartRequest(ScriptState* script_state) {
}
bool BatteryManager::charging() {
diff --git a/build/patches/Block-all-connection-requests-with-qjz9zk-in-the-domain-name-or-with-a-trk-scheme.patch b/build/patches/Block-all-connection-requests-with-qjz9zk-in-the-domain-name-or-with-a-trk-scheme.patch
new file mode 100644
index 0000000000000000000000000000000000000000..91ed7032f1ad9706c02feab115a9a14a5ea3e6db
--- /dev/null
+++ b/build/patches/Block-all-connection-requests-with-qjz9zk-in-the-domain-name-or-with-a-trk-scheme.patch
@@ -0,0 +1,319 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Wed, 30 Oct 2019 11:50:13 +0100
+Subject: Block all connection requests with 'qjz9zk' in the domain name or
+ with a 'trk:' scheme.
+
+An info bar is displayed unless the --disable-trkbar command-line flag or the chrome://flag option is used.
+This patch is based on Iridium's 'net: add "trk:" scheme and help identify URLs being retrieved'
+---
+ .../chrome_autocomplete_scheme_classifier.cc | 1 +
+ chrome/browser/history/history_utils.cc | 1 +
+ chrome/browser/ui/singleton_tabs.cc | 3 +-
+ chromecast/browser/url_request_context_factory.cc | 7 ++++-
+ components/omnibox/browser/autocomplete_input.cc | 7 +++--
+ components/url_formatter/url_fixer.cc | 4 +++
+ .../browser/child_process_security_policy_impl.cc | 1 +
+ net/BUILD.gn | 2 ++
+ net/url_request/trk_protocol_handler.cc | 26 +++++++++++++++++
+ net/url_request/trk_protocol_handler.h | 33 ++++++++++++++++++++++
+ net/url_request/url_request.cc | 8 ++++++
+ net/url_request/url_request_context_builder.cc | 4 +++
+ url/url_constants.cc | 1 +
+ url/url_constants.h | 1 +
+ url/url_util.cc | 2 ++
+ 15 files changed, 97 insertions(+), 4 deletions(-)
+ create mode 100644 net/url_request/trk_protocol_handler.cc
+ create mode 100644 net/url_request/trk_protocol_handler.h
+
+diff --git a/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc b/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
+--- a/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
++++ b/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
+@@ -28,6 +28,7 @@ ChromeAutocompleteSchemeClassifier::GetInputTypeForScheme(
+ if (base::IsStringASCII(scheme) &&
+ (ProfileIOData::IsHandledProtocol(scheme) ||
+ base::LowerCaseEqualsASCII(scheme, content::kViewSourceScheme) ||
++ base::LowerCaseEqualsASCII(scheme, url::kTraceScheme) ||
+ base::LowerCaseEqualsASCII(scheme, url::kJavaScriptScheme) ||
+ base::LowerCaseEqualsASCII(scheme, url::kDataScheme))) {
+ return metrics::OmniboxInputType::URL;
+diff --git a/chrome/browser/history/history_utils.cc b/chrome/browser/history/history_utils.cc
+--- a/chrome/browser/history/history_utils.cc
++++ b/chrome/browser/history/history_utils.cc
+@@ -22,6 +22,7 @@ bool CanAddURLToHistory(const GURL& url) {
+ url.SchemeIs(content::kChromeDevToolsScheme) ||
+ url.SchemeIs(content::kChromeUIScheme) ||
+ url.SchemeIs(content::kViewSourceScheme) ||
++ url.SchemeIs(url::kTraceScheme) ||
+ url.SchemeIs(chrome::kChromeNativeScheme) ||
+ url.SchemeIs(chrome::kChromeSearchScheme) ||
+ url.SchemeIs(dom_distiller::kDomDistillerScheme) ||
+diff --git a/chrome/browser/ui/singleton_tabs.cc b/chrome/browser/ui/singleton_tabs.cc
+--- a/chrome/browser/ui/singleton_tabs.cc
++++ b/chrome/browser/ui/singleton_tabs.cc
+@@ -99,7 +99,8 @@ int GetIndexOfExistingTab(Browser* browser, const NavigateParams& params) {
+
+ // Skip view-source tabs. This is needed because RewriteURLIfNecessary
+ // removes the "view-source:" scheme which leads to incorrect matching.
+- if (tab_url.SchemeIs(content::kViewSourceScheme))
++ if (tab_url.SchemeIs(content::kViewSourceScheme) ||
++ tab_url.SchemeIs(url::kTraceScheme))
+ continue;
+
+ GURL rewritten_tab_url = tab_url;
+diff --git a/chromecast/browser/url_request_context_factory.cc b/chromecast/browser/url_request_context_factory.cc
+--- a/chromecast/browser/url_request_context_factory.cc
++++ b/chromecast/browser/url_request_context_factory.cc
+@@ -39,6 +39,7 @@
+ #include "net/http/http_stream_factory.h"
+ #include "net/proxy_resolution/proxy_resolution_service.h"
+ #include "net/ssl/ssl_config_service_defaults.h"
++#include "net/url_request/trk_protocol_handler.h"
+ #include "net/url_request/url_request_context.h"
+ #include "net/url_request/url_request_context_builder.h"
+ #include "net/url_request/url_request_context_getter.h"
+@@ -245,13 +246,17 @@ void URLRequestContextFactory::InitializeMainContextDependencies(
+ new net::URLRequestJobFactoryImpl());
+ // Keep ProtocolHandlers added in sync with
+ // CastContentBrowserClient::IsHandledURL().
++ bool set_protocol = false;
+ for (content::ProtocolHandlerMap::iterator it = protocol_handlers->begin();
+ it != protocol_handlers->end();
+ ++it) {
+- bool set_protocol =
++ set_protocol =
+ job_factory->SetProtocolHandler(it->first, std::move(it->second));
+ DCHECK(set_protocol);
+ }
++ set_protocol = job_factory->SetProtocolHandler(
++ url::kTraceScheme, base::WrapUnique(new net::TrkProtocolHandler));
++ DCHECK(set_protocol);
+
+ // Set up interceptors in the reverse order.
+ std::unique_ptr top_job_factory =
+diff --git a/components/omnibox/browser/autocomplete_input.cc b/components/omnibox/browser/autocomplete_input.cc
+--- a/components/omnibox/browser/autocomplete_input.cc
++++ b/components/omnibox/browser/autocomplete_input.cc
+@@ -496,7 +496,8 @@ void AutocompleteInput::ParseForEmphasizeComponents(
+ // For the view-source and blob schemes, we should emphasize the host of the
+ // URL qualified by the view-source or blob prefix.
+ if ((base::LowerCaseEqualsASCII(scheme_str, kViewSourceScheme) ||
+- base::LowerCaseEqualsASCII(scheme_str, url::kBlobScheme)) &&
++ base::LowerCaseEqualsASCII(scheme_str, url::kBlobScheme) ||
++ base::LowerCaseEqualsASCII(scheme_str, url::kTraceScheme)) &&
+ (static_cast(text.length()) > after_scheme_and_colon)) {
+ // Obtain the URL prefixed by view-source or blob and parse it.
+ base::string16 real_url(text.substr(after_scheme_and_colon));
+@@ -569,7 +570,9 @@ int AutocompleteInput::NumNonHostComponents(const url::Parsed& parts) {
+ bool AutocompleteInput::HasHTTPScheme(const base::string16& input) {
+ std::string utf8_input(base::UTF16ToUTF8(input));
+ url::Component scheme;
+- if (url::FindAndCompareScheme(utf8_input, kViewSourceScheme, &scheme)) {
++ if (url::FindAndCompareScheme(utf8_input, url::kTraceScheme, &scheme)) {
++ return false;
++ } else if (url::FindAndCompareScheme(utf8_input, kViewSourceScheme, &scheme)) {
+ utf8_input.erase(0, scheme.end() + 1);
+ }
+ return url::FindAndCompareScheme(utf8_input, url::kHttpScheme, nullptr);
+diff --git a/components/url_formatter/url_fixer.cc b/components/url_formatter/url_fixer.cc
+--- a/components/url_formatter/url_fixer.cc
++++ b/components/url_formatter/url_fixer.cc
+@@ -552,6 +552,10 @@ GURL FixupURL(const std::string& text, const std::string& desired_tld) {
+ }
+ }
+
++ if (scheme == url::kTraceScheme) {
++ return GURL();
++ }
++
+ // We handle the file scheme separately.
+ if (scheme == url::kFileScheme)
+ return GURL(parts.scheme.is_valid() ? text : FixupPath(text));
+diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc
+--- a/content/browser/child_process_security_policy_impl.cc
++++ b/content/browser/child_process_security_policy_impl.cc
+@@ -507,6 +507,7 @@ ChildProcessSecurityPolicyImpl::ChildProcessSecurityPolicyImpl() {
+ RegisterWebSafeScheme(url::kHttpsScheme);
+ RegisterWebSafeScheme(url::kFtpScheme);
+ RegisterWebSafeScheme(url::kDataScheme);
++ RegisterWebSafeScheme(url::kTraceScheme);
+ RegisterWebSafeScheme("feed");
+
+ // TODO(nick): https://crbug.com/651534 blob: and filesystem: schemes embed
+diff --git a/net/BUILD.gn b/net/BUILD.gn
+--- a/net/BUILD.gn
++++ b/net/BUILD.gn
+@@ -1787,6 +1787,8 @@ component("net") {
+ "url_request/report_sender.h",
+ "url_request/static_http_user_agent_settings.cc",
+ "url_request/static_http_user_agent_settings.h",
++ "url_request/trk_protocol_handler.cc",
++ "url_request/trk_protocol_handler.h",
+ "url_request/url_fetcher.cc",
+ "url_request/url_fetcher.h",
+ "url_request/url_fetcher_core.cc",
+diff --git a/net/url_request/trk_protocol_handler.cc b/net/url_request/trk_protocol_handler.cc
+new file mode 100644
+--- /dev/null
++++ b/net/url_request/trk_protocol_handler.cc
+@@ -0,0 +1,26 @@
++// Copyright (c) 2018 The ungoogled-chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "net/url_request/trk_protocol_handler.h"
++
++#include "base/logging.h"
++#include "net/base/net_errors.h"
++#include "net/url_request/url_request_error_job.h"
++
++namespace net {
++
++TrkProtocolHandler::TrkProtocolHandler() = default;
++
++URLRequestJob* TrkProtocolHandler::MaybeCreateJob(
++ URLRequest* request, NetworkDelegate* network_delegate) const {
++ LOG(ERROR) << "Blocked URL in TrkProtocolHandler: " << request->original_url();
++ return new URLRequestErrorJob(
++ request, network_delegate, ERR_BLOCKED_BY_CLIENT);
++}
++
++bool TrkProtocolHandler::IsSafeRedirectTarget(const GURL& location) const {
++ return true;
++}
++
++} // namespace net
+diff --git a/net/url_request/trk_protocol_handler.h b/net/url_request/trk_protocol_handler.h
+new file mode 100644
+--- /dev/null
++++ b/net/url_request/trk_protocol_handler.h
+@@ -0,0 +1,33 @@
++// Copyright (c) 2018 The ungoogled-chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#ifndef NET_URL_REQUEST_TRK_PROTOCOL_HANDLER_H_
++#define NET_URL_REQUEST_TRK_PROTOCOL_HANDLER_H_
++
++#include "base/compiler_specific.h"
++#include "base/macros.h"
++#include "net/base/net_export.h"
++#include "net/url_request/url_request_job_factory.h"
++
++namespace net {
++
++class URLRequestJob;
++
++// Implements a ProtocolHandler for Trk jobs.
++class NET_EXPORT TrkProtocolHandler
++ : public URLRequestJobFactory::ProtocolHandler {
++ public:
++ TrkProtocolHandler();
++ URLRequestJob* MaybeCreateJob(
++ URLRequest* request,
++ NetworkDelegate* network_delegate) const override;
++ bool IsSafeRedirectTarget(const GURL& location) const override;
++
++ private:
++ DISALLOW_COPY_AND_ASSIGN(TrkProtocolHandler);
++};
++
++} // namespace net
++
++#endif // NET_URL_REQUEST_TRK_PROTOCOL_HANDLER_H_
+diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc
+--- a/net/url_request/url_request.cc
++++ b/net/url_request/url_request.cc
+@@ -15,6 +15,7 @@
+ #include "base/metrics/histogram_macros.h"
+ #include "base/rand_util.h"
+ #include "base/stl_util.h"
++#include "base/strings/string_util.h"
+ #include "base/strings/utf_string_conversions.h"
+ #include "base/synchronization/lock.h"
+ #include "base/threading/thread_task_runner_handle.h"
+@@ -42,6 +43,7 @@
+ #include "net/url_request/url_request_redirect_job.h"
+ #include "url/gurl.h"
+ #include "url/origin.h"
++#include "url/url_constants.h"
+
+ using base::Time;
+ using std::string;
+@@ -612,6 +614,12 @@ URLRequest::URLRequest(const GURL& url,
+ // Sanity check out environment.
+ DCHECK(base::ThreadTaskRunnerHandle::IsSet());
+
++ if (!url.SchemeIs(url::kTraceScheme) &&
++ base::EndsWith(url.host(), "qjz9zk", base::CompareCase::INSENSITIVE_ASCII)) {
++ LOG(ERROR) << "Block URL in URLRequest: " << url;
++ url_chain_[0] = GURL(url::kTraceScheme + (":" + url.possibly_invalid_spec()));
++ }
++
+ context->url_requests()->insert(this);
+ net_log_.BeginEvent(NetLogEventType::REQUEST_ALIVE, [&] {
+ return NetLogURLRequestConstructorParams(url, priority_,
+diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc
+--- a/net/url_request/url_request_context_builder.cc
++++ b/net/url_request/url_request_context_builder.cc
+@@ -40,6 +40,7 @@
+ #include "net/ssl/ssl_config_service_defaults.h"
+ #include "net/url_request/data_protocol_handler.h"
+ #include "net/url_request/static_http_user_agent_settings.h"
++#include "net/url_request/trk_protocol_handler.h"
+ #include "net/url_request/url_request_context.h"
+ #include "net/url_request/url_request_context_storage.h"
+ #include "net/url_request/url_request_intercepting_job_factory.h"
+@@ -641,6 +642,9 @@ std::unique_ptr URLRequestContextBuilder::Build() {
+ job_factory->SetProtocolHandler(url::kDataScheme,
+ std::make_unique());
+
++ job_factory->SetProtocolHandler(url::kTraceScheme,
++ std::make_unique());
++
+ #if !BUILDFLAG(DISABLE_FILE_SUPPORT)
+ if (file_enabled_) {
+ job_factory->SetProtocolHandler(
+diff --git a/url/url_constants.cc b/url/url_constants.cc
+--- a/url/url_constants.cc
++++ b/url/url_constants.cc
+@@ -26,6 +26,7 @@ const char kHttpsScheme[] = "https";
+ const char kJavaScriptScheme[] = "javascript";
+ const char kMailToScheme[] = "mailto";
+ const char kTelScheme[] = "tel";
++const char kTraceScheme[] = "trk";
+ const char kWsScheme[] = "ws";
+ const char kWssScheme[] = "wss";
+
+diff --git a/url/url_constants.h b/url/url_constants.h
+--- a/url/url_constants.h
++++ b/url/url_constants.h
+@@ -32,6 +32,7 @@ COMPONENT_EXPORT(URL) extern const char kHttpsScheme[];
+ COMPONENT_EXPORT(URL) extern const char kJavaScriptScheme[];
+ COMPONENT_EXPORT(URL) extern const char kMailToScheme[];
+ COMPONENT_EXPORT(URL) extern const char kTelScheme[];
++COMPONENT_EXPORT(URL) extern const char kTraceScheme[];
+ COMPONENT_EXPORT(URL) extern const char kWsScheme[];
+ COMPONENT_EXPORT(URL) extern const char kWssScheme[];
+
+diff --git a/url/url_util.cc b/url/url_util.cc
+--- a/url/url_util.cc
++++ b/url/url_util.cc
+@@ -52,6 +52,7 @@ struct SchemeRegistry {
+ kHttpsScheme,
+ kAboutScheme,
+ kDataScheme,
++ kTraceScheme,
+ kWssScheme,
+ };
+
+@@ -67,6 +68,7 @@ struct SchemeRegistry {
+ kAboutScheme,
+ kJavaScriptScheme,
+ kDataScheme,
++ kTraceScheme,
+ };
+
+ // Schemes that can be sent CORS requests.
+--
+2.11.0
+
diff --git a/build/patches/Bromite-AdBlock-engine-for-SystemWebView.patch b/build/patches/Bromite-AdBlock-engine-for-SystemWebView.patch
deleted file mode 100644
index e65ea1d48a6df2a13b93732ee1942c9bb927fef5..0000000000000000000000000000000000000000
--- a/build/patches/Bromite-AdBlock-engine-for-SystemWebView.patch
+++ /dev/null
@@ -1,572 +0,0 @@
-From: csagan5 <32685696+csagan5@users.noreply.github.com>
-Date: Sat, 14 Sep 2019 10:14:54 +0200
-Subject: Bromite AdBlock engine for SystemWebView
-
----
- android_webview/browser/net/aw_network_delegate.cc | 71 ++++
- android_webview/browser/net/aw_network_delegate.h | 3 +
- net/BUILD.gn | 7 +
- net/url_request/adblock_intercept.cc | 389 +++++++++++++++++++++
- net/url_request/adblock_intercept.h | 35 ++
- 5 files changed, 505 insertions(+)
- create mode 100644 net/url_request/adblock_intercept.cc
- create mode 100644 net/url_request/adblock_intercept.h
-
-diff --git a/android_webview/browser/net/aw_network_delegate.cc b/android_webview/browser/net/aw_network_delegate.cc
---- a/android_webview/browser/net/aw_network_delegate.cc
-+++ b/android_webview/browser/net/aw_network_delegate.cc
-@@ -20,9 +20,11 @@
- #include "net/base/proxy_server.h"
- #include "net/http/http_response_headers.h"
- #include "net/proxy_resolution/proxy_info.h"
-+#include "net/url_request/adblock_intercept.h"
- #include "net/url_request/url_request.h"
-
- using content::BrowserThread;
-+using content::ResourceRequestInfo;
-
- namespace android_webview {
-
-@@ -49,6 +51,75 @@ AwNetworkDelegate::AwNetworkDelegate() {}
- AwNetworkDelegate::~AwNetworkDelegate() {
- }
-
-+#define TRANSPARENT1PXGIF "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
-+#define EMPTYJS "data:text/javascript;base64,Cg=="
-+#define EMPTYCSS "data:text/css;base64,Cg=="
-+
-+static bool requestIntercepted(net::URLRequest* request, GURL* new_url) {
-+ bool block = false, isValidUrl;
-+
-+ // skip invalid URLs and browser-initiated requests (which have no initiator)
-+ auto initiator = request->initiator();
-+ isValidUrl = request->url().is_valid() && initiator.has_value();
-+ std::string scheme = request->url().scheme();
-+ if (isValidUrl && scheme.length()) {
-+ std::transform(scheme.begin(), scheme.end(), scheme.begin(), ::tolower);
-+ if ("http" != scheme && "https" != scheme) {
-+ isValidUrl = false;
-+ }
-+ }
-+ ResourceRequestInfo* info;
-+ if (isValidUrl) {
-+ info = ResourceRequestInfo::ForRequest(request);
-+ }
-+
-+ // there are no per-site nor global ad/content settings when using the SystemWebView
-+ bool adblock_enabled = true;
-+ if (isValidUrl && info) {
-+ auto resource_type = info->GetResourceType();
-+
-+ if (adblock_enabled
-+ && content::ResourceType::kMainFrame != resource_type
-+ && net::adblock_intercept(request->url(), initiator->host(), resource_type)) {
-+ block = true;
-+ }
-+
-+ if (block) {
-+ switch (resource_type) {
-+ case content::ResourceType::kImage:
-+ case content::ResourceType::kFavicon:
-+ *new_url = GURL(TRANSPARENT1PXGIF);
-+ break;
-+ case content::ResourceType::kScript:
-+ *new_url = GURL(EMPTYJS);
-+ break;
-+ case content::ResourceType::kStylesheet:
-+ *new_url = GURL(EMPTYCSS);
-+ break;
-+ default:
-+ *new_url = GURL("");
-+ return true;
-+ }
-+ }
-+ } // valid URL and info
-+ return false;
-+}
-+#undef TRANSPARENT1PXGIF
-+#undef EMPTYJS
-+#undef EMPTYCSS
-+
-+int AwNetworkDelegate::OnBeforeURLRequest(net::URLRequest* request,
-+ net::CompletionOnceCallback callback,
-+ GURL* new_url) {
-+ if (request) {
-+ // most requests will be modified rather than intercepted
-+ if (requestIntercepted(request, new_url))
-+ return net::ERR_BLOCKED_BY_ADMINISTRATOR;
-+ } // request
-+
-+ return net::OK;
-+}
-+
- int AwNetworkDelegate::OnBeforeStartTransaction(
- net::URLRequest* request,
- net::CompletionOnceCallback callback,
-diff --git a/android_webview/browser/net/aw_network_delegate.h b/android_webview/browser/net/aw_network_delegate.h
---- a/android_webview/browser/net/aw_network_delegate.h
-+++ b/android_webview/browser/net/aw_network_delegate.h
-@@ -22,6 +22,9 @@ class AwNetworkDelegate : public net::NetworkDelegateImpl {
-
- private:
- // NetworkDelegate implementation.
-+ int OnBeforeURLRequest(net::URLRequest* request,
-+ net::CompletionOnceCallback callback,
-+ GURL* new_url) override;
- int OnBeforeStartTransaction(net::URLRequest* request,
- net::CompletionOnceCallback callback,
- net::HttpRequestHeaders* headers) override;
-diff --git a/net/BUILD.gn b/net/BUILD.gn
---- a/net/BUILD.gn
-+++ b/net/BUILD.gn
-@@ -1842,6 +1842,13 @@ component("net") {
- "url_request/websocket_handshake_userdata_key.h",
- ]
-
-+ if (is_android) {
-+ sources += [
-+ "url_request/adblock_intercept.cc",
-+ "url_request/adblock_intercept.h"
-+ ]
-+ }
-+
- if (enable_reporting) {
- sources += [
- "network_error_logging/network_error_logging_service.cc",
-diff --git a/net/url_request/adblock_intercept.cc b/net/url_request/adblock_intercept.cc
-new file mode 100644
---- /dev/null
-+++ b/net/url_request/adblock_intercept.cc
-@@ -0,0 +1,389 @@
-+/*
-+ 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 .
-+*/
-+#include "adblock_intercept.h"
-+
-+#ifdef ADB_TESTER
-+#include
-+#include
-+#include
-+
-+#include "log.h"
-+#include
-+
-+#else
-+
-+#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
-+#include
-+
-+#endif
-+
-+#include "net/url_request/adblock_entries.h"
-+
-+namespace net {
-+
-+const char *LOG_TAG = "Bromite";
-+
-+#ifdef ADB_TESTER
-+int adblock_rules_count() { return ADBLOCK_ENTRY_COUNT; }
-+#endif
-+
-+// True if the given canonical |host| is "[www.]."
-+// with a valid TLD. If |subdomain_permission| is ALLOW_SUBDOMAIN, we check
-+// against host "*.." instead. Will return the TLD
-+// string in |tld|, if specified and the |host| can be parsed.
-+static bool is_first_party(const char *l_host, int len, const char *l_url_host,
-+ int b_len) {
-+ size_t tld_length;
-+
-+#ifdef ADB_TESTER
-+ char *found_tld;
-+
-+ if (TLD_SUCCESS != tld_get_z(l_host, &found_tld))
-+ return false;
-+ tld_length = strlen(found_tld);
-+ if (tld_length == 0)
-+ return false;
-+#else
-+ tld_length = net::registry_controlled_domains::GetCanonicalHostRegistryLength(
-+ l_host, net::registry_controlled_domains::EXCLUDE_UNKNOWN_REGISTRIES,
-+ net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES);
-+ if ((tld_length == 0) || (tld_length == std::string::npos))
-+ return false;
-+#endif
-+
-+ const char *tld = l_host + len - tld_length;
-+
-+ // Removes any subdomain from origin host.
-+ int i = len - tld_length - 2, top_i = i;
-+ if (i < 0) {
-+ return false;
-+ }
-+ const char *domain = l_host;
-+ for (; i >= 0; i--) {
-+ if (l_host[i] == '.') {
-+ int p_len = top_i - i;
-+ // skip "co" in "co.uk", "org" in "org.uk"
-+ if (p_len <= 3) {
-+ tld -= p_len + 1;
-+ continue;
-+ }
-+
-+ // segment is long enough, accept it at as a domain
-+ domain = l_host + i;
-+ len -= i;
-+ break;
-+ }
-+ }
-+
-+#ifdef ADBLOCK_LOG
-+ __android_log_print(ANDROID_LOG_INFO, LOG_TAG,
-+ "%s: extracted domain suffix: \"%s\" (TLD=\"%s\")",
-+ l_host, domain, tld);
-+#endif
-+
-+ // Check if supplied URL host matches, including the dot.
-+ if (b_len < len) {
-+ return false;
-+ }
-+ for (int i = 0; i < len; i++) {
-+ if (l_url_host[b_len - 1 - i] != domain[len - 1 - i])
-+ return false;
-+ }
-+
-+ // pass with flying colors
-+ return true;
-+}
-+
-+static char *strtolower(const char *str, int len, bool &should_free) {
-+ char *ret = NULL;
-+ for (int i = 0; i < len; i++) {
-+ if ((65 <= str[i]) && (str[i] <= 90)) {
-+ // first time a difference is found, allocate buffer and copy previous
-+ // characters (if any)
-+ if (ret == NULL) {
-+ ret = (char *)malloc(len + 1);
-+ if (i != 0)
-+ memcpy(ret, str, i);
-+ }
-+ // convert character to lower case
-+ ret[i] = str[i] + 32;
-+ } else {
-+ if (ret != NULL)
-+ ret[i] = str[i];
-+ }
-+ }
-+
-+ if (ret != NULL) {
-+ ret[len] = '\0';
-+ should_free = true;
-+ return ret;
-+ }
-+
-+ // return source, unchanged
-+ return (char *)str;
-+}
-+
-+static char *strtosep(const char *str, int len) {
-+ char *ret = (char *)malloc(len + 3);
-+ ret[0] = '^';
-+ for (int i = 0; i < len; i++) {
-+ if ((str[i] == ':') || (str[i] == '/') || (str[i] == '?') ||
-+ (str[i] == '&') || (str[i] == '=')) {
-+ ret[i + 1] = '^';
-+ } else {
-+ ret[i + 1] = str[i];
-+ }
-+ }
-+ // the index 'len' character is set by the previous loop
-+ ret[len + 1] = '^';
-+ ret[len + 2] = '\0';
-+ return ret;
-+}
-+
-+static bool url_matches(const char *c_url, char *c_url_sep, char *c_url_lower,
-+ char *c_url_lower_sep, adblock_entry *entry) {
-+ bool match = false;
-+ // select comparison string based on case and separator presence (separator
-+ // takes some shortcuts)
-+ bool match_case = ((entry->flags & ADBLOCK_FLAG_MATCH_CASE) != 0);
-+ bool match_separator = ((entry->flags & ADBLOCK_FLAG_HAS_SEPARATOR) != 0);
-+ const char *match_url =
-+ match_case ? (match_separator ? c_url_sep : c_url)
-+ : (match_separator ? c_url_lower_sep : c_url_lower);
-+
-+#ifdef ADBLOCK_LOG_MORE
-+ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[case:%d][sep:%d][%s]",
-+ match_case, match_separator, match_url);
-+#endif
-+ // check for all match parts at >= position of last match
-+ const char *last = match_url;
-+ for (int m = 0; const char *url_match = entry->matches[m]; m++) {
-+ bool is_last_match = entry->matches[m + 1] == NULL;
-+ const char *pos = strstr(last, url_match);
-+ match = (pos != NULL);
-+
-+#ifdef ADBLOCK_LOG_MORE
-+ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%s][found:%d][match:%d]",
-+ entry->matches[m], pos == NULL ? 0 : 1, match ? 1 : 0);
-+#endif
-+ // check if the url starts with the first match part
-+ if (match && (m == 0) && ((entry->flags & ADBLOCK_FLAG_MATCH_BEGIN) != 0) &&
-+ (pos != match_url))
-+ match = false;
-+
-+ // check if the url ends with the last match part
-+ if (match && is_last_match &&
-+ ((entry->flags & ADBLOCK_FLAG_MATCH_END) != 0) &&
-+ (pos != &match_url[strlen(match_url) - strlen(entry->matches[m])]))
-+ match = false;
-+
-+ // check domain match
-+ if (match && (m == 0) &&
-+ ((entry->flags & ADBLOCK_FLAG_MATCH_DOMAIN) != 0) &&
-+ (pos != match_url) && (pos[-1] != '^') && (pos[-1] != '.') &&
-+ (pos[-1] != '/'))
-+ match = false;
-+
-+ // short circuit
-+ if (!match)
-+ break;
-+ }
-+ return match;
-+}
-+
-+bool url_match_domain(adblock_entry *entry, const std::string &origin_host) {
-+ bool match_domain = true;
-+ // check for a negative domain match
-+ if (entry->domains_skip) {
-+ if (origin_host.empty()) {
-+ // skip this rule, cannot match on domain
-+ return false;
-+ }
-+ for (int d = 0; const char *domain = entry->domains_skip[d]; d++) {
-+ if (domain == origin_host) {
-+ match_domain = false;
-+ break;
-+ }
-+ }
-+ }
-+
-+ // check for a required positive domain match
-+ if (entry->domains) {
-+ if (origin_host.empty()) {
-+ // skip this rule, cannot match on domain
-+ return false;
-+ }
-+ for (int d = 0; const char *domain = entry->domains[d]; d++) {
-+ if (domain != origin_host) {
-+ match_domain = false;
-+ break;
-+ }
-+ }
-+ }
-+ return match_domain;
-+}
-+
-+static bool url_match_party(adblock_entry *entry, const char *l_origin_host,
-+ int origin_host_len, const char *l_url_host,
-+ int url_host_len, bool &checked_fp, bool &fp) {
-+ bool wanted_fp;
-+ if ((entry->flags & ADBLOCK_FLAG_THIRD_PARTY) != 0) {
-+ wanted_fp = false;
-+ } else if ((entry->flags & ADBLOCK_FLAG_FIRST_PARTY) != 0) {
-+ wanted_fp = true;
-+ } else {
-+ // no-op
-+ return true;
-+ }
-+
-+ if (origin_host_len == 0) {
-+ // cannot match this rule, no origin host to determine first/third party
-+ return false;
-+ }
-+
-+ if (!checked_fp) {
-+ // is the URL a first-party to the current page's host?
-+ fp = is_first_party(l_origin_host, origin_host_len, l_url_host,
-+ url_host_len);
-+
-+ checked_fp = true;
-+#ifdef ADB_TESTER
-+ __android_log_print(ANDROID_LOG_INFO, LOG_TAG,
-+ "is_first_party(\"%s\", \"%s\") = %s", l_origin_host,
-+ l_url_host, fp ? "true" : "false");
-+#endif
-+ }
-+
-+ return fp == wanted_fp;
-+}
-+
-+static bool resource_type_match(adblock_entry *entry,
-+ content::ResourceType resource_type) {
-+ bool exclude;
-+ if ((entry->flags & ADBLOCK_FLAG_RESOURCE_TYPE_IN) != 0) {
-+ exclude = false;
-+ } else if ((entry->flags & ADBLOCK_FLAG_RESOURCE_TYPE_NOT_IN) != 0) {
-+ exclude = true;
-+ } else {
-+ // no resource type matching
-+ return true;
-+ }
-+
-+ // use a bitwise trick to test for the current resource type
-+ bool found = (entry->flags & (int(resource_type) << 16));
-+ if (!exclude)
-+ return found;
-+ return !found;
-+}
-+
-+int adblock_intercept(const GURL &url, const std::string &origin_host,
-+ content::ResourceType resource_type) {
-+ // these are verified on caller when not testing
-+#ifdef ADB_TESTER
-+ if (!url.is_valid() || !url.SchemeIsHTTPOrHTTPS()) {
-+ return 0;
-+ }
-+#endif
-+
-+ bool free1 = false, free2 = false, free3 = false, free4 = false;
-+ int url_len = url.spec().size();
-+ const char *c_url = url.spec().c_str();
-+ char *c_url_lower = strtolower(c_url, url_len, free1);
-+ char *c_url_sep = strtosep(c_url, url_len);
-+ char *c_url_lower_sep = strtolower(c_url_sep, url_len + 2, free4);
-+
-+ // might be empty in case of no host
-+ const char *origin_host_cstr = origin_host.c_str();
-+ int origin_host_len = origin_host.size(), url_host_len = url.host().size();
-+
-+ // lower-case version of origin and url hosts
-+ const char *c_origin_host_lower =
-+ strtolower(origin_host_cstr, origin_host_len, free2),
-+ *c_url_host_lower =
-+ strtolower(url.host().c_str(), url_host_len, free3);
-+
-+#ifdef ADBLOCK_LOG
-+ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%s with host '%s'] [%s]",
-+ c_url, url.host().c_str(), origin_host_cstr);
-+#endif
-+
-+ bool checked_fp = false, fp = false;
-+
-+ bool intercept = false;
-+ for (int i = 0; i < ADBLOCK_ENTRY_COUNT; i++) {
-+ adblock_entry *entry = &ADBLOCK_ENTRIES[i];
-+
-+ // no use checking rules when we're intercepting, or exceptions when not
-+ bool check =
-+ (!intercept && ((entry->flags & ADBLOCK_FLAG_EXCEPTION) == 0)) ||
-+ (intercept && ((entry->flags & ADBLOCK_FLAG_EXCEPTION) != 0));
-+ if (!check)
-+ continue;
-+
-+ // check for resource type
-+ if (!resource_type_match(entry, resource_type))
-+ continue;
-+
-+ // check for domain matches, a quick branch out if not matching
-+ if (!url_match_domain(entry, origin_host))
-+ continue;
-+
-+ // check on the URL matcher
-+ if (!url_matches(c_url, c_url_sep, c_url_lower, c_url_lower_sep, entry))
-+ continue;
-+
-+ // finally check first/third-party
-+ if (!url_match_party(entry, c_origin_host_lower, origin_host_len,
-+ c_url_host_lower, url_host_len, checked_fp, fp))
-+ continue;
-+
-+#ifdef ADBLOCK_LOG
-+ if (!intercept) {
-+ __android_log_print(ANDROID_LOG_INFO, LOG_TAG,
-+ "--> intercept (#%d: \"%s\") (%x)", i,
-+ entry->matches[0], entry->flags);
-+ } else {
-+ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "--> pass (%d) (#%d)", i,
-+ entry->flags);
-+ }
-+#endif
-+ intercept = !intercept;
-+ } // for each entry
-+
-+ if (free3)
-+ free((void *)c_url_host_lower);
-+ if (free2)
-+ free((void *)c_origin_host_lower);
-+ free(c_url_sep);
-+ if (free1)
-+ free(c_url_lower);
-+ if (free4)
-+ free(c_url_lower_sep);
-+
-+ if (intercept) {
-+#ifdef ADBLOCK_LOG
-+ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "blocked");
-+#endif
-+ return 1;
-+ }
-+#ifdef ADBLOCK_LOG
-+ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "pass");
-+#endif
-+ return 0;
-+}
-+
-+} // namespace net
-diff --git a/net/url_request/adblock_intercept.h b/net/url_request/adblock_intercept.h
-new file mode 100644
---- /dev/null
-+++ b/net/url_request/adblock_intercept.h
-@@ -0,0 +1,35 @@
-+/*
-+ 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 .
-+*/
-+
-+#ifndef NET_URL_REQUEST_ADBLOCK_INTERCEPT_H_
-+#define NET_URL_REQUEST_ADBLOCK_INTERCEPT_H_
-+
-+#include "content/public/common/resource_type.h"
-+#include "url/gurl.h"
-+
-+namespace net {
-+
-+#ifdef ADB_TESTER
-+int adblock_rules_count();
-+#endif
-+
-+int adblock_intercept(const GURL &url, const std::string &origin_host,
-+ content::ResourceType resource_type);
-+
-+} // namespace net
-+
-+#endif // NET_URL_REQUEST_ADBLOCK_INTERCEPT_H_
---
-2.11.0
-
diff --git a/build/patches/Bromite-AdBlockUpdaterService.patch b/build/patches/Bromite-AdBlockUpdaterService.patch
index 027952ba7c2dc25a39712a046db8c876af6b381b..97061691a12a6f185590882034e38e3e5f17af71 100644
--- a/build/patches/Bromite-AdBlockUpdaterService.patch
+++ b/build/patches/Bromite-AdBlockUpdaterService.patch
@@ -77,7 +77,7 @@ diff --git a/chrome/browser/browser_process.h b/chrome/browser/browser_process.h
namespace extensions {
class EventRouterForwarder;
}
-@@ -233,6 +238,8 @@ class BrowserProcess {
+@@ -229,6 +234,8 @@ class BrowserProcess {
virtual component_updater::ComponentUpdateService* component_updater() = 0;
@@ -89,7 +89,7 @@ diff --git a/chrome/browser/browser_process.h b/chrome/browser/browser_process.h
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
-@@ -1017,6 +1017,34 @@ BrowserProcessImpl::component_updater() {
+@@ -1009,6 +1009,34 @@ BrowserProcessImpl::component_updater() {
return component_updater_.get();
}
@@ -135,7 +135,7 @@ diff --git a/chrome/browser/browser_process_impl.h b/chrome/browser/browser_proc
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
component_updater::SupervisedUserWhitelistInstaller*
supervised_user_whitelist_installer() override;
-@@ -362,6 +363,8 @@ class BrowserProcessImpl : public BrowserProcess,
+@@ -361,6 +362,8 @@ class BrowserProcessImpl : public BrowserProcess,
// but some users of component updater only install per-user.
std::unique_ptr component_updater_;
@@ -147,7 +147,7 @@ diff --git a/chrome/browser/browser_process_impl.h b/chrome/browser/browser_proc
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
-@@ -1739,8 +1739,11 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
+@@ -1722,8 +1722,11 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
PreBrowserStart();
@@ -163,7 +163,7 @@ diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_brows
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
-@@ -64,7 +64,6 @@
+@@ -65,7 +65,6 @@
#include "chrome/browser/hid/chrome_hid_delegate.h"
#include "chrome/browser/language/translate_frame_binder.h"
#include "chrome/browser/lifetime/browser_shutdown.h"
@@ -171,7 +171,7 @@ diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/ch
#include "chrome/browser/media/router/media_router_feature.h"
#include "chrome/browser/media/router/presentation/presentation_service_delegate_impl.h"
#include "chrome/browser/media/router/presentation/receiver_presentation_service_delegate_impl.h"
-@@ -80,7 +79,6 @@
+@@ -81,7 +80,6 @@
#include "chrome/browser/net_benchmarking.h"
#include "chrome/browser/notifications/platform_notification_service_factory.h"
#include "chrome/browser/notifications/platform_notification_service_impl.h"
@@ -179,7 +179,7 @@ diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/ch
#include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h"
#include "chrome/browser/page_load_metrics/page_load_metrics_util.h"
#include "chrome/browser/password_manager/chrome_password_manager_client.h"
-@@ -4083,16 +4081,6 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation(
+@@ -4044,16 +4042,6 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation(
content::NavigationHandle* handle) {
std::vector> throttles;
@@ -196,7 +196,7 @@ diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/ch
#if BUILDFLAG(ENABLE_PLUGINS)
std::unique_ptr flash_url_throttle =
FlashDownloadInterception::MaybeCreateThrottleFor(handle);
-@@ -4202,12 +4190,6 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation(
+@@ -4163,12 +4151,6 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation(
}
#endif
@@ -1327,7 +1327,7 @@ diff --git a/content/browser/frame_host/navigation_throttle_runner.cc b/content/
#include "content/browser/frame_host/mixed_content_navigation_throttle.h"
#include "content/browser/frame_host/navigation_handle_impl.h"
#include "content/browser/frame_host/navigator_delegate.h"
-@@ -118,15 +117,6 @@ void NavigationThrottleRunner::RegisterNavigationThrottles() {
+@@ -120,15 +119,6 @@ void NavigationThrottleRunner::RegisterNavigationThrottles() {
devtools_instrumentation::CreateNavigationThrottles(handle)) {
AddThrottle(std::move(throttle));
}
diff --git a/build/patches/Canvas-fingerprinting-mitigations-for-image-data-and-webGL.patch b/build/patches/Canvas-fingerprinting-mitigations-for-image-data-and-webGL.patch
deleted file mode 100644
index 955938b648d228642447c909b767699adfea299f..0000000000000000000000000000000000000000
--- a/build/patches/Canvas-fingerprinting-mitigations-for-image-data-and-webGL.patch
+++ /dev/null
@@ -1,292 +0,0 @@
-From: csagan5 <32685696+csagan5@users.noreply.github.com>
-Date: Sat, 24 Mar 2018 05:18:03 +0100
-Subject: Canvas: fingerprinting mitigations for image data and webGL
-
-Disable webGL renderer info and modify the color data returned by ToBlob,
-ToDataURL and getImageData so that it will contain randomly manipulated
-pixels (maximum 20) that slightly change the color of the R,G,B components
-without a visible effect.
-
-Credits to Slaviro (https://github.com/Slaviro) for coming up with a better
-approach to change color components.
----
- .../canvas/canvas2d/canvas_rendering_context_2d.cc | 3 +-
- .../modules/webgl/webgl_debug_renderer_info.cc | 4 +-
- third_party/blink/renderer/platform/BUILD.gn | 4 +-
- .../platform/graphics/image_data_buffer.cc | 5 +
- .../platform/graphics/static_bitmap_image.cc | 156 +++++++++++++++++++++
- .../platform/graphics/static_bitmap_image.h | 2 +
- 6 files changed, 169 insertions(+), 5 deletions(-)
-
-diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
---- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
-+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
-@@ -33,7 +33,6 @@
-
- #include "third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h"
-
--#include "base/rand_util.h"
- #include "base/metrics/histogram_functions.h"
- #include "third_party/blink/public/common/features.h"
- #include "third_party/blink/public/platform/platform.h"
-@@ -817,7 +816,7 @@ TextMetrics* CanvasRenderingContext2D::measureText(const String& text) {
- "Canvas.TextMetrics.MeasureText", elapsed);
-
- // scale text metrics by 3/1000000th
-- auto shuffleFactor = 1 + (base::RandDouble() - 0.5) * 0.000003;
-+ auto shuffleFactor = 1 + (canvas()->GetDocument().GetShuffleFactorX() - 0.5) * 0.000003;
- text_metrics->Shuffle(shuffleFactor);
-
- return text_metrics;
-diff --git a/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc b/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc
---- a/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc
-+++ b/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc
-@@ -37,11 +37,11 @@ WebGLExtensionName WebGLDebugRendererInfo::GetName() const {
-
- WebGLDebugRendererInfo* WebGLDebugRendererInfo::Create(
- WebGLRenderingContextBase* context) {
-- return MakeGarbageCollected(context);
-+ return nullptr;
- }
-
- bool WebGLDebugRendererInfo::Supported(WebGLRenderingContextBase*) {
-- return true;
-+ return false;
- }
-
- const char* WebGLDebugRendererInfo::ExtensionName() {
-diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
---- a/third_party/blink/renderer/platform/BUILD.gn
-+++ b/third_party/blink/renderer/platform/BUILD.gn
-@@ -1394,7 +1394,9 @@ jumbo_component("platform") {
- "//third_party/blink/renderer:non_test_config",
- ]
-
-- include_dirs = []
-+ include_dirs = [
-+ "//third_party/skia/include/private", # For shuffler in graphics/static_bitmap_image.cc
-+ ]
-
- public_deps = [
- ":blink_platform_public_deps",
-diff --git a/third_party/blink/renderer/platform/graphics/image_data_buffer.cc b/third_party/blink/renderer/platform/graphics/image_data_buffer.cc
---- a/third_party/blink/renderer/platform/graphics/image_data_buffer.cc
-+++ b/third_party/blink/renderer/platform/graphics/image_data_buffer.cc
-@@ -35,6 +35,8 @@
- #include
-
- #include "base/memory/ptr_util.h"
-+#include "base/rand_util.h"
-+#include "base/logging.h"
- #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
- #include "third_party/blink/renderer/platform/image-encoders/image_encoder.h"
- #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
-@@ -127,6 +129,9 @@ bool ImageDataBuffer::EncodeImageInternal(const ImageEncodingMimeType mime_type,
- const SkPixmap& pixmap) const {
- DCHECK(is_valid_);
-
-+ // shuffle subchannel color data within the pixmap
-+ StaticBitmapImage::ShuffleSubchannelColorData(pixmap_.writable_addr(), pixmap_.info(), 0, 0);
-+
- if (mime_type == kMimeTypeJpeg) {
- SkJpegEncoder::Options options;
- options.fQuality = ImageEncoder::ComputeJpegQuality(quality);
-diff --git a/third_party/blink/renderer/platform/graphics/static_bitmap_image.cc b/third_party/blink/renderer/platform/graphics/static_bitmap_image.cc
---- a/third_party/blink/renderer/platform/graphics/static_bitmap_image.cc
-+++ b/third_party/blink/renderer/platform/graphics/static_bitmap_image.cc
-@@ -4,6 +4,8 @@
-
- #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
-
-+#include "base/rand_util.h"
-+#include "base/logging.h"
- #include "base/numerics/checked_math.h"
- #include "gpu/command_buffer/client/gles2_interface.h"
- #include "third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.h"
-@@ -15,6 +17,7 @@
- #include "third_party/skia/include/core/SkCanvas.h"
- #include "third_party/skia/include/core/SkImage.h"
- #include "third_party/skia/include/core/SkPaint.h"
-+#include "third_party/skia/include/private/SkColorData.h"
- #include "third_party/skia/include/core/SkSurface.h"
- #include "third_party/skia/include/gpu/GrContext.h"
- #include "v8/include/v8.h"
-@@ -154,10 +157,163 @@ bool StaticBitmapImage::ConvertToArrayBufferContents(
- DCHECK(read_pixels_successful ||
- !sk_image->bounds().intersect(SkIRect::MakeXYWH(
- rect.X(), rect.Y(), info.width(), info.height())));
-+
-+ ShuffleSubchannelColorData(result.Data(), info, rect.X(), rect.Y());
-+
- result.Transfer(dest_contents);
- return true;
- }
-
-+// set the component to maximum-delta if it is >= maximum, or add to existing color component (color + delta)
-+#define shuffleComponent(color, max, delta) ( (color) >= (max) ? ((max)-(delta)) : ((color)+(delta)) )
-+
-+#define writable_addr(T, p, stride, x, y) (T*)((const char *)p + y * stride + x * sizeof(T))
-+
-+void StaticBitmapImage::ShuffleSubchannelColorData(const void *addr, const SkImageInfo& info, int srcX, int srcY) {
-+ auto w = info.width() - srcX, h = info.height() - srcY;
-+
-+ // skip tiny images; info.width()/height() can also be 0
-+ if ((w < 8) || (h < 8)) {
-+ return;
-+ }
-+
-+ // generate the first random number here
-+ double shuffleX = base::RandDouble();
-+
-+ // cap maximum pixels to change
-+ auto pixels = (w + h) / 128;
-+ if (pixels > 20) {
-+ pixels = 20;
-+ } else if (pixels < 2) {
-+ pixels = 2;
-+ }
-+
-+ auto colorType = info.colorType();
-+ auto fRowBytes = info.minRowBytes(); // stride
-+
-+ DLOG(INFO) << "BRM: ShuffleSubchannelColorData() w=" << w << " h=" << h << " colorType=" << colorType << " fRowBytes=" << fRowBytes;
-+
-+ // second random number (for y/height)
-+ double shuffleY = base::RandDouble();
-+
-+ // calculate random coordinates using bisection
-+ auto currentW = w, currentH = h;
-+ for(;pixels >= 0; pixels--) {
-+ int x = currentW * shuffleX, y = currentH * shuffleY;
-+
-+ // calculate randomisation amounts for each RGB component
-+ uint8_t shuffleR = base::RandInt(0, 4);
-+ uint8_t shuffleG = (shuffleR + x) % 4;
-+ uint8_t shuffleB = (shuffleG + y) % 4;
-+
-+ // manipulate pixel data to slightly change the R, G, B components
-+ switch (colorType) {
-+ case kAlpha_8_SkColorType:
-+ {
-+ auto *pixel = writable_addr(uint8_t, addr, fRowBytes, x, y);
-+ auto r = SkColorGetR(*pixel), g = SkColorGetG(*pixel), b = SkColorGetB(*pixel), a = SkColorGetA(*pixel);
-+
-+ r = shuffleComponent(r, UINT8_MAX-1, shuffleR);
-+ g = shuffleComponent(g, UINT8_MAX-1, shuffleG);
-+ b = shuffleComponent(b, UINT8_MAX-1, shuffleB);
-+ // alpha is left unchanged
-+
-+ *pixel = SkColorSetARGB(a, r, g, b);
-+ }
-+ break;
-+ case kGray_8_SkColorType:
-+ {
-+ auto *pixel = writable_addr(uint8_t, addr, fRowBytes, x, y);
-+ *pixel = shuffleComponent(*pixel, UINT8_MAX-1, shuffleB);
-+ }
-+ break;
-+ case kRGB_565_SkColorType:
-+ {
-+ auto *pixel = writable_addr(uint16_t, addr, fRowBytes, x, y);
-+ unsigned r = SkPacked16ToR32(*pixel);
-+ unsigned g = SkPacked16ToG32(*pixel);
-+ unsigned b = SkPacked16ToB32(*pixel);
-+
-+ r = shuffleComponent(r, 31, shuffleR);
-+ g = shuffleComponent(g, 63, shuffleG);
-+ b = shuffleComponent(b, 31, shuffleB);
-+
-+ unsigned r16 = (r & SK_R16_MASK) << SK_R16_SHIFT;
-+ unsigned g16 = (g & SK_G16_MASK) << SK_G16_SHIFT;
-+ unsigned b16 = (b & SK_B16_MASK) << SK_B16_SHIFT;
-+
-+ *pixel = r16 | g16 | b16;
-+ }
-+ break;
-+ case kARGB_4444_SkColorType:
-+ {
-+ auto *pixel = writable_addr(uint16_t, addr, fRowBytes, x, y);
-+ auto a = SkGetPackedA4444(*pixel), r = SkGetPackedR4444(*pixel), g = SkGetPackedG4444(*pixel), b = SkGetPackedB4444(*pixel);
-+
-+ r = shuffleComponent(r, 15, shuffleR);
-+ g = shuffleComponent(g, 15, shuffleG);
-+ b = shuffleComponent(b, 15, shuffleB);
-+ // alpha is left unchanged
-+
-+ unsigned a4 = (a & 0xF) << SK_A4444_SHIFT;
-+ unsigned r4 = (r & 0xF) << SK_R4444_SHIFT;
-+ unsigned g4 = (g & 0xF) << SK_G4444_SHIFT;
-+ unsigned b4 = (b & 0xF) << SK_B4444_SHIFT;
-+
-+ *pixel = r4 | b4 | g4 | a4;
-+ }
-+ break;
-+ case kRGBA_8888_SkColorType:
-+ {
-+ auto *pixel = writable_addr(uint32_t, addr, fRowBytes, x, y);
-+ auto a = SkGetPackedA32(*pixel), r = SkGetPackedR32(*pixel), g = SkGetPackedG32(*pixel), b = SkGetPackedB32(*pixel);
-+
-+ r = shuffleComponent(r, UINT8_MAX-1, shuffleR);
-+ g = shuffleComponent(g, UINT8_MAX-1, shuffleG);
-+ b = shuffleComponent(b, UINT8_MAX-1, shuffleB);
-+ // alpha is left unchanged
-+
-+ *pixel = (a << SK_A32_SHIFT) | (r << SK_R32_SHIFT) |
-+ (g << SK_G32_SHIFT) | (b << SK_B32_SHIFT);
-+ }
-+ break;
-+ case kBGRA_8888_SkColorType:
-+ {
-+ auto *pixel = writable_addr(uint32_t, addr, fRowBytes, x, y);
-+ auto a = SkGetPackedA32(*pixel), b = SkGetPackedR32(*pixel), g = SkGetPackedG32(*pixel), r = SkGetPackedB32(*pixel);
-+
-+ r = shuffleComponent(r, UINT8_MAX-1, shuffleR);
-+ g = shuffleComponent(g, UINT8_MAX-1, shuffleG);
-+ b = shuffleComponent(b, UINT8_MAX-1, shuffleB);
-+ // alpha is left unchanged
-+
-+ *pixel = (a << SK_BGRA_A32_SHIFT) | (r << SK_BGRA_R32_SHIFT) |
-+ (g << SK_BGRA_G32_SHIFT) | (b << SK_BGRA_B32_SHIFT);
-+ }
-+ break;
-+ default:
-+ // the remaining formats are not expected to be used in Chromium
-+ LOG(WARNING) << "BRM: ShuffleSubchannelColorData(): Ignoring pixel format";
-+ return;
-+ }
-+
-+ // keep bisecting or reset current width/height as needed
-+ if (x == 0) {
-+ currentW = w;
-+ } else {
-+ currentW = x;
-+ }
-+ if (y == 0) {
-+ currentH = h;
-+ } else {
-+ currentH = y;
-+ }
-+ }
-+}
-+
-+#undef writable_addr
-+#undef shuffleComponent
-+
- const gpu::SyncToken& StaticBitmapImage::GetSyncToken() const {
- static const gpu::SyncToken sync_token;
- return sync_token;
-diff --git a/third_party/blink/renderer/platform/graphics/static_bitmap_image.h b/third_party/blink/renderer/platform/graphics/static_bitmap_image.h
---- a/third_party/blink/renderer/platform/graphics/static_bitmap_image.h
-+++ b/third_party/blink/renderer/platform/graphics/static_bitmap_image.h
-@@ -46,6 +46,8 @@ class PLATFORM_EXPORT StaticBitmapImage : public Image {
- static scoped_refptr Create(WTF::ArrayBufferContents&,
- const SkImageInfo&);
-
-+ static void ShuffleSubchannelColorData(const void *addr, const SkImageInfo& info, int srcX, int srcY);
-+
- bool IsStaticBitmapImage() const override { return true; }
-
- // Methods overridden by all sub-classes
---
-2.11.0
-
diff --git a/build/patches/Disable-HEAD-requests-for-single-word-Omnibar-searches.patch b/build/patches/Disable-HEAD-requests-for-single-word-Omnibar-searches.patch
new file mode 100644
index 0000000000000000000000000000000000000000..3d03ddda1470ecd659b98c5002b087fd6b7602c6
--- /dev/null
+++ b/build/patches/Disable-HEAD-requests-for-single-word-Omnibar-searches.patch
@@ -0,0 +1,54 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Sun, 27 Oct 2019 10:21:19 +0100
+Subject: Disable HEAD requests for single-word Omnibar searches
+
+Patch from https://github.com/Eloston/ungoogled-chromium/issues/814#issuecomment-526873727
+---
+ chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc | 8 ++++----
+ chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.h | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc b/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc
+--- a/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc
++++ b/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc
+@@ -85,8 +85,8 @@ ChromeOmniboxNavigationObserver::ChromeOmniboxNavigationObserver(
+ shortcuts_backend_(ShortcutsBackendFactory::GetForProfile(profile)),
+ load_state_(LOAD_NOT_SEEN),
+ fetch_state_(FETCH_NOT_COMPLETE) {
+- if (alternate_nav_match_.destination_url.is_valid())
+- CreateLoader(alternate_nav_match_.destination_url);
++// if (alternate_nav_match_.destination_url.is_valid())
++// CreateLoader(alternate_nav_match_.destination_url);
+
+ // We need to start by listening to AllSources, since we don't know which tab
+ // the navigation might occur in.
+@@ -286,7 +286,7 @@ void ChromeOmniboxNavigationObserver::OnAllLoadingFinished() {
+ delete this;
+ }
+
+-void ChromeOmniboxNavigationObserver::CreateLoader(
++/*void ChromeOmniboxNavigationObserver::CreateLoader(
+ const GURL& destination_url) {
+ net::NetworkTrafficAnnotationTag traffic_annotation =
+ net::DefineNetworkTrafficAnnotation("omnibox_navigation_observer", R"(
+@@ -327,4 +327,4 @@ void ChromeOmniboxNavigationObserver::CreateLoader(
+ loader_->SetAllowHttpErrorResults(true);
+ loader_->SetOnRedirectCallback(base::BindRepeating(
+ &ChromeOmniboxNavigationObserver::OnURLRedirect, base::Unretained(this)));
+-}
++}*/
+diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.h b/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.h
+--- a/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.h
++++ b/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.h
+@@ -127,7 +127,7 @@ class ChromeOmniboxNavigationObserver : public OmniboxNavigationObserver,
+
+ // Creates a URL loader for |destination_url| and stores it in |loader_|.
+ // Does not start the loader.
+- void CreateLoader(const GURL& destination_url);
++ //void CreateLoader(const GURL& destination_url);
+
+ const base::string16 text_;
+ const AutocompleteMatch match_;
+--
+2.11.0
+
diff --git a/build/patches/Disable-NTP-remote-suggestions-by-default.patch b/build/patches/Disable-NTP-remote-suggestions-by-default.patch
index 6ed03b156093fb91195a753b9686d90b68d0fa56..13346035f1e487f9fa750ced1c738d6e09954e0e 100644
--- a/build/patches/Disable-NTP-remote-suggestions-by-default.patch
+++ b/build/patches/Disable-NTP-remote-suggestions-by-default.patch
@@ -26,7 +26,7 @@ diff --git a/components/ntp_snippets/features.cc b/components/ntp_snippets/featu
+ "KeepPrefetchedContentSuggestions", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kOptionalImagesEnabledFeature{
- "NTPRemoteSuggestionsOptionalImages", base::FEATURE_DISABLED_BY_DEFAULT};
+ "NTPRemoteSuggestionsOptionalImages", base::FEATURE_ENABLED_BY_DEFAULT};
--
2.11.0
diff --git a/build/patches/Disable-Omaha-update-checks.patch b/build/patches/Disable-Omaha-update-checks.patch
index e1641eddc8e5bac511897d0cfc705d79a520b2cc..8b9363e6b6228fbcca37896cf5ebe27367fc2648 100644
--- a/build/patches/Disable-Omaha-update-checks.patch
+++ b/build/patches/Disable-Omaha-update-checks.patch
@@ -36,7 +36,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/VersionNu
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
-@@ -439,7 +439,7 @@ const base::Feature kIntentBlockExternalFormRedirectsNoGesture{
+@@ -465,7 +465,7 @@ const base::Feature kIntentBlockExternalFormRedirectsNoGesture{
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kJellyBeanSupported{"JellyBeanSupported",
diff --git a/build/patches/Disable-signin-data-reduction-promos.patch b/build/patches/Disable-all-promo-dialogs.patch
similarity index 95%
rename from build/patches/Disable-signin-data-reduction-promos.patch
rename to build/patches/Disable-all-promo-dialogs.patch
index 7546ded9e89f9aeb656b26b94d0a553ecd62e0b6..da50411b0a423b66a55efe9c5e26ff37594ec8f3 100644
--- a/build/patches/Disable-signin-data-reduction-promos.patch
+++ b/build/patches/Disable-all-promo-dialogs.patch
@@ -1,6 +1,6 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Tue, 12 Jun 2018 15:09:26 +0200
-Subject: Disable signin/data reduction promos
+Subject: Disable all promo dialogs
---
.../chrome/browser/ChromeTabbedActivity.java | 30 +---------------------
@@ -9,7 +9,7 @@ Subject: Disable signin/data reduction promos
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
-@@ -785,35 +785,7 @@ public class ChromeTabbedActivity
+@@ -799,35 +799,7 @@ public class ChromeTabbedActivity extends ChromeActivity implements ScreenshotMo
try (TraceEvent e = TraceEvent.scoped(
"ChromeTabbedActivity.createToolbarButtonInProductHelpController")) {
ChromePreferenceManager preferenceManager = ChromePreferenceManager.getInstance();
diff --git a/build/patches/Disable-contextual-search-by-default.patch b/build/patches/Disable-contextual-search-by-default.patch
index 547ce0d579f2c8b0c2bc39151f5c1c11fbb4b988..2a13838f7f1b42fee35e060483904016f4ec92ee 100644
--- a/build/patches/Disable-contextual-search-by-default.patch
+++ b/build/patches/Disable-contextual-search-by-default.patch
@@ -2,10 +2,24 @@ From: Daniel Micay
Date: Wed, 23 Nov 2016 09:26:51 -0500
Subject: Disable contextual search by default
+Disable contextual search in preference by default
---
- chrome/browser/profiles/profile.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ .../src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java | 2 +-
+ chrome/browser/profiles/profile.cc | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
+@@ -423,7 +423,7 @@ public class PrefServiceBridge {
+ * @return Whether the Contextual Search feature was disabled by the user explicitly.
+ */
+ public boolean isContextualSearchDisabled() {
+- return getContextualSearchPreference().equals(CONTEXTUAL_SEARCH_DISABLED);
++ return !getContextualSearchPreference().equals(CONTEXTUAL_SEARCH_ENABLED);
+ }
+
+ /**
diff --git a/chrome/browser/profiles/profile.cc b/chrome/browser/profiles/profile.cc
--- a/chrome/browser/profiles/profile.cc
+++ b/chrome/browser/profiles/profile.cc
diff --git a/build/patches/Disable-data-saver.patch b/build/patches/Disable-data-saver.patch
deleted file mode 100644
index ca5d63ed04adfc50cca3ea675fba38c4ee706769..0000000000000000000000000000000000000000
--- a/build/patches/Disable-data-saver.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-From: csagan5 <32685696+csagan5@users.noreply.github.com>
-Date: Fri, 27 Oct 2017 15:53:37 +0200
-Subject: Disable data saver
-
----
- .../datareduction/DataReductionPreferenceFragment.java | 17 +++++------------
- chrome/android/java/strings/android_chrome_strings.grd | 3 ---
- 2 files changed, 5 insertions(+), 15 deletions(-)
-
-diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java
---- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java
-+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java
-@@ -45,10 +45,10 @@ public class DataReductionPreferenceFragment extends PreferenceFragmentCompat {
- public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
- PreferenceUtils.addPreferencesFromResource(this, R.xml.data_reduction_preferences);
- getActivity().setTitle(R.string.data_reduction_title_lite_mode);
-- boolean isEnabled = DataReductionProxySettings.getInstance().isDataReductionProxyEnabled();
-- mIsEnabled = !isEnabled;
-- mWasEnabledAtCreation = isEnabled;
-- updatePreferences(isEnabled);
-+
-+ mIsEnabled = false;
-+ mWasEnabledAtCreation = false;
-+ updatePreferences(false);
-
- setHasOptionsMenu(true);
-
-@@ -143,14 +143,7 @@ public class DataReductionPreferenceFragment extends PreferenceFragmentCompat {
- * Returns summary string.
- */
- public static String generateSummary(Resources resources) {
-- if (DataReductionProxySettings.getInstance().isDataReductionProxyEnabled()) {
-- String percent =
-- DataReductionProxySettings.getInstance().getContentLengthPercentSavings();
-- return resources.getString(
-- R.string.data_reduction_menu_item_summary_lite_mode, percent);
-- } else {
-- return (String) resources.getText(R.string.text_off);
-- }
-+ return (String) resources.getText(R.string.text_off);
- }
-
- private void createDataReductionSwitch(boolean isEnabled) {
-diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
---- a/chrome/android/java/strings/android_chrome_strings.grd
-+++ b/chrome/android/java/strings/android_chrome_strings.grd
-@@ -1303,9 +1303,6 @@ Your Google account may have other forms of browsing history like searches and a
-
- When Lite mode is on, Chrome uses Google servers to make pages load faster. Lite mode rewrites very slow pages to load only essential content. Lite mode does not apply to Incognito tabs.
-
--
-- %1$s49% data savings
--
-
- data saved
-
---
-2.11.0
-
diff --git a/build/patches/Disable-dynamic-module-loading.patch b/build/patches/Disable-dynamic-module-loading.patch
index 75dc01a37c9cdee20542507fc8c56bbe2e090c9f..3d81b21e96caab03ed09a82627f2839bb7653a87 100644
--- a/build/patches/Disable-dynamic-module-loading.patch
+++ b/build/patches/Disable-dynamic-module-loading.patch
@@ -13,7 +13,7 @@ Subject: Disable dynamic module loading
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
-@@ -410,19 +410,6 @@ chrome_java_sources = [
+@@ -418,19 +418,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/customtabs/content/TabCreationMode.java",
"java/src/org/chromium/chrome/browser/customtabs/dependency_injection/CustomTabActivityComponent.java",
"java/src/org/chromium/chrome/browser/customtabs/dependency_injection/CustomTabActivityModule.java",
@@ -36,7 +36,7 @@ diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
-@@ -62,7 +62,6 @@ import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabProvid
+@@ -66,7 +66,6 @@ import org.chromium.chrome.browser.customtabs.content.CustomTabIntentHandler.Int
import org.chromium.chrome.browser.customtabs.content.TabCreationMode;
import org.chromium.chrome.browser.customtabs.dependency_injection.CustomTabActivityComponent;
import org.chromium.chrome.browser.customtabs.dependency_injection.CustomTabActivityModule;
@@ -44,7 +44,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/Cust
import org.chromium.chrome.browser.customtabs.features.CustomTabNavigationBarController;
import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarCoordinator;
import org.chromium.chrome.browser.dependency_injection.ChromeActivityCommonsModule;
-@@ -129,9 +128,6 @@ public class CustomTabActivity extends ChromeActivityDO NOT CALL
* Public to be instanciable from {@link ChromeApplication}. This is however
-@@ -1354,7 +1351,6 @@ public class CustomTabsConnection {
+@@ -1373,7 +1370,6 @@ public class CustomTabsConnection {
if (ChromeApplication.isSevereMemorySignal(level)) {
getInstance().mClientManager.cleanupUnusedSessions();
}
@@ -151,9 +151,9 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/Cust
}
@VisibleForTesting
-@@ -1495,32 +1491,6 @@ public class CustomTabsConnection {
- CustomTabsSessionToken session, String url, String origin, int referrerPolicy,
- @DetachedResourceRequestMotivation int motivation);
+@@ -1510,32 +1506,6 @@ public class CustomTabsConnection {
+ recordSpeculationStatusOnSwap(SPECULATION_STATUS_ON_SWAP_BACKGROUND_TAB_NOT_MATCHED);
+ }
- public ModuleLoader getModuleLoader(ComponentName componentName, @Nullable String assetName) {
- if (!ChromeFeatureList.isEnabled(ChromeFeatureList.CCT_MODULE_DEX_LOADING)) {
@@ -187,7 +187,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/Cust
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/CustomTabActivityComponent.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/CustomTabActivityComponent.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/CustomTabActivityComponent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/CustomTabActivityComponent.java
-@@ -14,8 +14,6 @@ import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigatio
+@@ -15,8 +15,6 @@ import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigatio
import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabController;
import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabFactory;
import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabProvider;
@@ -196,7 +196,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/depe
import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarCoordinator;
import org.chromium.chrome.browser.dependency_injection.ActivityScope;
import org.chromium.chrome.browser.dependency_injection.ChromeActivityCommonsModule;
-@@ -31,8 +29,6 @@ import dagger.Subcomponent;
+@@ -32,8 +30,6 @@ import dagger.Subcomponent;
@ActivityScope
public interface CustomTabActivityComponent extends ChromeActivityComponent {
TrustedWebActivityCoordinator resolveTrustedWebActivityCoordinator();
diff --git a/build/patches/Disable-fetching-of-all-field-trials.patch b/build/patches/Disable-fetching-of-all-field-trials.patch
index ba8e38c922b8d366cc3c2ab4e755282bc1e9d239..e9143e0ded429b873f2c0df6c48633719255344b 100644
--- a/build/patches/Disable-fetching-of-all-field-trials.patch
+++ b/build/patches/Disable-fetching-of-all-field-trials.patch
@@ -46,11 +46,11 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureLi
diff --git a/components/variations/service/variations_service.cc b/components/variations/service/variations_service.cc
--- a/components/variations/service/variations_service.cc
+++ b/components/variations/service/variations_service.cc
-@@ -239,17 +239,7 @@ bool GetInstanceManipulations(const net::HttpResponseHeaders* headers,
+@@ -240,17 +240,7 @@ bool GetInstanceManipulations(const net::HttpResponseHeaders* headers,
// Variations seed fetching is only enabled in official Chrome builds, if a URL
// is specified on the command line, and for testing.
bool IsFetchingEnabled() {
--#if !defined(GOOGLE_CHROME_BUILD)
+-#if !BUILDFLAG(GOOGLE_CHROME_BRANDING)
- if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kVariationsServerURL) &&
- !g_should_fetch_for_testing) {
diff --git a/build/patches/Disable-media-router-and-remoting-by-default.patch b/build/patches/Disable-media-router-and-remoting-by-default.patch
index 92ee7e5097895a45d47994593ff065f976b6b8f9..ae8d21a51753b312a5940b043a4059d58e44f4c8 100644
--- a/build/patches/Disable-media-router-and-remoting-by-default.patch
+++ b/build/patches/Disable-media-router-and-remoting-by-default.patch
@@ -52,7 +52,7 @@ diff --git a/chrome/browser/profiles/profile.cc b/chrome/browser/profiles/profil
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
-@@ -436,7 +436,7 @@ void ProfileImpl::RegisterProfilePrefs(
+@@ -444,7 +444,7 @@ void ProfileImpl::RegisterProfilePrefs(
registry->RegisterStringPref(
prefs::kPrintPreviewDefaultDestinationSelectionRules, std::string());
registry->RegisterBooleanPref(prefs::kForceEphemeralProfiles, false);
diff --git a/build/patches/Disable-metrics-collection-for-NTP-tiles.patch b/build/patches/Disable-metrics-collection-for-NTP-tiles.patch
index 0ebed7055cc799ba0f95c4ccf4cee9c788393367..24e10d1c70daf99125df8b02e085936da5fee95b 100644
--- a/build/patches/Disable-metrics-collection-for-NTP-tiles.patch
+++ b/build/patches/Disable-metrics-collection-for-NTP-tiles.patch
@@ -78,7 +78,7 @@ diff --git a/components/ntp_tiles/BUILD.gn b/components/ntp_tiles/BUILD.gn
"most_visited_sites.cc",
"most_visited_sites.h",
"ntp_tile.cc",
-@@ -77,7 +75,6 @@ source_set("unit_tests") {
+@@ -78,7 +76,6 @@ source_set("unit_tests") {
"custom_links_manager_impl_unittest.cc",
"custom_links_store_unittest.cc",
"icon_cacher_impl_unittest.cc",
diff --git a/build/patches/Disable-metrics-on-all-I-O-threads.patch b/build/patches/Disable-metrics-on-all-I-O-threads.patch
index 0f59f3a14abb33bf3b2ef116ae19f3f98052623d..065d5f4c06bedd531424b3c12e23efee962a1254 100644
--- a/build/patches/Disable-metrics-on-all-I-O-threads.patch
+++ b/build/patches/Disable-metrics-on-all-I-O-threads.patch
@@ -10,7 +10,7 @@ Subject: Disable metrics on all I/O threads
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
-@@ -917,7 +917,7 @@ void BrowserProcessImpl::RegisterPrefs(PrefRegistrySimple* registry) {
+@@ -909,7 +909,7 @@ void BrowserProcessImpl::RegisterPrefs(PrefRegistrySimple* registry) {
#endif // defined(OS_CHROMEOS)
registry->RegisterBooleanPref(metrics::prefs::kMetricsReportingEnabled,
@@ -22,15 +22,15 @@ diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_pro
diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc
--- a/chrome/browser/profiles/profile_io_data.cc
+++ b/chrome/browser/profiles/profile_io_data.cc
-@@ -49,8 +49,6 @@
+@@ -47,8 +47,6 @@
+ #include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/cookie_config/cookie_store_util.h"
- #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h"
#include "components/dom_distiller/core/url_constants.h"
-#include "components/metrics/metrics_pref_names.h"
-#include "components/metrics/metrics_service.h"
#include "components/net_log/chrome_net_log.h"
#include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
- #include "components/prefs/pref_service.h"
+ #include "components/signin/public/base/signin_pref_names.h"
--
2.11.0
diff --git a/build/patches/Disable-omission-of-URL-elements-in-Omnibox.patch b/build/patches/Disable-omission-of-URL-elements-in-Omnibox.patch
index 00ad57d65a3b673fd918addcf0d57c7ee7b887fb..5736bb83be07d9f68da9764d4b29361867477d0d 100644
--- a/build/patches/Disable-omission-of-URL-elements-in-Omnibox.patch
+++ b/build/patches/Disable-omission-of-URL-elements-in-Omnibox.patch
@@ -11,7 +11,7 @@ a corresponding user option to individually disable their usage.
diff --git a/components/url_formatter/url_formatter.cc b/components/url_formatter/url_formatter.cc
--- a/components/url_formatter/url_formatter.cc
+++ b/components/url_formatter/url_formatter.cc
-@@ -434,13 +434,13 @@ bool IDNToUnicodeOneComponent(const base::char16* comp,
+@@ -433,13 +433,13 @@ bool IDNToUnicodeOneComponent(const base::char16* comp,
} // namespace
const FormatUrlType kFormatUrlOmitNothing = 0;
diff --git a/build/patches/Disable-plugins-enumeration.patch b/build/patches/Disable-plugins-enumeration.patch
index 001d79fd93e5317ba89b14605f94be310a3cdb2e..52cd62c8f0d0e0a154f1814cea0023a220a0ba93 100644
--- a/build/patches/Disable-plugins-enumeration.patch
+++ b/build/patches/Disable-plugins-enumeration.patch
@@ -9,7 +9,7 @@ Subject: Disable plugins enumeration
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
-@@ -1186,10 +1186,8 @@ WebContentSettingsClient* LocalFrame::GetContentSettingsClient() {
+@@ -1234,10 +1234,8 @@ WebContentSettingsClient* LocalFrame::GetContentSettingsClient() {
}
PluginData* LocalFrame::GetPluginData() const {
diff --git a/build/patches/Disable-promos-displayed-in-bookmarks-manager.patch b/build/patches/Disable-promos-displayed-in-bookmarks-manager.patch
index b6a58120e943a0c7c137e95b027fdd3048c1a7c8..e00de6cdc19822fcd1c75fe2340cc28bcfa4c1c7 100644
--- a/build/patches/Disable-promos-displayed-in-bookmarks-manager.patch
+++ b/build/patches/Disable-promos-displayed-in-bookmarks-manager.patch
@@ -105,7 +105,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/Bookm
}
@Override
-@@ -397,19 +391,6 @@ class BookmarkItemsAdapter extends RecyclerView.Adapter
+@@ -387,19 +381,6 @@ class BookmarkItemsAdapter extends RecyclerView.Adapter
if (currentUIState == BookmarkUIState.STATE_SEARCHING) return;
assert currentUIState == BookmarkUIState.STATE_FOLDER : "Unexpected UI state";
@@ -220,7 +220,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/Bookm
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ReorderBookmarkItemsAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ReorderBookmarkItemsAdapter.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ReorderBookmarkItemsAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ReorderBookmarkItemsAdapter.java
-@@ -167,8 +167,6 @@ class ReorderBookmarkItemsAdapter extends DragReorderableListAdapter {
-@@ -201,13 +196,6 @@ class ReorderBookmarkItemsAdapter extends DragReorderableListAdapter
-
--
-
--
--
--
--
+-
@@ -102,43 +109,51 @@ diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/androi
- android:key="usage_and_crash_reports"
- android:title="@string/usage_and_crash_reports_title_legacy"
- android:fragment="org.chromium.chrome.browser.preferences.privacy.UsageAndCrashReportsPreferenceFragment" />
-
-
--
--
--
-- {
String key = preference.getKey();
PrefServiceBridge prefs = PrefServiceBridge.getInstance();
@@ -326,12 +318,9 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/pri
- if (PREF_SAFE_BROWSING.equals(key)) {
- return prefs.isSafeBrowsingManaged();
- }
-- if (PREF_NETWORK_PREDICTIONS.equals(key)) {
-- return prefs.isNetworkPredictionManaged();
-- }
- return false;
- };
- }
+ if (PREF_NETWORK_PREDICTIONS.equals(key)) {
+ return prefs.isNetworkPredictionManaged();
+ }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webshare/ShareServiceImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/webshare/ShareServiceImpl.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/webshare/ShareServiceImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webshare/ShareServiceImpl.java
@@ -358,16 +347,10 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webshare/ShareS
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
-@@ -391,30 +391,12 @@ CHAR-LIMIT guidelines:
-
- Sends some cookies and searches from the address bar and search box to your default search engine
+@@ -406,12 +406,6 @@ CHAR-LIMIT guidelines:
+
+ Uses cookies to remember your preferences, even if you don't visit those pages
--
-- Preload pages for faster browsing and searching
--
--
-- Uses cookies to remember your preferences, even if you don't visit those pages
--
-
- Show suggestions for similar pages when a page can't be found
-
@@ -377,8 +360,9 @@ diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/and
Make searches and browsing better
-
- Sends URLs of pages you visit to Google
+@@ -421,12 +415,6 @@ CHAR-LIMIT guidelines:
+
+ For more settings that relate to privacy, security, and data collection, see <link>Sync and Google services</link>
-
- Help improve Chrome's features and performance
@@ -389,7 +373,7 @@ diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/and
Cancel sync?
-@@ -704,36 +686,12 @@ CHAR-LIMIT guidelines:
+@@ -728,30 +716,12 @@ CHAR-LIMIT guidelines:
Privacy
@@ -416,17 +400,11 @@ diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/and
-
-
- Sends URLs of some pages you visit to Google, when your security is at risk
--
--
-- Use page predictions
--
--
-- Preload pages for faster loading and offline reading
-
Tap to Search
-@@ -3956,9 +3914,6 @@ The site does NOT gain access to the camera. The camera images are only visible
+@@ -4041,9 +4011,6 @@ The site does NOT gain access to the camera. The camera images are only visible
You can see sites you visit in Chrome and set timers for them.\n\nGoogle gets info about the sites you set timers for and how long you visit them. This info is used to make Digital Wellbeing better.
@@ -439,7 +417,7 @@ diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/and
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
-@@ -2952,8 +2952,6 @@ jumbo_split_static_library("browser") {
+@@ -3039,8 +3039,6 @@ jumbo_split_static_library("browser") {
"download/download_commands.h",
"download/download_crx_util.cc",
"download/download_crx_util.h",
@@ -462,7 +440,7 @@ diff --git a/chrome/browser/browser_process.h b/chrome/browser/browser_process.h
namespace subresource_filter {
class RulesetService;
}
-@@ -110,10 +106,6 @@ class ResourceCoordinatorParts;
+@@ -106,10 +102,6 @@ class ResourceCoordinatorParts;
class TabManager;
}
@@ -473,7 +451,7 @@ diff --git a/chrome/browser/browser_process.h b/chrome/browser/browser_process.h
// NOT THREAD SAFE, call only from the main thread.
// These functions shouldn't return NULL unless otherwise noted.
class BrowserProcess {
-@@ -214,14 +206,6 @@ class BrowserProcess {
+@@ -210,14 +202,6 @@ class BrowserProcess {
// on this platform (or this is a unit test).
virtual StatusTray* status_tray() = 0;
@@ -499,7 +477,7 @@ diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_pro
#include "chrome/browser/shell_integration.h"
#include "chrome/browser/site_isolation/prefs_observer.h"
#include "chrome/browser/ssl/secure_origin_prefs_observer.h"
-@@ -363,8 +362,6 @@ void BrowserProcessImpl::StartTearDown() {
+@@ -361,8 +360,6 @@ void BrowserProcessImpl::StartTearDown() {
metrics_services_manager_.reset();
intranet_redirect_detector_.reset();
@@ -508,7 +486,7 @@ diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_pro
network_time_tracker_.reset();
#if BUILDFLAG(ENABLE_PLUGINS)
plugins_resource_service_.reset();
-@@ -962,22 +959,6 @@ StatusTray* BrowserProcessImpl::status_tray() {
+@@ -954,22 +951,6 @@ StatusTray* BrowserProcessImpl::status_tray() {
return status_tray_.get();
}
@@ -531,7 +509,7 @@ diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_pro
subresource_filter::RulesetService*
BrowserProcessImpl::subresource_filter_ruleset_service() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-@@ -1236,23 +1217,6 @@ void BrowserProcessImpl::CreateBackgroundPrintingManager() {
+@@ -1228,23 +1209,6 @@ void BrowserProcessImpl::CreateBackgroundPrintingManager() {
}
void BrowserProcessImpl::CreateSafeBrowsingService() {
@@ -568,7 +546,7 @@ diff --git a/chrome/browser/browser_process_impl.h b/chrome/browser/browser_proc
subresource_filter::RulesetService* subresource_filter_ruleset_service()
override;
optimization_guide::OptimizationGuideService* optimization_guide_service()
-@@ -313,9 +310,6 @@ class BrowserProcessImpl : public BrowserProcess,
+@@ -312,9 +309,6 @@ class BrowserProcessImpl : public BrowserProcess,
std::unique_ptr background_mode_manager_;
#endif
@@ -581,16 +559,17 @@ diff --git a/chrome/browser/browser_process_impl.h b/chrome/browser/browser_proc
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
-@@ -249,16 +249,6 @@ bool DoesOriginMatchEmbedderMask(int origin_type_mask,
+@@ -256,17 +256,6 @@ bool DoesOriginMatchEmbedderMask(int origin_type_mask,
return false;
}
-// Callback for when cookies have been deleted. Invokes NotifyIfDone.
-// Receiving |cookie_manager| as a parameter so that the receive pipe is
-// not deleted before the response is received.
--void OnClearedCookies(base::OnceClosure done,
-- network::mojom::CookieManagerPtr cookie_manager,
-- uint32_t num_deleted) {
+-void OnClearedCookies(
+- base::OnceClosure done,
+- mojo::Remote cookie_manager,
+- uint32_t num_deleted) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- std::move(done).Run();
-}
@@ -598,7 +577,7 @@ diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.
} // namespace
ChromeBrowsingDataRemoverDelegate::ChromeBrowsingDataRemoverDelegate(
-@@ -637,36 +627,6 @@ void ChromeBrowsingDataRemoverDelegate::RemoveEmbedderData(
+@@ -662,36 +651,6 @@ void ChromeBrowsingDataRemoverDelegate::RemoveEmbedderData(
CONTENT_SETTINGS_TYPE_CLIENT_HINTS, base::Time(), base::Time::Max(),
website_settings_filter);
@@ -610,9 +589,9 @@ diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.
- safe_browsing::SafeBrowsingService* sb_service =
- g_browser_process->safe_browsing_service();
- if (sb_service) {
-- network::mojom::CookieManagerPtr cookie_manager;
+- mojo::Remote cookie_manager;
- sb_service->GetNetworkContext()->GetCookieManager(
-- mojo::MakeRequest(&cookie_manager));
+- cookie_manager.BindNewPipeAndPassReceiver());
-
- network::mojom::CookieManager* manager_ptr = cookie_manager.get();
-
@@ -638,18 +617,21 @@ diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.
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
-@@ -119,9 +119,6 @@
+@@ -120,10 +120,9 @@
#include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h"
#include "chrome/browser/renderer_preferences_util.h"
#include "chrome/browser/resource_coordinator/background_tab_navigation_throttle.h"
-#include "chrome/browser/safe_browsing/certificate_reporting_service.h"
-#include "chrome/browser/safe_browsing/certificate_reporting_service_factory.h"
-#include "chrome/browser/safe_browsing/safe_browsing_navigation_throttle.h"
++#if defined(FULL_SAFE_BROWSING)
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
++#endif
#include "chrome/browser/safe_browsing/ui_manager.h"
#include "chrome/browser/safe_browsing/url_checker_delegate_impl.h"
-@@ -137,7 +134,7 @@
- #include "chrome/browser/speech/tts_message_filter.h"
+ #include "chrome/browser/search/search.h"
+@@ -136,11 +135,13 @@
+ #include "chrome/browser/speech/tts_controller_delegate_impl.h"
#include "chrome/browser/ssl/insecure_sensitive_input_driver_factory.h"
#include "chrome/browser/ssl/ssl_blocking_page.h"
-#include "chrome/browser/ssl/ssl_cert_reporter.h"
@@ -657,7 +639,13 @@ diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/ch
#include "chrome/browser/ssl/ssl_client_auth_metrics.h"
#include "chrome/browser/ssl/ssl_client_certificate_selector.h"
#include "chrome/browser/ssl/ssl_error_handler.h"
-@@ -909,30 +906,6 @@ void SetApplicationLocaleOnIOThread(const std::string& locale) {
++#if defined(FULL_SAFE_BROWSING)
+ #include "chrome/browser/ssl/ssl_error_navigation_throttle.h"
++#endif
+ #include "chrome/browser/ssl/typed_navigation_timing_throttle.h"
+ #include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h"
+ #include "chrome/browser/sync_file_system/local/sync_file_system_backend.h"
+@@ -862,30 +863,6 @@ void SetApplicationLocaleOnIOThread(const std::string& locale) {
GetIOThreadApplicationLocale() = locale;
}
@@ -688,7 +676,17 @@ diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/ch
#if defined(OS_ANDROID)
float GetDeviceScaleAdjustment() {
static const float kMinFSM = 1.05f;
-@@ -2061,7 +2034,7 @@ void ChromeContentBrowserClient::AppendExtraCommandLineSwitches(
+@@ -1264,7 +1241,9 @@ void ChromeContentBrowserClient::PostAfterStartupTask(
+ InitNetworkContextsParentDirectory();
+
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
++#if defined(FULL_SAFE_BROWSING)
+ safe_browsing_service_ = g_browser_process->safe_browsing_service();
++#endif
+ }
+
+ bool ChromeContentBrowserClient::IsBrowserStartupComplete() {
+@@ -2031,7 +2010,7 @@ void ChromeContentBrowserClient::AppendExtraCommandLineSwitches(
}
#elif defined(OS_POSIX)
#if defined(OS_ANDROID)
@@ -697,7 +695,7 @@ diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/ch
#else
bool enable_crash_reporter = breakpad::IsCrashReporterEnabled();
#endif
-@@ -2154,7 +2127,7 @@ void ChromeContentBrowserClient::AppendExtraCommandLineSwitches(
+@@ -2122,7 +2101,7 @@ void ChromeContentBrowserClient::AppendExtraCommandLineSwitches(
// Disable client-side phishing detection in the renderer if it is
// disabled in the Profile preferences or the browser process.
if (!prefs->GetBoolean(prefs::kSafeBrowsingEnabled) ||
@@ -706,29 +704,22 @@ diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/ch
command_line->AppendSwitch(
switches::kDisableClientSidePhishingDetection);
}
-@@ -3013,9 +2986,6 @@ bool ChromeContentBrowserClient::CanCreateWindow(
-
- void ChromeContentBrowserClient::ResourceDispatcherHostCreated() {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
--
-- // TODO(jam): move this creation elsewhere so we can remove this method.
-- safe_browsing_service_ = g_browser_process->safe_browsing_service();
- }
+@@ -4202,12 +4181,12 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation(
- content::SpeechRecognitionManagerDelegate*
-@@ -4251,11 +4221,6 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation(
throttles.push_back(std::make_unique(
handle, handle->GetWebContents()->GetBrowserContext()));
-
-- throttles.push_back(std::make_unique(
-- handle,
-- std::make_unique(web_contents),
-- base::Bind(&SSLErrorHandler::HandleSSLError)));
-
++#if defined(FULL_SAFE_BROWSING)
+ throttles.push_back(std::make_unique(
+ handle,
+ std::make_unique(web_contents),
+ base::Bind(&SSLErrorHandler::HandleSSLError)));
+-
++#endif
+ throttles.push_back(std::make_unique(handle));
+
std::unique_ptr https_upgrade_timing_throttle =
- TypedNavigationTimingThrottle::MaybeCreateThrottleFor(handle);
- if (https_upgrade_timing_throttle)
-@@ -4284,11 +4249,6 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation(
+@@ -4238,11 +4217,6 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation(
PreviewsLitePageDecider::MaybeCreateThrottleFor(handle);
if (previews_lite_page_throttle)
throttles.push_back(std::move(previews_lite_page_throttle));
@@ -740,7 +731,7 @@ diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/ch
#if defined(OS_WIN) || defined(OS_MACOSX) || \
(defined(OS_LINUX) && !defined(OS_CHROMEOS))
-@@ -5426,19 +5386,7 @@ ChromeContentBrowserClient::GetSafeBrowsingUrlCheckerDelegate(
+@@ -5250,19 +5224,7 @@ ChromeContentBrowserClient::GetSafeBrowsingUrlCheckerDelegate(
content::ResourceContext* resource_context) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -798,18 +789,19 @@ diff --git a/chrome/browser/component_updater/file_type_policies_component_insta
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
--- a/chrome/browser/download/chrome_download_manager_delegate.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc
-@@ -40,8 +40,10 @@
+@@ -40,9 +40,11 @@
#include "chrome/browser/download/save_package_file_picker.h"
#include "chrome/browser/platform_util.h"
#include "chrome/browser/profiles/profile.h"
+#if defined(FULL_SAFE_BROWSING)
+ #include "chrome/browser/safe_browsing/download_protection/binary_upload_service.h"
#include "chrome/browser/safe_browsing/download_protection/download_protection_util.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
+#endif
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
#include "chrome/common/buildflags.h"
-@@ -50,7 +52,9 @@
+@@ -51,7 +53,9 @@
#include "chrome/common/chrome_paths.h"
#include "chrome/common/pdf_util.h"
#include "chrome/common/pref_names.h"
@@ -819,7 +811,7 @@ diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrom
#include "chrome/grit/generated_resources.h"
#include "components/download/public/common/download_danger_type.h"
#include "components/download/public/common/download_features.h"
-@@ -110,8 +114,10 @@ using content::DownloadManager;
+@@ -122,8 +126,10 @@ using content::DownloadManager;
using download::DownloadItem;
using download::DownloadPathReservationTracker;
using download::PathValidationResult;
@@ -830,7 +822,7 @@ diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrom
namespace {
-@@ -325,13 +331,6 @@ ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() {
+@@ -345,13 +351,6 @@ ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() {
void ChromeDownloadManagerDelegate::SetDownloadManager(DownloadManager* dm) {
download_manager_ = dm;
@@ -844,7 +836,7 @@ diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrom
}
#if defined(OS_ANDROID)
-@@ -636,16 +635,6 @@ void ChromeDownloadManagerDelegate::ChooseSavePath(
+@@ -654,16 +653,6 @@ void ChromeDownloadManagerDelegate::ChooseSavePath(
void ChromeDownloadManagerDelegate::SanitizeSavePackageResourceName(
base::FilePath* filename) {
@@ -861,15 +853,15 @@ diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrom
}
void ChromeDownloadManagerDelegate::OpenDownloadUsingPlatformHandler(
-@@ -779,19 +768,19 @@ ChromeDownloadManagerDelegate::ApplicationClientIdForFileScanning() {
+@@ -797,19 +786,19 @@ ChromeDownloadManagerDelegate::ApplicationClientIdForFileScanning() {
return std::string(chrome::kApplicationClientIDStringForAVScanning);
}
-+#if defined(FULL_SAFE_BROWSING)
++#if BUILDFLAG(FULL_SAFE_BROWSING)
DownloadProtectionService*
ChromeDownloadManagerDelegate::GetDownloadProtectionService() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
--#if defined(FULL_SAFE_BROWSING)
+-#if BUILDFLAG(FULL_SAFE_BROWSING)
safe_browsing::SafeBrowsingService* sb_service =
g_browser_process->safe_browsing_service();
if (sb_service && sb_service->download_protection_service() &&
@@ -883,7 +875,7 @@ diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrom
void ChromeDownloadManagerDelegate::ShouldBlockDownload(
download::DownloadItem* download,
-@@ -1254,13 +1243,17 @@ void ChromeDownloadManagerDelegate::OnDownloadTargetDetermined(
+@@ -1262,13 +1251,17 @@ void ChromeDownloadManagerDelegate::OnDownloadTargetDetermined(
DownloadItemModel(item).SetShouldPreferOpeningInBrowser(true);
#endif
@@ -926,7 +918,7 @@ diff --git a/chrome/browser/download/chrome_download_manager_delegate.h b/chrome
// Show file picker for |download|.
virtual void ShowFilePickerForDownload(
-@@ -206,9 +210,11 @@ class ChromeDownloadManagerDelegate
+@@ -205,9 +209,11 @@ class ChromeDownloadManagerDelegate
const content::NotificationSource& source,
const content::NotificationDetails& details) override;
@@ -953,7 +945,7 @@ diff --git a/chrome/browser/download/download_item_model.cc b/chrome/browser/dow
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "components/download/public/common/download_danger_type.h"
-@@ -42,7 +44,9 @@
+@@ -43,7 +45,9 @@
using base::TimeDelta;
using download::DownloadItem;
@@ -963,7 +955,7 @@ diff --git a/chrome/browser/download/download_item_model.cc b/chrome/browser/dow
namespace {
-@@ -72,9 +76,11 @@ class DownloadItemModelData : public base::SupportsUserData::Data {
+@@ -73,9 +77,11 @@ class DownloadItemModelData : public base::SupportsUserData::Data {
// for the file type.
bool should_prefer_opening_in_browser_;
@@ -975,7 +967,7 @@ diff --git a/chrome/browser/download/download_item_model.cc b/chrome/browser/dow
// Whether the download is currently being revived.
bool is_being_revived_;
-@@ -111,7 +117,9 @@ DownloadItemModelData::DownloadItemModelData()
+@@ -112,7 +118,9 @@ DownloadItemModelData::DownloadItemModelData()
: should_show_in_shelf_(true),
was_ui_notified_(false),
should_prefer_opening_in_browser_(false),
@@ -985,7 +977,7 @@ diff --git a/chrome/browser/download/download_item_model.cc b/chrome/browser/dow
is_being_revived_(false) {}
} // namespace
-@@ -377,6 +385,7 @@ void DownloadItemModel::SetShouldPreferOpeningInBrowser(bool preference) {
+@@ -378,6 +386,7 @@ void DownloadItemModel::SetShouldPreferOpeningInBrowser(bool preference) {
data->should_prefer_opening_in_browser_ = preference;
}
@@ -993,7 +985,7 @@ diff --git a/chrome/browser/download/download_item_model.cc b/chrome/browser/dow
DownloadFileType::DangerLevel DownloadItemModel::GetDangerLevel() const {
const DownloadItemModelData* data = DownloadItemModelData::Get(download_);
return data ? data->danger_level_ : DownloadFileType::NOT_DANGEROUS;
-@@ -387,6 +396,7 @@ void DownloadItemModel::SetDangerLevel(
+@@ -388,6 +397,7 @@ void DownloadItemModel::SetDangerLevel(
DownloadItemModelData* data = DownloadItemModelData::GetOrCreate(download_);
data->danger_level_ = danger_level;
}
@@ -1001,7 +993,7 @@ diff --git a/chrome/browser/download/download_item_model.cc b/chrome/browser/dow
bool DownloadItemModel::IsBeingRevived() const {
const DownloadItemModelData* data = DownloadItemModelData::Get(download_);
-@@ -535,9 +545,6 @@ bool DownloadItemModel::IsCommandEnabled(
+@@ -536,9 +546,6 @@ bool DownloadItemModel::IsCommandEnabled(
// filename. Don't base an "Always open" decision based on it. Also
// exclude extensions.
return download_->CanOpenDownload() &&
@@ -1099,7 +1091,7 @@ diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/brow
#include "chrome/grit/generated_resources.h"
#include "components/download/public/common/download_interrupt_reasons.h"
#include "components/history/core/browser/history_service.h"
-@@ -59,13 +61,16 @@
+@@ -60,13 +62,16 @@
using content::BrowserThread;
using download::DownloadItem;
using download::DownloadPathReservationTracker;
@@ -1116,7 +1108,7 @@ diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/brow
// Condenses the results from HistoryService::GetVisibleVisitCountToHost() to a
// single bool. A host is considered visited before if prior visible visits were
// found in history and the first such visit was earlier than the most recent
-@@ -76,6 +81,7 @@ void VisitCountsToVisitedBefore(base::OnceCallback callback,
+@@ -77,6 +82,7 @@ void VisitCountsToVisitedBefore(base::OnceCallback callback,
result.success && result.count > 0 &&
(result.first_visit.LocalMidnight() < base::Time::Now().LocalMidnight()));
}
@@ -1124,7 +1116,7 @@ diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/brow
#if defined(OS_WIN)
// Keeps track of whether Adobe Reader is up to date.
-@@ -100,7 +106,9 @@ DownloadTargetDeterminer::DownloadTargetDeterminer(
+@@ -101,7 +107,9 @@ DownloadTargetDeterminer::DownloadTargetDeterminer(
create_target_directory_(false),
conflict_action_(conflict_action),
danger_type_(download->GetDangerType()),
@@ -1134,7 +1126,7 @@ diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/brow
virtual_path_(initial_virtual_path),
is_filetype_handled_safely_(false),
#if defined(OS_ANDROID)
-@@ -258,8 +266,12 @@ DownloadTargetDeterminer::Result
+@@ -259,8 +267,12 @@ DownloadTargetDeterminer::Result
// |suggested_filename| and Content-Disposition header have higher priority
// than the URL.
bool safe_file_ext =
@@ -1147,7 +1139,7 @@ diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/brow
net::HttpContentDisposition content_disposition_header(
download_->GetContentDisposition(), referrer_charset);
bool should_replace_extension =
-@@ -777,6 +789,7 @@ DownloadTargetDeterminer::Result
+@@ -789,6 +801,7 @@ DownloadTargetDeterminer::Result
return CONTINUE;
}
@@ -1155,7 +1147,7 @@ diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/brow
// First determine the danger level assuming that the user doesn't have any
// prior visits to the referrer recoreded in history. The resulting danger
// level would be ALLOW_ON_USER_GESTURE if the level depends on the visit
-@@ -813,6 +826,7 @@ DownloadTargetDeterminer::Result
+@@ -825,6 +838,7 @@ DownloadTargetDeterminer::Result
// invalid, then assume the referrer has not been visited before.
if (danger_type_ == download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS)
danger_type_ = download::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE;
@@ -1163,7 +1155,7 @@ diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/brow
return CONTINUE;
}
-@@ -820,11 +834,13 @@ void DownloadTargetDeterminer::CheckVisitedReferrerBeforeDone(
+@@ -832,11 +846,13 @@ void DownloadTargetDeterminer::CheckVisitedReferrerBeforeDone(
bool visited_referrer_before) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK_EQ(STATE_DETERMINE_INTERMEDIATE_PATH, next_state_);
@@ -1177,7 +1169,7 @@ diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/brow
DoLoop();
}
-@@ -929,7 +945,9 @@ void DownloadTargetDeterminer::ScheduleCallbackAndDeleteSelf(
+@@ -941,7 +957,9 @@ void DownloadTargetDeterminer::ScheduleCallbackAndDeleteSelf(
<< " Intermediate:" << intermediate_path_.AsUTF8Unsafe()
<< " Confirmation reason:" << static_cast(confirmation_reason_)
<< " Danger type:" << danger_type_
@@ -1187,7 +1179,7 @@ diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/brow
<< " Result:" << static_cast(result);
std::unique_ptr target_info(new DownloadTargetInfo);
-@@ -941,7 +959,9 @@ void DownloadTargetDeterminer::ScheduleCallbackAndDeleteSelf(
+@@ -953,7 +971,9 @@ void DownloadTargetDeterminer::ScheduleCallbackAndDeleteSelf(
? DownloadItem::TARGET_DISPOSITION_PROMPT
: DownloadItem::TARGET_DISPOSITION_OVERWRITE);
target_info->danger_type = danger_type_;
@@ -1197,7 +1189,7 @@ diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/brow
target_info->intermediate_path = intermediate_path_;
target_info->mime_type = mime_type_;
target_info->is_filetype_handled_safely = is_filetype_handled_safely_;
-@@ -1027,6 +1047,7 @@ bool DownloadTargetDeterminer::HasPromptedForPath() const {
+@@ -1039,6 +1059,7 @@ bool DownloadTargetDeterminer::HasPromptedForPath() const {
DownloadItem::TARGET_DISPOSITION_PROMPT);
}
@@ -1205,7 +1197,7 @@ diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/brow
DownloadFileType::DangerLevel DownloadTargetDeterminer::GetDangerLevel(
PriorVisitsToReferrer visits) const {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
-@@ -1056,30 +1077,9 @@ DownloadFileType::DangerLevel DownloadTargetDeterminer::GetDangerLevel(
+@@ -1063,30 +1084,9 @@ DownloadFileType::DangerLevel DownloadTargetDeterminer::GetDangerLevel(
download_->HasUserGesture())
return DownloadFileType::NOT_DANGEROUS;
@@ -1329,7 +1321,7 @@ diff --git a/chrome/browser/download/download_target_info.h b/chrome/browser/dow
diff --git a/chrome/browser/download/download_ui_model.cc b/chrome/browser/download/download_ui_model.cc
--- a/chrome/browser/download/download_ui_model.cc
+++ b/chrome/browser/download/download_ui_model.cc
-@@ -30,7 +30,9 @@
+@@ -32,7 +32,9 @@
using base::TimeDelta;
using download::DownloadItem;
@@ -1339,7 +1331,7 @@ diff --git a/chrome/browser/download/download_ui_model.cc b/chrome/browser/downl
using offline_items_collection::FailState;
namespace {
-@@ -386,12 +388,14 @@ bool DownloadUIModel::ShouldPreferOpeningInBrowser() const {
+@@ -390,12 +392,14 @@ bool DownloadUIModel::ShouldPreferOpeningInBrowser() const {
void DownloadUIModel::SetShouldPreferOpeningInBrowser(bool preference) {}
@@ -1394,7 +1386,7 @@ diff --git a/chrome/browser/extensions/api/downloads/downloads_api.cc b/chrome/b
#include "chrome/browser/download/download_file_icon_extractor.h"
#include "chrome/browser/download/download_open_prompt.h"
#include "chrome/browser/download/download_prefs.h"
-@@ -1310,9 +1309,6 @@ DownloadsAcceptDangerFunction::DownloadsAcceptDangerFunction() {}
+@@ -1311,9 +1310,6 @@ DownloadsAcceptDangerFunction::DownloadsAcceptDangerFunction() {}
DownloadsAcceptDangerFunction::~DownloadsAcceptDangerFunction() {}
@@ -1404,7 +1396,7 @@ diff --git a/chrome/browser/extensions/api/downloads/downloads_api.cc b/chrome/b
bool DownloadsAcceptDangerFunction::RunAsync() {
std::unique_ptr params(
downloads::AcceptDanger::Params::Create(*args_));
-@@ -1350,40 +1346,7 @@ void DownloadsAcceptDangerFunction::PromptOrWait(int download_id, int retries) {
+@@ -1351,40 +1347,7 @@ void DownloadsAcceptDangerFunction::PromptOrWait(int download_id, int retries) {
return;
}
RecordApiFunctions(DOWNLOADS_FUNCTION_ACCEPT_DANGER);
@@ -1486,7 +1478,7 @@ diff --git a/chrome/browser/extensions/api/downloads/downloads_api.h b/chrome/br
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
-@@ -681,51 +681,9 @@ WebstorePrivateGetReferrerChainFunction::
+@@ -682,51 +682,9 @@ WebstorePrivateGetReferrerChainFunction::
ExtensionFunction::ResponseAction
WebstorePrivateGetReferrerChainFunction::Run() {
@@ -1620,7 +1612,7 @@ diff --git a/chrome/browser/extensions/blacklist_state_fetcher.h b/chrome/browse
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc
--- a/chrome/browser/metrics/chrome_metrics_service_client.cc
+++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
-@@ -772,9 +772,6 @@ void ChromeMetricsServiceClient::RegisterMetricsServiceProviders() {
+@@ -773,9 +773,6 @@ void ChromeMetricsServiceClient::RegisterMetricsServiceProviders() {
metrics_service_->RegisterMetricsProvider(
std::make_unique());
@@ -1630,10 +1622,141 @@ diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/br
#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
metrics_service_->RegisterMetricsProvider(
std::make_unique());
+diff --git a/chrome/browser/native_file_system/chrome_native_file_system_permission_context.cc b/chrome/browser/native_file_system/chrome_native_file_system_permission_context.cc
+--- a/chrome/browser/native_file_system/chrome_native_file_system_permission_context.cc
++++ b/chrome/browser/native_file_system/chrome_native_file_system_permission_context.cc
+@@ -18,7 +18,6 @@
+ #include "chrome/browser/native_file_system/native_file_system_permission_context_factory.h"
+ #include "chrome/browser/native_file_system/native_file_system_permission_request_manager.h"
+ #include "chrome/browser/profiles/profile.h"
+-#include "chrome/browser/safe_browsing/download_protection/download_protection_service.h"
+ #include "chrome/browser/sessions/session_tab_helper.h"
+ #include "chrome/browser/ui/browser_dialogs.h"
+ #include "chrome/common/chrome_paths.h"
+@@ -322,74 +321,6 @@ class ReadPermissionGrantImpl
+ PermissionStatus status_ = PermissionStatus::GRANTED;
+ };
+
+-void DoSafeBrowsingCheckOnUIThread(
+- int process_id,
+- int frame_id,
+- std::unique_ptr item,
+- safe_browsing::CheckDownloadCallback callback) {
+- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+-
+- safe_browsing::SafeBrowsingService* sb_service =
+- g_browser_process->safe_browsing_service();
+-
+- if (!sb_service || !sb_service->download_protection_service() ||
+- !sb_service->download_protection_service()->enabled()) {
+- std::move(callback).Run(safe_browsing::DownloadCheckResult::UNKNOWN);
+- return;
+- }
+-
+- if (!item->browser_context) {
+- content::RenderProcessHost* rph =
+- content::RenderProcessHost::FromID(process_id);
+- if (!rph) {
+- std::move(callback).Run(safe_browsing::DownloadCheckResult::UNKNOWN);
+- return;
+- }
+- item->browser_context = rph->GetBrowserContext();
+- }
+-
+- if (!item->web_contents) {
+- content::RenderFrameHost* rfh =
+- content::RenderFrameHost::FromID(process_id, frame_id);
+- if (rfh)
+- item->web_contents = content::WebContents::FromRenderFrameHost(rfh);
+- }
+-
+- sb_service->download_protection_service()->CheckNativeFileSystemWrite(
+- std::move(item), std::move(callback));
+-}
+-
+-ChromeNativeFileSystemPermissionContext::SafeBrowsingResult
+-InterpretSafeBrowsingResult(safe_browsing::DownloadCheckResult result) {
+- using Result = safe_browsing::DownloadCheckResult;
+- switch (result) {
+- // Only allow downloads that are marked as SAFE or UNKNOWN by SafeBrowsing.
+- // All other types are going to be blocked. UNKNOWN could be the result of a
+- // failed safe browsing ping.
+- case Result::UNKNOWN:
+- case Result::SAFE:
+- case Result::WHITELISTED_BY_POLICY:
+- return ChromeNativeFileSystemPermissionContext::SafeBrowsingResult::
+- kAllow;
+-
+- case Result::DANGEROUS:
+- case Result::UNCOMMON:
+- case Result::DANGEROUS_HOST:
+- case Result::POTENTIALLY_UNWANTED:
+- case Result::BLOCKED_PASSWORD_PROTECTED:
+- return ChromeNativeFileSystemPermissionContext::SafeBrowsingResult::
+- kBlock;
+-
+- // This shouldn't be returned for Native File System write checks.
+- case Result::ASYNC_SCANNING:
+- NOTREACHED();
+- return ChromeNativeFileSystemPermissionContext::SafeBrowsingResult::
+- kAllow;
+- }
+- NOTREACHED();
+- return ChromeNativeFileSystemPermissionContext::SafeBrowsingResult::kBlock;
+-}
+-
+ } // namespace
+
+ ChromeNativeFileSystemPermissionContext::Grants::Grants() = default;
+@@ -666,28 +597,6 @@ void ChromeNativeFileSystemPermissionContext::ConfirmSensitiveDirectoryAccess(
+ std::move(callback)));
+ }
+
+-void ChromeNativeFileSystemPermissionContext::PerformSafeBrowsingChecks(
+- std::unique_ptr item,
+- int process_id,
+- int frame_id,
+- base::OnceCallback callback) {
+- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+- base::PostTask(
+- FROM_HERE, {content::BrowserThread::UI},
+- base::BindOnce(
+- &DoSafeBrowsingCheckOnUIThread, process_id, frame_id, std::move(item),
+- base::BindOnce(
+- [](scoped_refptr task_runner,
+- base::OnceCallback callback,
+- safe_browsing::DownloadCheckResult result) {
+- task_runner->PostTask(
+- FROM_HERE,
+- base::BindOnce(std::move(callback),
+- InterpretSafeBrowsingResult(result)));
+- },
+- base::SequencedTaskRunnerHandle::Get(), std::move(callback))));
+-}
+-
+ ChromeNativeFileSystemPermissionContext::Grants
+ ChromeNativeFileSystemPermissionContext::GetPermissionGrants(
+ const url::Origin& origin,
+diff --git a/chrome/browser/native_file_system/chrome_native_file_system_permission_context.h b/chrome/browser/native_file_system/chrome_native_file_system_permission_context.h
+--- a/chrome/browser/native_file_system/chrome_native_file_system_permission_context.h
++++ b/chrome/browser/native_file_system/chrome_native_file_system_permission_context.h
+@@ -155,12 +155,6 @@ class ChromeNativeFileSystemPermissionContext
+ int frame_id,
+ base::OnceCallback callback) override;
+
+- void PerformSafeBrowsingChecks(
+- std::unique_ptr item,
+- int process_id,
+- int frame_id,
+- base::OnceCallback callback) override;
+-
+ struct Grants {
+ Grants();
+ ~Grants();
diff --git a/chrome/browser/net/trial_comparison_cert_verifier_controller.cc b/chrome/browser/net/trial_comparison_cert_verifier_controller.cc
--- a/chrome/browser/net/trial_comparison_cert_verifier_controller.cc
+++ b/chrome/browser/net/trial_comparison_cert_verifier_controller.cc
-@@ -122,9 +122,6 @@ void TrialComparisonCertVerifierController::SendTrialReport(
+@@ -125,9 +125,6 @@ void TrialComparisonCertVerifierController::SendTrialReport(
std::string serialized_report;
if (!report.Serialize(&serialized_report))
return;
@@ -1646,7 +1769,7 @@ diff --git a/chrome/browser/net/trial_comparison_cert_verifier_controller.cc b/c
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
-@@ -238,7 +238,6 @@ void ChromeBrowserMainExtraPartsProfiles::
+@@ -244,7 +244,6 @@ void ChromeBrowserMainExtraPartsProfiles::
#if BUILDFLAG(ENABLE_CAPTIVE_PORTAL_DETECTION)
CaptivePortalServiceFactory::GetInstance();
#endif
@@ -1657,7 +1780,7 @@ diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
-@@ -87,7 +87,6 @@
+@@ -90,7 +90,6 @@
#include "chrome/browser/profiles/profile_metrics.h"
#include "chrome/browser/push_messaging/push_messaging_service_factory.h"
#include "chrome/browser/push_messaging/push_messaging_service_impl.h"
@@ -1665,7 +1788,7 @@ diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/p
#include "chrome/browser/sharing/sharing_service_factory.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/signin/signin_ui_util.h"
-@@ -607,16 +606,6 @@ void ProfileImpl::LoadPrefsForNormalStartup(bool async_prefs) {
+@@ -623,16 +622,6 @@ void ProfileImpl::LoadPrefsForNormalStartup(bool async_prefs) {
pref_registry_.get());
prefs::mojom::TrackedPreferenceValidationDelegatePtr pref_validation_delegate;
@@ -1685,7 +1808,7 @@ diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/p
diff --git a/chrome/browser/safe_browsing/BUILD.gn b/chrome/browser/safe_browsing/BUILD.gn
--- a/chrome/browser/safe_browsing/BUILD.gn
+++ b/chrome/browser/safe_browsing/BUILD.gn
-@@ -6,6 +6,7 @@ import("//build/config/jumbo.gni")
+@@ -7,6 +7,7 @@ import("//components/safe_browsing/buildflags.gni")
import("//extensions/buildflags/buildflags.gni")
jumbo_static_library("safe_browsing") {
@@ -1693,7 +1816,7 @@ diff --git a/chrome/browser/safe_browsing/BUILD.gn b/chrome/browser/safe_browsin
sources = [
"safe_browsing_controller_client.cc",
"safe_browsing_controller_client.h",
-@@ -19,7 +20,6 @@ jumbo_static_library("safe_browsing") {
+@@ -20,7 +21,6 @@ jumbo_static_library("safe_browsing") {
"//chrome/app:generated_resources",
"//chrome/common",
"//chrome/common:constants",
@@ -1701,7 +1824,7 @@ diff --git a/chrome/browser/safe_browsing/BUILD.gn b/chrome/browser/safe_browsin
"//components/browser_sync",
"//components/keyed_service/content",
"//components/language/core/browser",
-@@ -60,6 +60,7 @@ jumbo_static_library("safe_browsing") {
+@@ -62,6 +62,7 @@ jumbo_static_library("safe_browsing") {
]
deps += [ "//extensions/browser" ]
}
@@ -1736,7 +1859,7 @@ diff --git a/chrome/browser/ssl/captive_portal_blocking_page.cc b/chrome/browser
diff --git a/chrome/browser/ssl/cert_report_helper.cc b/chrome/browser/ssl/cert_report_helper.cc
--- a/chrome/browser/ssl/cert_report_helper.cc
+++ b/chrome/browser/ssl/cert_report_helper.cc
-@@ -179,8 +179,6 @@ void CertReportHelper::FinishCertCollection() {
+@@ -180,8 +180,6 @@ void CertReportHelper::FinishCertCollection() {
LOG(ERROR) << "Failed to serialize certificate report.";
return;
}
@@ -1748,7 +1871,7 @@ diff --git a/chrome/browser/ssl/cert_report_helper.cc b/chrome/browser/ssl/cert_
diff --git a/chrome/browser/ssl/security_state_tab_helper.cc b/chrome/browser/ssl/security_state_tab_helper.cc
--- a/chrome/browser/ssl/security_state_tab_helper.cc
+++ b/chrome/browser/ssl/security_state_tab_helper.cc
-@@ -149,76 +149,6 @@ bool SecurityStateTabHelper::UsedPolicyInstalledCertificate() const {
+@@ -160,88 +160,6 @@ bool SecurityStateTabHelper::UsedPolicyInstalledCertificate() const {
security_state::MaliciousContentStatus
SecurityStateTabHelper::GetMaliciousContentStatus() const {
@@ -1775,20 +1898,32 @@ diff --git a/chrome/browser/ssl/security_state_tab_helper.cc b/chrome/browser/ss
- return security_state::MALICIOUS_CONTENT_STATUS_MALWARE;
- case safe_browsing::SB_THREAT_TYPE_URL_UNWANTED:
- return security_state::MALICIOUS_CONTENT_STATUS_UNWANTED_SOFTWARE;
-- case safe_browsing::SB_THREAT_TYPE_SIGN_IN_PASSWORD_REUSE:
--#if defined(FULL_SAFE_BROWSING)
+- case safe_browsing::SB_THREAT_TYPE_SIGNED_IN_SYNC_PASSWORD_REUSE:
+-#if BUILDFLAG(FULL_SAFE_BROWSING)
- if (safe_browsing::ChromePasswordProtectionService::
- ShouldShowPasswordReusePageInfoBubble(
- web_contents(), PasswordType::PRIMARY_ACCOUNT_PASSWORD)) {
- return security_state::
-- MALICIOUS_CONTENT_STATUS_SIGN_IN_PASSWORD_REUSE;
+- MALICIOUS_CONTENT_STATUS_SIGNED_IN_SYNC_PASSWORD_REUSE;
+- }
+- // If user has already changed Gaia password, returns the regular
+- // social engineering content status.
+- return security_state::MALICIOUS_CONTENT_STATUS_SOCIAL_ENGINEERING;
+-#endif
+- case safe_browsing::SB_THREAT_TYPE_SIGNED_IN_NON_SYNC_PASSWORD_REUSE:
+-#if BUILDFLAG(FULL_SAFE_BROWSING)
+- if (safe_browsing::ChromePasswordProtectionService::
+- ShouldShowPasswordReusePageInfoBubble(
+- web_contents(), PasswordType::OTHER_GAIA_PASSWORD)) {
+- return security_state::
+- MALICIOUS_CONTENT_STATUS_SIGNED_IN_NON_SYNC_PASSWORD_REUSE;
- }
- // If user has already changed Gaia password, returns the regular
- // social engineering content status.
- return security_state::MALICIOUS_CONTENT_STATUS_SOCIAL_ENGINEERING;
-#endif
- case safe_browsing::SB_THREAT_TYPE_ENTERPRISE_PASSWORD_REUSE:
--#if defined(FULL_SAFE_BROWSING)
+-#if BUILDFLAG(FULL_SAFE_BROWSING)
- if (safe_browsing::ChromePasswordProtectionService::
- ShouldShowPasswordReusePageInfoBubble(
- web_contents(), PasswordType::ENTERPRISE_PASSWORD)) {
@@ -1828,7 +1963,7 @@ diff --git a/chrome/browser/ssl/security_state_tab_helper.cc b/chrome/browser/ss
diff --git a/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc b/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc
--- a/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc
+++ b/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc
-@@ -70,18 +70,6 @@ void ChromeSubresourceFilterClient::DidStartNavigation(
+@@ -70,16 +70,6 @@ void ChromeSubresourceFilterClient::DidStartNavigation(
void ChromeSubresourceFilterClient::MaybeAppendNavigationThrottles(
content::NavigationHandle* navigation_handle,
std::vector>* throttles) {
@@ -1839,21 +1974,19 @@ diff --git a/chrome/browser/subresource_filter/chrome_subresource_filter_client.
- std::make_unique(
- navigation_handle, this,
-- base::CreateSingleThreadTaskRunnerWithTraits(
-- {content::BrowserThread::IO}),
+- base::CreateSingleThreadTaskRunner({content::BrowserThread::IO}),
- safe_browsing_service->database_manager()));
- }
--
+
throttle_manager_->MaybeAppendNavigationThrottles(navigation_handle,
throttles);
- }
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
-@@ -2631,7 +2631,6 @@ jumbo_split_static_library("ui") {
- "views/desktop_capture/desktop_media_tab_list.h",
- "views/device_chooser_content_view.cc",
+@@ -2662,7 +2662,6 @@ jumbo_split_static_library("ui") {
"views/device_chooser_content_view.h",
+ "views/devtools_process_observer.cc",
+ "views/devtools_process_observer.h",
- "views/download/download_danger_prompt_views.cc",
"views/download/download_in_progress_dialog_view.cc",
"views/download/download_in_progress_dialog_view.h",
@@ -1861,7 +1994,7 @@ diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc
--- a/chrome/browser/ui/tab_helpers.cc
+++ b/chrome/browser/ui/tab_helpers.cc
-@@ -48,8 +48,8 @@
+@@ -50,8 +50,8 @@
#include "chrome/browser/previews/resource_loading_hints/resource_loading_hints_web_contents_observer.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/resource_coordinator/tab_helper.h"
@@ -1872,7 +2005,7 @@ diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc
#include "chrome/browser/sessions/session_tab_helper.h"
#include "chrome/browser/ssl/connection_help_tab_helper.h"
#include "chrome/browser/ssl/security_state_tab_helper.h"
-@@ -107,7 +107,7 @@
+@@ -108,7 +108,7 @@
#else
#include "chrome/browser/banners/app_banner_manager_desktop.h"
#include "chrome/browser/plugins/plugin_observer.h"
@@ -1881,7 +2014,7 @@ diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc
#include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h"
#include "chrome/browser/ui/hung_plugin_tab_helper.h"
#include "chrome/browser/ui/intent_picker_tab_helper.h"
-@@ -244,10 +244,6 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) {
+@@ -247,10 +247,6 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) {
PreviewsUITabHelper::CreateForWebContents(web_contents);
RecentlyAudibleHelper::CreateForWebContents(web_contents);
ResourceLoadingHintsWebContentsObserver::CreateForWebContents(web_contents);
@@ -1889,21 +2022,21 @@ diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc
- web_contents);
- safe_browsing::TriggerCreator::MaybeCreateTriggersForWebContents(
- profile, web_contents);
+ safety_tips::ReputationWebContentsObserver::CreateForWebContents(
+ web_contents);
SearchEngineTabHelper::CreateForWebContents(web_contents);
- SecurityStateTabHelper::CreateForWebContents(web_contents);
- if (SiteEngagementService::IsEnabled())
-@@ -299,7 +295,6 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) {
+@@ -303,7 +299,6 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) {
web_contents, std::make_unique());
PluginObserver::CreateForWebContents(web_contents);
SadTabHelper::CreateForWebContents(web_contents);
- safe_browsing::SafeBrowsingTabObserver::CreateForWebContents(web_contents);
SearchTabHelper::CreateForWebContents(web_contents);
TabDialogs::CreateForWebContents(web_contents);
- if (base::FeatureList::IsEnabled(features::kTabHoverCardImages))
+ if (base::FeatureList::IsEnabled(features::kTabHoverCardImages) ||
diff --git a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc b/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
--- a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
+++ b/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
-@@ -265,6 +265,7 @@ LookalikeUrlInterstitialPage* CreateLookalikeInterstitialPage(
+@@ -271,6 +271,7 @@ LookalikeUrlInterstitialPage* CreateLookalikeInterstitialPage(
safe_url));
}
@@ -1911,7 +2044,7 @@ diff --git a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc b/chrome/b
safe_browsing::SafeBrowsingBlockingPage* CreateSafeBrowsingBlockingPage(
content::WebContents* web_contents) {
safe_browsing::SBThreatType threat_type =
-@@ -323,7 +324,9 @@ safe_browsing::SafeBrowsingBlockingPage* CreateSafeBrowsingBlockingPage(
+@@ -329,7 +330,9 @@ safe_browsing::SafeBrowsingBlockingPage* CreateSafeBrowsingBlockingPage(
g_browser_process->safe_browsing_service()->ui_manager().get(),
web_contents, main_frame_url, resource);
}
@@ -1921,7 +2054,7 @@ diff --git a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc b/chrome/b
TestSafeBrowsingBlockingPageQuiet* CreateSafeBrowsingQuietBlockingPage(
content::WebContents* web_contents) {
safe_browsing::SBThreatType threat_type =
-@@ -375,6 +378,7 @@ TestSafeBrowsingBlockingPageQuiet* CreateSafeBrowsingQuietBlockingPage(
+@@ -381,6 +384,7 @@ TestSafeBrowsingBlockingPageQuiet* CreateSafeBrowsingQuietBlockingPage(
g_browser_process->safe_browsing_service()->ui_manager().get(),
web_contents, main_frame_url, resource, is_giant_webview);
}
@@ -1929,7 +2062,7 @@ diff --git a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc b/chrome/b
#if BUILDFLAG(ENABLE_CAPTIVE_PORTAL_DETECTION)
CaptivePortalBlockingPage* CreateCaptivePortalBlockingPage(
-@@ -481,8 +485,6 @@ void InterstitialHTMLSource::StartDataRequest(
+@@ -487,8 +491,6 @@ void InterstitialHTMLSource::StartDataRequest(
interstitial_delegate.reset(CreateSSLBlockingPage(web_contents));
} else if (path_without_query == "/mitm-software-ssl") {
interstitial_delegate.reset(CreateMITMSoftwareBlockingPage(web_contents));
@@ -1938,22 +2071,24 @@ diff --git a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc b/chrome/b
} else if (path_without_query == "/clock") {
interstitial_delegate.reset(CreateBadClockBlockingPage(web_contents));
} else if (path_without_query == "/lookalike") {
-@@ -498,11 +500,6 @@ void InterstitialHTMLSource::StartDataRequest(
-
- if (path_without_query == "/supervised_user") {
- html = GetSupervisedUserInterstitialHTML(path);
-- } else if (path_without_query == "/quietsafebrowsing") {
+@@ -500,13 +502,6 @@ void InterstitialHTMLSource::StartDataRequest(
+ } else if (path_without_query == "/origin_policy") {
+ interstitial_delegate.reset(
+ CreateOriginPolicyInterstitialPage(web_contents));
+- }
+-
+- if (path_without_query == "/quietsafebrowsing") {
- TestSafeBrowsingBlockingPageQuiet* blocking_page =
- CreateSafeBrowsingQuietBlockingPage(web_contents);
- interstitial_delegate.reset(blocking_page);
- html = blocking_page->GetHTML();
- } else if (interstitial_delegate.get()) {
- html = interstitial_delegate.get()->GetHTMLContents();
- } else {
+ #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+ } else if (path_without_query == "/supervised_user") {
+ html = GetSupervisedUserInterstitialHTML(path);
diff --git a/chrome/common/safe_browsing/BUILD.gn b/chrome/common/safe_browsing/BUILD.gn
--- a/chrome/common/safe_browsing/BUILD.gn
+++ b/chrome/common/safe_browsing/BUILD.gn
-@@ -13,20 +13,6 @@ proto_library("proto") {
+@@ -14,20 +14,6 @@ proto_library("proto") {
]
}
@@ -1974,7 +2109,7 @@ diff --git a/chrome/common/safe_browsing/BUILD.gn b/chrome/common/safe_browsing/
if (safe_browsing_mode == 1) {
source_set("archive_analyzer_results") {
sources = [
-@@ -149,7 +135,6 @@ if (safe_browsing_mode == 1) {
+@@ -150,7 +136,6 @@ if (safe_browsing_mode == 1) {
source_set("safe_browsing") {
deps = [
@@ -1986,18 +2121,30 @@ diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -85,7 +85,6 @@
- #include "components/error_page/common/localized_error.h"
- #include "components/network_hints/renderer/prescient_networking_dispatcher.h"
+ #include "components/page_load_metrics/renderer/metrics_render_frame_observer.h"
#include "components/pdf/renderer/pepper_pdf_host.h"
+ #include "components/safe_browsing/buildflags.h"
-#include "components/safe_browsing/renderer/threat_dom_details.h"
#include "components/spellcheck/spellcheck_buildflags.h"
#include "components/startup_metric_utils/common/startup_metric.mojom.h"
#include "components/subresource_filter/content/renderer/subresource_filter_agent.h"
+diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn
+--- a/components/password_manager/core/browser/BUILD.gn
++++ b/components/password_manager/core/browser/BUILD.gn
+@@ -12,7 +12,7 @@ if (is_android) {
+
+ # TODO(crbug.com/706392): Fix password reuse detection for Android.
+ password_reuse_detection_support = !is_android && !is_ios
+-password_on_focus_ping_support = !is_ios
++password_on_focus_ping_support = !is_android && !is_ios
+
+ config("password_reuse_detection_config") {
+ defines = []
diff --git a/components/safe_browsing/features.cc b/components/safe_browsing/features.cc
--- a/components/safe_browsing/features.cc
+++ b/components/safe_browsing/features.cc
-@@ -62,7 +62,7 @@ const base::Feature kRealTimeUrlLookupFetchAllowlist{
- base::FEATURE_DISABLED_BY_DEFAULT};
+@@ -63,7 +63,7 @@ const base::Feature kSendOnFocusPing {
+ #endif
const base::Feature kSuspiciousSiteTriggerQuotaFeature{
- "SafeBrowsingSuspiciousSiteTriggerQuota", base::FEATURE_ENABLED_BY_DEFAULT};
@@ -2005,6 +2152,138 @@ diff --git a/components/safe_browsing/features.cc b/components/safe_browsing/fea
const base::Feature kThreatDomDetailsTagAndAttributeFeature{
"ThreatDomDetailsTagAttributes", base::FEATURE_DISABLED_BY_DEFAULT};
+diff --git a/components/unified_consent/unified_consent_service.cc b/components/unified_consent/unified_consent_service.cc
+--- a/components/unified_consent/unified_consent_service.cc
++++ b/components/unified_consent/unified_consent_service.cc
+@@ -75,7 +75,7 @@ void UnifiedConsentService::SetUrlKeyedAnonymizedDataCollectionEnabled(
+ SetMigrationState(MigrationState::kCompleted);
+
+ pref_service_->SetBoolean(prefs::kUrlKeyedAnonymizedDataCollectionEnabled,
+- enabled);
++ false);
+ }
+
+ void UnifiedConsentService::Shutdown() {
+diff --git a/content/browser/native_file_system/native_file_system_file_writer_impl.cc b/content/browser/native_file_system/native_file_system_file_writer_impl.cc
+--- a/content/browser/native_file_system/native_file_system_file_writer_impl.cc
++++ b/content/browser/native_file_system/native_file_system_file_writer_impl.cc
+@@ -91,8 +91,7 @@ NativeFileSystemFileWriterImpl::NativeFileSystemFileWriterImpl(
+ url,
+ handle_state,
+ /*is_directory=*/false),
+- swap_url_(swap_url),
+- has_transient_user_activation_(has_transient_user_activation) {
++ swap_url_(swap_url) {
+ DCHECK_EQ(swap_url.type(), url.type());
+ }
+
+@@ -296,48 +295,7 @@ void NativeFileSystemFileWriterImpl::CloseImpl(CloseCallback callback) {
+ // swap file even if the writer was destroyed at that point.
+ state_ = State::kClosePending;
+
+- if (!require_safe_browsing_check() || !manager()->permission_context()) {
+- DidPassSafeBrowsingCheck(std::move(callback));
+- return;
+- }
+-
+- ComputeHashForSwapFile(base::BindOnce(
+- &NativeFileSystemFileWriterImpl::DoSafeBrowsingCheck,
+- weak_factory_.GetWeakPtr(), swap_url().path(), std::move(callback)));
+-}
+-
+-// static
+-void NativeFileSystemFileWriterImpl::DoSafeBrowsingCheck(
+- base::WeakPtr file_writer,
+- const base::FilePath& swap_path,
+- NativeFileSystemFileWriterImpl::CloseCallback callback,
+- base::File::Error hash_result,
+- const std::string& hash,
+- int64_t size) {
+- if (!file_writer || hash_result != base::File::FILE_OK) {
+- // If writer was deleted, or calculating the hash failed try deleting the
+- // swap file and invoke the callback.
+- base::PostTask(FROM_HERE, {base::ThreadPool(), base::MayBlock()},
+- base::BindOnce(base::IgnoreResult(&base::DeleteFile),
+- swap_path, /*recursive=*/false));
+- std::move(callback).Run(native_file_system_error::FromStatus(
+- NativeFileSystemStatus::kOperationAborted,
+- "Failed to perform Safe Browsing check."));
+- return;
+- }
+-
+- auto item = std::make_unique();
+- item->target_file_path = file_writer->url().path();
+- item->full_path = file_writer->swap_url().path();
+- item->sha256_hash = hash;
+- item->size = size;
+- item->frame_url = file_writer->context().url;
+- item->has_user_gesture = file_writer->has_transient_user_activation_;
+- file_writer->manager()->permission_context()->PerformSafeBrowsingChecks(
+- std::move(item), file_writer->context().process_id,
+- file_writer->context().frame_id,
+- base::BindOnce(&NativeFileSystemFileWriterImpl::DidSafeBrowsingCheck,
+- file_writer, swap_path, std::move(callback)));
++ DidPassSafeBrowsingCheck(std::move(callback));
+ }
+
+ // static
+diff --git a/content/browser/native_file_system/native_file_system_file_writer_impl.h b/content/browser/native_file_system/native_file_system_file_writer_impl.h
+--- a/content/browser/native_file_system/native_file_system_file_writer_impl.h
++++ b/content/browser/native_file_system/native_file_system_file_writer_impl.h
+@@ -88,15 +88,8 @@ class CONTENT_EXPORT NativeFileSystemFileWriterImpl
+ bool complete);
+ void TruncateImpl(uint64_t length, TruncateCallback callback);
+ void CloseImpl(CloseCallback callback);
+- // The following two methods are static, because they need to be invoked to
++ // The following method is static because it needs to be invoked to
+ // perform cleanup even if the writer was deleted before they were invoked.
+- static void DoSafeBrowsingCheck(
+- base::WeakPtr file_writer,
+- const base::FilePath& swap_path,
+- NativeFileSystemFileWriterImpl::CloseCallback callback,
+- base::File::Error hash_result,
+- const std::string& hash,
+- int64_t size);
+ static void DidSafeBrowsingCheck(
+ base::WeakPtr file_writer,
+ const base::FilePath& swap_path,
+@@ -109,7 +102,7 @@ class CONTENT_EXPORT NativeFileSystemFileWriterImpl
+
+ // Safe browsing checks only apply to native local paths.
+ bool require_safe_browsing_check() {
+- return url().type() == storage::kFileSystemTypeNativeLocal;
++ return false;
+ }
+
+ // Quarantine checks only apply to native local paths.
+@@ -149,10 +142,6 @@ class CONTENT_EXPORT NativeFileSystemFileWriterImpl
+
+ bool skip_quarantine_check_for_testing_ = false;
+
+- // Keeps track of user activation state at creation time for SafeBrowsing
+- // checks.
+- bool has_transient_user_activation_ = false;
+-
+ base::WeakPtr AsWeakPtr() override;
+
+ base::WeakPtrFactory weak_factory_{this};
+diff --git a/content/public/browser/native_file_system_permission_context.h b/content/public/browser/native_file_system_permission_context.h
+--- a/content/public/browser/native_file_system_permission_context.h
++++ b/content/public/browser/native_file_system_permission_context.h
+@@ -95,13 +95,6 @@ class NativeFileSystemPermissionContext {
+ base::OnceCallback callback) = 0;
+
+ enum class SafeBrowsingResult { kAllow, kBlock };
+- // Runs a recently finished write operation through Safe Browsing code to
+- // determine if the write should be allowed or blocked.
+- virtual void PerformSafeBrowsingChecks(
+- std::unique_ptr item,
+- int process_id,
+- int frame_id,
+- base::OnceCallback callback) = 0;
+
+ // Returns whether the given |origin| is allowed to ask for write access.
+ // This is used to block save file dialogs from being shown
--
2.11.0
diff --git a/build/patches/Disable-search-ready-omnibox-by-default.patch b/build/patches/Disable-search-ready-omnibox-by-default.patch
index c534146c77d214eba7f69ffc4f6f37b825c3a473..193d6ed151097d5ca42876e91305861822a4b935 100644
--- a/build/patches/Disable-search-ready-omnibox-by-default.patch
+++ b/build/patches/Disable-search-ready-omnibox-by-default.patch
@@ -9,7 +9,7 @@ Subject: Disable search-ready omnibox by default
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
-@@ -494,7 +494,7 @@ const base::Feature kRevampedContextMenu{"RevampedContextMenu",
+@@ -518,7 +518,7 @@ const base::Feature kRevampedContextMenu{"RevampedContextMenu",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kSearchReadyOmniboxFeature{
diff --git a/build/patches/Disable-seed-based-field-trials.patch b/build/patches/Disable-seed-based-field-trials.patch
index 479285c41f8db840d48c4ee79e6f5ee04f2d7b46..e46754874c29d3dd8bc938ac1720e1fab99ed5df 100644
--- a/build/patches/Disable-seed-based-field-trials.patch
+++ b/build/patches/Disable-seed-based-field-trials.patch
@@ -9,7 +9,7 @@ Subject: Disable seed-based field trials
diff --git a/components/variations/service/variations_field_trial_creator.cc b/components/variations/service/variations_field_trial_creator.cc
--- a/components/variations/service/variations_field_trial_creator.cc
+++ b/components/variations/service/variations_field_trial_creator.cc
-@@ -526,8 +526,10 @@ bool VariationsFieldTrialCreator::SetupFieldTrials(
+@@ -535,8 +535,10 @@ bool VariationsFieldTrialCreator::SetupFieldTrials(
#endif // BUILDFLAG(FIELDTRIAL_TESTING_ENABLED)
bool used_seed = false;
if (!used_testing_config) {
diff --git a/build/patches/Disable-signin-and-data-saver-preferences.patch b/build/patches/Disable-signin-and-data-saver-preferences.patch
deleted file mode 100644
index ec250febe5e3fb9df37d1cd9dcd71a5079791bdd..0000000000000000000000000000000000000000
--- a/build/patches/Disable-signin-and-data-saver-preferences.patch
+++ /dev/null
@@ -1,338 +0,0 @@
-From: csagan5 <32685696+csagan5@users.noreply.github.com>
-Date: Tue, 12 Jun 2018 14:23:07 +0200
-Subject: Disable signin and data saver preferences
-
-Never show the data saver promo snackbar
----
- chrome/android/java/res/xml/main_preferences.xml | 20 -----
- .../android/java/res/xml/privacy_preferences.xml | 8 --
- .../browser/preferences/MainPreferences.java | 86 +---------------------
- .../preferences/privacy/PrivacyPreferences.java | 17 -----
- .../java/strings/android_chrome_strings.grd | 6 --
- 5 files changed, 1 insertion(+), 136 deletions(-)
-
-diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml
---- a/chrome/android/java/res/xml/main_preferences.xml
-+++ b/chrome/android/java/res/xml/main_preferences.xml
-@@ -7,21 +7,6 @@
- android:orderingFromXml="false">
-
-
--
--
--
--
-@@ -91,11 +76,6 @@
- android:order="16"
- android:title="@string/prefs_languages"/>
-
--
--
--
-
-diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
---- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
-+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
-@@ -17,13 +17,11 @@ import org.chromium.base.ContextUtils;
- import org.chromium.base.VisibleForTesting;
- import org.chromium.chrome.R;
- import org.chromium.chrome.browser.ChromeFeatureList;
--import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
- import org.chromium.chrome.browser.night_mode.NightModeUtils;
- import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchConfiguration;
- import org.chromium.chrome.browser.partnercustomizations.HomepageManager;
- import org.chromium.chrome.browser.password_manager.ManagePasswordsReferrer;
- import org.chromium.chrome.browser.preferences.autofill_assistant.AutofillAssistantPreferences;
--import org.chromium.chrome.browser.preferences.datareduction.DataReductionPreferenceFragment;
- import org.chromium.chrome.browser.preferences.developer.DeveloperPreferences;
- import org.chromium.chrome.browser.preferences.sync.SignInPreference;
- import org.chromium.chrome.browser.preferences.sync.SyncPreferenceUtils;
-@@ -42,16 +40,11 @@ import java.util.Map;
- * The main settings screen, shown when the user first opens Settings.
- */
- public class MainPreferences extends PreferenceFragmentCompat
-- implements TemplateUrlService.LoadListener, ProfileSyncService.SyncStateChangedListener,
-- SigninManager.SignInStateObserver {
-- public static final String PREF_ACCOUNT_SECTION = "account_section";
-- public static final String PREF_SIGN_IN = "sign_in";
-- public static final String PREF_SYNC_AND_SERVICES = "sync_and_services";
-+ implements TemplateUrlService.LoadListener {
- public static final String PREF_SEARCH_ENGINE = "search_engine";
- public static final String PREF_SAVED_PASSWORDS = "saved_passwords";
- public static final String PREF_HOMEPAGE = "homepage";
- public static final String PREF_UI_THEME = "ui_theme";
-- public static final String PREF_DATA_REDUCTION = "data_reduction";
- public static final String PREF_NOTIFICATIONS = "notifications";
- public static final String PREF_LANGUAGES = "languages";
- public static final String PREF_DOWNLOADS = "downloads";
-@@ -65,7 +58,6 @@ public class MainPreferences extends PreferenceFragmentCompat
-
- private final ManagedPreferenceDelegateCompat mManagedPreferenceDelegate;
- private final Map mAllPreferences = new HashMap<>();
-- private SignInPreference mSignInPreference;
-
- public MainPreferences() {
- setHasOptionsMenu(true);
-@@ -88,35 +80,16 @@ public class MainPreferences extends PreferenceFragmentCompat
- @Override
- public void onDestroy() {
- super.onDestroy();
-- mSignInPreference.onPreferenceFragmentDestroyed();
- }
-
- @Override
- public void onStart() {
- super.onStart();
-- SigninManager signinManager = IdentityServicesProvider.getSigninManager();
-- if (signinManager.isSigninSupported()) {
-- signinManager.addSignInStateObserver(this);
-- mSignInPreference.registerForUpdates();
-- }
-- ProfileSyncService syncService = ProfileSyncService.get();
-- if (syncService != null) {
-- syncService.addSyncStateChangedListener(this);
-- }
- }
-
- @Override
- public void onStop() {
- super.onStop();
-- SigninManager signinManager = IdentityServicesProvider.getSigninManager();
-- if (signinManager.isSigninSupported()) {
-- signinManager.removeSignInStateObserver(this);
-- mSignInPreference.unregisterForUpdates();
-- }
-- ProfileSyncService syncService = ProfileSyncService.get();
-- if (syncService != null) {
-- syncService.removeSyncStateChangedListener(this);
-- }
- }
-
- @Override
-@@ -129,12 +102,9 @@ public class MainPreferences extends PreferenceFragmentCompat
- PreferenceUtils.addPreferencesFromResource(this, R.xml.main_preferences);
- cachePreferences();
-
-- mSignInPreference.setOnStateChangedCallback(this::onSignInPreferenceStateChanged);
--
- updatePasswordsPreference();
-
- setManagedPreferenceDelegateForPreference(PREF_SEARCH_ENGINE);
-- setManagedPreferenceDelegateForPreference(PREF_DATA_REDUCTION);
-
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- // If we are on Android O+ the Notifications preference should lead to the Android
-@@ -188,7 +158,6 @@ public class MainPreferences extends PreferenceFragmentCompat
- Preference preference = getPreferenceScreen().getPreference(index);
- mAllPreferences.put(preference.getKey(), preference);
- }
-- mSignInPreference = (SignInPreference) mAllPreferences.get(PREF_SIGN_IN);
- }
-
- private void setManagedPreferenceDelegateForPreference(String key) {
-@@ -198,13 +167,6 @@ public class MainPreferences extends PreferenceFragmentCompat
- }
-
- private void updatePreferences() {
-- if (IdentityServicesProvider.getSigninManager().isSigninSupported()) {
-- addPreferenceIfAbsent(PREF_SIGN_IN);
-- } else {
-- removePreferenceIfPresent(PREF_SIGN_IN);
-- }
--
-- updateSyncAndServicesPreference();
- updateSearchEnginePreference();
-
- Preference homepagePref = addPreferenceIfAbsent(PREF_HOMEPAGE);
-@@ -224,10 +186,6 @@ public class MainPreferences extends PreferenceFragmentCompat
- } else {
- removePreferenceIfPresent(PREF_DEVELOPER);
- }
--
-- ChromeBasePreferenceCompat dataReduction =
-- (ChromeBasePreferenceCompat) findPreference(PREF_DATA_REDUCTION);
-- dataReduction.setSummary(DataReductionPreferenceFragment.generateSummary(getResources()));
- }
-
- private Preference addPreferenceIfAbsent(String key) {
-@@ -241,13 +199,6 @@ public class MainPreferences extends PreferenceFragmentCompat
- if (preference != null) getPreferenceScreen().removePreference(preference);
- }
-
-- private void updateSyncAndServicesPreference() {
-- ChromeBasePreferenceCompat syncAndServices =
-- (ChromeBasePreferenceCompat) findPreference(PREF_SYNC_AND_SERVICES);
-- syncAndServices.setIcon(SyncPreferenceUtils.getSyncStatusIcon(getActivity()));
-- syncAndServices.setSummary(SyncPreferenceUtils.getSyncStatusSummary(getActivity()));
-- }
--
- private void updateSearchEnginePreference() {
- if (!TemplateUrlServiceFactory.get().isLoaded()) {
- ChromeBasePreferenceCompat searchEnginePref =
-@@ -279,28 +230,6 @@ public class MainPreferences extends PreferenceFragmentCompat
- pref.setSummary(getResources().getString(isOn ? R.string.text_on : R.string.text_off));
- }
-
-- // SigninManager.SignInStateObserver implementation.
-- @Override
-- public void onSignedIn() {
-- // After signing in or out of a managed account, preferences may change or become enabled
-- // or disabled.
-- new Handler().post(() -> updatePreferences());
-- }
--
-- @Override
-- public void onSignedOut() {
-- updatePreferences();
-- }
--
-- private void onSignInPreferenceStateChanged() {
-- // Remove "Account" section header if the personalized sign-in promo is shown.
-- if (mSignInPreference.getState() == SignInPreference.State.PERSONALIZED_PROMO) {
-- removePreferenceIfPresent(PREF_ACCOUNT_SECTION);
-- } else {
-- addPreferenceIfAbsent(PREF_ACCOUNT_SECTION);
-- }
-- }
--
- // TemplateUrlService.LoadListener implementation.
- @Override
- public void onTemplateUrlServiceLoaded() {
-@@ -308,11 +237,6 @@ public class MainPreferences extends PreferenceFragmentCompat
- updateSearchEnginePreference();
- }
-
-- @Override
-- public void syncStateChanged() {
-- updateSyncAndServicesPreference();
-- }
--
- @VisibleForTesting
- ManagedPreferenceDelegateCompat getManagedPreferenceDelegateForTest() {
- return mManagedPreferenceDelegate;
-@@ -322,9 +246,6 @@ public class MainPreferences extends PreferenceFragmentCompat
- return new ManagedPreferenceDelegateCompat() {
- @Override
- public boolean isPreferenceControlledByPolicy(Preference preference) {
-- if (PREF_DATA_REDUCTION.equals(preference.getKey())) {
-- return DataReductionProxySettings.getInstance().isDataReductionProxyManaged();
-- }
- if (PREF_SEARCH_ENGINE.equals(preference.getKey())) {
- return TemplateUrlServiceFactory.get().isDefaultSearchManaged();
- }
-@@ -333,11 +254,6 @@ public class MainPreferences extends PreferenceFragmentCompat
-
- @Override
- public boolean isPreferenceClickDisabledByPolicy(Preference preference) {
-- if (PREF_DATA_REDUCTION.equals(preference.getKey())) {
-- DataReductionProxySettings settings = DataReductionProxySettings.getInstance();
-- return settings.isDataReductionProxyManaged()
-- && !settings.isDataReductionProxyEnabled();
-- }
- if (PREF_SEARCH_ENGINE.equals(preference.getKey())) {
- return TemplateUrlServiceFactory.get().isDefaultSearchManaged();
- }
-diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
---- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
-+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
-@@ -25,7 +25,6 @@ import org.chromium.chrome.browser.preferences.Pref;
- import org.chromium.chrome.browser.preferences.PrefServiceBridge;
- import org.chromium.chrome.browser.preferences.PreferenceUtils;
- import org.chromium.chrome.browser.preferences.PreferencesLauncher;
--import org.chromium.chrome.browser.preferences.sync.SyncAndServicesPreferences;
- import org.chromium.chrome.browser.profiles.Profile;
- import org.chromium.chrome.browser.usage_stats.UsageStatsConsentDialog;
- import org.chromium.ui.text.NoUnderlineClickableSpan;
-@@ -47,9 +46,6 @@ public class PrivacyPreferences
- private static final String PREF_DO_NOT_TRACK = "do_not_track";
- private static final String PREF_USAGE_AND_CRASH_REPORTING = "usage_and_crash_reports";
- private static final String PREF_CLEAR_BROWSING_DATA = "clear_browsing_data";
-- private static final String PREF_SYNC_AND_SERVICES_LINK_DIVIDER =
-- "sync_and_services_link_divider";
-- private static final String PREF_SYNC_AND_SERVICES_LINK = "sync_and_services_link";
- private static final String PREF_USAGE_STATS = "usage_stats_reporting";
-
- private ManagedPreferenceDelegateCompat mManagedPreferenceDelegate;
-@@ -97,22 +93,9 @@ public class PrivacyPreferences
- networkPredictionPref.setOrder(canMakePaymentPref.getOrder());
- preferenceScreen.addPreference(networkPredictionPref);
-
-- Preference syncAndServicesLink = findPreference(PREF_SYNC_AND_SERVICES_LINK);
-- NoUnderlineClickableSpan linkSpan =
-- new NoUnderlineClickableSpan(getResources(), view -> {
-- PreferencesLauncher.launchSettingsPage(getActivity(),
-- SyncAndServicesPreferences.class,
-- SyncAndServicesPreferences.createArguments(false));
-- });
-- syncAndServicesLink.setSummary(
-- SpanApplier.applySpans(getString(R.string.privacy_sync_and_services_link),
-- new SpanApplier.SpanInfo("", "", linkSpan)));
--
- updateSummaries();
- return;
- }
-- preferenceScreen.removePreference(findPreference(PREF_SYNC_AND_SERVICES_LINK_DIVIDER));
-- preferenceScreen.removePreference(findPreference(PREF_SYNC_AND_SERVICES_LINK));
-
- ChromeBaseCheckBoxPreferenceCompat navigationErrorPref =
- (ChromeBaseCheckBoxPreferenceCompat) findPreference(PREF_NAVIGATION_ERROR);
-diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
---- a/chrome/android/java/strings/android_chrome_strings.grd
-+++ b/chrome/android/java/strings/android_chrome_strings.grd
-@@ -339,9 +339,6 @@ CHAR-LIMIT guidelines:
-
-
-
--
-- Account
--
-
- Sign in to Chrome
-
-@@ -412,9 +409,6 @@ CHAR-LIMIT guidelines:
-
- Sends URLs of pages you visit to Google
-
--
-- For more settings that relate to privacy, security, and data collection, see <link>Sync and Google services</link>
--
-
- Help improve Chrome's features and performance
-
---
-2.11.0
-
diff --git a/build/patches/Disable-some-signed-exchange-features.patch b/build/patches/Disable-some-signed-exchange-features.patch
new file mode 100644
index 0000000000000000000000000000000000000000..f3a077e5c6d0e71333b3b1f8856ffbe7131b1c0c
--- /dev/null
+++ b/build/patches/Disable-some-signed-exchange-features.patch
@@ -0,0 +1,32 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Sat, 2 Nov 2019 16:22:56 +0100
+Subject: Disable some signed exchange features
+
+---
+ content/public/common/content_features.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
+--- a/content/public/common/content_features.cc
++++ b/content/public/common/content_features.cc
+@@ -508,7 +508,7 @@ const base::Feature kSignedExchangePrefetchCacheForNavigations{
+ // Signed Exchange Reporting for distributors
+ // https://www.chromestatus.com/features/5687904902840320
+ const base::Feature kSignedExchangeReportingForDistributors{
+- "SignedExchangeReportingForDistributors", base::FEATURE_ENABLED_BY_DEFAULT};
++ "SignedExchangeReportingForDistributors", base::FEATURE_DISABLED_BY_DEFAULT};
+
+ // Subresource prefetching+loading via Signed HTTP Exchange
+ // https://www.chromestatus.com/features/5126805474246656
+@@ -518,7 +518,7 @@ const base::Feature kSignedExchangeSubresourcePrefetch{
+ // Origin-Signed HTTP Exchanges (for WebPackage Loading)
+ // https://www.chromestatus.com/features/5745285984681984
+ const base::Feature kSignedHTTPExchange{"SignedHTTPExchange",
+- base::FEATURE_ENABLED_BY_DEFAULT};
++ base::FEATURE_DISABLED_BY_DEFAULT};
+
+ // Whether to send a ping to the inner URL upon navigation or not.
+ const base::Feature kSignedHTTPExchangePingValidity{
+--
+2.11.0
+
diff --git a/build/patches/Disable-sync-services-menu-entry.patch b/build/patches/Disable-sync-services-menu-entry.patch
new file mode 100644
index 0000000000000000000000000000000000000000..eb9e811906b99f4cfa4b22a69cb55671751c18d6
--- /dev/null
+++ b/build/patches/Disable-sync-services-menu-entry.patch
@@ -0,0 +1,44 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Mon, 11 Nov 2019 23:09:48 +0100
+Subject: Disable sync services menu entry
+
+---
+ chrome/android/java/res/xml/main_preferences.xml | 6 ------
+ chrome/android/java/res/xml/privacy_preferences.xml | 7 -------
+ 2 files changed, 13 deletions(-)
+
+diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml
+--- a/chrome/android/java/res/xml/main_preferences.xml
++++ b/chrome/android/java/res/xml/main_preferences.xml
+@@ -14,12 +14,6 @@
+ android:key="sign_in"
+ android:order="1"
+ android:title="@string/sign_in_to_chrome"/>
+-
+
+
+-
+-
+
+--
+2.11.0
+
diff --git a/build/patches/Disable-third-party-cookies-by-default.patch b/build/patches/Disable-third-party-cookies-by-default.patch
index b346af69f3699d27363a1cbe0c4675cbdcd537f4..3a344badc709c446fa437397590e74e6fabd01fe 100644
--- a/build/patches/Disable-third-party-cookies-by-default.patch
+++ b/build/patches/Disable-third-party-cookies-by-default.patch
@@ -17,8 +17,8 @@ diff --git a/components/content_settings/core/browser/cookie_settings.cc b/compo
- prefs::kBlockThirdPartyCookies, false,
+ prefs::kBlockThirdPartyCookies, true,
user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
- registry->RegisterBooleanPref(
- prefs::kCookieControlsEnabled, false,
+ registry->RegisterIntegerPref(
+ prefs::kCookieControlsMode,
--
2.11.0
diff --git a/build/patches/Disable-unused-permissions.patch b/build/patches/Disable-unused-permissions.patch
deleted file mode 100644
index 775b891f588fd05f5241905cbe856ee1eff64967..0000000000000000000000000000000000000000
--- a/build/patches/Disable-unused-permissions.patch
+++ /dev/null
@@ -1,507 +0,0 @@
-From: csagan5 <32685696+csagan5@users.noreply.github.com>
-Date: Sun, 14 Apr 2019 12:08:27 +0200
-Subject: Disable unused permissions
-
-Disable sync adaptive and invalidation services from manifest
-
-Prevents authorization prompt for Play services on reboot
-
-Fixes building with debug symbols:
-
-ld.lld: error: undefined symbol: notifier::NotifierOptions::NotifierOptions()
->>> referenced by invalidation_service_util.cc:17 (../../components/invalidation/impl/invalidation_service_util.cc:17)
->>> impl/invalidation_service_util.o:(invalidation::ParseNotifierOptions(base::CommandLine const&)) in archive obj/components/invalidation/impl/libimpl.a
-
-Fixup more permission removal
----
- chrome/android/BUILD.gn | 4 +-
- chrome/android/java/AndroidManifest.xml | 27 -----
- .../chromium/chrome/browser/ChromeActivity.java | 34 ------
- .../invalidation/impl/invalidation_service_util.cc | 21 ----
- .../invalidation/impl/invalidation_service_util.h | 6 +-
- .../signin/SystemAccountManagerDelegate.java | 38 +------
- .../components/sync/AndroidSyncSettings.java | 24 +---
- .../chromium/net/HttpNegotiateAuthenticator.java | 122 +--------------------
- .../chromoting/base/OAuthTokenFetcher.java | 2 -
- 9 files changed, 13 insertions(+), 265 deletions(-)
-
-diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
---- a/chrome/android/BUILD.gn
-+++ b/chrome/android/BUILD.gn
-@@ -1131,8 +1131,7 @@ jinja_template_resources("chrome_public_apk_template_resources") {
- resources = [
- "java/res_template/xml/file_paths.xml",
- "java/res_template/xml/launchershortcuts.xml",
-- "java/res_template/xml/searchable.xml",
-- "java/res_template/xml/syncadapter.xml",
-+ "java/res_template/xml/searchable.xml"
- ]
- res_dir = "java/res_template"
- variables = [ "manifest_package=$chrome_public_manifest_package" ]
-@@ -1143,7 +1142,6 @@ jinja_template_resources("chrome_test_apk_template_resources") {
- "java/res_template/xml/file_paths.xml",
- "java/res_template/xml/launchershortcuts.xml",
- "java/res_template/xml/searchable.xml",
-- "java/res_template/xml/syncadapter.xml",
- ]
- res_dir = "java/res_template"
-
-diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
---- a/chrome/android/java/AndroidManifest.xml
-+++ b/chrome/android/java/AndroidManifest.xml
-@@ -47,22 +47,16 @@ by a child template that "extends" this file.
- {% if target_sdk_version|int > 27 or target_sdk_version == "Q" %}
-
- {% endif %}
--
-
--
-
-
-
--
--
-
-
--
-
-
-
-
--
- {% set enable_vr = enable_vr|default(0) %}
- {% if enable_vr == "true" %}
-
-@@ -103,8 +97,6 @@ by a child template that "extends" this file.
-
-
-
--
--
- {% block extra_uses_permissions %}
- {% endblock %}
-
-@@ -981,16 +973,6 @@ by a child template that "extends" this file.
- android:resource="@xml/file_paths" />
-
-
--
--
--
--
--
--
--
--
-
-
-
-@@ -1098,15 +1080,6 @@ by a child template that "extends" this file.
-
-
--
--
--
--
--
--
--
-
-
- @SuppressLint("NewApi")
- private TouchExplorationStateChangeListener mTouchExplorationStateChangeListener;
-
-- // Observes when sync becomes ready to create the mContextReporter.
-- private ProfileSyncService.SyncStateChangedListener mSyncStateChangedListener;
--
- @Nullable
- private ChromeFullscreenManager mFullscreenManager;
-
-@@ -906,28 +901,6 @@ public abstract class ChromeActivity
- private void createContextReporterIfNeeded() {
- if (!mStarted) return; // Sync state reporting should work only in started state.
- if (mContextReporter != null || getActivityTab() == null) return;
--
-- final SyncController syncController = SyncController.get(this);
-- final ProfileSyncService syncService = ProfileSyncService.get();
--
-- if (syncController != null && syncController.isSyncingUrlsWithKeystorePassphrase()) {
-- assert syncService != null;
-- mContextReporter = AppHooks.get().createGsaHelper().getContextReporter(this);
--
-- if (mSyncStateChangedListener != null) {
-- syncService.removeSyncStateChangedListener(mSyncStateChangedListener);
-- mSyncStateChangedListener = null;
-- }
--
-- return;
-- } else {
-- ContextReporter.reportSyncStatus(syncService);
-- }
--
-- if (mSyncStateChangedListener == null && syncService != null) {
-- mSyncStateChangedListener = () -> createContextReporterIfNeeded();
-- syncService.addSyncStateChangedListener(mSyncStateChangedListener);
-- }
- }
-
- @Override
-@@ -995,13 +968,6 @@ public abstract class ChromeActivity
- if (GSAState.getInstance(this).isGsaAvailable() && !SysUtils.isLowEndDevice()) {
- GSAAccountChangeListener.getInstance().disconnect();
- }
-- if (mSyncStateChangedListener != null) {
-- ProfileSyncService syncService = ProfileSyncService.get();
-- if (syncService != null) {
-- syncService.removeSyncStateChangedListener(mSyncStateChangedListener);
-- }
-- mSyncStateChangedListener = null;
-- }
- if (mContextReporter != null) mContextReporter.disable();
-
- super.onStopWithNative();
-diff --git a/components/invalidation/impl/invalidation_service_util.cc b/components/invalidation/impl/invalidation_service_util.cc
---- a/components/invalidation/impl/invalidation_service_util.cc
-+++ b/components/invalidation/impl/invalidation_service_util.cc
-@@ -12,27 +12,6 @@
-
- namespace invalidation {
-
--notifier::NotifierOptions ParseNotifierOptions(
-- const base::CommandLine& command_line) {
-- notifier::NotifierOptions notifier_options;
--
-- if (command_line.HasSwitch(switches::kSyncNotificationHostPort)) {
-- notifier_options.xmpp_host_port =
-- net::HostPortPair::FromString(
-- command_line.GetSwitchValueASCII(
-- switches::kSyncNotificationHostPort));
-- DVLOG(1) << "Using " << notifier_options.xmpp_host_port.ToString()
-- << " for test sync notification server.";
-- }
--
-- notifier_options.allow_insecure_connection =
-- command_line.HasSwitch(switches::kSyncAllowInsecureXmppConnection);
-- DVLOG_IF(1, notifier_options.allow_insecure_connection)
-- << "Allowing insecure XMPP connections.";
--
-- return notifier_options;
--}
--
- std::string GenerateInvalidatorClientId() {
- // Generate a GUID with 128 bits worth of base64-encoded randomness.
- // This format is similar to that of sync's cache_guid.
-diff --git a/components/invalidation/impl/invalidation_service_util.h b/components/invalidation/impl/invalidation_service_util.h
---- a/components/invalidation/impl/invalidation_service_util.h
-+++ b/components/invalidation/impl/invalidation_service_util.h
-@@ -5,7 +5,7 @@
- #ifndef COMPONENTS_INVALIDATION_IMPL_INVALIDATION_SERVICE_UTIL_H_
- #define COMPONENTS_INVALIDATION_IMPL_INVALIDATION_SERVICE_UTIL_H_
-
--#include "jingle/notifier/base/notifier_options.h"
-+#include
-
- namespace base {
- class CommandLine;
-@@ -13,10 +13,6 @@ class CommandLine;
-
- namespace invalidation {
-
--// Parses the given command line for notifier options.
--notifier::NotifierOptions ParseNotifierOptions(
-- const base::CommandLine& command_line);
--
- // Generates a unique client ID for the invalidator.
- std::string GenerateInvalidatorClientId();
-
-diff --git a/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java b/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
---- a/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
-+++ b/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
-@@ -167,16 +167,6 @@ public class SystemAccountManagerDelegate implements AccountManagerDelegate {
-
- @Override
- public boolean hasFeatures(Account account, String[] features) {
-- if (!hasGetAccountsPermission()) {
-- return false;
-- }
-- try {
-- return mAccountManager.hasFeatures(account, features, null, null).getResult();
-- } catch (AuthenticatorException | IOException e) {
-- Log.e(TAG, "Error while checking features: ", e);
-- } catch (OperationCanceledException e) {
-- Log.e(TAG, "Checking features was cancelled. This should not happen.");
-- }
- return false;
- }
-
-@@ -216,32 +206,10 @@ public class SystemAccountManagerDelegate implements AccountManagerDelegate {
- public void updateCredentials(
- Account account, Activity activity, final Callback callback) {
- ThreadUtils.assertOnUiThread();
-- if (!hasManageAccountsPermission()) {
-- if (callback != null) {
-- ThreadUtils.postOnUiThread(() -> callback.onResult(false));
-- }
-- return;
-+ if (callback != null) {
-+ ThreadUtils.postOnUiThread(() -> callback.onResult(false));
- }
--
-- AccountManagerCallback realCallback = future -> {
-- Bundle bundle = null;
-- try {
-- bundle = future.getResult();
-- } catch (AuthenticatorException | IOException e) {
-- Log.e(TAG, "Error while update credentials: ", e);
-- } catch (OperationCanceledException e) {
-- Log.w(TAG, "Updating credentials was cancelled.");
-- }
-- boolean success =
-- bundle != null && bundle.getString(AccountManager.KEY_ACCOUNT_TYPE) != null;
-- if (callback != null) {
-- callback.onResult(success);
-- }
-- };
-- // Android 4.4 throws NullPointerException if null is passed
-- Bundle emptyOptions = new Bundle();
-- mAccountManager.updateCredentials(
-- account, "android", emptyOptions, activity, realCallback, null);
-+ return;
- }
-
- protected boolean hasGetAccountsPermission() {
-diff --git a/components/sync/android/java/src/org/chromium/components/sync/AndroidSyncSettings.java b/components/sync/android/java/src/org/chromium/components/sync/AndroidSyncSettings.java
---- a/components/sync/android/java/src/org/chromium/components/sync/AndroidSyncSettings.java
-+++ b/components/sync/android/java/src/org/chromium/components/sync/AndroidSyncSettings.java
-@@ -212,13 +212,7 @@ public class AndroidSyncSettings {
-
- private void setChromeSyncEnabled(boolean value) {
- synchronized (mLock) {
-- updateSyncability(null);
-- if (value == mChromeSyncEnabled || mAccount == null) return;
-- mChromeSyncEnabled = value;
--
-- StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
-- mSyncContentResolverDelegate.setSyncAutomatically(mAccount, mContractAuthority, value);
-- StrictMode.setThreadPolicy(oldPolicy);
-+ mChromeSyncEnabled = false;
- }
- notifyObservers();
- }
-@@ -299,19 +293,9 @@ public class AndroidSyncSettings {
- boolean oldChromeSyncEnabled = mChromeSyncEnabled;
- boolean oldMasterSyncEnabled = mMasterSyncEnabled;
-
-- StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
-- if (mAccount != null) {
-- mIsSyncable =
-- mSyncContentResolverDelegate.getIsSyncable(mAccount, mContractAuthority)
-- == 1;
-- mChromeSyncEnabled = mSyncContentResolverDelegate.getSyncAutomatically(
-- mAccount, mContractAuthority);
-- } else {
-- mIsSyncable = false;
-- mChromeSyncEnabled = false;
-- }
-- mMasterSyncEnabled = mSyncContentResolverDelegate.getMasterSyncAutomatically();
-- StrictMode.setThreadPolicy(oldPolicy);
-+ mIsSyncable = false;
-+ mChromeSyncEnabled = false;
-+ mMasterSyncEnabled = false;
-
- return oldChromeSyncEnabled != mChromeSyncEnabled
- || oldMasterSyncEnabled != mMasterSyncEnabled;
-diff --git a/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java b/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java
---- a/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java
-+++ b/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java
-@@ -96,50 +96,7 @@ public class HttpNegotiateAuthenticator {
-
- @Override
- public void run(AccountManagerFuture future) {
-- Account[] accounts;
-- try {
-- accounts = future.getResult();
-- } catch (OperationCanceledException | AuthenticatorException | IOException e) {
-- Log.w(TAG, "ERR_UNEXPECTED: Error while attempting to retrieve accounts.", e);
-- nativeSetResult(mRequestData.nativeResultObject, NetError.ERR_UNEXPECTED, null);
-- return;
-- }
--
-- if (accounts.length == 0) {
-- Log.w(TAG, "ERR_MISSING_AUTH_CREDENTIALS: No account provided for the kerberos "
-- + "authentication. Please verify the configuration policies and "
-- + "that the CONTACTS runtime permission is granted. ");
-- nativeSetResult(mRequestData.nativeResultObject,
-- NetError.ERR_MISSING_AUTH_CREDENTIALS, null);
-- return;
-- }
--
-- if (accounts.length > 1) {
-- Log.w(TAG, "ERR_MISSING_AUTH_CREDENTIALS: Found %d accounts eligible for the "
-- + "kerberos authentication. Please fix the configuration by "
-- + "providing a single account.",
-- accounts.length);
-- nativeSetResult(mRequestData.nativeResultObject,
-- NetError.ERR_MISSING_AUTH_CREDENTIALS, null);
-- return;
-- }
--
-- if (lacksPermission(ContextUtils.getApplicationContext(),
-- "android.permission.USE_CREDENTIALS", true)) {
-- // Protecting the AccountManager#getAuthToken call.
-- // API < 23 Requires the USE_CREDENTIALS permission or throws an exception.
-- // API >= 23 USE_CREDENTIALS permission is removed
-- Log.e(TAG, "ERR_MISCONFIGURED_AUTH_ENVIRONMENT: USE_CREDENTIALS permission not "
-- + "granted. Aborting authentication.");
-- nativeSetResult(mRequestData.nativeResultObject,
-- NetError.ERR_MISCONFIGURED_AUTH_ENVIRONMENT, null);
-- return;
-- }
-- mRequestData.account = accounts[0];
-- mRequestData.accountManager.getAuthToken(mRequestData.account,
-- mRequestData.authTokenType, mRequestData.options, true /* notifyAuthFailure */,
-- new GetTokenCallback(mRequestData),
-- new Handler(ThreadUtils.getUiThreadLooper()));
-+ // account-based authentication removed for privacy-violations concerns
- }
- }
-
-@@ -152,41 +109,7 @@ public class HttpNegotiateAuthenticator {
-
- @Override
- public void run(AccountManagerFuture future) {
-- Bundle result;
-- try {
-- result = future.getResult();
-- } catch (OperationCanceledException | AuthenticatorException | IOException e) {
-- Log.w(TAG, "ERR_UNEXPECTED: Error while attempting to obtain a token.", e);
-- nativeSetResult(mRequestData.nativeResultObject, NetError.ERR_UNEXPECTED, null);
-- return;
-- }
--
-- if (result.containsKey(AccountManager.KEY_INTENT)) {
-- final Context appContext = ContextUtils.getApplicationContext();
--
-- // We wait for a broadcast that should be sent once the user is done interacting
-- // with the notification
-- // TODO(dgn) We currently hang around if the notification is swiped away, until
-- // a LOGIN_ACCOUNTS_CHANGED_ACTION filter is received. It might be for something
-- // unrelated then we would wait again here. Maybe we should limit the number of
-- // retries in some way?
-- BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
--
-- @Override
-- public void onReceive(Context context, Intent intent) {
-- appContext.unregisterReceiver(this);
-- mRequestData.accountManager.getAuthToken(mRequestData.account,
-- mRequestData.authTokenType, mRequestData.options,
-- true /* notifyAuthFailure */, new GetTokenCallback(mRequestData),
-- null);
-- }
--
-- };
-- appContext.registerReceiver(broadcastReceiver,
-- new IntentFilter(AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION));
-- } else {
-- processResult(result, mRequestData);
-- }
-+ // ditto
- }
- }
-
-@@ -300,22 +223,7 @@ public class HttpNegotiateAuthenticator {
- */
- private void requestTokenWithoutActivity(
- Context ctx, RequestData requestData, String[] features) {
-- if (lacksPermission(ctx, Manifest.permission.GET_ACCOUNTS, true /* onlyPreM */)) {
-- // Protecting the AccountManager#getAccountsByTypeAndFeatures call.
-- // API < 23 Requires the GET_ACCOUNTS permission or throws an exception.
-- // API >= 23 Requires the GET_ACCOUNTS permission (CONTACTS permission group) or
-- // returns only the accounts whose authenticator has a signature that
-- // matches our app. Working with this restriction and not requesting
-- // the permission is a valid use case in the context of WebView, so we
-- // don't require it on M+
-- Log.e(TAG, "ERR_MISCONFIGURED_AUTH_ENVIRONMENT: GET_ACCOUNTS permission not "
-- + "granted. Aborting authentication.");
-- nativeSetResult(requestData.nativeResultObject,
-- NetError.ERR_MISCONFIGURED_AUTH_ENVIRONMENT, null);
-- return;
-- }
-- requestData.accountManager.getAccountsByTypeAndFeatures(mAccountType, features,
-- new GetAccountsCallback(requestData), new Handler(ThreadUtils.getUiThreadLooper()));
-+ // ditto
- }
-
- /**
-@@ -334,29 +242,7 @@ public class HttpNegotiateAuthenticator {
- */
- private void requestTokenWithActivity(
- Context ctx, Activity activity, RequestData requestData, String[] features) {
-- boolean isPreM = Build.VERSION.SDK_INT < Build.VERSION_CODES.M;
-- String permission = isPreM
-- ? "android.permission.MANAGE_ACCOUNTS"
-- : Manifest.permission.GET_ACCOUNTS;
--
-- // Check if the AccountManager#getAuthTokenByFeatures call can be made.
-- // API < 23 Requires the MANAGE_ACCOUNTS permission.
-- // API >= 23 Requires the GET_ACCOUNTS permission to behave properly. When it's not granted,
-- // accounts not managed by the current application can't be retrieved. Depending
-- // on the authenticator implementation, it might prompt to create an account, but
-- // that won't be saved. This would be a bad user experience, so we also consider
-- // it a failure case.
-- if (lacksPermission(ctx, permission, isPreM)) {
-- Log.e(TAG, "ERR_MISCONFIGURED_AUTH_ENVIRONMENT: %s permission not granted. "
-- + "Aborting authentication", permission);
-- nativeSetResult(requestData.nativeResultObject,
-- NetError.ERR_MISCONFIGURED_AUTH_ENVIRONMENT, null);
-- return;
-- }
--
-- requestData.accountManager.getAuthTokenByFeatures(mAccountType, requestData.authTokenType,
-- features, activity, null, requestData.options, new GetTokenCallback(requestData),
-- new Handler(ThreadUtils.getUiThreadLooper()));
-+ // ditto
- }
-
- /**
-diff --git a/remoting/android/java/src/org/chromium/chromoting/base/OAuthTokenFetcher.java b/remoting/android/java/src/org/chromium/chromoting/base/OAuthTokenFetcher.java
---- a/remoting/android/java/src/org/chromium/chromoting/base/OAuthTokenFetcher.java
-+++ b/remoting/android/java/src/org/chromium/chromoting/base/OAuthTokenFetcher.java
-@@ -92,7 +92,6 @@ public class OAuthTokenFetcher {
-
- /** Begins fetching a token. Should be called on the main thread. */
- public void fetch() {
-- fetchImpl(null);
- }
-
- /**
-@@ -101,7 +100,6 @@ public class OAuthTokenFetcher {
- * @param expiredToken A previously-fetched token which has expired.
- */
- public void clearAndFetch(String expiredToken) {
-- fetchImpl(expiredToken);
- }
-
- private void fetchImpl(final String expiredToken) {
---
-2.11.0
-
diff --git a/build/patches/Disable-update-scheduler.patch b/build/patches/Disable-update-scheduler.patch
index 6e3f0acf26ebea062d99a86358071e1efe86f134..9dbfc15589e343790ed1c6c9692e3592328a470e 100644
--- a/build/patches/Disable-update-scheduler.patch
+++ b/build/patches/Disable-update-scheduler.patch
@@ -9,7 +9,7 @@ Subject: Disable update scheduler
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/component_updater/UpdateScheduler.java b/chrome/android/java/src/org/chromium/chrome/browser/component_updater/UpdateScheduler.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/component_updater/UpdateScheduler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/component_updater/UpdateScheduler.java
-@@ -35,10 +35,7 @@ public class UpdateScheduler {
+@@ -36,10 +36,7 @@ public class UpdateScheduler {
@CalledByNative
/* package */ static boolean isAvailable() {
@@ -21,10 +21,10 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/component_updat
}
/* package */ void onStartTaskBeforeNativeLoaded(TaskFinishedCallback callback) {
-@@ -108,4 +105,4 @@ public class UpdateScheduler {
-
- private native void nativeOnStartTask(long nativeBackgroundTaskUpdateScheduler);
- private native void nativeOnStopTask(long nativeBackgroundTaskUpdateScheduler);
+@@ -112,4 +109,4 @@ public class UpdateScheduler {
+ void onStartTask(long nativeBackgroundTaskUpdateScheduler, UpdateScheduler caller);
+ void onStopTask(long nativeBackgroundTaskUpdateScheduler, UpdateScheduler caller);
+ }
-}
\ No newline at end of file
+}
diff --git a/build/patches/Do-not-grant-notifications-to-default-search-engine.patch b/build/patches/Do-not-grant-notifications-to-default-search-engine.patch
index 1500aa94062770854e863d9ae742a03f9520556c..cf595284486d1d497f036ec72bfe0692cd527164 100644
--- a/build/patches/Do-not-grant-notifications-to-default-search-engine.patch
+++ b/build/patches/Do-not-grant-notifications-to-default-search-engine.patch
@@ -63,7 +63,7 @@ diff --git a/chrome/browser/android/search_permissions/search_permissions_servic
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
-@@ -270,7 +270,7 @@ const char kDisallowUnsafeHttpDownloadsParamName[] = "MimeTypeList";
+@@ -288,7 +288,7 @@ const base::FeatureParam kDnsOverHttpsTemplatesParam{
#if defined(OS_ANDROID)
// Enable changing default downloads storage location on Android.
const base::Feature kDownloadsLocationChange{"DownloadsLocationChange",
diff --git a/build/patches/Do-not-ignore-download-location-prompt-setting.patch b/build/patches/Do-not-ignore-download-location-prompt-setting.patch
index abd9204c2e98daa5c541969b6c57909bcf18e1c9..0bd22cd2777b79766ff8721f5e0637e3aa8cb0d3 100644
--- a/build/patches/Do-not-ignore-download-location-prompt-setting.patch
+++ b/build/patches/Do-not-ignore-download-location-prompt-setting.patch
@@ -6,13 +6,13 @@ Upstream has decided that it works as intended (https://bugs.chromium.org/p/chro
but users would like to decide where to save a file even when there is no SD card available;
do not skip the prompt in such cases.
---
- .../download/DownloadLocationDialogBridge.java | 71 +++++++---------------
- 1 file changed, 21 insertions(+), 50 deletions(-)
+ .../download/DownloadLocationDialogBridge.java | 73 +++++++---------------
+ 1 file changed, 21 insertions(+), 52 deletions(-)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationDialogBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationDialogBridge.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationDialogBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationDialogBridge.java
-@@ -31,9 +31,6 @@ public class DownloadLocationDialogBridge implements ModalDialogProperties.Contr
+@@ -32,9 +32,6 @@ public class DownloadLocationDialogBridge implements ModalDialogProperties.Contr
private PropertyModel mDialogModel;
private DownloadLocationCustomView mCustomView;
private ModalDialogManager mModalDialogManager;
@@ -22,7 +22,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/Downlo
private Context mContext;
private DownloadLocationDialogBridge(long nativeDownloadLocationDialogBridge) {
-@@ -66,12 +63,28 @@ public class DownloadLocationDialogBridge implements ModalDialogProperties.Contr
+@@ -67,12 +64,28 @@ public class DownloadLocationDialogBridge implements ModalDialogProperties.Contr
mModalDialogManager = activity.getModalDialogManager();
mContext = activity;
@@ -56,7 +56,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/Downlo
}
@Override
-@@ -104,48 +117,6 @@ public class DownloadLocationDialogBridge implements ModalDialogProperties.Contr
+@@ -105,50 +118,6 @@ public class DownloadLocationDialogBridge implements ModalDialogProperties.Contr
mCustomView = null;
}
@@ -74,7 +74,9 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/Downlo
- assert(!TextUtils.isEmpty(dir.location));
- PrefServiceBridge.getInstance().setDownloadAndSaveFileDefaultDirectory(
- dir.location);
-- nativeOnComplete(mNativeDownloadLocationDialogBridge, mSuggestedPath);
+- DownloadLocationDialogBridgeJni.get().onComplete(
+- mNativeDownloadLocationDialogBridge, DownloadLocationDialogBridge.this,
+- mSuggestedPath);
- }
- return;
- }
diff --git a/build/patches/Do-not-store-passwords-by-default.patch b/build/patches/Do-not-store-passwords-by-default.patch
index 641f219e1343676252f24a81475fc8daee1fcf5a..b8416f94f1f876915f6556d0442b8732f6ac45a5 100644
--- a/build/patches/Do-not-store-passwords-by-default.patch
+++ b/build/patches/Do-not-store-passwords-by-default.patch
@@ -9,7 +9,7 @@ Subject: Do not store passwords by default
diff --git a/components/password_manager/core/browser/password_manager.cc b/components/password_manager/core/browser/password_manager.cc
--- a/components/password_manager/core/browser/password_manager.cc
+++ b/components/password_manager/core/browser/password_manager.cc
-@@ -359,10 +359,10 @@ void PasswordManager::RegisterProfilePrefs(
+@@ -202,10 +202,10 @@ void PasswordManager::RegisterProfilePrefs(
registry->RegisterBooleanPref(prefs::kBlacklistedCredentialsNormalized,
false);
registry->RegisterBooleanPref(
diff --git a/build/patches/Enable-changing-default-downloads-storage-location-by-default.patch b/build/patches/Enable-changing-default-downloads-storage-location-by-default.patch
index 537eb0e0baff6ba2e2a416043ec4f03a8b841bf8..e1523e0f60e4768648deb38f29caf61ff1320a33 100644
--- a/build/patches/Enable-changing-default-downloads-storage-location-by-default.patch
+++ b/build/patches/Enable-changing-default-downloads-storage-location-by-default.patch
@@ -9,7 +9,7 @@ Subject: Enable changing default downloads storage location by default
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
-@@ -270,7 +270,7 @@ const char kDisallowUnsafeHttpDownloadsParamName[] = "MimeTypeList";
+@@ -288,7 +288,7 @@ const base::FeatureParam kDnsOverHttpsTemplatesParam{
#if defined(OS_ANDROID)
// Enable changing default downloads storage location on Android.
const base::Feature kDownloadsLocationChange{"DownloadsLocationChange",
diff --git a/build/patches/Enable-download-rename-option-by-default.patch b/build/patches/Enable-download-rename-option-by-default.patch
index 04f3cfed603ce48b1e22a1a6475698697b6d0601..ff66643526b596286429b30ff16a275cb85301b9 100644
--- a/build/patches/Enable-download-rename-option-by-default.patch
+++ b/build/patches/Enable-download-rename-option-by-default.patch
@@ -9,8 +9,8 @@ Subject: Enable download rename option by default
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
-@@ -395,7 +395,7 @@ const base::Feature kDownloadHomeShowStorageInfo{
- "DownloadHomeShowStorageInfo", base::FEATURE_DISABLED_BY_DEFAULT};
+@@ -421,7 +421,7 @@ const base::Feature kDownloadNotificationBadge{
+ "DownloadNotificationBadge", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kDownloadRename{"DownloadRename",
- base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/build/patches/Enable-fwrapv-in-Clang-for-non-UBSan-builds.patch b/build/patches/Enable-fwrapv-in-Clang-for-non-UBSan-builds.patch
index 8a337b5d9599ec2a9b244c0cecd59e32025732e4..afbfc11171b483c77380d67f5580f5372cdd838f 100644
--- a/build/patches/Enable-fwrapv-in-Clang-for-non-UBSan-builds.patch
+++ b/build/patches/Enable-fwrapv-in-Clang-for-non-UBSan-builds.patch
@@ -42,7 +42,7 @@ Excerpt from https://github.com/bromite/bromite/issues/226
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
-@@ -288,6 +288,10 @@ config("compiler") {
+@@ -282,6 +282,10 @@ config("compiler") {
}
}
@@ -52,7 +52,7 @@ diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
+
# Linker warnings.
if (fatal_linker_warnings && !(is_chromeos && current_cpu == "arm") &&
- !(is_android && use_order_profiling) && !is_mac && !is_ios &&
+ !is_mac && !is_ios && current_os != "aix") {
--
2.11.0
diff --git a/build/patches/Enable-night-mode-menu-entry-by-default.patch b/build/patches/Enable-night-mode-menu-entry-by-default.patch
index 53bf71be44a08eb936fd3afeb38e009b6555f65e..d41505605e62e549cfa1fb52d8ed73c3965ab38f 100644
--- a/build/patches/Enable-night-mode-menu-entry-by-default.patch
+++ b/build/patches/Enable-night-mode-menu-entry-by-default.patch
@@ -9,7 +9,7 @@ Subject: Enable night mode menu entry by default
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
-@@ -235,7 +235,7 @@ const base::Feature kAdjustWebApkInstallationSpace = {
+@@ -246,7 +246,7 @@ const base::Feature kAdjustWebApkInstallationSpace = {
"AdjustWebApkInstallationSpace", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kAndroidNightMode{"AndroidNightMode",
diff --git a/build/patches/Enable-site-per-process-isolation-for-devices-with-enough-memory.patch b/build/patches/Enable-site-per-process-isolation-for-devices-with-enough-memory.patch
index 0c2439656062e4e0ee7d381073db79ae676615fa..e79d0a96ffec112e9e107c60cb83b664b3c200b5 100644
--- a/build/patches/Enable-site-per-process-isolation-for-devices-with-enough-memory.patch
+++ b/build/patches/Enable-site-per-process-isolation-for-devices-with-enough-memory.patch
@@ -9,7 +9,7 @@ Subject: Enable site per process isolation for devices with enough memory
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
-@@ -609,11 +609,7 @@ const base::Feature kShowTrustedPublisherURL{"ShowTrustedPublisherURL",
+@@ -617,11 +617,7 @@ const base::Feature kShowTrustedPublisherURL{"ShowTrustedPublisherURL",
// browser_features, as they are only used on the browser side.
const base::Feature kSitePerProcess {
"site-per-process",
@@ -21,7 +21,7 @@ diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
};
// Controls a mode for dynamically process-isolating sites where the user has
-@@ -635,7 +631,7 @@ const base::Feature kSiteIsolationForPasswordSites{
+@@ -643,7 +639,7 @@ const base::Feature kSiteIsolationForPasswordSites{
// base::SysInfo::AmountOfPhysicalMemoryMB().
const base::Feature kSitePerProcessOnlyForHighMemoryClients{
"site-per-process-only-for-high-memory-clients",
diff --git a/build/patches/Fix-About-Chrome-regression.patch b/build/patches/Fix-About-Chrome-regression.patch
index 3b58e315d71427091348e020f57facb713aa7b9c..a581f44517ece334416f5302d45287979996ff07 100644
--- a/build/patches/Fix-About-Chrome-regression.patch
+++ b/build/patches/Fix-About-Chrome-regression.patch
@@ -1,7 +1,7 @@
-From 2353a80279b145f6c3aaa5f7f5e467cb51857f7b Mon Sep 17 00:00:00 2001
+From 9e5d5c6c3479fb137787b16c29decf69aa06451f Mon Sep 17 00:00:00 2001
From: Sumit Pundir
Date: Fri, 23 Aug 2019 01:26:27 +0530
-Subject: [PATCH] Fix 'About Chrome' regression
+Subject: [PATCH 7/7] Fix 'About Chrome' regression
---
chrome/android/java/strings/android_chrome_strings.grd | 2 +-
@@ -9,11 +9,11 @@ Subject: [PATCH] Fix 'About Chrome' regression
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
-index 7aa459c4c0a9..d0a4485c3c0f 100644
+index 6d5af7283bf0..d0d0bc82f519 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
-@@ -1450,7 +1450,7 @@ Your Google account may have other forms of browsing history like searches and a
-
+@@ -1465,7 +1465,7 @@ Your Google account may have other forms of browsing history like searches and a
+
- About Chrome
@@ -22,7 +22,7 @@ index 7aa459c4c0a9..d0a4485c3c0f 100644
Application version
diff --git a/chrome/app/settings_google_chrome_strings.grdp b/chrome/app/settings_google_chrome_strings.grdp
-index 413cf6f2f7fe..a3c6a8be4c52 100644
+index c63c5b3382d4..8004ec2afb00 100644
--- a/chrome/app/settings_google_chrome_strings.grdp
+++ b/chrome/app/settings_google_chrome_strings.grdp
@@ -3,7 +3,7 @@
@@ -35,4 +35,5 @@ index 413cf6f2f7fe..a3c6a8be4c52 100644
Get help with Chrome
--
-2.17.1
+2.23.0
+
diff --git a/build/patches/Fix-crash-when-accessing-page-info-site-settings.patch b/build/patches/Fix-crash-when-accessing-page-info-site-settings.patch
index 898f1b30fc483f3814023174af24e16295c252a8..93826954e628f97f6b654c744b3a3fc0f6fcbad4 100644
--- a/build/patches/Fix-crash-when-accessing-page-info-site-settings.patch
+++ b/build/patches/Fix-crash-when-accessing-page-info-site-settings.patch
@@ -9,7 +9,7 @@ Subject: Fix crash when accessing page info / site settings
diff --git a/chrome/browser/permissions/permission_manager.cc b/chrome/browser/permissions/permission_manager.cc
--- a/chrome/browser/permissions/permission_manager.cc
+++ b/chrome/browser/permissions/permission_manager.cc
-@@ -713,6 +713,9 @@ PermissionResult PermissionManager::GetPermissionStatusHelper(
+@@ -761,6 +761,9 @@ PermissionResult PermissionManager::GetPermissionStatusHelper(
if (status != CONTENT_SETTING_DEFAULT)
return PermissionResult(status, PermissionStatusSource::UNSPECIFIED);
PermissionContextBase* context = GetPermissionContext(permission);
diff --git a/build/patches/Hide-passwords-manager-link.patch b/build/patches/Hide-passwords-manager-link.patch
index 14b83ffc2d8fb93ff461492c935a90877aa07d6e..a18c3a4b2fa76b9289f50893d58e47a23a3fd557 100644
--- a/build/patches/Hide-passwords-manager-link.patch
+++ b/build/patches/Hide-passwords-manager-link.patch
@@ -9,7 +9,7 @@ Subject: Hide passwords manager link
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java
-@@ -242,7 +242,7 @@ public class SavePasswordsPreferences
+@@ -251,7 +251,7 @@ public class SavePasswordsPreferences
return;
}
@@ -18,7 +18,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/pas
PreferenceGroup passwordParent;
if (mSearchQuery == null) {
-@@ -317,7 +317,7 @@ public class SavePasswordsPreferences
+@@ -326,7 +326,7 @@ public class SavePasswordsPreferences
return;
}
diff --git a/build/patches/Increase-number-of-autocomplete-matches-from-5-to-10.patch b/build/patches/Increase-number-of-autocomplete-matches-from-5-to-10.patch
new file mode 100644
index 0000000000000000000000000000000000000000..f82200632ca21ab7ee02c9e50f8a6ed4ff66e691
--- /dev/null
+++ b/build/patches/Increase-number-of-autocomplete-matches-from-5-to-10.patch
@@ -0,0 +1,49 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Sun, 27 Oct 2019 10:18:39 +0100
+Subject: Increase number of autocomplete matches from 5 to 10
+
+Patch from https://github.com/Eloston/ungoogled-chromium/issues/814#issuecomment-526874703
+---
+ components/omnibox/browser/autocomplete_result.cc | 7 ++-----
+ components/omnibox/browser/omnibox_field_trial.cc | 3 ++-
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+diff --git a/components/omnibox/browser/autocomplete_result.cc b/components/omnibox/browser/autocomplete_result.cc
+--- a/components/omnibox/browser/autocomplete_result.cc
++++ b/components/omnibox/browser/autocomplete_result.cc
+@@ -48,17 +48,14 @@ struct MatchGURLHash {
+ // static
+ size_t AutocompleteResult::GetMaxMatches(bool is_zero_suggest) {
+ #if (defined(OS_ANDROID))
+- constexpr size_t kDefaultMaxAutocompleteMatches = 5;
++ constexpr size_t kDefaultMaxAutocompleteMatches = 10; // was 6, this needs to be double the value of default_max_matches_per_provider from components/omnibox/browser/omnibox_field_trial.cc
+ if (is_zero_suggest)
+ return kDefaultMaxAutocompleteMatches;
+ #else
+ constexpr size_t kDefaultMaxAutocompleteMatches = 6;
+ #endif // defined(OS_ANDROID)
+
+- return base::GetFieldTrialParamByFeatureAsInt(
+- omnibox::kUIExperimentMaxAutocompleteMatches,
+- OmniboxFieldTrial::kUIMaxAutocompleteMatchesParam,
+- kDefaultMaxAutocompleteMatches);
++ return kDefaultMaxAutocompleteMatches;
+ }
+
+ AutocompleteResult::AutocompleteResult() {
+diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc
+--- a/components/omnibox/browser/omnibox_field_trial.cc
++++ b/components/omnibox/browser/omnibox_field_trial.cc
+@@ -321,7 +321,8 @@ void OmniboxFieldTrial::GetDemotionsByType(
+
+ size_t OmniboxFieldTrial::GetProviderMaxMatches(
+ AutocompleteProvider::Type provider) {
+- size_t default_max_matches_per_provider = 3;
++ size_t default_max_matches_per_provider = 5; // was 3; this needs to be half the value of kDefaultMaxAutocompleteMatches from components/omnibox/browser/autocomplete_result.cc
++ return default_max_matches_per_provider;
+
+ std::string param_value = base::GetFieldTrialParamValueByFeature(
+ omnibox::kUIExperimentMaxAutocompleteMatches,
+--
+2.11.0
+
diff --git a/build/patches/Inject-scripts-for-AMP-tracking-ads-and-video-functionality.patch b/build/patches/Inject-scripts-for-AMP-tracking-ads-and-video-functionality.patch
index 5d5a79a65c5d6fefe782f661b4aa64f9a7a6c4a4..b73c658a1e758b120fec479d765361b7e2c58126 100644
--- a/build/patches/Inject-scripts-for-AMP-tracking-ads-and-video-functionality.patch
+++ b/build/patches/Inject-scripts-for-AMP-tracking-ads-and-video-functionality.patch
@@ -3,17 +3,18 @@ Date: Sat, 28 Oct 2017 10:09:41 +0200
Subject: Inject scripts for AMP, tracking, ads and video functionality
Remove AMP, tracking and ads from search/news results
-Break Page Visibility API and Fullscreen API for youtube.com and vimeo.com to
-allow playing videos in background (original Javascript code by timdream)
+Break Page Visibility API and Fullscreen API for youtube.com and vimeo.com to allow playing videos in background (original Javascript code by timdream)
+Set proper injection script nonce
Send a random key press to circumvent idle status detection
---
- third_party/blink/renderer/core/dom/BUILD.gn | 2 ++
- third_party/blink/renderer/core/dom/document.cc | 31 +++++++++++++++++++++-
- .../renderer/core/dom/extensions/anti_amp_cure.h | 6 +++++
- .../renderer/core/dom/extensions/video_bg_play.h | 6 +++++
- .../renderer/core/html/html_script_element.cc | 5 ++++
+ third_party/blink/renderer/core/dom/BUILD.gn | 2 +
+ third_party/blink/renderer/core/dom/document.cc | 60 +++++++++++++++++++++-
+ third_party/blink/renderer/core/dom/document.h | 2 +
+ .../renderer/core/dom/extensions/anti_amp_cure.h | 6 +++
+ .../renderer/core/dom/extensions/video_bg_play.h | 6 +++
+ .../renderer/core/html/html_script_element.cc | 5 ++
.../blink/renderer/core/html/html_script_element.h | 1 +
- 6 files changed, 50 insertions(+), 1 deletion(-)
+ 7 files changed, 81 insertions(+), 1 deletion(-)
create mode 100644 third_party/blink/renderer/core/dom/extensions/anti_amp_cure.h
create mode 100644 third_party/blink/renderer/core/dom/extensions/video_bg_play.h
@@ -32,24 +33,24 @@ diff --git a/third_party/blink/renderer/core/dom/BUILD.gn b/third_party/blink/re
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
-@@ -248,6 +248,7 @@
+@@ -254,6 +254,7 @@
#include "third_party/blink/renderer/core/page/scrolling/root_scroller_controller.h"
#include "third_party/blink/renderer/core/page/scrolling/scroll_state_callback.h"
#include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h"
+#include "extensions/video_bg_play.h"
#include "third_party/blink/renderer/core/page/scrolling/snap_coordinator.h"
+ #include "third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.h"
#include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h"
- #include "third_party/blink/renderer/core/page/spatial_navigation_controller.h"
-@@ -314,6 +315,8 @@
+@@ -319,6 +320,8 @@
+ #include "third_party/blink/renderer/platform/wtf/text/string_buffer.h"
#include "third_party/blink/renderer/platform/wtf/text/text_encoding_registry.h"
- #include "third_party/blink/renderer/platform/wtf/time.h"
+#include "extensions/anti_amp_cure.h"
+
#ifndef NDEBUG
using WeakDocumentSet = blink::HeapHashSet>;
static WeakDocumentSet& liveDocumentSet();
-@@ -6540,8 +6543,34 @@ void Document::FinishedParsing() {
+@@ -6688,8 +6691,63 @@ void Document::FinishedParsing() {
// Parser should have picked up all preloads by now
fetcher_->ClearPreloads(ResourceFetcher::kClearSpeculativeMarkupPreloads);
@@ -65,26 +66,67 @@ diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink
+ return;
+
+ auto* bodyElement = body();
-+ if (bodyElement) {
-+ size_t pos1 = host.Find("www.google."), pos2 = host.Find("news.google."), pos3 = url_.GetPath().Find("/search");
-+ if (((pos1 == 0) && (pos3 == 0)) || (pos2 == 0)) {
-+ LOG(INFO) << "injecting anti-AMP-cure Javascript payload, URL: " << url_.GetString();
-+ HTMLScriptElement* e = MakeGarbageCollected(*this, CreateElementFlags());
-+ e->setTextDirect(ANTI_AMP_CURE_JS);
-+ bodyElement->AppendChild(e);
-+ }
-+
++ if (!bodyElement)
++ return;
++ int selected = 0;
++ size_t pos1 = host.Find("www.google."), pos2 = host.Find("news.google."), pos3 = url_.GetPath().Find("/search"), pos4 = host.Find("images.google.");
++ if (((pos1 == 0) && (pos3 == 0)) || (pos2 == 0) || (pos4 == 0)) {
++ LOG(INFO) << "injecting AMP removal Javascript payload, URL: " << url_.GetString();
++ selected = 1;
+ // check for eligibility of the video bg fix
-+ if ((WTF::kNotFound != host.Find("youtube.com")) || (WTF::kNotFound != host.Find("vimeo.com"))) {
-+ LOG(INFO) << "injecting video-bg-play Javascript payload, URL: " << url_.GetString();
-+ HTMLScriptElement* e = MakeGarbageCollected(*this, CreateElementFlags());
-+ e->setTextDirect(VIDEO_BG_PLAY_JS);
-+ bodyElement->AppendChild(e);
-+ }
-+ } // has origin and body element
++ } else if ((WTF::kNotFound != host.Find("youtube.com")) || (WTF::kNotFound != host.Find("vimeo.com"))) {
++ LOG(INFO) << "injecting video-bg-play Javascript payload, URL: " << url_.GetString();
++ selected = 2;
++ } else
++ return;
++
++ // find out which nonce to use
++ const AtomicString& nonce = findFirstScriptNonce();
++
++ HTMLScriptElement* e = MakeGarbageCollected(*this, CreateElementFlags());
++ if (selected == 1)
++ e->setTextDirect(ANTI_AMP_CURE_JS);
++ else if (selected == 2)
++ e->setTextDirect(VIDEO_BG_PLAY_JS);
++ else
++ NOTREACHED();
++
++ if (nonce != g_null_atom)
++ e->setNonce(nonce);
++ else
++ LOG(WARNING) << "could not find script nonce to use";
++
++ bodyElement->AppendChild(e);
++}
++
++const AtomicString& Document::findFirstScriptNonce() {
++ HTMLCollection* s = scripts();
++ unsigned source_length = (unsigned)s->length();
++ // all scripts are likely to have the nonce, thus scan only first 10
++ if (source_length > 10)
++ source_length = 10;
++ for (unsigned i = 0; i < source_length; ++i) {
++ Element* element = s->item(i);
++ const AtomicString& nonce = element->nonce();
++ if ((nonce != g_null_atom) && !nonce.IsEmpty())
++ return nonce;
++ }
++ return g_null_atom;
}
void Document::ElementDataCacheClearTimerFired(TimerBase*) {
+diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
+--- a/third_party/blink/renderer/core/dom/document.h
++++ b/third_party/blink/renderer/core/dom/document.h
+@@ -1641,6 +1641,8 @@ class CORE_EXPORT Document : public ContainerNode,
+ void AddAXContext(AXContext*);
+ void RemoveAXContext(AXContext*);
+
++ const AtomicString& findFirstScriptNonce();
++
+ bool IsDocumentFragment() const =
+ delete; // This will catch anyone doing an unnecessary check.
+ bool IsDocumentNode() const =
diff --git a/third_party/blink/renderer/core/dom/extensions/anti_amp_cure.h b/third_party/blink/renderer/core/dom/extensions/anti_amp_cure.h
new file mode 100644
--- /dev/null
@@ -93,7 +135,7 @@ new file mode 100644
+#ifndef anti_amp_cure_h
+#define anti_amp_cure_h
+
-+#define ANTI_AMP_CURE_JS "/* Bromite click-tracking and AMP removal v0.3.7 */\n\nfunction recreateHyperlink(a) {\n // skip already-sanitized hyperlinks\n if (a.sane) return false;\n\n // create new A element - old one has event listeners attached\n var newA = document.createElement('a');\n newA.referrerPolicy = 'origin';\n // property set when hyperlink has been created by this script\n newA.sane = 1;\n\n // remove AMP class, get actual page URL\n var ampCur = a.getAttribute('data-amp-cur');\n if (ampCur) {\n newA.href = ampCur;\n a.classList.remove('amp_r');\n } else {\n var realLink = getRealLinkFromGoogleUrl(a);\n if (realLink) {\n newA.href = realLink;\n } else {\n // might not be an actual hyperlink, ignore it\n if (!a.href) {\n return false;\n }\n // leave original href unchanged\n newA.href = a.href;\n }\n }\n // copy CSS classes\n newA.className = a.className;\n\n // copy nodes inside the hyperlink\n while (a.firstChild) {\n newA.appendChild(a.lastChild);\n }\n // replace hyperlink\n a.parentNode.replaceChild(newA, a);\n return true;\n}\n\nfunction isResult(a) {\n if (a.getAttribute('data-amp-cur'))\n return true;\n var inlineMousedown = a.getAttribute('onmousedown');\n if (!inlineMousedown)\n\treturn false;\n // return rwt(....); // E.g Google search results.\n // return google.rwt(...); // E.g. sponsored search results\n // return google.arwt(this); // E.g. sponsored search results (dec 2016).\n return /\\ba?rwt\\(/.test(inlineMousedown) || /\\bctpacw\\b/.test(inlineMousedown);\n}\n\n/**\n * @returns {String} the real URL if the given link is a Google redirect URL.\n */\nfunction getRealLinkFromGoogleUrl(a) {\n if ((a.hostname === location.hostname || a.hostname.indexOf('www.google.') == 0) &&\n /^\\/(local_)?url$/.test(a.pathname)) {\n // Google Maps / Dito (/local_url?q=)\n // Mobile (/url?q=)\n var url = /[?&](?:q|url)=((?:https?|ftp)[%:][^&]+)/.exec(a.search);\n if (url) {\n return decodeURIComponent(url[1]);\n }\n // Help pages, e.g. safe browsing (/url?...&q=%2Fsupport%2Fanswer...)\n url = /[?&](?:q|url)=((?:%2[Ff]|\\/)[^&]+)/.exec(a.search);\n if (url) {\n return a.origin + decodeURIComponent(url[1]);\n }\n }\n}\n\nfunction sanitizeAds() {\n // scan all divs\n var div = document.getElementById('tads');\n if (div) {\n div.style.display = 'none';\n\treturn true;\n }\n return false;\n}\n\nfunction hookMoreResults() {\n var extrares = document.getElementById('extrares');\n if (!extrares) {\n console.log(\"could not hook more results\");\n return;\n }\n // mutation observers are great but they don't work\n extrares.addEventListener(\"DOMNodeInserted\", function(e) {\n var node = e.target;\n if (node.id && node.id.startsWith(\"arc-srp\"))\n console.log(\"hyperlinks sanitized on new result node: \", sanitizeAllHyperlinks(node));\n });\n}\n\nfunction setMlogoClick() {\n // skip home page\n if (document.getElementById('hplogo')) return;\n\n var mlogo = document.getElementById('qslc');\n if (mlogo && mlogo.children[0]) {\n mlogo = mlogo.children[0];\n } else {\n mlogo = document.getElementById('mlogo');\n }\n if (mlogo) {\n mlogo.removeAttribute(\"href\");\n mlogo.setAttribute(\"onclick\", \"sanitizeAll()\");\n console.log(\"logo link replaced\");\n } else {\n console.log(\"could not replace logo link\");\n }\n}\n\nfunction sanitizeAllHyperlinks(rootNode) {\n var sanitized = 0, total = 0;\n // exclude translation hyperlink nodes\n const exclude = rootNode.querySelectorAll('#tw-ob a');\n // selector for both results and news\n rootNode.querySelectorAll('div[data-hveid]:not([data-hveid=\"\"]) a, div[data-ved]:not([data-ved=\"\"]) a').forEach(function(a) {\n // exclude nodes which should not be processed\n var excluded = false;\n exclude.forEach(function(e) {\n if (excluded) return;\n if (e == a) {\n excluded = true;\n }\n });\n if (excluded) return;\n\n\ttotal++;\n\tvar res = recreateHyperlink(a);\n\tif (res) sanitized++;\n });\n console.log(\"sanitized \", sanitized, \"/\", total, \" hyperlinks\");\n\n return sanitized;\n}\n\nfunction sanitizeAll() {\n console.log(\"ads removed: \", sanitizeAds());\n console.log(\"hyperlinks sanitized: \", sanitizeAllHyperlinks(document));\n}\n\n// avoid running cleanup on non-search pages\nif ((document.location.host.indexOf(\"images.google.\") == -1) &&\n (document.location.host.indexOf(\"accounts.google.\") == -1)) {\n sanitizeAll();\n}\nsetMlogoClick();\n\nhookMoreResults();\n"
++#define ANTI_AMP_CURE_JS "/* Array of bytes to base64 string decoding */\n/* */\nfunction b64ToUint6(nChr) {\n return nChr > 64 && nChr < 91 ?\n nChr - 65 :\n nChr > 96 && nChr < 123 ?\n nChr - 71 :\n nChr > 47 && nChr < 58 ?\n nChr + 4 :\n nChr === 43 ?\n 62 :\n nChr === 47 ?\n 63 :\n 0;\n}\n\n/* returns an Uint8Array with decoded bytes */\n/* from https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Appendix.3A_Decode_a_Base64_string_to_Uint8Array_or_ArrayBuffer */\nfunction base64DecToArr(sBase64, nBlockSize) {\n var\n // URL encoding variant\n sB64Enc = sBase64.replace('-', '+').replace('_', '/'),\n nInLen = sB64Enc.length,\n nOutLen = nBlockSize ? Math.ceil((nInLen * 3 + 1 >>> 2) / nBlockSize) * nBlockSize : nInLen * 3 + 1 >>> 2,\n aBytes = new Uint8Array(nOutLen);\n\n for (var nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) {\n nMod4 = nInIdx & 3;\n nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4;\n if (nMod4 === 3 || nInLen - nInIdx === 1) {\n for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) {\n aBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255;\n }\n nUint24 = 0;\n }\n }\n\n return aBytes;\n}\n\nfunction replaceHyperlink(a, url) {\n // create new A element - old one has event listeners attached\n var newA = document.createElement('a');\n newA.referrerPolicy = 'no-referrer';\n // property set when hyperlink has been created by this script\n newA.sane = true;\n newA.href = url;\n // copy CSS classes - news have only one\n newA.className = a.className;\n // scan child nodes for SVGs\n // news nodes will only have a text node\n a.childNodes.forEach(function(n) {\n // remove icon from image result buttons\n if (n.nodeName == 'DIV') {\n var svgs = n.querySelectorAll('div svg');\n if (svgs.length == 2)\n n.removeChild(svgs[1]);\n }\n });\n // use direct HTML as appending nodes skips some e.g. heading\n newA.innerHTML = a.innerHTML;\n // replace hyperlink\n a.parentNode.replaceChild(newA, a);\n return newA;\n}\n\nfunction getURLFromJsData(jsdata) {\n if (!jsdata) return;\n\n var res = jsdata.split(';');\n if (res.length < 3) return;\n // decode the payload\n var data = base64DecToArr(res[1]);\n // 08 = field 1, type Variant\n if (data[0] != 0x08)\n return;\n // 13 = 19 (raw) or -10 (zigzag)\n if (data[1] != 0x13) {\n console.warn('could not decode:', res[1]);\n return;\n }\n // 22 = field 4, type String\n if (data[2] != 0x22)\n return;\n // usually 2 bytes varint e.g. 88-01 = length 136\n res = proto_read_uint32(data, 3);\n // extract slice with the URL\n return new TextDecoder().decode(data.slice(res.pos, res.pos + res.value));\n}\n\nfunction recreateNewsHyperlink(a) {\n var article = a.parentNode;\n if (!article) return false;\n // grab jsdata from parent\n var url = getURLFromJsData(article.getAttribute('jsdata'));\n // use the AMP (but external) URL as fallback\n var obfuscated = false;\n if (!url) {\n url = a.href;\n obfuscated = true;\n }\n\n // ready to replace the hyperlink\n var newA = replaceHyperlink(a, url);\n if (obfuscated)\n newA.setAttribute(\"_target\", \"blank\");\n\n // replace headline hyperlink\n var h4a = article.querySelector('h4 a');\n if (h4a) {\n var newH4a = replaceHyperlink(h4a, url);\n if (obfuscated)\n newH4a.setAttribute(\"_target\", \"blank\");\n }\n\n // remove icon by finding the time sibling\n var t = article.querySelector('time');\n if (t) {\n var found = false;\n t.parentNode.childNodes.forEach(function(n) {\n if (found) return;\n if (n.innerText == \"amp\") {\n t.parentNode.removeChild(n);\n found = true;\n }\n });\n }\n\n // cleanup of the article\n article.removeAttribute('jsmodel');\n article.removeAttribute('jsaction');\n article.removeAttribute('jscontroller');\n article.removeAttribute('jsdata');\n\n return true;\n}\n\n// from protobufjs\nfunction proto_read_uint32(buf, pos) {\n var value = (buf[pos] & 127) >>> 0;\n if (buf[pos++] < 128) return {\n value: value,\n pos: pos\n };\n value = (value | (buf[pos] & 127) << 7) >>> 0;\n if (buf[pos++] < 128) return {\n value: value,\n pos: pos\n };\n value = (value | (buf[pos] & 127) << 14) >>> 0;\n if (buf[pos++] < 128) return {\n value: value,\n pos: pos\n };\n value = (value | (buf[pos] & 127) << 21) >>> 0;\n if (buf[pos++] < 128) return {\n value: value,\n pos: pos\n };\n value = (value | (buf[pos] & 15) << 28) >>> 0;\n if (buf[pos++] < 128) return {\n value: value,\n pos: pos\n };\n\n if ((pos += 5) > buf.length)\n throw RangeError('cannot read string length');\n\n return {\n value: value,\n pos: pos\n };\n}\n\nfunction recreateResultHyperlink(a) {\n var url = a.href;\n // remove AMP class, get actual page URL\n var ampCur = a.getAttribute('data-amp-cur');\n if (ampCur) {\n url = ampCur;\n a.classList.remove('amp_r');\n } else {\n var realLink = getRealLinkFromGoogleUrl(a);\n if (realLink) {\n url = realLink;\n } else {\n // might not be an actual hyperlink, ignore it\n if (!a.href) {\n return false;\n }\n // leave original href unchanged\n }\n }\n\n // re-create with original CSS classes\n replaceHyperlink(a, url);\n\n return true;\n}\n\nfunction isResult(a) {\n if (a.getAttribute('data-amp-cur'))\n return true;\n var inlineMousedown = a.getAttribute('onmousedown');\n if (!inlineMousedown)\n return false;\n // return rwt(....); // E.g Google search results.\n // return google.rwt(...); // E.g. sponsored search results\n // return google.arwt(this); // E.g. sponsored search results (dec 2016).\n return /\\ba?rwt\\(/.test(inlineMousedown) || /\\bctpacw\\b/.test(inlineMousedown);\n}\n\n/**\n * @returns {String} the real URL if the given link is a Google redirect URL.\n */\nfunction getRealLinkFromGoogleUrl(a) {\n if ((a.hostname === location.hostname || a.hostname.indexOf('www.google.') == 0) &&\n /^\\/(local_)?url$/.test(a.pathname)) {\n // Google Maps / Dito (/local_url?q=)\n // Mobile (/url?q=)\n var url = /[?&](?:q|url)=((?:https?|ftp)[%:][^&]+)/.exec(a.search);\n if (url)\n return decodeURIComponent(url[1]);\n // Help pages, e.g. safe browsing (/url?...&q=%2Fsupport%2Fanswer...)\n url = /[?&](?:q|url)=((?:%2[Ff]|\\/)[^&]+)/.exec(a.search);\n if (url)\n return a.origin + decodeURIComponent(url[1]);\n }\n}\n\nfunction sanitizeAds() {\n // scan all divs\n var div = document.getElementById('tads');\n if (div) {\n div.style.display = 'none';\n return true;\n }\n return false;\n}\n\nfunction hookMoreSearchResults() {\n var extrares = document.getElementById('extrares');\n if (!extrares) {\n console.warn(\"could not hook more results\");\n return;\n }\n // mutation observers are great but they don't work\n extrares.addEventListener(\"DOMNodeInserted\", function(e) {\n var node = e.target;\n if (node.id && node.id.startsWith(\"arc-srp\"))\n sanitizeResultHyperlinks(node);\n });\n}\n\nfunction setMlogoClick() {\n // skip home page\n if (document.getElementById('hplogo')) return;\n\n var mlogo = document.getElementById('qslc');\n if (mlogo && mlogo.children[0]) {\n mlogo = mlogo.children[0];\n } else {\n mlogo = document.getElementById('mlogo');\n }\n if (mlogo) {\n mlogo.removeAttribute(\"href\");\n mlogo.setAttribute(\"onclick\", \"sanitizeAll()\");\n console.log(\"logo link replaced\");\n } else {\n console.warn(\"could not replace logo link\");\n }\n}\n\nfunction sanitizeResultHyperlinks(rootNode) {\n var sanitized = 0,\n total = 0;\n // exclude translation hyperlink nodes\n const exclude = rootNode.querySelectorAll('#tw-ob a');\n // selector for results (doesn't work with news anymore)\n rootNode.querySelectorAll('div[data-hveid]:not([data-hveid=\"\"]) a, div[data-ved]:not([data-ved=\"\"]) a').forEach(function(a) {\n // exclude nodes which should not be processed\n var excluded = false;\n exclude.forEach(function(e) {\n if (excluded) return;\n if (e == a) {\n excluded = true;\n }\n });\n if (excluded) return;\n\n total++;\n if (!a.sane && recreateResultHyperlink(a))\n sanitized++;\n });\n console.log(\"sanitized \", sanitized, \"/\", total, \" result hyperlinks\");\n}\n\nfunction sanitizeAllNews() {\n var sanitized = 0,\n total = 0;\n // pick all articles which have the associated data not yet wiped\n document.querySelectorAll('article[jsdata]:not([jsdata=\"\"]) a').forEach(function(a) {\n total++;\n if (!a.sane && recreateNewsHyperlink(a))\n sanitized++;\n });\n console.log(\"sanitized \", sanitized, \"/\", total, \" news hyperlinks\");\n}\n\nfunction hookMoreNews() {\n document.addEventListener(\"DOMNodeInserted\", function(e) {\n var node = e.target;\n // the real inserted node is 'C-WIZ', but we need to wait for loading to complete\n if (node.nodeName == '#text' && node.parentNode && node.parentNode.nodeName == 'TITLE')\n // title is updated when page loading completes, thus trigger hyperlinks fixing afterwards\n sanitizeAllNews();\n });\n}\n\nfunction hookMoreImageResults() {\n document.addEventListener(\"DOMNodeInserted\", function(e) {\n var node = e.target;\n // remove card and iframe, fix hyperlink\n if (node.nodeName == \"DIV\" && node.hasAttribute(\"data-query\"))\n sanitizeResultHyperlinks(node);\n else if (node.nodeName == \"IFRAME\")\n node.parentNode.removeChild(node);\n else if (node.nodeName == \"C-WIZ\")\n // replace instead of removing so that correlated image results will be displayed\n node.parentNode.replaceChild(node, document.createTextNode(\"iframe replaced\"));\n });\n}\n\nconsole.log('Bromite click-tracking and AMP removal v0.4.2');\n\nif (document.location.host.indexOf(\"news.google.\") === 0) {\n sanitizeAllNews();\n hookMoreNews();\n} else {\n // avoid running cleanup on non-result pages\n if (document.location.host.indexOf(\"accounts.google.\") == -1) {\n console.log(\"ads removed: \", sanitizeAds());\n\n if (document.location.search.match(/[?&]tbm=isch/)) {\n // find main c-wiz\n var cwizs = document.querySelectorAll('c-wiz[data-ssc=\"0\"]');\n if (cwizs.length)\n sanitizeResultHyperlinks(cwizs[0]);\n else\n console.warning('could not find main image results');\n // image search results\n hookMoreImageResults();\n } else {\n var main = document.getElementById('main');\n if (main)\n sanitizeResultHyperlinks(main);\n else\n console.warning('could not find main search results');\n // regular search results\n setMlogoClick();\n hookMoreSearchResults();\n }\n }\n}\n"
+
+#endif // anti_amp_cure_h
diff --git a/third_party/blink/renderer/core/dom/extensions/video_bg_play.h b/third_party/blink/renderer/core/dom/extensions/video_bg_play.h
@@ -104,7 +146,7 @@ new file mode 100644
+#ifndef video_bg_play_h
+#define video_bg_play_h
+
-+#define VIDEO_BG_PLAY_JS "'use strict';\n\n/* generate a synthetic keypress to circumvent the extremely useful pause-and-prompt beaviour */\nsetInterval(function() {\n document.dispatchEvent(new KeyboardEvent(\"keydown\", {key : \"a\", char : \"a\", shiftKey: false}));\n}, 3 * 60 * 1000);\n\n/* video background play fix - original version by timdream */\ndocument.videoBGFix = {};\n\n// Page Visibility API\nObject.defineProperties(document.videoBGFix,\n { 'hidden': {value: false}, 'visibilityState': {value: 'visible'} });\n\nwindow.addEventListener(\n 'visibilitychange', evt => evt.stopImmediatePropagation(), true);\nwindow.addEventListener(\n 'blur', evt => evt.stopImmediatePropagation(), true);\n\n// Fullscreen API\nwindow.addEventListener('fullscreenchange', evt => {\n Object.defineProperties(document.videoBGFix,\n { 'fullscreenEnabled': {value: true},\n 'fullscreen': {value: true},\n 'fullscreenElement': {value: document.fullscreenElement.videoBGFix}});\n window.addEventListener(\n 'fullscreenchange', evt => evt.stopImmediatePropagation(), true);\n}, { capture: true, once: true });\n"
++#define VIDEO_BG_PLAY_JS "'use strict';\n\nconst IS_YOUTUBE = window.location.hostname.search(/(?:^|.+\\.)youtube.com/) > -1 ||\n window.location.hostname.search(/(?:^|.+\\.)youtube-nocookie.com/) > -1;\nconst IS_MOBILE_YOUTUBE = window.location.hostname == 'm.youtube.com';\nconst IS_VIMEO = window.location.hostname.search(/(?:^|.+\\.)vimeo.com/) > -1;\n\n/* video background play fix - based on https://github.com/mozilla/video-bg-play */\ndocument.wrappedJSObject = {};\n\n// Page Visibility API\nObject.defineProperties(document.wrappedJSObject,\n { 'hidden': {value: false}, 'visibilityState': {value: 'visible'} });\n\nwindow.addEventListener(\n 'visibilitychange', evt => evt.stopImmediatePropagation(), true);\n\n// Fullscreen API\nif (IS_VIMEO) {\n window.addEventListener(\n 'fullscreenchange', evt => evt.stopImmediatePropagation(), true);\n}\n\n// User activity tracking\nif (IS_YOUTUBE) {\n const refreshInterval = 2 + 3 * 60 * 1000; // every 3 minutes\n waitForYoutubeLactInit(() => refreshLact(), refreshInterval);\n}\n\nfunction waitForYoutubeLactInit(aCallback, aCallbackInterval, aDelay) {\n let pageWin = window.wrappedJSObject;\n if (pageWin.hasOwnProperty('_lact')) {\n window.setInterval(aCallback, aCallbackInterval);\n } else {\n window.setTimeout(() => waitForYoutubeLactInit(aCallback,\n aCallbackInterval,\n aDelay * 2),\n aDelay);\n }\n}\n\nfunction refreshLact() {\n window.wrappedJSObject._lact = Date.now();\n}\n"
+
+#endif // video_bg_play_h
diff --git a/third_party/blink/renderer/core/html/html_script_element.cc b/third_party/blink/renderer/core/html/html_script_element.cc
diff --git a/build/patches/Modify-default-preferences.patch b/build/patches/Modify-default-preferences.patch
index 7c7784f763fba8aea37b228344184c92197ed632..f2e53098162db9781722f83e4125aaaebfd1d5f4 100644
--- a/build/patches/Modify-default-preferences.patch
+++ b/build/patches/Modify-default-preferences.patch
@@ -36,7 +36,7 @@ diff --git a/chrome/browser/background/background_mode_manager.cc b/chrome/brows
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
-@@ -1177,7 +1177,7 @@ void ChromeContentBrowserClient::RegisterLocalStatePrefs(
+@@ -1150,7 +1150,7 @@ void ChromeContentBrowserClient::RegisterLocalStatePrefs(
void ChromeContentBrowserClient::RegisterProfilePrefs(
user_prefs::PrefRegistrySyncable* registry) {
registry->RegisterBooleanPref(prefs::kDisable3DAPIs, false);
@@ -113,7 +113,7 @@ diff --git a/chrome/browser/ui/browser_ui_prefs.cc b/chrome/browser/ui/browser_u
diff --git a/chrome/browser/ui/navigation_correction_tab_observer.cc b/chrome/browser/ui/navigation_correction_tab_observer.cc
--- a/chrome/browser/ui/navigation_correction_tab_observer.cc
+++ b/chrome/browser/ui/navigation_correction_tab_observer.cc
-@@ -55,7 +55,7 @@ NavigationCorrectionTabObserver::~NavigationCorrectionTabObserver() {}
+@@ -42,7 +42,7 @@ NavigationCorrectionTabObserver::~NavigationCorrectionTabObserver() {}
// static
void NavigationCorrectionTabObserver::RegisterProfilePrefs(
user_prefs::PrefRegistrySyncable* prefs) {
@@ -151,7 +151,7 @@ diff --git a/chrome/service/cloud_print/connector_settings.cc b/chrome/service/c
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc
--- a/components/autofill/core/browser/autofill_manager.cc
+++ b/components/autofill/core/browser/autofill_manager.cc
-@@ -425,10 +425,7 @@ bool AutofillManager::ShouldParseForms(const std::vector& forms,
+@@ -516,10 +516,7 @@ bool AutofillManager::ShouldParseForms(const std::vector& forms,
bool enabled = IsAutofillEnabled();
sync_state_ = personal_data_ ? personal_data_->GetSyncSigninState()
: AutofillSyncSigninState::kNumSyncStates;
@@ -163,7 +163,7 @@ diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/a
return enabled;
}
-@@ -704,10 +701,7 @@ void AutofillManager::OnQueryFormFieldAutofillImpl(
+@@ -803,10 +800,7 @@ void AutofillManager::OnQueryFormFieldAutofillImpl(
// suggestions available.
// TODO(mathp): Differentiate between number of suggestions available
// (current metric) and number shown to the user.
@@ -175,7 +175,7 @@ diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/a
}
}
-@@ -1311,8 +1305,8 @@ void AutofillManager::Reset() {
+@@ -1427,8 +1421,8 @@ void AutofillManager::Reset() {
#if defined(OS_ANDROID) || defined(OS_IOS)
autofill_assistant_.Reset();
#endif
@@ -189,7 +189,7 @@ diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/a
diff --git a/components/autofill/core/common/autofill_prefs.cc b/components/autofill/core/common/autofill_prefs.cc
--- a/components/autofill/core/common/autofill_prefs.cc
+++ b/components/autofill/core/common/autofill_prefs.cc
-@@ -146,7 +146,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
+@@ -150,7 +150,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
prefs::kAutofillLastVersionDisusedAddressesDeleted, 0,
user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
registry->RegisterBooleanPref(
@@ -201,7 +201,7 @@ diff --git a/components/autofill/core/common/autofill_prefs.cc b/components/auto
diff --git a/components/bookmarks/browser/bookmark_utils.cc b/components/bookmarks/browser/bookmark_utils.cc
--- a/components/bookmarks/browser/bookmark_utils.cc
+++ b/components/bookmarks/browser/bookmark_utils.cc
-@@ -433,12 +433,12 @@ void GetBookmarksMatchingProperties(BookmarkModel* model,
+@@ -443,12 +443,12 @@ bool DoesBookmarkContainWords(const base::string16& title,
void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
registry->RegisterBooleanPref(
prefs::kShowBookmarkBar,
@@ -219,7 +219,7 @@ diff --git a/components/bookmarks/browser/bookmark_utils.cc b/components/bookmar
diff --git a/components/safe_browsing/common/safe_browsing_prefs.cc b/components/safe_browsing/common/safe_browsing_prefs.cc
--- a/components/safe_browsing/common/safe_browsing_prefs.cc
+++ b/components/safe_browsing/common/safe_browsing_prefs.cc
-@@ -153,9 +153,9 @@ void RegisterProfilePrefs(PrefRegistrySimple* registry) {
+@@ -167,9 +167,9 @@ void RegisterProfilePrefs(PrefRegistrySimple* registry) {
registry->RegisterBooleanPref(
prefs::kSafeBrowsingSawInterstitialScoutReporting, false);
registry->RegisterBooleanPref(
diff --git a/build/patches/Multiple-fingerprinting-mitigations-for-canvas-text-and-client-rectangles.patch b/build/patches/Multiple-fingerprinting-mitigations-for-canvas-text-and-client-rectangles.patch
new file mode 100644
index 0000000000000000000000000000000000000000..e395814b508ac230954ff798813043d8b84ffaca
--- /dev/null
+++ b/build/patches/Multiple-fingerprinting-mitigations-for-canvas-text-and-client-rectangles.patch
@@ -0,0 +1,732 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Fri, 30 Mar 2018 10:09:03 +0200
+Subject: Multiple fingerprinting mitigations for canvas, text and client
+ rectangles
+
+1. getClientRects, getBoundingClientRect, measureText: add fingerprinting mitigation
+
+Scale the result of Range::getClientRects, Element::getBoundingClientRect and
+Canvas::measureText by a random +/-3/1000000th of the original value for each
+float in the returned Rect/Quad.
+
+It contains improvements from ungoogled-chromium which add two flags:
+1. --fingerprinting-client-rects-noise to enable fingerprinting deception for Range::getClientRects and Element::getBoundingClientRect
+2. --fingerprinting-canvas-measuretext-noise to enable fingerprinting deception for Canvas::measureText
+
+2. Canvas: fingerprinting mitigations for image data and webGL
+
+Disable webGL renderer info and modify the color data returned by ToBlob,
+ToDataURL and getImageData so that it will contain randomly manipulated
+pixels (maximum 20) that slightly change the color of the R,G,B components
+without a visible effect.
+
+Credits to Slaviro (https://github.com/Slaviro) for coming up with a better
+approach to change color components.
+
+Added flag --fingerprinting-canvas-image-data-noise to disable Canvas image data fingerprinting deception
+---
+ chrome/browser/BUILD.gn | 1 +
+ chrome/browser/about_flags.cc | 13 ++
+ content/browser/BUILD.gn | 1 +
+ .../renderer_host/render_process_host_impl.cc | 4 +
+ content/child/BUILD.gn | 1 +
+ content/child/runtime_features.cc | 8 ++
+ .../blink/public/platform/web_runtime_features.h | 3 +
+ third_party/blink/renderer/core/dom/document.cc | 18 +++
+ third_party/blink/renderer/core/dom/document.h | 7 +
+ third_party/blink/renderer/core/dom/element.cc | 8 ++
+ third_party/blink/renderer/core/dom/range.cc | 12 +-
+ .../renderer/core/html/canvas/text_metrics.cc | 18 +++
+ .../blink/renderer/core/html/canvas/text_metrics.h | 2 +
+ .../canvas/canvas2d/canvas_rendering_context_2d.cc | 8 +-
+ .../modules/webgl/webgl_debug_renderer_info.cc | 4 +-
+ third_party/blink/renderer/platform/BUILD.gn | 5 +-
+ .../platform/exported/web_runtime_features.cc | 12 ++
+ .../platform/graphics/image_data_buffer.cc | 7 +
+ .../platform/graphics/static_bitmap_image.cc | 159 +++++++++++++++++++++
+ .../platform/graphics/static_bitmap_image.h | 2 +
+ .../platform/runtime_enabled_features.json5 | 9 ++
+ third_party/ungoogled/BUILD.gn | 10 ++
+ third_party/ungoogled/ungoogled_switches.cc | 18 +++
+ third_party/ungoogled/ungoogled_switches.h | 18 +++
+ 24 files changed, 343 insertions(+), 5 deletions(-)
+ create mode 100644 third_party/ungoogled/BUILD.gn
+ create mode 100644 third_party/ungoogled/ungoogled_switches.cc
+ create mode 100644 third_party/ungoogled/ungoogled_switches.h
+
+diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
+--- a/chrome/browser/BUILD.gn
++++ b/chrome/browser/BUILD.gn
+@@ -2200,6 +2200,7 @@ jumbo_split_static_library("browser") {
+ "//third_party/metrics_proto",
+ "//third_party/re2",
+ "//third_party/smhasher:cityhash",
++ "//third_party/ungoogled:switches",
+ "//third_party/webrtc_overrides",
+ "//third_party/webrtc_overrides:init_webrtc",
+ "//third_party/widevine/cdm:buildflags",
+diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
+--- a/chrome/browser/about_flags.cc
++++ b/chrome/browser/about_flags.cc
+@@ -147,6 +147,7 @@
+ #include "third_party/blink/public/common/features.h"
+ #include "third_party/blink/public/common/forcedark/forcedark_switches.h"
+ #include "third_party/leveldatabase/leveldb_features.h"
++#include "third_party/ungoogled/ungoogled_switches.h"
+ #include "ui/accessibility/accessibility_switches.h"
+ #include "ui/base/ui_base_features.h"
+ #include "ui/base/ui_base_switches.h"
+@@ -1405,12 +1406,24 @@ const FeatureEntry kFeatureEntries[] = {
+ {"enable-webrtc-srtp-aes-gcm", flag_descriptions::kWebrtcSrtpAesGcmName,
+ flag_descriptions::kWebrtcSrtpAesGcmDescription, kOsAll,
+ SINGLE_VALUE_TYPE(switches::kEnableWebRtcSrtpAesGcm)},
++ {"fingerprinting-canvas-image-data-noise",
++ "Disable Canvas image data fingerprint deception",
++ "Slightly modifies at most 20 pixels in Canvas image data extracted via JS APIs",
++ kOsAll, SINGLE_DISABLE_VALUE_TYPE(switches::kFingerprintingCanvasImageDataNoise)},
+ {"enable-webrtc-stun-origin", flag_descriptions::kWebrtcStunOriginName,
+ flag_descriptions::kWebrtcStunOriginDescription, kOsAll,
+ SINGLE_VALUE_TYPE(switches::kEnableWebRtcStunOrigin)},
+ {"enable-webrtc-hybrid-agc", flag_descriptions::kWebrtcHybridAgcName,
+ flag_descriptions::kWebrtcHybridAgcDescription, kOsAll,
+ FEATURE_VALUE_TYPE(features::kWebRtcHybridAgc)},
++ {"fingerprinting-client-rects-noise",
++ "Disable get*ClientRects() fingerprint deception",
++ "Scale the output values of Range::getClientRects() and Element::getBoundingClientRect() with a randomly selected factor in the range -0.0003% to 0.0003%, which are recomputed on every document initialization.",
++ kOsAll, SINGLE_DISABLE_VALUE_TYPE(switches::kFingerprintingClientRectsNoise)},
++ {"fingerprinting-canvas-measuretext-noise",
++ "Disable Canvas::measureText() fingerprint deception",
++ "Scale the output values of Canvas::measureText() with a randomly selected factor in the range -0.0003% to 0.0003%, which are recomputed on every document initialization.",
++ kOsAll, SINGLE_DISABLE_VALUE_TYPE(switches::kFingerprintingCanvasMeasureTextNoise)},
+ {"enable-webrtc-new-encode-cpu-load-estimator",
+ flag_descriptions::kWebrtcNewEncodeCpuLoadEstimatorName,
+ flag_descriptions::kWebrtcNewEncodeCpuLoadEstimatorDescription, kOsAll,
+diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
+--- a/content/browser/BUILD.gn
++++ b/content/browser/BUILD.gn
+@@ -206,6 +206,7 @@ jumbo_source_set("browser") {
+ "//third_party/libyuv",
+ "//third_party/re2",
+ "//third_party/sqlite",
++ "//third_party/ungoogled:switches",
+ "//third_party/webrtc/modules/desktop_capture:primitives",
+ "//third_party/webrtc/rtc_base:rtc_base",
+ "//third_party/zlib",
+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
+@@ -213,6 +213,7 @@
+ #include "third_party/blink/public/common/page/launching_process_state.h"
+ #include "third_party/blink/public/common/user_agent/user_agent_metadata.h"
+ #include "third_party/blink/public/public_buildflags.h"
++#include "third_party/ungoogled/ungoogled_switches.h"
+ #include "third_party/skia/include/core/SkBitmap.h"
+ #include "ui/accessibility/accessibility_switches.h"
+ #include "ui/base/ui_base_switches.h"
+@@ -2970,6 +2971,9 @@ void RenderProcessHostImpl::PropagateBrowserCommandLineToRenderer(
+ switches::kEnableWebGLSwapChain,
+ switches::kEnableWebVR,
+ switches::kFileUrlPathAlias,
++ switches::kFingerprintingClientRectsNoise,
++ switches::kFingerprintingCanvasMeasureTextNoise,
++ switches::kFingerprintingCanvasImageDataNoise,
+ switches::kForceDisplayColorProfile,
+ switches::kForceDeviceScaleFactor,
+ switches::kForceGpuMemAvailableMb,
+diff --git a/content/child/BUILD.gn b/content/child/BUILD.gn
+--- a/content/child/BUILD.gn
++++ b/content/child/BUILD.gn
+@@ -120,6 +120,7 @@ target(link_target_type, "child") {
+ "//third_party/blink/public:scaled_resources",
+ "//third_party/blink/public/common",
+ "//third_party/ced",
++ "//third_party/ungoogled:switches",
+ "//third_party/zlib/google:compression_utils",
+ "//ui/base",
+ "//ui/events/blink",
+diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
+--- a/content/child/runtime_features.cc
++++ b/content/child/runtime_features.cc
+@@ -23,6 +23,7 @@
+ #include "services/network/public/cpp/features.h"
+ #include "third_party/blink/public/common/features.h"
+ #include "third_party/blink/public/platform/web_runtime_features.h"
++#include "third_party/ungoogled/ungoogled_switches.h"
+ #include "ui/base/ui_base_features.h"
+ #include "ui/events/blink/blink_features.h"
+ #include "ui/gfx/switches.h"
+@@ -461,6 +462,13 @@ void SetIndividualRuntimeFeatures(
+ WebRuntimeFeatures::EnableAllowSyncXHRInPageDismissal(true);
+ }
+
++ WebRuntimeFeatures::EnableFingerprintingClientRectsNoise(
++ !command_line.HasSwitch(switches::kFingerprintingClientRectsNoise));
++ WebRuntimeFeatures::EnableFingerprintingCanvasMeasureTextNoise(
++ !command_line.HasSwitch(switches::kFingerprintingCanvasMeasureTextNoise));
++ WebRuntimeFeatures::EnableFingerprintingCanvasImageDataNoise(
++ !command_line.HasSwitch(switches::kFingerprintingCanvasImageDataNoise));
++
+ WebRuntimeFeatures::EnableAutoplayIgnoresWebAudio(
+ base::FeatureList::IsEnabled(media::kAutoplayIgnoreWebAudio));
+
+diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h
+--- a/third_party/blink/public/platform/web_runtime_features.h
++++ b/third_party/blink/public/platform/web_runtime_features.h
+@@ -228,6 +228,9 @@ class WebRuntimeFeatures {
+ BLINK_PLATFORM_EXPORT static void EnableMergeBlockingNonBlockingPools(bool);
+ BLINK_PLATFORM_EXPORT static void EnableGetDisplayMedia(bool);
+ BLINK_PLATFORM_EXPORT static void EnableAllowSyncXHRInPageDismissal(bool);
++ BLINK_PLATFORM_EXPORT static void EnableFingerprintingClientRectsNoise(bool);
++ BLINK_PLATFORM_EXPORT static void EnableFingerprintingCanvasMeasureTextNoise(bool);
++ BLINK_PLATFORM_EXPORT static void EnableFingerprintingCanvasImageDataNoise(bool);
+ BLINK_PLATFORM_EXPORT static void EnableShadowDOMV0(bool);
+ BLINK_PLATFORM_EXPORT static void EnableCustomElementsV0(bool);
+ BLINK_PLATFORM_EXPORT static void EnableHTMLImports(bool);
+diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
+--- a/third_party/blink/renderer/core/dom/document.cc
++++ b/third_party/blink/renderer/core/dom/document.cc
+@@ -35,6 +35,7 @@
+ #include "base/auto_reset.h"
+ #include "base/macros.h"
+ #include "base/optional.h"
++#include "base/rand_util.h"
+ #include "base/time/time.h"
+ #include "cc/input/overscroll_behavior.h"
+ #include "cc/input/scroll_snap_data.h"
+@@ -1199,6 +1200,15 @@ Document::Document(const DocumentInit& initializer,
+ #ifndef NDEBUG
+ liveDocumentSet().insert(this);
+ #endif
++
++ if (RuntimeEnabledFeatures::FingerprintingClientRectsNoiseEnabled()) {
++ // Precompute -0.0003% to 0.0003% noise factor for get*ClientRect*() fingerprinting
++ noise_factor_x_ = 1 + (base::RandDouble() - 0.5) * 0.000003;
++ noise_factor_y_ = 1 + (base::RandDouble() - 0.5) * 0.000003;
++ } else {
++ noise_factor_x_ = 1;
++ noise_factor_y_ = 1;
++ }
+ }
+
+ Document::~Document() {
+@@ -1227,6 +1237,14 @@ Range* Document::CreateRangeAdjustedToTreeScope(const TreeScope& tree_scope,
+ Position::BeforeNode(*shadow_host));
+ }
+
++double Document::GetNoiseFactorX() {
++ return noise_factor_x_;
++}
++
++double Document::GetNoiseFactorY() {
++ return noise_factor_y_;
++}
++
+ SelectorQueryCache& Document::GetSelectorQueryCache() {
+ if (!selector_query_cache_)
+ selector_query_cache_ = std::make_unique();
+diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
+--- a/third_party/blink/renderer/core/dom/document.h
++++ b/third_party/blink/renderer/core/dom/document.h
+@@ -408,6 +408,10 @@ class CORE_EXPORT Document : public ContainerNode,
+ has_xml_declaration_ = has_xml_declaration ? 1 : 0;
+ }
+
++ // Values for get*ClientRect fingerprint deception
++ double GetNoiseFactorX();
++ double GetNoiseFactorY();
++
+ String visibilityState() const;
+ bool IsPageVisible() const;
+ bool hidden() const;
+@@ -1905,6 +1909,9 @@ class CORE_EXPORT Document : public ContainerNode,
+
+ base::ElapsedTimer start_time_;
+
++ double noise_factor_x_;
++ double noise_factor_y_;
++
+ Member script_runner_;
+
+ HeapVector> current_script_stack_;
+diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
+--- a/third_party/blink/renderer/core/dom/element.cc
++++ b/third_party/blink/renderer/core/dom/element.cc
+@@ -1630,6 +1630,11 @@ DOMRectList* Element::getClientRects() {
+ DCHECK(element_layout_object);
+ GetDocument().AdjustFloatQuadsForScrollAndAbsoluteZoom(
+ quads, *element_layout_object);
++ if (RuntimeEnabledFeatures::FingerprintingClientRectsNoiseEnabled()) {
++ for (FloatQuad& quad : quads) {
++ quad.Scale(GetDocument().GetNoiseFactorX(), GetDocument().GetNoiseFactorY());
++ }
++ }
+ return DOMRectList::Create(quads);
+ }
+
+@@ -1647,6 +1652,9 @@ DOMRect* Element::getBoundingClientRect() {
+ DCHECK(element_layout_object);
+ GetDocument().AdjustFloatRectForScrollAndAbsoluteZoom(result,
+ *element_layout_object);
++ if (RuntimeEnabledFeatures::FingerprintingClientRectsNoiseEnabled()) {
++ result.Scale(GetDocument().GetNoiseFactorX(), GetDocument().GetNoiseFactorY());
++ }
+ return DOMRect::FromFloatRect(result);
+ }
+
+diff --git a/third_party/blink/renderer/core/dom/range.cc b/third_party/blink/renderer/core/dom/range.cc
+--- a/third_party/blink/renderer/core/dom/range.cc
++++ b/third_party/blink/renderer/core/dom/range.cc
+@@ -1631,11 +1631,21 @@ DOMRectList* Range::getClientRects() const {
+ Vector quads;
+ GetBorderAndTextQuads(quads);
+
++ if (RuntimeEnabledFeatures::FingerprintingClientRectsNoiseEnabled()) {
++ for (FloatQuad& quad : quads) {
++ quad.Scale(owner_document_->GetNoiseFactorX(), owner_document_->GetNoiseFactorY());
++ }
++ }
++
+ return DOMRectList::Create(quads);
+ }
+
+ DOMRect* Range::getBoundingClientRect() const {
+- return DOMRect::FromFloatRect(BoundingRect());
++ auto rect = BoundingRect();
++ if (RuntimeEnabledFeatures::FingerprintingClientRectsNoiseEnabled()) {
++ rect.Scale(owner_document_->GetNoiseFactorX(), owner_document_->GetNoiseFactorY());
++ }
++ return DOMRect::FromFloatRect(rect);
+ }
+
+ // TODO(editing-dev): We should make
+diff --git a/third_party/blink/renderer/core/html/canvas/text_metrics.cc b/third_party/blink/renderer/core/html/canvas/text_metrics.cc
+--- a/third_party/blink/renderer/core/html/canvas/text_metrics.cc
++++ b/third_party/blink/renderer/core/html/canvas/text_metrics.cc
+@@ -54,6 +54,24 @@ TextMetrics::TextMetrics(const Font& font,
+ Update(font, direction, baseline, align, text);
+ }
+
++void TextMetrics::Shuffle(const double factor) {
++ // x-direction
++ width_ *= factor;
++ actual_bounding_box_left_ *= factor;
++ actual_bounding_box_right_ *= factor;
++
++ // y-direction
++ font_bounding_box_ascent_ *= factor;
++ font_bounding_box_descent_ *= factor;
++ actual_bounding_box_ascent_ *= factor;
++ actual_bounding_box_descent_ *= factor;
++ em_height_ascent_ *= factor;
++ em_height_descent_ *= factor;
++ baselines_->setAlphabetic(baselines_->alphabetic() * factor);
++ baselines_->setHanging(baselines_->hanging() * factor);
++ baselines_->setIdeographic(baselines_->ideographic() * factor);
++}
++
+ void TextMetrics::Update(const Font& font,
+ const TextDirection& direction,
+ const TextBaseline& baseline,
+diff --git a/third_party/blink/renderer/core/html/canvas/text_metrics.h b/third_party/blink/renderer/core/html/canvas/text_metrics.h
+--- a/third_party/blink/renderer/core/html/canvas/text_metrics.h
++++ b/third_party/blink/renderer/core/html/canvas/text_metrics.h
+@@ -64,6 +64,8 @@ class CORE_EXPORT TextMetrics final : public ScriptWrappable {
+
+ void Trace(Visitor*) override;
+
++ void Shuffle(const double factor);
++
+ private:
+ void Update(const Font&,
+ const TextDirection&,
+diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
+--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
++++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
+@@ -811,9 +811,15 @@ TextMetrics* CanvasRenderingContext2D::measureText(const String& text) {
+ else
+ direction = ToTextDirection(GetState().GetDirection(), canvas());
+
+- return MakeGarbageCollected(font, direction,
++ TextMetrics* text_metrics = MakeGarbageCollected(font, direction,
+ GetState().GetTextBaseline(),
+ GetState().GetTextAlign(), text);
++
++ // Scale text metrics if enabled
++ if (RuntimeEnabledFeatures::FingerprintingCanvasMeasureTextNoiseEnabled()) {
++ text_metrics->Shuffle(canvas()->GetDocument().GetNoiseFactorX());
++ }
++ return text_metrics;
+ }
+
+ void CanvasRenderingContext2D::DrawTextInternal(
+diff --git a/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc b/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc
+--- a/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc
++++ b/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc
+@@ -37,11 +37,11 @@ WebGLExtensionName WebGLDebugRendererInfo::GetName() const {
+
+ WebGLDebugRendererInfo* WebGLDebugRendererInfo::Create(
+ WebGLRenderingContextBase* context) {
+- return MakeGarbageCollected(context);
++ return nullptr;
+ }
+
+ bool WebGLDebugRendererInfo::Supported(WebGLRenderingContextBase*) {
+- return true;
++ return false;
+ }
+
+ const char* WebGLDebugRendererInfo::ExtensionName() {
+diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
+--- a/third_party/blink/renderer/platform/BUILD.gn
++++ b/third_party/blink/renderer/platform/BUILD.gn
+@@ -1417,7 +1417,9 @@ jumbo_component("platform") {
+ "//third_party/blink/renderer:non_test_config",
+ ]
+
+- include_dirs = []
++ include_dirs = [
++ "//third_party/skia/include/private", # For shuffler in graphics/static_bitmap_image.cc
++ ]
+
+ public_deps = [
+ ":blink_platform_public_deps",
+@@ -1450,6 +1452,7 @@ jumbo_component("platform") {
+ "//third_party/ced",
+ "//third_party/emoji-segmenter",
+ "//third_party/icu",
++ "//third_party/ungoogled:switches",
+ "//third_party/webrtc/api:libjingle_logging_api",
+ "//third_party/webrtc/api/audio_codecs/L16:audio_decoder_L16",
+ "//third_party/webrtc/api/audio_codecs/L16:audio_encoder_L16",
+diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
+--- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc
++++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
+@@ -722,4 +722,16 @@ void WebRuntimeFeatures::EnableAcceleratedSmallCanvases(bool enable) {
+ RuntimeEnabledFeatures::SetAcceleratedSmallCanvasesEnabled(enable);
+ }
+
++void WebRuntimeFeatures::EnableFingerprintingClientRectsNoise(bool enable) {
++ RuntimeEnabledFeatures::SetFingerprintingClientRectsNoiseEnabled(enable);
++}
++
++void WebRuntimeFeatures::EnableFingerprintingCanvasMeasureTextNoise(bool enable) {
++ RuntimeEnabledFeatures::SetFingerprintingCanvasMeasureTextNoiseEnabled(enable);
++}
++
++void WebRuntimeFeatures::EnableFingerprintingCanvasImageDataNoise(bool enable) {
++ RuntimeEnabledFeatures::SetFingerprintingCanvasImageDataNoiseEnabled(enable);
++}
++
+ } // namespace blink
+diff --git a/third_party/blink/renderer/platform/graphics/image_data_buffer.cc b/third_party/blink/renderer/platform/graphics/image_data_buffer.cc
+--- a/third_party/blink/renderer/platform/graphics/image_data_buffer.cc
++++ b/third_party/blink/renderer/platform/graphics/image_data_buffer.cc
+@@ -35,6 +35,8 @@
+ #include
+
+ #include "base/memory/ptr_util.h"
++#include "base/rand_util.h"
++#include "base/logging.h"
+ #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
+ #include "third_party/blink/renderer/platform/image-encoders/image_encoder.h"
+ #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
+@@ -127,6 +129,11 @@ bool ImageDataBuffer::EncodeImageInternal(const ImageEncodingMimeType mime_type,
+ const SkPixmap& pixmap) const {
+ DCHECK(is_valid_);
+
++ if (RuntimeEnabledFeatures::FingerprintingCanvasImageDataNoiseEnabled()) {
++ // shuffle subchannel color data within the pixmap
++ StaticBitmapImage::ShuffleSubchannelColorData(pixmap_.writable_addr(), pixmap_.info(), 0, 0);
++ }
++
+ if (mime_type == kMimeTypeJpeg) {
+ SkJpegEncoder::Options options;
+ options.fQuality = ImageEncoder::ComputeJpegQuality(quality);
+diff --git a/third_party/blink/renderer/platform/graphics/static_bitmap_image.cc b/third_party/blink/renderer/platform/graphics/static_bitmap_image.cc
+--- a/third_party/blink/renderer/platform/graphics/static_bitmap_image.cc
++++ b/third_party/blink/renderer/platform/graphics/static_bitmap_image.cc
+@@ -4,6 +4,8 @@
+
+ #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
+
++#include "base/rand_util.h"
++#include "base/logging.h"
+ #include "base/numerics/checked_math.h"
+ #include "gpu/command_buffer/client/gles2_interface.h"
+ #include "third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.h"
+@@ -11,12 +13,14 @@
+ #include "third_party/blink/renderer/platform/graphics/image_observer.h"
+ #include "third_party/blink/renderer/platform/graphics/paint/paint_image.h"
+ #include "third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h"
++#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
+ #include "third_party/blink/renderer/platform/wtf/typed_arrays/array_buffer_contents.h"
+ #include "third_party/skia/include/core/SkCanvas.h"
+ #include "third_party/skia/include/core/SkImage.h"
+ #include "third_party/skia/include/core/SkPaint.h"
+ #include "third_party/skia/include/core/SkSurface.h"
+ #include "third_party/skia/include/gpu/GrContext.h"
++#include "third_party/skia/include/private/SkColorData.h"
+ #include "v8/include/v8.h"
+
+ namespace blink {
+@@ -154,10 +158,165 @@ bool StaticBitmapImage::ConvertToArrayBufferContents(
+ DCHECK(read_pixels_successful ||
+ !sk_image->bounds().intersect(SkIRect::MakeXYWH(
+ rect.X(), rect.Y(), info.width(), info.height())));
++
++ if (RuntimeEnabledFeatures::FingerprintingCanvasImageDataNoiseEnabled()) {
++ ShuffleSubchannelColorData(result.Data(), info, rect.X(), rect.Y());
++ }
++
+ result.Transfer(dest_contents);
+ return true;
+ }
+
++// set the component to maximum-delta if it is >= maximum, or add to existing color component (color + delta)
++#define shuffleComponent(color, max, delta) ( (color) >= (max) ? ((max)-(delta)) : ((color)+(delta)) )
++
++#define writable_addr(T, p, stride, x, y) (T*)((const char *)p + y * stride + x * sizeof(T))
++
++void StaticBitmapImage::ShuffleSubchannelColorData(const void *addr, const SkImageInfo& info, int srcX, int srcY) {
++ auto w = info.width() - srcX, h = info.height() - srcY;
++
++ // skip tiny images; info.width()/height() can also be 0
++ if ((w < 8) || (h < 8)) {
++ return;
++ }
++
++ // generate the first random number here
++ double shuffleX = base::RandDouble();
++
++ // cap maximum pixels to change
++ auto pixels = (w + h) / 128;
++ if (pixels > 20) {
++ pixels = 20;
++ } else if (pixels < 2) {
++ pixels = 2;
++ }
++
++ auto colorType = info.colorType();
++ auto fRowBytes = info.minRowBytes(); // stride
++
++ DLOG(INFO) << "BRM: ShuffleSubchannelColorData() w=" << w << " h=" << h << " colorType=" << colorType << " fRowBytes=" << fRowBytes;
++
++ // second random number (for y/height)
++ double shuffleY = base::RandDouble();
++
++ // calculate random coordinates using bisection
++ auto currentW = w, currentH = h;
++ for(;pixels >= 0; pixels--) {
++ int x = currentW * shuffleX, y = currentH * shuffleY;
++
++ // calculate randomisation amounts for each RGB component
++ uint8_t shuffleR = base::RandInt(0, 4);
++ uint8_t shuffleG = (shuffleR + x) % 4;
++ uint8_t shuffleB = (shuffleG + y) % 4;
++
++ // manipulate pixel data to slightly change the R, G, B components
++ switch (colorType) {
++ case kAlpha_8_SkColorType:
++ {
++ auto *pixel = writable_addr(uint8_t, addr, fRowBytes, x, y);
++ auto r = SkColorGetR(*pixel), g = SkColorGetG(*pixel), b = SkColorGetB(*pixel), a = SkColorGetA(*pixel);
++
++ r = shuffleComponent(r, UINT8_MAX-1, shuffleR);
++ g = shuffleComponent(g, UINT8_MAX-1, shuffleG);
++ b = shuffleComponent(b, UINT8_MAX-1, shuffleB);
++ // alpha is left unchanged
++
++ *pixel = SkColorSetARGB(a, r, g, b);
++ }
++ break;
++ case kGray_8_SkColorType:
++ {
++ auto *pixel = writable_addr(uint8_t, addr, fRowBytes, x, y);
++ *pixel = shuffleComponent(*pixel, UINT8_MAX-1, shuffleB);
++ }
++ break;
++ case kRGB_565_SkColorType:
++ {
++ auto *pixel = writable_addr(uint16_t, addr, fRowBytes, x, y);
++ unsigned r = SkPacked16ToR32(*pixel);
++ unsigned g = SkPacked16ToG32(*pixel);
++ unsigned b = SkPacked16ToB32(*pixel);
++
++ r = shuffleComponent(r, 31, shuffleR);
++ g = shuffleComponent(g, 63, shuffleG);
++ b = shuffleComponent(b, 31, shuffleB);
++
++ unsigned r16 = (r & SK_R16_MASK) << SK_R16_SHIFT;
++ unsigned g16 = (g & SK_G16_MASK) << SK_G16_SHIFT;
++ unsigned b16 = (b & SK_B16_MASK) << SK_B16_SHIFT;
++
++ *pixel = r16 | g16 | b16;
++ }
++ break;
++ case kARGB_4444_SkColorType:
++ {
++ auto *pixel = writable_addr(uint16_t, addr, fRowBytes, x, y);
++ auto a = SkGetPackedA4444(*pixel), r = SkGetPackedR4444(*pixel), g = SkGetPackedG4444(*pixel), b = SkGetPackedB4444(*pixel);
++
++ r = shuffleComponent(r, 15, shuffleR);
++ g = shuffleComponent(g, 15, shuffleG);
++ b = shuffleComponent(b, 15, shuffleB);
++ // alpha is left unchanged
++
++ unsigned a4 = (a & 0xF) << SK_A4444_SHIFT;
++ unsigned r4 = (r & 0xF) << SK_R4444_SHIFT;
++ unsigned g4 = (g & 0xF) << SK_G4444_SHIFT;
++ unsigned b4 = (b & 0xF) << SK_B4444_SHIFT;
++
++ *pixel = r4 | b4 | g4 | a4;
++ }
++ break;
++ case kRGBA_8888_SkColorType:
++ {
++ auto *pixel = writable_addr(uint32_t, addr, fRowBytes, x, y);
++ auto a = SkGetPackedA32(*pixel), r = SkGetPackedR32(*pixel), g = SkGetPackedG32(*pixel), b = SkGetPackedB32(*pixel);
++
++ r = shuffleComponent(r, UINT8_MAX-1, shuffleR);
++ g = shuffleComponent(g, UINT8_MAX-1, shuffleG);
++ b = shuffleComponent(b, UINT8_MAX-1, shuffleB);
++ // alpha is left unchanged
++
++ *pixel = (a << SK_A32_SHIFT) | (r << SK_R32_SHIFT) |
++ (g << SK_G32_SHIFT) | (b << SK_B32_SHIFT);
++ }
++ break;
++ case kBGRA_8888_SkColorType:
++ {
++ auto *pixel = writable_addr(uint32_t, addr, fRowBytes, x, y);
++ auto a = SkGetPackedA32(*pixel), b = SkGetPackedR32(*pixel), g = SkGetPackedG32(*pixel), r = SkGetPackedB32(*pixel);
++
++ r = shuffleComponent(r, UINT8_MAX-1, shuffleR);
++ g = shuffleComponent(g, UINT8_MAX-1, shuffleG);
++ b = shuffleComponent(b, UINT8_MAX-1, shuffleB);
++ // alpha is left unchanged
++
++ *pixel = (a << SK_BGRA_A32_SHIFT) | (r << SK_BGRA_R32_SHIFT) |
++ (g << SK_BGRA_G32_SHIFT) | (b << SK_BGRA_B32_SHIFT);
++ }
++ break;
++ default:
++ // the remaining formats are not expected to be used in Chromium
++ LOG(WARNING) << "BRM: ShuffleSubchannelColorData(): Ignoring pixel format";
++ return;
++ }
++
++ // keep bisecting or reset current width/height as needed
++ if (x == 0) {
++ currentW = w;
++ } else {
++ currentW = x;
++ }
++ if (y == 0) {
++ currentH = h;
++ } else {
++ currentH = y;
++ }
++ }
++}
++
++#undef writable_addr
++#undef shuffleComponent
++
+ const gpu::SyncToken& StaticBitmapImage::GetSyncToken() const {
+ static const gpu::SyncToken sync_token;
+ return sync_token;
+diff --git a/third_party/blink/renderer/platform/graphics/static_bitmap_image.h b/third_party/blink/renderer/platform/graphics/static_bitmap_image.h
+--- a/third_party/blink/renderer/platform/graphics/static_bitmap_image.h
++++ b/third_party/blink/renderer/platform/graphics/static_bitmap_image.h
+@@ -46,6 +46,8 @@ class PLATFORM_EXPORT StaticBitmapImage : public Image {
+ static scoped_refptr Create(WTF::ArrayBufferContents&,
+ const SkImageInfo&);
+
++ static void ShuffleSubchannelColorData(const void *addr, const SkImageInfo& info, int srcX, int srcY);
++
+ bool IsStaticBitmapImage() const override { return true; }
+
+ // Methods overridden by all sub-classes
+diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
+--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
++++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
+@@ -677,6 +677,15 @@
+ name: "FileSystem",
+ status: "stable",
+ },
++ {
++ name: "FingerprintingClientRectsNoise",
++ },
++ {
++ name: "FingerprintingCanvasMeasureTextNoise",
++ },
++ {
++ name: "FingerprintingCanvasImageDataNoise",
++ },
+ // FirstContentfulPaintPlusPlus enables the Largest Text Paint metric, Last
+ // Text Paint metric, Largest Image Paint metric and Last Image Paint
+ // metric. See also: http://bit.ly/fcp_plus_plus
+diff --git a/third_party/ungoogled/BUILD.gn b/third_party/ungoogled/BUILD.gn
+new file mode 100644
+--- /dev/null
++++ b/third_party/ungoogled/BUILD.gn
+@@ -0,0 +1,10 @@
++# Copyright (c) 2018 The ungoogled-chromium Authors. All rights reserved.
++# Use of this source code is governed by a BSD-style license that can be
++# found in the LICENSE file.
++
++component("switches") {
++ sources = [
++ "ungoogled_switches.h",
++ "ungoogled_switches.cc",
++ ]
++}
+diff --git a/third_party/ungoogled/ungoogled_switches.cc b/third_party/ungoogled/ungoogled_switches.cc
+new file mode 100644
+--- /dev/null
++++ b/third_party/ungoogled/ungoogled_switches.cc
+@@ -0,0 +1,18 @@
++// Copyright (c) 2018 The ungoogled-chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "third_party/ungoogled/ungoogled_switches.h"
++
++namespace switches {
++
++// Enable fingerprinting deception for getClientRects and getBoundingClientRect
++const char kFingerprintingClientRectsNoise[] = "fingerprinting-client-rects-noise";
++
++// Enable fingerprinting deception for measureText
++const char kFingerprintingCanvasMeasureTextNoise[] = "fingerprinting-canvas-measuretext-noise";
++
++// Enable fingerprinting deception for Canvas image data
++const char kFingerprintingCanvasImageDataNoise[] = "fingerprinting-canvas-image-data-noise";
++
++} // namespace switches
+diff --git a/third_party/ungoogled/ungoogled_switches.h b/third_party/ungoogled/ungoogled_switches.h
+new file mode 100644
+--- /dev/null
++++ b/third_party/ungoogled/ungoogled_switches.h
+@@ -0,0 +1,18 @@
++// Copyright (c) 2018 The ungoogled-chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++// Defines all the fingerprinting command-line switches.
++
++#ifndef THIRD_PARTY_UNGOOGLED_FINGERPRINTING_SWITCHES_H_
++#define THIRD_PARTY_UNGOOGLED_FINGERPRINTING_SWITCHES_H_
++
++namespace switches {
++
++extern const char kFingerprintingClientRectsNoise[];
++extern const char kFingerprintingCanvasMeasureTextNoise[];
++extern const char kFingerprintingCanvasImageDataNoise[];
++
++}
++
++#endif // THIRD_PARTY_UNGOOGLED_FINGERPRINTING_SWITCHES_H_
+--
+2.11.0
+
diff --git a/build/patches/Never-fetch-popular-sites.patch b/build/patches/Never-fetch-popular-sites.patch
index c567a981f2d357f00cc504170fc3622503dcfa37..997ac1ca9881cf6596e7b05aecaff12fb2aeee00 100644
--- a/build/patches/Never-fetch-popular-sites.patch
+++ b/build/patches/Never-fetch-popular-sites.patch
@@ -9,7 +9,7 @@ Subject: Never fetch popular sites
diff --git a/components/ntp_tiles/popular_sites_impl.cc b/components/ntp_tiles/popular_sites_impl.cc
--- a/components/ntp_tiles/popular_sites_impl.cc
+++ b/components/ntp_tiles/popular_sites_impl.cc
-@@ -280,6 +280,12 @@ bool PopularSitesImpl::MaybeStartFetch(bool force_download,
+@@ -283,6 +283,12 @@ bool PopularSitesImpl::MaybeStartFetch(bool force_download,
DCHECK(!callback_);
callback_ = callback;
diff --git a/build/patches/Never-send-any-crash-upload-data.patch b/build/patches/Never-send-any-crash-upload-data.patch
index 4e6fa949cead5b0ca82e5f7361be4835762cbc47..585c8d8fb7ad14885934891553debaf65fc18e93 100644
--- a/build/patches/Never-send-any-crash-upload-data.patch
+++ b/build/patches/Never-send-any-crash-upload-data.patch
@@ -9,7 +9,7 @@ Subject: Never send any crash upload data
diff --git a/chrome/browser/tracing/crash_service_uploader.cc b/chrome/browser/tracing/crash_service_uploader.cc
--- a/chrome/browser/tracing/crash_service_uploader.cc
+++ b/chrome/browser/tracing/crash_service_uploader.cc
-@@ -126,6 +126,9 @@ void TraceCrashServiceUploader::DoUpload(
+@@ -125,6 +125,9 @@ void TraceCrashServiceUploader::DoUpload(
std::unique_ptr metadata,
const UploadProgressCallback& progress_callback,
UploadDoneCallback done_callback) {
diff --git a/build/patches/Remove-SMS-integration.patch b/build/patches/Remove-SMS-integration.patch
new file mode 100644
index 0000000000000000000000000000000000000000..94e64634baa2e171aa5853e81661c53fbf2460c9
--- /dev/null
+++ b/build/patches/Remove-SMS-integration.patch
@@ -0,0 +1,104 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Sun, 3 Nov 2019 08:22:29 +0100
+Subject: Remove SMS integration
+
+---
+ content/public/android/BUILD.gn | 2 -
+ .../org/chromium/content/browser/sms/Wrappers.java | 74 ----------------------
+ 2 files changed, 76 deletions(-)
+ delete mode 100644 content/public/android/java/src/org/chromium/content/browser/sms/Wrappers.java
+
+diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
+--- a/content/public/android/BUILD.gn
++++ b/content/public/android/BUILD.gn
+@@ -231,8 +231,6 @@ android_library("content_java") {
+ "java/src/org/chromium/content/browser/selection/SmartSelectionClient.java",
+ "java/src/org/chromium/content/browser/selection/SmartSelectionMetricsLogger.java",
+ "java/src/org/chromium/content/browser/selection/SmartSelectionProvider.java",
+- "java/src/org/chromium/content/browser/sms/SmsReceiver.java",
+- "java/src/org/chromium/content/browser/sms/Wrappers.java",
+ "java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java",
+ "java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java",
+ "java/src/org/chromium/content/common/ContentSwitchUtils.java",
+diff --git a/content/public/android/java/src/org/chromium/content/browser/sms/Wrappers.java b/content/public/android/java/src/org/chromium/content/browser/sms/Wrappers.java
+deleted file mode 100644
+--- a/content/public/android/java/src/org/chromium/content/browser/sms/Wrappers.java
++++ /dev/null
+@@ -1,74 +0,0 @@
+-// Copyright 2019 The Chromium Authors. All rights reserved.
+-// Use of this source code is governed by a BSD-style license that can be
+-// found in the LICENSE file.
+-
+-package org.chromium.content.browser.sms;
+-
+-import android.content.BroadcastReceiver;
+-import android.content.Context;
+-import android.content.ContextWrapper;
+-import android.content.Intent;
+-import android.content.IntentFilter;
+-
+-import com.google.android.gms.auth.api.phone.SmsRetrieverClient;
+-import com.google.android.gms.tasks.Task;
+-
+-class Wrappers {
+- // Prevent instantiation.
+- private Wrappers() {}
+-
+- /**
+- * Wraps com.google.android.gms.auth.api.phone.SmsRetrieverClient.
+- */
+- static class SmsRetrieverClientWrapper {
+- private final SmsRetrieverClient mSmsRetrieverClient;
+- private SmsReceiverContext mContext;
+-
+- public SmsRetrieverClientWrapper(SmsRetrieverClient smsRetrieverClient) {
+- mSmsRetrieverClient = smsRetrieverClient;
+- }
+-
+- public void setContext(SmsReceiverContext context) {
+- mContext = context;
+- }
+-
+- public SmsReceiverContext getContext() {
+- return mContext;
+- }
+-
+- public Task startSmsRetriever() {
+- return mSmsRetrieverClient.startSmsRetriever();
+- }
+- }
+-
+- /**
+- * Extends android.content.ContextWrapper to store and retrieve the
+- * registered BroadcastReceiver.
+- */
+- static class SmsReceiverContext extends ContextWrapper {
+- private BroadcastReceiver mReceiver;
+-
+- public SmsReceiverContext(Context context) {
+- super(context);
+- }
+-
+- public BroadcastReceiver getRegisteredReceiver() {
+- return mReceiver;
+- }
+-
+- // ---------------------------------------------------------------------
+- // Context overrides:
+-
+- @Override
+- public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
+- mReceiver = receiver;
+- return super.registerReceiver(receiver, filter);
+- }
+-
+- @Override
+- public void unregisterReceiver(BroadcastReceiver receiver) {
+- mReceiver = null;
+- super.unregisterReceiver(receiver);
+- }
+- }
+-}
+--
+2.11.0
+
diff --git a/build/patches/Remove-background-sync-and-translate-menu-options.patch b/build/patches/Remove-background-sync-and-translate-menu-options.patch
index 6c8bafa0d3775898d5efb0ffce0541aaa43fcdda..8442176b3a60671657acedfa2af598ab436b693f 100644
--- a/build/patches/Remove-background-sync-and-translate-menu-options.patch
+++ b/build/patches/Remove-background-sync-and-translate-menu-options.patch
@@ -24,7 +24,7 @@ diff --git a/chrome/android/java/res/xml/site_settings_preferences.xml b/chrome/
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
-@@ -74,7 +74,7 @@ public class SiteSettingsPreferences
+@@ -73,7 +73,7 @@ public class SiteSettingsPreferences
// The Media sub-menu only contains Protected Content and Autoplay, so remove all other
// menus.
for (@Type int i = 0; i < Type.NUM_ENTRIES; i++) {
@@ -33,7 +33,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/web
getPreferenceScreen().removePreference(findPreference(i));
}
getPreferenceScreen().removePreference(findPreference(MEDIA_KEY));
-@@ -115,7 +115,6 @@ public class SiteSettingsPreferences
+@@ -111,7 +111,6 @@ public class SiteSettingsPreferences
websitePrefs.add(Type.ADS);
}
websitePrefs.add(Type.AUTOMATIC_DOWNLOADS);
diff --git a/build/patches/Remove-dependency-on-com.google.android.gcm.patch b/build/patches/Remove-dependency-on-com.google.android.gcm.patch
new file mode 100644
index 0000000000000000000000000000000000000000..309aee36fd864dbec50b1f093127f3364c0efed6
--- /dev/null
+++ b/build/patches/Remove-dependency-on-com.google.android.gcm.patch
@@ -0,0 +1,132 @@
+From: Wengling Chen
+Date: Sat, 2 Nov 2019 09:29:52 +0100
+Subject: Remove dependency on com.google.android.gcm
+
+---
+ third_party/android_sdk/BUILD.gn | 3 --
+ .../external/client/android2/AndroidManifest.xml | 35 ----------------------
+ .../channel/AndroidMessageReceiverService.java | 17 -----------
+ .../channel/AndroidMessageSenderService.java | 3 +-
+ 4 files changed, 1 insertion(+), 57 deletions(-)
+
+diff --git a/third_party/android_sdk/BUILD.gn b/third_party/android_sdk/BUILD.gn
+--- a/third_party/android_sdk/BUILD.gn
++++ b/third_party/android_sdk/BUILD.gn
+@@ -67,7 +67,4 @@ if (enable_java_templates) {
+ testonly = true
+ java_files = [ "//third_party/android_sdk/public/extras/chromium/support/src/org/chromium/android/support/PackageManagerWrapper.java" ]
+ }
+- android_java_prebuilt("android_gcm_java") {
+- jar_path = "//third_party/android_sdk/public/extras/google/gcm/gcm-client/dist/gcm.jar"
+- }
+ }
+diff --git a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/android2/AndroidManifest.xml b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/android2/AndroidManifest.xml
+--- a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/android2/AndroidManifest.xml
++++ b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/android2/AndroidManifest.xml
+@@ -4,10 +4,6 @@
+
+
+-
+-
+-
+-
+
+
+
+@@ -16,40 +12,9 @@
+
+
+-
+-
+-
+
+
+
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+
+
+diff --git a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidMessageReceiverService.java b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidMessageReceiverService.java
+--- a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidMessageReceiverService.java
++++ b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidMessageReceiverService.java
+@@ -15,7 +15,6 @@
+ */
+ package com.google.ipc.invalidation.ticl.android2.channel;
+
+-import com.google.android.gcm.GCMRegistrar;
+ import com.google.ipc.invalidation.external.client.SystemResources.Logger;
+ import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
+ import com.google.ipc.invalidation.external.client.contrib.MultiplexingGcmListener;
+@@ -126,20 +125,4 @@ public class AndroidMessageReceiverService extends MultiplexingGcmListener.Abstr
+ // now, there is nothing to do.
+ }
+
+- /**
+- * Initializes GCM as a convenience method for tests. In production, applications should handle
+- * this.
+- */
+- public static void initializeGcmForTest(Context context, Logger logger, String senderId) {
+- // Initialize GCM.
+- GCMRegistrar.checkDevice(context);
+- GCMRegistrar.checkManifest(context);
+- String regId = GCMRegistrar.getRegistrationId(context);
+- if (regId.isEmpty()) {
+- logger.info("Not registered with GCM; registering");
+- GCMRegistrar.register(context, senderId);
+- } else {
+- logger.fine("Already registered with GCM: %s", regId);
+- }
+- }
+ }
+diff --git a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidMessageSenderService.java b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidMessageSenderService.java
+--- a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidMessageSenderService.java
++++ b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidMessageSenderService.java
+@@ -15,7 +15,6 @@
+ */
+ package com.google.ipc.invalidation.ticl.android2.channel;
+
+-import com.google.android.gcm.GCMRegistrar;
+ import com.google.ipc.invalidation.common.GcmSharedConstants;
+ import com.google.ipc.invalidation.external.client.SystemResources.Logger;
+ import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
+@@ -395,7 +394,7 @@ public class AndroidMessageSenderService extends IntentService {
+ // No client key when using old style registration id.
+ clientKey = "";
+ try {
+- registrationId = GCMRegistrar.getRegistrationId(context);
++ registrationId = null;
+ } catch (RuntimeException exception) {
+ // GCMRegistrar#getRegistrationId occasionally throws a runtime exception. Catching the
+ // exception rather than crashing.
+--
+2.11.0
+
diff --git a/build/patches/Remove-dependency-on-com.google.android.gms.auth.patch b/build/patches/Remove-dependency-on-com.google.android.gms.auth.patch
new file mode 100644
index 0000000000000000000000000000000000000000..19d682336076b68d6023fe612323099f610ee675
--- /dev/null
+++ b/build/patches/Remove-dependency-on-com.google.android.gms.auth.patch
@@ -0,0 +1,186 @@
+From: Wengling Chen
+Date: Sat, 2 Nov 2019 09:22:31 +0100
+Subject: Remove dependency on com.google.android.gms.auth
+
+---
+ chrome/android/BUILD.gn | 1 -
+ components/signin/core/browser/android/BUILD.gn | 1 -
+ .../components/signin/AccountIdProvider.java | 10 +----
+ .../signin/SystemAccountManagerDelegate.java | 15 +-------
+ content/public/android/BUILD.gn | 1 -
+ content/test/BUILD.gn | 1 -
+ third_party/android_deps/BUILD.gn | 44 ----------------------
+ third_party/robolectric/BUILD.gn | 1 -
+ 8 files changed, 2 insertions(+), 72 deletions(-)
+
+diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
+--- a/chrome/android/BUILD.gn
++++ b/chrome/android/BUILD.gn
+@@ -267,7 +267,6 @@ android_library("chrome_java") {
+ ":thumbnail_cache_entry_proto_java",
+ ":update_proto_java",
+ ":usage_stats_proto_java",
+- "$google_play_services_package:google_play_services_auth_base_java",
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+ "$google_play_services_package:google_play_services_cast_framework_java",
+diff --git a/components/signin/core/browser/android/BUILD.gn b/components/signin/core/browser/android/BUILD.gn
+--- a/components/signin/core/browser/android/BUILD.gn
++++ b/components/signin/core/browser/android/BUILD.gn
+@@ -15,7 +15,6 @@ generate_jni("jni_headers") {
+
+ android_library("java") {
+ deps = [
+- "$google_play_services_package:google_play_services_auth_base_java",
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+ "//base:base_java",
+diff --git a/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountIdProvider.java b/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountIdProvider.java
+--- a/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountIdProvider.java
++++ b/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountIdProvider.java
+@@ -4,9 +4,6 @@
+
+ package org.chromium.components.signin;
+
+-import com.google.android.gms.common.ConnectionResult;
+-import com.google.android.gms.common.GoogleApiAvailability;
+-
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.Log;
+ import org.chromium.base.StrictModeContext;
+@@ -47,12 +44,7 @@ public class AccountIdProvider {
+ * Google Play services is available.
+ */
+ public boolean canBeUsed() {
+- // TODO(http://crbug.com/577190): Remove StrictMode override.
+- try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) {
+- int resultCode = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(
+- ContextUtils.getApplicationContext());
+- return resultCode == ConnectionResult.SUCCESS;
+- }
++ return false;
+ }
+
+ /**
+diff --git a/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java b/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
+--- a/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
++++ b/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
+@@ -24,9 +24,6 @@ import android.os.PatternMatcher;
+ import android.os.Process;
+ import android.os.SystemClock;
+
+-import com.google.android.gms.common.ConnectionResult;
+-import com.google.android.gms.common.GoogleApiAvailability;
+-
+ import org.chromium.base.ApiCompatibilityUtils;
+ import org.chromium.base.Callback;
+ import org.chromium.base.ContextUtils;
+@@ -82,17 +79,7 @@ public class SystemAccountManagerDelegate implements AccountManagerDelegate {
+ }
+
+ protected void checkCanUseGooglePlayServices() throws AccountManagerDelegateException {
+- Context context = ContextUtils.getApplicationContext();
+- final int resultCode =
+- GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context);
+- if (resultCode == ConnectionResult.SUCCESS) {
+- return;
+- }
+-
+- throw new GmsAvailabilityException(
+- String.format("Can't use Google Play Services: %s",
+- GoogleApiAvailability.getInstance().getErrorString(resultCode)),
+- resultCode);
++ throw new GmsAvailabilityException("Can't use Google Play Services", 1);
+ }
+
+ @Override
+diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
+--- a/content/public/android/BUILD.gn
++++ b/content/public/android/BUILD.gn
+@@ -52,7 +52,6 @@ action("generate_sandboxed_service_srcjar") {
+ android_library("content_java") {
+ deps = [
+ ":content_java_resources",
+- "$google_play_services_package:google_play_services_auth_api_phone_java",
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+ "$google_play_services_package:google_play_services_tasks_java",
+diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
+--- a/content/test/BUILD.gn
++++ b/content/test/BUILD.gn
+@@ -2442,7 +2442,6 @@ if (is_android) {
+ testonly = true
+ java_files = content_java_sources_needing_jni
+ deps = [
+- "$google_play_services_package:google_play_services_auth_api_phone_java",
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+ "$google_play_services_package:google_play_services_tasks_java",
+diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn
+--- a/third_party/android_deps/BUILD.gn
++++ b/third_party/android_deps/BUILD.gn
+@@ -772,50 +772,6 @@ android_aar_prebuilt("com_android_support_viewpager_java") {
+ }
+
+ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_auth_java") {
+- aar_path = "libs/com_google_android_gms_play_services_auth/play-services-auth-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_auth/com_google_android_gms_play_services_auth.info"
+- deps = [
+- ":google_play_services_auth_api_phone_java",
+- ":google_play_services_auth_base_java",
+- ":google_play_services_base_java",
+- ":google_play_services_basement_java",
+- ":google_play_services_tasks_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_auth_api_phone_java") {
+- aar_path = "libs/com_google_android_gms_play_services_auth_api_phone/play-services-auth-api-phone-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_auth_api_phone/com_google_android_gms_play_services_auth_api_phone.info"
+- deps = [
+- ":google_play_services_base_java",
+- ":google_play_services_basement_java",
+- ":google_play_services_tasks_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_auth_base_java") {
+- aar_path = "libs/com_google_android_gms_play_services_auth_base/play-services-auth-base-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_auth_base/com_google_android_gms_play_services_auth_base.info"
+- deps = [
+- ":google_play_services_base_java",
+- ":google_play_services_basement_java",
+- ":google_play_services_tasks_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+ android_aar_prebuilt("google_play_services_base_java") {
+ aar_path = "libs/com_google_android_gms_play_services_base/play-services-base-15.0.1.aar"
+ info_path = "libs/com_google_android_gms_play_services_base/com_google_android_gms_play_services_base.info"
+diff --git a/third_party/robolectric/BUILD.gn b/third_party/robolectric/BUILD.gn
+--- a/third_party/robolectric/BUILD.gn
++++ b/third_party/robolectric/BUILD.gn
+@@ -938,7 +938,6 @@ java_library("shadows_play_services_java") {
+ ":robolectric_shadowapi_java",
+ ":robolectric_utils_java",
+ ":shadows_core_java",
+- "$google_play_services_package:google_play_services_auth_base_java",
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+ "//third_party/android_deps:android_support_v4_java",
+--
+2.11.0
+
diff --git a/build/patches/Remove-dependency-on-com.google.android.gms.cast.patch b/build/patches/Remove-dependency-on-com.google.android.gms.cast.patch
new file mode 100644
index 0000000000000000000000000000000000000000..8f39984b0971bfffdbb2610e36f2b174feaffee4
--- /dev/null
+++ b/build/patches/Remove-dependency-on-com.google.android.gms.cast.patch
@@ -0,0 +1,1523 @@
+From: Wengling Chen
+Date: Sat, 2 Nov 2019 08:00:04 +0100
+Subject: Remove dependency on com.google.android.gms.cast
+
+---
+ chrome/android/BUILD.gn | 6 --
+ chrome/android/features/media_router/BUILD.gn | 2 -
+ .../browser/media/router/CastSessionUtil.java | 35 -------
+ .../chrome/browser/media/router/MediaSink.java | 44 +-------
+ .../browser/media/router/MediaStatusBridge.java | 40 ++-----
+ .../router/caf/BaseNotificationController.java | 46 ---------
+ .../media/router/caf/BaseSessionController.java | 115 +--------------------
+ .../router/caf/CafBaseMediaRouteProvider.java | 103 +-----------------
+ .../media/router/caf/CafMediaRouteProvider.java | 16 ---
+ .../media/router/caf/CafMessageHandler.java | 97 +----------------
+ .../browser/media/router/caf/CastMediaSource.java | 10 +-
+ .../media/router/caf/CastOptionsProvider.java | 22 +---
+ .../media/router/caf/CastSessionController.java | 84 ---------------
+ .../chrome/browser/media/router/caf/CastUtils.java | 6 --
+ .../remoting/CafExpandedControllerActivity.java | 24 +----
+ .../caf/remoting/FlingingControllerAdapter.java | 61 -----------
+ .../router/caf/remoting/RemotingMediaSource.java | 8 +-
+ .../caf/remoting/RemotingSessionController.java | 21 ----
+ chrome/android/java/AndroidManifest.xml | 28 -----
+ chrome/test/android/cast_emulator/BUILD.gn | 1 -
+ third_party/android_deps/BUILD.gn | 32 ------
+ 21 files changed, 26 insertions(+), 775 deletions(-)
+
+diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
+--- a/chrome/android/BUILD.gn
++++ b/chrome/android/BUILD.gn
+@@ -269,8 +269,6 @@ android_library("chrome_java") {
+ ":usage_stats_proto_java",
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_cast_framework_java",
+- "$google_play_services_package:google_play_services_cast_java",
+ "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//base:jni_java",
+@@ -689,8 +687,6 @@ junit_binary("chrome_junit_tests") {
+ ":partner_location_descriptor_proto_java",
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_cast_framework_java",
+- "$google_play_services_package:google_play_services_cast_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//base:base_junit_test_support",
+@@ -790,8 +786,6 @@ android_library("chrome_test_java") {
+ ":partner_location_descriptor_proto_java",
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_cast_framework_java",
+- "$google_play_services_package:google_play_services_cast_java",
+ "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+diff --git a/chrome/android/features/media_router/BUILD.gn b/chrome/android/features/media_router/BUILD.gn
+--- a/chrome/android/features/media_router/BUILD.gn
++++ b/chrome/android/features/media_router/BUILD.gn
+@@ -11,8 +11,6 @@ android_library("java") {
+ ":java_resources",
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_cast_framework_java",
+- "$google_play_services_package:google_play_services_cast_java",
+ "//base:base_java",
+ "//base:jni_java",
+ "//chrome/android:chrome_java",
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/CastSessionUtil.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/CastSessionUtil.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/CastSessionUtil.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/CastSessionUtil.java
+@@ -4,9 +4,6 @@
+
+ package org.chromium.chrome.browser.media.router;
+
+-import com.google.android.gms.cast.CastDevice;
+-import com.google.android.gms.cast.RemoteMediaPlayer;
+-
+ import org.chromium.chrome.browser.media.ui.MediaNotificationInfo;
+ import org.chromium.services.media_session.MediaMetadata;
+
+@@ -18,36 +15,4 @@ public class CastSessionUtil {
+
+ // The value is borrowed from the Android Cast SDK code to match their behavior.
+ public static final double MIN_VOLUME_LEVEL_DELTA = 1e-7;
+-
+- /**
+- * Builds a MediaMetadata from the given CastDevice and MediaPlayer, and sets it on the builder
+- */
+- public static void setNotificationMetadata(MediaNotificationInfo.Builder builder,
+- CastDevice castDevice, RemoteMediaPlayer mediaPlayer) {
+- MediaMetadata notificationMetadata = new MediaMetadata("", "", "");
+- builder.setMetadata(notificationMetadata);
+-
+- if (castDevice != null) notificationMetadata.setTitle(castDevice.getFriendlyName());
+-
+- if (mediaPlayer == null) return;
+-
+- com.google.android.gms.cast.MediaInfo info = mediaPlayer.getMediaInfo();
+- if (info == null) return;
+-
+- com.google.android.gms.cast.MediaMetadata metadata = info.getMetadata();
+- if (metadata == null) return;
+-
+- String title = metadata.getString(com.google.android.gms.cast.MediaMetadata.KEY_TITLE);
+- if (title != null) notificationMetadata.setTitle(title);
+-
+- String artist = metadata.getString(com.google.android.gms.cast.MediaMetadata.KEY_ARTIST);
+- if (artist == null) {
+- artist = metadata.getString(com.google.android.gms.cast.MediaMetadata.KEY_ALBUM_ARTIST);
+- }
+- if (artist != null) notificationMetadata.setArtist(artist);
+-
+- String album =
+- metadata.getString(com.google.android.gms.cast.MediaMetadata.KEY_ALBUM_TITLE);
+- if (album != null) notificationMetadata.setAlbum(album);
+- }
+ }
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/MediaSink.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/MediaSink.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/MediaSink.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/MediaSink.java
+@@ -8,41 +8,24 @@ import android.support.annotation.Nullable;
+ import android.support.v7.media.MediaRouter;
+ import android.support.v7.media.MediaRouter.RouteInfo;
+
+-import com.google.android.gms.cast.CastDevice;
+-
+ /**
+ * A common descriptor of a device that can present some URI.
+ */
+ public class MediaSink {
+ private static final String CAST_SINK_URN_PREFIX = "urn:x-org.chromium:media:sink:cast-";
+- private final String mId;
+- private final String mName;
+- private final CastDevice mDevice;
+-
+- /**
+- * Constructor.
+- * @param id A unique identifier of the sink.
+- * @param name A user friendly name of the sink.
+- * @param device {@link CastDevice} corresponding to this sink.
+- */
+- public MediaSink(String id, String name, CastDevice device) {
+- mId = id;
+- mName = name;
+- mDevice = device;
+- }
+
+ /**
+ * @return The unique identifier of the sink.
+ */
+ public String getId() {
+- return mId;
++ return "";
+ }
+
+ /**
+ * @return The user friendly name of the sink.
+ */
+ public String getName() {
+- return mName;
++ return "";
+ }
+
+ /**
+@@ -52,17 +35,8 @@ public class MediaSink {
+ return CAST_SINK_URN_PREFIX + getId();
+ }
+
+- public CastDevice getDevice() {
+- return mDevice;
+- }
+-
+ @Override
+ public boolean equals(Object o) {
+- if (o == this) return true;
+- if (o instanceof MediaSink) {
+- MediaSink other = (MediaSink) o;
+- return mId.equals(other.getId()) && mName.equals(other.getName());
+- }
+ return false;
+ }
+
+@@ -70,23 +44,15 @@ public class MediaSink {
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+- result = prime * result + ((mId == null) ? 0 : mId.hashCode());
+- result = prime * result + ((mName == null) ? 0 : mName.hashCode());
+ return result;
+ }
+
+- @Override
+- public String toString() {
+- return String.format("MediaSink: %s, %s", getId(), getName());
+- }
+-
+ /**
+ * @param route The route information provided by Android.
+ * @return A new MediaSink instance corresponding to the specified {@link RouteInfo}.
+ */
+ public static MediaSink fromRoute(MediaRouter.RouteInfo route) {
+- return new MediaSink(
+- route.getId(), route.getName(), CastDevice.getFromBundle(route.getExtras()));
++ return null;
+ }
+
+ /**
+@@ -97,10 +63,6 @@ public class MediaSink {
+ */
+ @Nullable
+ public static MediaSink fromSinkId(String sinkId, MediaRouter router) {
+- for (MediaRouter.RouteInfo route : router.getRoutes()) {
+- MediaSink sink = MediaSink.fromRoute(route);
+- if (sink.getId().equals(sinkId)) return sink;
+- }
+ return null;
+ }
+ }
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/MediaStatusBridge.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/MediaStatusBridge.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/MediaStatusBridge.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/MediaStatusBridge.java
+@@ -4,10 +4,6 @@
+
+ package org.chromium.chrome.browser.media.router;
+
+-import com.google.android.gms.cast.MediaInfo;
+-import com.google.android.gms.cast.MediaMetadata;
+-import com.google.android.gms.cast.MediaStatus;
+-
+ import org.chromium.base.annotations.CalledByNative;
+ import org.chromium.base.annotations.JNINamespace;
+
+@@ -17,11 +13,6 @@ import org.chromium.base.annotations.JNINamespace;
+ */
+ @JNINamespace("media_router")
+ public class MediaStatusBridge {
+- private MediaStatus mStatus;
+-
+- public MediaStatusBridge(MediaStatus status) {
+- mStatus = status;
+- }
+
+ /**
+ * Gets the play state of the stream. Return values are defined as such:
+@@ -34,7 +25,7 @@ public class MediaStatusBridge {
+ */
+ @CalledByNative
+ public int playerState() {
+- return mStatus.getPlayerState();
++ return 0;
+ }
+
+ /**
+@@ -48,7 +39,7 @@ public class MediaStatusBridge {
+ */
+ @CalledByNative
+ public int idleReason() {
+- return mStatus.getIdleReason();
++ return 0;
+ }
+
+ /**
+@@ -57,13 +48,7 @@ public class MediaStatusBridge {
+ */
+ @CalledByNative
+ public String title() {
+- MediaInfo info = mStatus.getMediaInfo();
+- if (info == null) return "";
+-
+- MediaMetadata metadata = info.getMetadata();
+- if (metadata == null) return "";
+-
+- return metadata.getString(MediaMetadata.KEY_TITLE);
++ return "";
+ }
+
+ /**
+@@ -71,7 +56,7 @@ public class MediaStatusBridge {
+ */
+ @CalledByNative
+ public boolean canPlayPause() {
+- return mStatus.isMediaCommandSupported(MediaStatus.COMMAND_PAUSE);
++ return false;
+ }
+
+ /**
+@@ -79,7 +64,7 @@ public class MediaStatusBridge {
+ */
+ @CalledByNative
+ public boolean canMute() {
+- return mStatus.isMediaCommandSupported(MediaStatus.COMMAND_TOGGLE_MUTE);
++ return false;
+ }
+
+ /**
+@@ -87,7 +72,7 @@ public class MediaStatusBridge {
+ */
+ @CalledByNative
+ public boolean canSetVolume() {
+- return mStatus.isMediaCommandSupported(MediaStatus.COMMAND_SET_VOLUME);
++ return false;
+ }
+
+ /**
+@@ -95,7 +80,7 @@ public class MediaStatusBridge {
+ */
+ @CalledByNative
+ public boolean canSeek() {
+- return mStatus.isMediaCommandSupported(MediaStatus.COMMAND_SEEK);
++ return false;
+ }
+
+ /**
+@@ -103,7 +88,7 @@ public class MediaStatusBridge {
+ */
+ @CalledByNative
+ public boolean isMuted() {
+- return mStatus.isMute();
++ return false;
+ }
+
+ /**
+@@ -113,7 +98,7 @@ public class MediaStatusBridge {
+ */
+ @CalledByNative
+ public double volume() {
+- return mStatus.getStreamVolume();
++ return 0.0;
+ }
+
+ /**
+@@ -122,10 +107,7 @@ public class MediaStatusBridge {
+ */
+ @CalledByNative
+ public long duration() {
+- MediaInfo info = mStatus.getMediaInfo();
+- if (info == null) return 0;
+-
+- return info.getStreamDuration();
++ return 0;
+ }
+
+ /**
+@@ -133,6 +115,6 @@ public class MediaStatusBridge {
+ */
+ @CalledByNative
+ public long currentTime() {
+- return mStatus.getStreamPosition();
++ return 0;
+ }
+ }
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/BaseNotificationController.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/BaseNotificationController.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/BaseNotificationController.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/BaseNotificationController.java
+@@ -6,10 +6,6 @@ package org.chromium.chrome.browser.media.router.caf;
+
+ import android.content.Intent;
+
+-import com.google.android.gms.cast.CastDevice;
+-import com.google.android.gms.cast.MediaStatus;
+-import com.google.android.gms.cast.framework.media.RemoteMediaClient;
+-
+ import org.chromium.chrome.browser.media.ui.MediaNotificationInfo;
+ import org.chromium.chrome.browser.media.ui.MediaNotificationListener;
+ import org.chromium.chrome.browser.media.ui.MediaNotificationManager;
+@@ -59,20 +55,6 @@ public abstract class BaseNotificationController
+ public void onStatusUpdated() {
+ if (mNotificationBuilder == null) return;
+ if (!mSessionController.isConnected()) return;
+-
+- MediaStatus mediaStatus = mSessionController.getRemoteMediaClient().getMediaStatus();
+- if (mediaStatus == null) return;
+-
+- int playerState = mediaStatus.getPlayerState();
+- if (playerState == MediaStatus.PLAYER_STATE_PAUSED
+- || playerState == MediaStatus.PLAYER_STATE_PLAYING) {
+- mNotificationBuilder.setPaused(playerState != MediaStatus.PLAYER_STATE_PLAYING);
+- mNotificationBuilder.setActions(
+- MediaNotificationInfo.ACTION_STOP | MediaNotificationInfo.ACTION_PLAY_PAUSE);
+- } else {
+- mNotificationBuilder.setActions(MediaNotificationInfo.ACTION_STOP);
+- }
+- MediaNotificationManager.show(mNotificationBuilder.build());
+ }
+
+ /** Called when media metadata updated. */
+@@ -88,30 +70,6 @@ public abstract class BaseNotificationController
+ mNotificationBuilder.setMetadata(notificationMetadata);
+
+ if (!mSessionController.isConnected()) return;
+-
+- CastDevice castDevice = mSessionController.getSession().getCastDevice();
+- if (castDevice != null) notificationMetadata.setTitle(castDevice.getFriendlyName());
+-
+- RemoteMediaClient remoteMediaClient = mSessionController.getRemoteMediaClient();
+-
+- com.google.android.gms.cast.MediaInfo info = remoteMediaClient.getMediaInfo();
+- if (info == null) return;
+-
+- com.google.android.gms.cast.MediaMetadata metadata = info.getMetadata();
+- if (metadata == null) return;
+-
+- String title = metadata.getString(com.google.android.gms.cast.MediaMetadata.KEY_TITLE);
+- if (title != null) notificationMetadata.setTitle(title);
+-
+- String artist = metadata.getString(com.google.android.gms.cast.MediaMetadata.KEY_ARTIST);
+- if (artist == null) {
+- artist = metadata.getString(com.google.android.gms.cast.MediaMetadata.KEY_ALBUM_ARTIST);
+- }
+- if (artist != null) notificationMetadata.setArtist(artist);
+-
+- String album =
+- metadata.getString(com.google.android.gms.cast.MediaMetadata.KEY_ALBUM_TITLE);
+- if (album != null) notificationMetadata.setAlbum(album);
+ }
+
+ /////////////////////////////////////////////////////////////////////////////////////////////
+@@ -120,15 +78,11 @@ public abstract class BaseNotificationController
+ @Override
+ public void onPlay(int actionSource) {
+ if (!mSessionController.isConnected()) return;
+-
+- mSessionController.getRemoteMediaClient().play();
+ }
+
+ @Override
+ public void onPause(int actionSource) {
+ if (!mSessionController.isConnected()) return;
+-
+- mSessionController.getRemoteMediaClient().pause();
+ }
+
+ @Override
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/BaseSessionController.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/BaseSessionController.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/BaseSessionController.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/BaseSessionController.java
+@@ -6,12 +6,6 @@ package org.chromium.chrome.browser.media.router.caf;
+
+ import android.support.annotation.Nullable;
+
+-import com.google.android.gms.cast.CastDevice;
+-import com.google.android.gms.cast.framework.CastSession;
+-import com.google.android.gms.cast.framework.media.RemoteMediaClient;
+-import com.google.android.gms.common.api.PendingResult;
+-import com.google.android.gms.common.api.Status;
+-
+ import org.json.JSONArray;
+ import org.json.JSONException;
+ import org.json.JSONObject;
+@@ -52,16 +46,13 @@ public abstract class BaseSessionController {
+ }
+
+ private final Random mRequestIdGenerator = new Random();
+- private CastSession mCastSession;
+ private int mLatestMediaSessionId;
+ private final CafBaseMediaRouteProvider mProvider;
+ private CreateRouteRequestInfo mRouteCreationInfo;
+- private final RemoteMediaClient.Callback mRemoteMediaClientCallback;
+ private final List> mCallbacks = new ArrayList<>();
+
+ public BaseSessionController(CafBaseMediaRouteProvider provider) {
+ mProvider = provider;
+- mRemoteMediaClientCallback = new RemoteMediaClientCallback();
+ }
+
+ public void addCallback(Callback callback) {
+@@ -80,9 +71,6 @@ public abstract class BaseSessionController {
+
+ public void requestSessionLaunch() {
+ mRouteCreationInfo = mProvider.getPendingCreateRouteRequestInfo();
+- CastUtils.getCastContext().setReceiverApplicationId(
+- mRouteCreationInfo.source.getApplicationId());
+-
+ // When the user clicks a route on the MediaRouteChooserDialog, we intercept the click event
+ // and do not select the route. Instead the route selection is postponed to here. This will
+ // trigger CAF to launch the session.
+@@ -101,60 +89,18 @@ public abstract class BaseSessionController {
+ return mRouteCreationInfo;
+ }
+
+- public CastSession getSession() {
+- return mCastSession;
+- }
+-
+- public RemoteMediaClient getRemoteMediaClient() {
+- return isConnected() ? mCastSession.getRemoteMediaClient() : null;
+- }
+-
+ public abstract BaseNotificationController getNotificationController();
+
+ public void endSession() {
+- CastUtils.getCastContext().getSessionManager().endCurrentSession(/* stopCasting= */ true);
+- CastUtils.getCastContext().setReceiverApplicationId(null);
+ }
+
+ public List getCapabilities() {
+ List capabilities = new ArrayList<>();
+- if (mCastSession == null || !mCastSession.isConnected()) return capabilities;
+- CastDevice device = mCastSession.getCastDevice();
+- if (device.hasCapability(CastDevice.CAPABILITY_AUDIO_IN)) {
+- capabilities.add("audio_in");
+- }
+- if (device.hasCapability(CastDevice.CAPABILITY_AUDIO_OUT)) {
+- capabilities.add("audio_out");
+- }
+- if (device.hasCapability(CastDevice.CAPABILITY_VIDEO_IN)) {
+- capabilities.add("video_in");
+- }
+- if (device.hasCapability(CastDevice.CAPABILITY_VIDEO_OUT)) {
+- capabilities.add("video_out");
+- }
+ return capabilities;
+ }
+
+ public boolean isConnected() {
+- return mCastSession != null && mCastSession.isConnected();
+- }
+-
+- /**
+- * Safely seek to a position. This is an workaround for an IllegalStateException in
+- * RemoteMediaClient when a seek command times out. The code should be replaced by a normal
+- * seek() call when the Google Play services SDK gets updated.
+- */
+- public PendingResult safelySeek(long position) {
+- JSONObject json = new JSONObject();
+- try {
+- json.put("requestId", mRequestIdGenerator.nextInt(10000));
+- json.put("mediaSessionId", mLatestMediaSessionId);
+- json.put("type", "SEEK");
+- json.put("currentTime", position / 1000.0);
+- } catch (JSONException e) {
+- // Ignore.
+- }
+- return getSession().sendMessage(CastSessionUtil.MEDIA_NAMESPACE, json.toString());
++ return false;
+ }
+
+ private void updateMediaSessionId(String message) {
+@@ -179,29 +125,6 @@ public abstract class BaseSessionController {
+
+ private void updateRemoteMediaClient(String message) {
+ if (!isConnected()) return;
+-
+- mCastSession.getRemoteMediaClient().onMessageReceived(
+- mCastSession.getCastDevice(), CastSessionUtil.MEDIA_NAMESPACE, message);
+- }
+-
+- /** Attaches the controller to the current {@link CastSession}. */
+- public void attachToCastSession(CastSession session) {
+- mCastSession = session;
+- RemoteMediaClient uncheckedRemoteMediaClient = mCastSession.getRemoteMediaClient();
+- if (uncheckedRemoteMediaClient != null) {
+- uncheckedRemoteMediaClient.registerCallback(mRemoteMediaClientCallback);
+- }
+- }
+-
+- /** Detaches the controller from any {@link CastSession}. */
+- public void detachFromCastSession() {
+- if (mCastSession == null) return;
+-
+- RemoteMediaClient uncheckedRemoteMediaClient = mCastSession.getRemoteMediaClient();
+- if (uncheckedRemoteMediaClient != null) {
+- uncheckedRemoteMediaClient.unregisterCallback(mRemoteMediaClientCallback);
+- }
+- mCastSession = null;
+ }
+
+ /** Called when session started. */
+@@ -218,40 +141,6 @@ public abstract class BaseSessionController {
+ return mProvider;
+ }
+
+- /**
+- * All sub-classes need to register this method to listen to messages of the namespaces they are
+- * interested in.
+- */
+- protected void onMessageReceived(CastDevice castDevice, String namespace, String message) {
+- Log.d(TAG,
+- "Received message from Cast device: namespace=\"" + namespace + "\" message=\""
+- + message + "\"");
+- if (CastSessionUtil.MEDIA_NAMESPACE.equals(namespace)) {
+- updateMediaSessionId(message);
+- updateRemoteMediaClient(message);
+- }
+- }
+-
+- private class RemoteMediaClientCallback extends RemoteMediaClient.Callback {
+- @Override
+- public void onStatusUpdated() {
+- BaseSessionController.this.onStatusUpdated();
+- }
+-
+- @Override
+- public void onMetadataUpdated() {
+- BaseSessionController.this.onMetadataUpdated();
+- }
+- }
+-
+- protected void onStatusUpdated() {
+- notifyCallback((Callback callback) -> callback.onStatusUpdated());
+- }
+-
+- protected void onMetadataUpdated() {
+- notifyCallback((Callback callback) -> callback.onMetadataUpdated());
+- }
+-
+ @Nullable
+ public FlingingController getFlingingController() {
+ return null;
+@@ -262,7 +151,7 @@ public abstract class BaseSessionController {
+ * {@link CastSession#getSessionId()} is final.
+ */
+ public String getSessionId() {
+- return isConnected() ? getSession().getSessionId() : null;
++ return null;
+ }
+
+ private void notifyCallback(NotifyCallbackAction action) {
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CafBaseMediaRouteProvider.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CafBaseMediaRouteProvider.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CafBaseMediaRouteProvider.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CafBaseMediaRouteProvider.java
+@@ -11,9 +11,6 @@ import android.support.v7.media.MediaRouteSelector;
+ import android.support.v7.media.MediaRouter;
+ import android.support.v7.media.MediaRouter.RouteInfo;
+
+-import com.google.android.gms.cast.framework.CastSession;
+-import com.google.android.gms.cast.framework.SessionManagerListener;
+-
+ import org.chromium.base.Log;
+ import org.chromium.chrome.browser.media.router.DiscoveryCallback;
+ import org.chromium.chrome.browser.media.router.DiscoveryDelegate;
+@@ -36,7 +33,7 @@ import java.util.Set;
+ * A base provider containing common implementation for CAF-based {@link MediaRouteProvider}s.
+ */
+ public abstract class CafBaseMediaRouteProvider
+- implements MediaRouteProvider, DiscoveryDelegate, SessionManagerListener {
++ implements MediaRouteProvider, DiscoveryDelegate {
+ private static final String TAG = "CafMR";
+
+ protected static final List NO_SINKS = Collections.emptyList();
+@@ -153,7 +150,6 @@ public abstract class CafBaseMediaRouteProvider
+ // current session and clean up the routes (can't wait for session ending as the signal
+ // might be delayed).
+ sessionController().endSession();
+- handleSessionEnd();
+ }
+ if (mPendingCreateRouteRequestInfo != null) {
+ cancelPendingRequest("Request replaced");
+@@ -182,9 +178,6 @@ public abstract class CafBaseMediaRouteProvider
+ mManager.onRouteRequestError("The sink does not exist", nativeRequestId);
+ }
+
+- CastUtils.getCastContext().getSessionManager().addSessionManagerListener(
+- this, CastSession.class);
+-
+ mPendingCreateRouteRequestInfo = new CreateRouteRequestInfo(source, sink, presentationId,
+ origin, tabId, isIncognito, nativeRequestId, targetRouteInfo);
+
+@@ -211,100 +204,6 @@ public abstract class CafBaseMediaRouteProvider
+ removeRoute(routeId, /* error= */ null);
+ }
+
+- ///////////////////////////////////////////////////////
+- // SessionManagerListener implementation begin
+- ///////////////////////////////////////////////////////
+-
+- @Override
+- public final void onSessionStarting(CastSession session) {
+- // The session is not connected yet at this point so this is no-op.
+- }
+-
+- @Override
+- public void onSessionStartFailed(CastSession session, int error) {
+- removeAllRoutes("Launch error");
+- cancelPendingRequest("Launch error");
+- }
+-
+- @Override
+- public void onSessionStarted(CastSession session, String sessionId) {
+- Log.d(TAG, "onSessionStarted");
+-
+- if (session != CastUtils.getCastContext().getSessionManager().getCurrentCastSession()) {
+- // Sometimes the session start signal might come in for an earlier launch request, which
+- // should be ignored.
+- return;
+- }
+-
+- if (session == sessionController().getSession() || mPendingCreateRouteRequestInfo == null) {
+- // Early return for any possible case that the session start signal comes in twice for
+- // the same session.
+- return;
+- }
+- handleSessionStart(session, sessionId);
+- }
+-
+- @Override
+- public final void onSessionResumed(CastSession session, boolean wasSuspended) {
+- sessionController().attachToCastSession(session);
+- }
+-
+- @Override
+- public final void onSessionResuming(CastSession session, String sessionId) {}
+-
+- @Override
+- public final void onSessionResumeFailed(CastSession session, int error) {}
+-
+- @Override
+- public final void onSessionEnding(CastSession session) {
+- handleSessionEnd();
+- }
+-
+- @Override
+- public final void onSessionEnded(CastSession session, int error) {
+- Log.d(TAG, "Session ended with error code " + error);
+- handleSessionEnd();
+- }
+-
+- @Override
+- public final void onSessionSuspended(CastSession session, int reason) {
+- sessionController().detachFromCastSession();
+- }
+-
+- ///////////////////////////////////////////////////////
+- // SessionManagerListener implementation end
+- ///////////////////////////////////////////////////////
+-
+- protected void handleSessionStart(CastSession session, String sessionId) {
+- sessionController().attachToCastSession(session);
+- sessionController().onSessionStarted();
+-
+- MediaSink sink = mPendingCreateRouteRequestInfo.sink;
+- MediaSource source = mPendingCreateRouteRequestInfo.source;
+- MediaRoute route = new MediaRoute(
+- sink.getId(), source.getSourceId(), mPendingCreateRouteRequestInfo.presentationId);
+- addRoute(route, mPendingCreateRouteRequestInfo.origin, mPendingCreateRouteRequestInfo.tabId,
+- mPendingCreateRouteRequestInfo.nativeRequestId, /* wasLaunched= */ true);
+-
+- mPendingCreateRouteRequestInfo = null;
+- }
+-
+- private void handleSessionEnd() {
+- if (mPendingCreateRouteRequestInfo != null) {
+- // The Cast SDK notifies about session ending when a route is unselected, even when
+- // there's no current session. Because CastSessionController unselects the route to set
+- // the receiver app ID, this needs to be guarded by a pending request null check to make
+- // sure the listener is not unregistered during a session relaunch.
+- return;
+- }
+- sessionController().onSessionEnded();
+- sessionController().detachFromCastSession();
+- getAndroidMediaRouter().selectRoute(getAndroidMediaRouter().getDefaultRoute());
+- terminateAllRoutes();
+- CastUtils.getCastContext().getSessionManager().removeSessionManagerListener(
+- this, CastSession.class);
+- }
+-
+ private void cancelPendingRequest(String error) {
+ if (mPendingCreateRouteRequestInfo == null) return;
+
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CafMediaRouteProvider.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CafMediaRouteProvider.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CafMediaRouteProvider.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CafMediaRouteProvider.java
+@@ -11,8 +11,6 @@ import android.support.annotation.Nullable;
+ import android.support.annotation.VisibleForTesting;
+ import android.support.v7.media.MediaRouter;
+
+-import com.google.android.gms.cast.framework.CastSession;
+-
+ import org.chromium.base.Log;
+ import org.chromium.chrome.browser.media.router.ChromeMediaRouter;
+ import org.chromium.chrome.browser.media.router.ClientRecord;
+@@ -148,20 +146,6 @@ public class CafMediaRouteProvider extends CafBaseMediaRouteProvider {
+ }
+
+ @Override
+- protected void handleSessionStart(CastSession session, String sessionId) {
+- super.handleSessionStart(session, sessionId);
+-
+- for (ClientRecord clientRecord : mClientIdToRecords.values()) {
+- // Should be exactly one instance of MediaRoute/ClientRecord at this moment.
+- mMessageHandler.sendReceiverActionToClient(clientRecord.routeId,
+- sessionController().getSink(), clientRecord.clientId, "cast");
+- }
+-
+- mMessageHandler.onSessionStarted();
+- sessionController().getSession().getRemoteMediaClient().requestStatus();
+- }
+-
+- @Override
+ protected void addRoute(
+ MediaRoute route, String origin, int tabId, int nativeRequestId, boolean wasLaunched) {
+ super.addRoute(route, origin, tabId, nativeRequestId, wasLaunched);
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CafMessageHandler.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CafMessageHandler.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CafMessageHandler.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CafMessageHandler.java
+@@ -11,10 +11,6 @@ import android.support.v4.util.ArrayMap;
+ import android.text.TextUtils;
+ import android.util.SparseArray;
+
+-import com.google.android.gms.cast.ApplicationMetadata;
+-import com.google.android.gms.common.api.PendingResult;
+-import com.google.android.gms.common.api.Status;
+-
+ import org.json.JSONArray;
+ import org.json.JSONException;
+ import org.json.JSONObject;
+@@ -344,49 +340,7 @@ public class CafMessageHandler {
+ final int sequenceNumber) throws JSONException {
+ if (volumeMessage == null) return false;
+ if (!mSessionController.isConnected()) return false;
+- boolean shouldWaitForVolumeChange = false;
+- try {
+- if (!volumeMessage.isNull("muted")) {
+- boolean newMuted = volumeMessage.getBoolean("muted");
+- if (mSessionController.getSession().isMute() != newMuted) {
+- mSessionController.getSession().setMute(newMuted);
+- shouldWaitForVolumeChange = true;
+- }
+- }
+- if (!volumeMessage.isNull("level")) {
+- double newLevel = volumeMessage.getDouble("level");
+- double currentLevel = mSessionController.getSession().getVolume();
+- if (!Double.isNaN(currentLevel)
+- && Math.abs(currentLevel - newLevel)
+- > CastSessionUtil.MIN_VOLUME_LEVEL_DELTA) {
+- mSessionController.getSession().setVolume(newLevel);
+- shouldWaitForVolumeChange = true;
+- }
+- }
+- } catch (IOException | IllegalStateException e) {
+- Log.e(TAG, "Failed to send volume command: " + e);
+- return false;
+- }
+-
+- // For each successful volume message we need to respond with an empty "v2_message" so the
+- // Cast Web SDK can call the success callback of the page. If we expect the volume to change
+- // as the result of the command, we're relying on {@link Cast.CastListener#onVolumeChanged}
+- // to get called by the Android Cast SDK when the receiver status is updated. We keep the
+- // sequence number until then. If the volume doesn't change as the result of the command, we
+- // won't get notified by the Android SDK
+- if (shouldWaitForVolumeChange) {
+- mVolumeRequests.add(new RequestRecord(clientId, sequenceNumber));
+- } else {
+- // It's usually bad to have request and response on the same call stack so post the
+- // response to the Android message loop.
+- mHandler.post(new Runnable() {
+- @Override
+- public void run() {
+- onVolumeChanged(clientId, sequenceNumber);
+- }
+- });
+- }
+- return true;
++ return false;
+ }
+
+ @VisibleForTesting
+@@ -674,19 +628,11 @@ public class CafMessageHandler {
+ try {
+ // "volume" is a part of "receiver" initialized below.
+ JSONObject jsonVolume = new JSONObject();
+- jsonVolume.put("level", mSessionController.getSession().getVolume());
+- jsonVolume.put("muted", mSessionController.getSession().isMute());
+
+ // "receiver" is a part of "message" initialized below.
+ JSONObject jsonReceiver = new JSONObject();
+- jsonReceiver.put(
+- "label", mSessionController.getSession().getCastDevice().getDeviceId());
+- jsonReceiver.put("friendlyName",
+- mSessionController.getSession().getCastDevice().getFriendlyName());
+ jsonReceiver.put("capabilities", toJSONArray(mSessionController.getCapabilities()));
+ jsonReceiver.put("volume", jsonVolume);
+- jsonReceiver.put(
+- "isActiveInput", mSessionController.getSession().getActiveInputState());
+ jsonReceiver.put("displayStatus", null);
+ jsonReceiver.put("receiverType", "cast");
+
+@@ -699,23 +645,14 @@ public class CafMessageHandler {
+
+ JSONObject jsonMessage = new JSONObject();
+ jsonMessage.put("sessionId", mSessionController.getSessionId());
+- jsonMessage.put("statusText", mSessionController.getSession().getApplicationStatus());
+ jsonMessage.put("receiver", jsonReceiver);
+ jsonMessage.put("namespaces", jsonNamespaces);
+ jsonMessage.put("media", toJSONArray(new ArrayList<>()));
+ jsonMessage.put("status", "connected");
+ jsonMessage.put("transportId", "web-4");
+
+- ApplicationMetadata applicationMetadata =
+- mSessionController.getSession().getApplicationMetadata();
+- if (applicationMetadata != null) {
+- jsonMessage.put("appId", applicationMetadata.getApplicationId());
+- } else {
+- jsonMessage.put("appId",
+- mSessionController.getRouteCreationInfo().source.getApplicationId());
+- }
+- jsonMessage.put("displayName",
+- mSessionController.getSession().getCastDevice().getFriendlyName());
++ jsonMessage.put("appId",
++ mSessionController.getRouteCreationInfo().source.getApplicationId());
+
+ return jsonMessage.toString();
+ } catch (JSONException e) {
+@@ -796,32 +733,6 @@ public class CafMessageHandler {
+ boolean sendStringCastMessage(
+ String message, String namespace, String clientId, int sequenceNumber) {
+ if (!mSessionController.isConnected()) return false;
+-
+- PendingResult pendingResult =
+- mSessionController.getSession().sendMessage(namespace, message);
+- if (!TextUtils.equals(namespace, CastSessionUtil.MEDIA_NAMESPACE)) {
+- // Media commands wait for the media status update as a result.
+- pendingResult.setResultCallback(
+- (Status result) -> onSendAppMessageResult(result, clientId, sequenceNumber));
+- }
+- return true;
+- }
+-
+- /**
+- * Notifies a client that an app message has been sent.
+- * @param clientId The client id the message is sent from.
+- * @param sequenceNumber The sequence number of the message.
+- */
+- void onSendAppMessageResult(Status result, String clientId, int sequenceNumber) {
+- if (!result.isSuccess()) {
+- // TODO(avayvod): should actually report back to the page.
+- // See https://crbug.com/550445.
+- Log.e(TAG, "Failed to send the message: " + result);
+- return;
+- }
+-
+- // App messages wait for the empty message with the sequence
+- // number.
+- sendEnclosedMessageToClient(clientId, "app_message", null, sequenceNumber);
++ return false;
+ }
+ }
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastMediaSource.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastMediaSource.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastMediaSource.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastMediaSource.java
+@@ -8,8 +8,6 @@ import android.net.Uri;
+ import android.support.annotation.Nullable;
+ import android.support.v7.media.MediaRouteSelector;
+
+-import com.google.android.gms.cast.CastMediaControlIntent;
+-
+ import org.chromium.chrome.browser.media.router.MediaSource;
+
+ import java.util.Arrays;
+@@ -105,13 +103,7 @@ public class CastMediaSource implements MediaSource {
+ */
+ @Override
+ public MediaRouteSelector buildRouteSelector() {
+- try {
+- return new MediaRouteSelector.Builder()
+- .addControlCategory(CastMediaControlIntent.categoryForCast(mApplicationId))
+- .build();
+- } catch (IllegalArgumentException e) {
+- return null;
+- }
++ return null;
+ }
+
+ /**
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastOptionsProvider.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastOptionsProvider.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastOptionsProvider.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastOptionsProvider.java
+@@ -6,28 +6,8 @@ package org.chromium.chrome.browser.media.router.caf;
+
+ import android.content.Context;
+
+-import com.google.android.gms.cast.LaunchOptions;
+-import com.google.android.gms.cast.framework.CastOptions;
+-import com.google.android.gms.cast.framework.OptionsProvider;
+-import com.google.android.gms.cast.framework.SessionProvider;
+-
+ import java.util.List;
+
+ /** {@link OptionsProvider} implementation for Chrome MR. */
+-public class CastOptionsProvider implements OptionsProvider {
+- @Override
+- public CastOptions getCastOptions(Context context) {
+- return new CastOptions.Builder()
+- .setCastMediaOptions(null)
+- .setEnableReconnectionService(false)
+- .setLaunchOptions(new LaunchOptions.Builder().setRelaunchIfRunning(true).build())
+- .setResumeSavedSession(false)
+- .setStopReceiverApplicationWhenEndingSession(true)
+- .build();
+- }
+-
+- @Override
+- public List getAdditionalSessionProviders(Context context) {
+- return null;
+- }
++public class CastOptionsProvider {
+ }
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastSessionController.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastSessionController.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastSessionController.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastSessionController.java
+@@ -7,11 +7,6 @@ package org.chromium.chrome.browser.media.router.caf;
+ import android.support.annotation.NonNull;
+ import android.support.annotation.VisibleForTesting;
+
+-import com.google.android.gms.cast.ApplicationMetadata;
+-import com.google.android.gms.cast.Cast;
+-import com.google.android.gms.cast.CastDevice;
+-import com.google.android.gms.cast.framework.CastSession;
+-
+ import org.chromium.base.Log;
+
+ import java.util.ArrayList;
+@@ -24,12 +19,10 @@ public class CastSessionController extends BaseSessionController {
+ private static final String TAG = "CafSessionCtrl";
+
+ private List mNamespaces = new ArrayList();
+- private CastListener mCastListener;
+ private CafNotificationController mNotificationController;
+
+ public CastSessionController(CafBaseMediaRouteProvider provider) {
+ super(provider);
+- mCastListener = new CastListener();
+ mNotificationController = new CafNotificationController(this);
+ }
+
+@@ -37,30 +30,6 @@ public class CastSessionController extends BaseSessionController {
+ return mNamespaces;
+ }
+
+- /**
+- * Init nested fields for testing. The reason is that nested classes are bound to the original
+- * instance instead of the spyed instance.
+- */
+- void initNestedFieldsForTesting() {
+- mCastListener = new CastListener();
+- }
+-
+- @Override
+- public void attachToCastSession(CastSession session) {
+- super.attachToCastSession(session);
+- getSession().addCastListener(mCastListener);
+- updateNamespaces();
+- }
+-
+- @Override
+- public void detachFromCastSession() {
+- if (getSession() == null) return;
+-
+- mNamespaces.clear();
+- getSession().removeCastListener(mCastListener);
+- super.detachFromCastSession();
+- }
+-
+ @Override
+ public void onSessionEnded() {
+ getMessageHandler().onSessionEnded();
+@@ -72,24 +41,6 @@ public class CastSessionController extends BaseSessionController {
+ return mNotificationController;
+ }
+
+- private class CastListener extends Cast.Listener {
+- @Override
+- public void onApplicationStatusChanged() {
+- CastSessionController.this.onApplicationStatusChanged();
+- }
+-
+- @Override
+- public void onApplicationMetadataChanged(ApplicationMetadata metadata) {
+- CastSessionController.this.onApplicationStatusChanged();
+- }
+-
+- @Override
+- public void onVolumeChanged() {
+- CastSessionController.this.onApplicationStatusChanged();
+- getMessageHandler().onVolumeChanged();
+- }
+- }
+-
+ private void onApplicationStatusChanged() {
+ updateNamespaces();
+
+@@ -100,53 +51,18 @@ public class CastSessionController extends BaseSessionController {
+ @VisibleForTesting
+ void updateNamespaces() {
+ if (!isConnected()) return;
+-
+- if (getSession().getApplicationMetadata() == null
+- || getSession().getApplicationMetadata().getSupportedNamespaces() == null) {
+- return;
+- }
+-
+- Set namespacesToAdd =
+- new HashSet<>(getSession().getApplicationMetadata().getSupportedNamespaces());
+- Set namespacesToRemove = new HashSet(mNamespaces);
+-
+- namespacesToRemove.removeAll(namespacesToAdd);
+- namespacesToAdd.removeAll(mNamespaces);
+-
+- for (String namespace : namespacesToRemove) unregisterNamespace(namespace);
+- for (String namespace : namespacesToAdd) registerNamespace(namespace);
+ }
+
+ private void registerNamespace(String namespace) {
+ assert !mNamespaces.contains(namespace);
+
+ if (!isConnected()) return;
+-
+- try {
+- getSession().setMessageReceivedCallbacks(namespace, this::onMessageReceived);
+- mNamespaces.add(namespace);
+- } catch (Exception e) {
+- Log.e(TAG, "Failed to register namespace listener for %s", namespace, e);
+- }
+ }
+
+ private void unregisterNamespace(String namespace) {
+ assert mNamespaces.contains(namespace);
+
+ if (!isConnected()) return;
+-
+- try {
+- getSession().removeMessageReceivedCallbacks(namespace);
+- mNamespaces.remove(namespace);
+- } catch (Exception e) {
+- Log.e(TAG, "Failed to remove the namespace listener for %s", namespace, e);
+- }
+- }
+-
+- @Override
+- protected void onMessageReceived(CastDevice castDevice, String namespace, String message) {
+- super.onMessageReceived(castDevice, namespace, message);
+- getMessageHandler().onMessageReceived(namespace, message);
+ }
+
+ @NonNull
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastUtils.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastUtils.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastUtils.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/CastUtils.java
+@@ -4,16 +4,10 @@
+
+ package org.chromium.chrome.browser.media.router.caf;
+
+-import com.google.android.gms.cast.framework.CastContext;
+-
+ import org.chromium.base.ContextUtils;
+
+ /** Utility methods for Cast. */
+ public class CastUtils {
+- /** Helper method to return the {@link CastContext} instance. */
+- public static CastContext getCastContext() {
+- return CastContext.getSharedInstance(ContextUtils.getApplicationContext());
+- }
+
+ /**
+ * Compares two origins. Empty origin strings correspond to unique origins in
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/CafExpandedControllerActivity.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/CafExpandedControllerActivity.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/CafExpandedControllerActivity.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/CafExpandedControllerActivity.java
+@@ -44,15 +44,11 @@ public class CafExpandedControllerActivity
+ @Override
+ public void play() {
+ if (!mSessionController.isConnected()) return;
+-
+- mSessionController.getSession().getRemoteMediaClient().play();
+ }
+
+ @Override
+ public void pause() {
+ if (!mSessionController.isConnected()) return;
+-
+- mSessionController.getSession().getRemoteMediaClient().pause();
+ }
+
+ @Override
+@@ -70,27 +66,19 @@ public class CafExpandedControllerActivity
+ @Override
+ public void seekTo(long pos) {
+ if (!mSessionController.isConnected()) return;
+-
+- mSessionController.safelySeek(pos);
+ }
+
+ @Override
+ public boolean isPlaying() {
+ if (!mSessionController.isConnected()) return false;
+
+- return mSessionController.getSession().getRemoteMediaClient().isPlaying();
++ return false;
+ }
+
+ @Override
+ public long getActionFlags() {
+ long flags =
+ PlaybackStateCompat.ACTION_REWIND | PlaybackStateCompat.ACTION_FAST_FORWARD;
+- if (mSessionController.isConnected()
+- && mSessionController.getSession().getRemoteMediaClient().isPlaying()) {
+- flags |= PlaybackStateCompat.ACTION_PAUSE;
+- } else {
+- flags |= PlaybackStateCompat.ACTION_PLAY;
+- }
+ return flags;
+ }
+ };
+@@ -173,20 +161,10 @@ public class CafExpandedControllerActivity
+ private void updateUi() {
+ if (!mSessionController.isConnected()) return;
+
+- String deviceName = mSessionController.getSession().getCastDevice().getFriendlyName();
+- String titleText = "";
+- if (deviceName != null) {
+- titleText = getResources().getString(R.string.cast_casting_video, deviceName);
+- }
+- mTitleView.setText(titleText);
+-
+ mMediaController.refresh();
+ mMediaController.updateProgress();
+
+ cancelProgressUpdateTask();
+- if (mSessionController.getSession().getRemoteMediaClient().isPlaying()) {
+- scheduleProgressUpdateTask();
+- }
+ }
+
+ private void scheduleProgressUpdateTask() {
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/FlingingControllerAdapter.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/FlingingControllerAdapter.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/FlingingControllerAdapter.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/FlingingControllerAdapter.java
+@@ -4,11 +4,6 @@
+
+ package org.chromium.chrome.browser.media.router.caf.remoting;
+
+-import com.google.android.gms.cast.MediaInfo;
+-import com.google.android.gms.cast.MediaStatus;
+-import com.google.android.gms.cast.framework.media.RemoteMediaClient;
+-import com.google.android.gms.common.api.Result;
+-
+ import org.chromium.base.Log;
+ import org.chromium.chrome.browser.media.router.FlingingController;
+ import org.chromium.chrome.browser.media.router.MediaController;
+@@ -68,14 +63,6 @@ public class FlingingControllerAdapter implements FlingingController, MediaContr
+ /** Starts loading the media URL, from the given position. */
+ public void load(long position) {
+ if (!mSessionController.isConnected()) return;
+-
+- mLoaded = true;
+-
+- MediaInfo mediaInfo = new MediaInfo.Builder(mMediaUrl)
+- .setContentType("*/*")
+- .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
+- .build();
+- mSessionController.getRemoteMediaClient().load(mediaInfo, /* autoplay= */ true, position);
+ }
+
+ ////////////////////////////////////////////
+@@ -90,30 +77,21 @@ public class FlingingControllerAdapter implements FlingingController, MediaContr
+ load(/* position= */ 0);
+ return;
+ }
+-
+- mSessionController.getRemoteMediaClient().play().setResultCallback(
+- this::onMediaCommandResult);
+ }
+
+ @Override
+ public void pause() {
+ if (!mSessionController.isConnected()) return;
+- mSessionController.getRemoteMediaClient().pause().setResultCallback(
+- this::onMediaCommandResult);
+ }
+
+ @Override
+ public void setMute(boolean mute) {
+ if (!mSessionController.isConnected()) return;
+- mSessionController.getRemoteMediaClient().setStreamMute(mute).setResultCallback(
+- this::onMediaCommandResult);
+ }
+
+ @Override
+ public void setVolume(double volume) {
+ if (!mSessionController.isConnected()) return;
+- mSessionController.getRemoteMediaClient().setStreamVolume(volume).setResultCallback(
+- this::onMediaCommandResult);
+ }
+
+ @Override
+@@ -124,49 +102,10 @@ public class FlingingControllerAdapter implements FlingingController, MediaContr
+ load(position);
+ return;
+ }
+-
+- mSessionController.safelySeek(position).setResultCallback(this::onMediaCommandResult);
+- mStreamPositionExtrapolator.onSeek(position);
+ }
+
+ ////////////////////////////////////////////
+ // MediaController implementation end
+ ////////////////////////////////////////////
+
+- public void onStatusUpdated() {
+- if (mMediaStatusObserver == null) return;
+-
+- RemoteMediaClient remoteMediaClient = mSessionController.getRemoteMediaClient();
+-
+- MediaStatus mediaStatus = remoteMediaClient.getMediaStatus();
+- if (mediaStatus != null) {
+- if (mediaStatus.getPlayerState() == MediaStatus.PLAYER_STATE_IDLE
+- && mediaStatus.getIdleReason() == MediaStatus.IDLE_REASON_FINISHED) {
+- mLoaded = false;
+- mStreamPositionExtrapolator.onFinish();
+- } else {
+- mStreamPositionExtrapolator.update(remoteMediaClient.getStreamDuration(),
+- remoteMediaClient.getApproximateStreamPosition(),
+- remoteMediaClient.isPlaying(), mediaStatus.getPlaybackRate());
+- }
+-
+- mMediaStatusObserver.onMediaStatusUpdate(new MediaStatusBridge(mediaStatus));
+-
+- } else {
+- mLoaded = false;
+- mStreamPositionExtrapolator.clear();
+- }
+- }
+-
+- private void onMediaCommandResult(Result result) {
+- // When multiple API calls are made in quick succession, "Results have already been set"
+- // IllegalStateExceptions might be thrown from GMS code. We prefer to catch the exception
+- // and noop it, than to crash. This might lead to some API calls never getting their
+- // onResult() called, so we should not rely on onResult() being called for every API call.
+- // See https://crbug.com/853923.
+- if (!result.getStatus().isSuccess()) {
+- Log.e(TAG, "Error when sending command. Status code: %d",
+- result.getStatus().getStatusCode());
+- }
+- }
+ }
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/RemotingMediaSource.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/RemotingMediaSource.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/RemotingMediaSource.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/RemotingMediaSource.java
+@@ -11,8 +11,6 @@ import android.support.annotation.Nullable;
+ import android.support.v7.media.MediaRouteSelector;
+ import android.util.Base64;
+
+-import com.google.android.gms.cast.CastMediaControlIntent;
+-
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.Log;
+ import org.chromium.chrome.browser.media.router.MediaSource;
+@@ -78,9 +76,7 @@ public class RemotingMediaSource implements MediaSource {
+ */
+ @Override
+ public MediaRouteSelector buildRouteSelector() {
+- return new MediaRouteSelector.Builder()
+- .addControlCategory(CastMediaControlIntent.categoryForCast(getApplicationId()))
+- .build();
++ return null;
+ }
+
+ /**
+@@ -107,7 +103,7 @@ public class RemotingMediaSource implements MediaSource {
+
+ sApplicationId = (customAppId != null && !customAppId.isEmpty())
+ ? customAppId
+- : CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID;
++ : "CC1AD845"; /*DEFAULT_MEDIA_RECEIVER_APPLICATION_ID*/
+ }
+
+ return sApplicationId;
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/RemotingSessionController.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/RemotingSessionController.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/RemotingSessionController.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/caf/remoting/RemotingSessionController.java
+@@ -4,8 +4,6 @@
+
+ package org.chromium.chrome.browser.media.router.caf.remoting;
+
+-import com.google.android.gms.cast.framework.CastSession;
+-
+ import org.chromium.base.Log;
+ import org.chromium.chrome.browser.media.router.CastSessionUtil;
+ import org.chromium.chrome.browser.media.router.caf.BaseNotificationController;
+@@ -34,19 +32,6 @@ public class RemotingSessionController extends BaseSessionController {
+ }
+
+ @Override
+- public void attachToCastSession(CastSession session) {
+- super.attachToCastSession(session);
+-
+- try {
+- getSession().setMessageReceivedCallbacks(
+- CastSessionUtil.MEDIA_NAMESPACE, this::onMessageReceived);
+- } catch (Exception e) {
+- Log.e(TAG, "Failed to register namespace listener for %s",
+- CastSessionUtil.MEDIA_NAMESPACE, e);
+- }
+- }
+-
+- @Override
+ public void onSessionStarted() {
+ super.onSessionStarted();
+ RemotingMediaSource source = (RemotingMediaSource) getSource();
+@@ -54,12 +39,6 @@ public class RemotingSessionController extends BaseSessionController {
+ }
+
+ @Override
+- protected void onStatusUpdated() {
+- mFlingingControllerAdapter.onStatusUpdated();
+- super.onStatusUpdated();
+- }
+-
+- @Override
+ public FlingingControllerAdapter getFlingingController() {
+ return mFlingingControllerAdapter;
+ }
+diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
+--- a/chrome/android/java/AndroidManifest.xml
++++ b/chrome/android/java/AndroidManifest.xml
+@@ -184,12 +184,6 @@ by a child template that "extends" this file.
+ android:theme="@android:style/Theme.Material.Light.Dialog.Alert" />
+ {% endif %}
+
+-
+-
+-
+
+
+ {% endif %}
+
+ {% block extra_application_definitions %}
+-
+-
+-
+-
+ {% endblock %}
+ {% block extra_application_definitions_for_test %}
+ {% endblock %}
+diff --git a/chrome/test/android/cast_emulator/BUILD.gn b/chrome/test/android/cast_emulator/BUILD.gn
+--- a/chrome/test/android/cast_emulator/BUILD.gn
++++ b/chrome/test/android/cast_emulator/BUILD.gn
+@@ -20,7 +20,6 @@ android_library("cast_emulator_java") {
+ "src/org/chromium/chrome/browser/media/router/DummyRoutePublisher.java",
+ ]
+ deps = [
+- "$google_play_services_package:google_play_services_cast_java",
+ "//base:base_java",
+ "//third_party/android_deps:android_support_v7_appcompat_java",
+ "//third_party/android_deps:com_android_support_mediarouter_v7_java",
+diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn
+--- a/third_party/android_deps/BUILD.gn
++++ b/third_party/android_deps/BUILD.gn
+@@ -798,38 +798,6 @@ android_aar_prebuilt("google_play_services_basement_java") {
+ }
+
+ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_cast_java") {
+- aar_path = "libs/com_google_android_gms_play_services_cast/play-services-cast-16.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_cast/com_google_android_gms_play_services_cast.info"
+- deps = [
+- ":com_android_support_mediarouter_v7_java",
+- ":google_play_services_base_java",
+- ":google_play_services_basement_java",
+- ":google_play_services_flags_java",
+- ":google_play_services_tasks_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_cast_framework_java") {
+- aar_path = "libs/com_google_android_gms_play_services_cast_framework/play-services-cast-framework-16.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_cast_framework/com_google_android_gms_play_services_cast_framework.info"
+- deps = [
+- ":com_android_support_mediarouter_v7_java",
+- ":com_android_support_recyclerview_v7_java",
+- ":google_play_services_base_java",
+- ":google_play_services_basement_java",
+- ":google_play_services_cast_java",
+- ]
+-
+- # Removing all resources from cast framework as they are unused bloat.
+- strip_resources = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+ android_aar_prebuilt("google_play_services_tasks_java") {
+ aar_path = "libs/com_google_android_gms_play_services_tasks/play-services-tasks-15.0.1.aar"
+ info_path = "libs/com_google_android_gms_play_services_tasks/com_google_android_gms_play_services_tasks.info"
+--
+2.11.0
+
diff --git a/build/patches/Remove-dependency-on-com.google.android.gms.common-auth-signin-dynamic-com.google.android.gms.tasks.patch b/build/patches/Remove-dependency-on-com.google.android.gms.common-auth-signin-dynamic-com.google.android.gms.tasks.patch
new file mode 100644
index 0000000000000000000000000000000000000000..bffdc2586292549eee6439cb843e5d1648e84ba8
--- /dev/null
+++ b/build/patches/Remove-dependency-on-com.google.android.gms.common-auth-signin-dynamic-com.google.android.gms.tasks.patch
@@ -0,0 +1,798 @@
+From: Wengling Chen
+Date: Sat, 2 Nov 2019 08:58:19 +0100
+Subject: Remove dependency on
+ com.google.android.gms.common/auth/signin/dynamic,
+ com.google.android.gms.tasks
+
+---
+ chrome/android/BUILD.gn | 8 ---
+ chrome/android/features/media_router/BUILD.gn | 2 -
+ .../browser/media/router/ChromeMediaRouter.java | 7 +-
+ chrome/android/java/AndroidManifest.xml | 9 ---
+ .../src/org/chromium/chrome/browser/AppHooks.java | 14 +---
+ .../chromium/chrome/browser/ChromeVersionInfo.java | 12 +---
+ .../browser/component_updater/UpdateScheduler.java | 3 -
+ .../browser/externalauth/ExternalAuthUtils.java | 14 ++--
+ .../externalauth/UserRecoverableErrorHandler.java | 7 --
+ .../browser/gcore/ChromeGoogleApiClientImpl.java | 25 +------
+ .../browser/gcore/GoogleApiClientHelper.java | 82 +---------------------
+ .../chrome/browser/omaha/UpdateStatusProvider.java | 10 +--
+ .../browser/preferences/PreferencesLauncher.java | 5 +-
+ chrome/test/android/BUILD.gn | 2 -
+ components/background_task_scheduler/BUILD.gn | 10 ---
+ components/signin/core/browser/android/BUILD.gn | 2 -
+ .../signin/GmsAvailabilityException.java | 4 +-
+ content/public/android/BUILD.gn | 3 -
+ content/test/BUILD.gn | 3 -
+ device/BUILD.gn | 2 -
+ remoting/android/client_java_tmpl.gni | 3 -
+ services/BUILD.gn | 4 --
+ services/device/geolocation/BUILD.gn | 2 -
+ services/shape_detection/BUILD.gn | 2 -
+ third_party/android_deps/BUILD.gn | 38 ----------
+ third_party/cacheinvalidation/BUILD.gn | 1 -
+ third_party/robolectric/BUILD.gn | 2 -
+ 27 files changed, 16 insertions(+), 260 deletions(-)
+
+diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
+--- a/chrome/android/BUILD.gn
++++ b/chrome/android/BUILD.gn
+@@ -267,9 +267,6 @@ android_library("chrome_java") {
+ ":thumbnail_cache_entry_proto_java",
+ ":update_proto_java",
+ ":usage_stats_proto_java",
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//base:jni_java",
+ "//chrome/android/features/keyboard_accessory:public_java",
+@@ -685,8 +682,6 @@ junit_binary("chrome_junit_tests") {
+ ":chrome_java",
+ ":chrome_junit_test_support",
+ ":partner_location_descriptor_proto_java",
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//base:base_junit_test_support",
+@@ -784,9 +779,6 @@ android_library("chrome_test_java") {
+ ":browser_java_test_support",
+ ":chrome_test_util_java",
+ ":partner_location_descriptor_proto_java",
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//base/test:test_support_java",
+diff --git a/chrome/android/features/media_router/BUILD.gn b/chrome/android/features/media_router/BUILD.gn
+--- a/chrome/android/features/media_router/BUILD.gn
++++ b/chrome/android/features/media_router/BUILD.gn
+@@ -9,8 +9,6 @@ import("//chrome/common/features.gni")
+ android_library("java") {
+ deps = [
+ ":java_resources",
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+ "//base:base_java",
+ "//base:jni_java",
+ "//chrome/android:chrome_java",
+diff --git a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java
+--- a/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java
++++ b/chrome/android/features/media_router/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java
+@@ -7,9 +7,6 @@ package org.chromium.chrome.browser.media.router;
+ import android.support.annotation.Nullable;
+ import android.support.v7.media.MediaRouter;
+
+-import com.google.android.gms.common.ConnectionResult;
+-import com.google.android.gms.common.GoogleApiAvailability;
+-
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.Log;
+ import org.chromium.base.StrictModeContext;
+@@ -43,9 +40,7 @@ public class ChromeMediaRouter implements MediaRouteManager {
+ int googleApiAvailabilityResult =
+ AppHooks.get().isGoogleApiAvailableWithMinApkVersion(
+ MIN_GOOGLE_PLAY_SERVICES_APK_VERSION);
+- if (googleApiAvailabilityResult != ConnectionResult.SUCCESS) {
+- GoogleApiAvailability.getInstance().showErrorNotification(
+- ContextUtils.getApplicationContext(), googleApiAvailabilityResult);
++ if (true) {
+ return;
+ }
+ MediaRouteProvider cafProvider = CafMediaRouteProvider.create(manager);
+diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
+--- a/chrome/android/java/AndroidManifest.xml
++++ b/chrome/android/java/AndroidManifest.xml
+@@ -889,15 +889,6 @@ by a child template that "extends" this file.
+
+
+
+-
+-
+-
+-
+ = minApkVersion) return ConnectionResult.SUCCESS;
+- } catch (PackageManager.NameNotFoundException e) {
+- return ConnectionResult.SERVICE_MISSING;
+- }
+- return ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED;
++ return 1; /* SERVICE_MISSING*/
+ }
+
+ /**
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeVersionInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeVersionInfo.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeVersionInfo.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeVersionInfo.java
+@@ -7,8 +7,6 @@ package org.chromium.chrome.browser;
+ import android.content.Context;
+ import android.content.pm.PackageManager;
+
+-import com.google.android.gms.common.GoogleApiAvailability;
+-
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.annotations.CalledByNative;
+ import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
+@@ -95,7 +93,7 @@ public class ChromeVersionInfo {
+ public static String getGmsInfo() {
+ Context context = ContextUtils.getApplicationContext();
+
+- final long sdkVersion = GoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODE;
++ final long sdkVersion = 12600000;
+ final long installedGmsVersion = getPlayServicesApkVersionNumber(context);
+
+ final String accessType;
+@@ -112,12 +110,6 @@ public class ChromeVersionInfo {
+ }
+
+ private static long getPlayServicesApkVersionNumber(Context context) {
+- try {
+- return context.getPackageManager()
+- .getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0)
+- .versionCode;
+- } catch (PackageManager.NameNotFoundException e) {
+- return 0;
+- }
++ return 0;
+ }
+ }
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/component_updater/UpdateScheduler.java b/chrome/android/java/src/org/chromium/chrome/browser/component_updater/UpdateScheduler.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/component_updater/UpdateScheduler.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/component_updater/UpdateScheduler.java
+@@ -6,9 +6,6 @@ package org.chromium.chrome.browser.component_updater;
+
+ import android.os.Build;
+
+-import com.google.android.gms.common.ConnectionResult;
+-import com.google.android.gms.common.GoogleApiAvailability;
+-
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.annotations.CalledByNative;
+ import org.chromium.base.annotations.JNINamespace;
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtils.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtils.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtils.java
+@@ -13,9 +13,6 @@ import android.os.Binder;
+ import android.support.annotation.WorkerThread;
+ import android.text.TextUtils;
+
+-import com.google.android.gms.common.ConnectionResult;
+-import com.google.android.gms.common.GoogleApiAvailability;
+-
+ import org.chromium.base.CommandLine;
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.Log;
+@@ -157,9 +154,7 @@ public class ExternalAuthUtils {
+ * when it is updating.
+ */
+ public boolean isGooglePlayServicesMissing(final Context context) {
+- final int resultCode = checkGooglePlayServicesAvailable(context);
+- return (resultCode == ConnectionResult.SERVICE_MISSING
+- || resultCode == ConnectionResult.SERVICE_INVALID);
++ return true;
+ }
+
+ /**
+@@ -181,7 +176,6 @@ public class ExternalAuthUtils {
+
+ Context context = ContextUtils.getApplicationContext();
+ final int resultCode = checkGooglePlayServicesAvailable(context);
+- if (resultCode == ConnectionResult.SUCCESS) return true;
+ // resultCode is some kind of error.
+ Log.v(TAG, "Unable to use Google Play Services: %s", describeError(resultCode));
+ if (isUserRecoverableError(resultCode)) {
+@@ -251,7 +245,7 @@ public class ExternalAuthUtils {
+ protected int checkGooglePlayServicesAvailable(final Context context) {
+ // TODO(crbug.com/577190): Temporarily allowing disk access until more permanent fix is in.
+ try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) {
+- return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context);
++ return 1; /*SERVICE_MISSING*/
+ }
+ }
+
+@@ -263,7 +257,7 @@ public class ExternalAuthUtils {
+ * @return true If the code represents a user-recoverable error
+ */
+ protected boolean isUserRecoverableError(final int errorCode) {
+- return GoogleApiAvailability.getInstance().isUserResolvableError(errorCode);
++ return false;
+ }
+
+ /**
+@@ -273,6 +267,6 @@ public class ExternalAuthUtils {
+ * @return a textual description of the error code
+ */
+ protected String describeError(final int errorCode) {
+- return GoogleApiAvailability.getInstance().getErrorString(errorCode);
++ return "";
+ }
+ }
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalauth/UserRecoverableErrorHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalauth/UserRecoverableErrorHandler.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/externalauth/UserRecoverableErrorHandler.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/externalauth/UserRecoverableErrorHandler.java
+@@ -9,8 +9,6 @@ import android.app.Dialog;
+ import android.content.Context;
+ import android.content.DialogInterface;
+
+-import com.google.android.gms.common.GoogleApiAvailability;
+-
+ import org.chromium.base.ThreadUtils;
+ import org.chromium.base.metrics.CachedMetrics.ActionEvent;
+
+@@ -97,7 +95,6 @@ public abstract class UserRecoverableErrorHandler {
+ if (!sNotificationShown.getAndSet(true)) {
+ return;
+ }
+- GoogleApiAvailability.getInstance().showErrorNotification(context, errorCode);
+ }
+ }
+
+@@ -190,11 +187,7 @@ public abstract class UserRecoverableErrorHandler {
+ cancelDialog();
+ }
+ if (mDialog == null) {
+- mDialog = GoogleApiAvailability.getInstance().getErrorDialog(
+- mActivity, errorCode, NO_RESPONSE_REQUIRED);
+ mErrorCode = errorCode;
+-
+- DialogUserActionRecorder.createAndAttachToDialog(mDialog);
+ }
+ // This can happen if |errorCode| is ConnectionResult.SERVICE_INVALID.
+ if (mDialog != null && !mDialog.isShowing()) {
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gcore/ChromeGoogleApiClientImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/gcore/ChromeGoogleApiClientImpl.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/gcore/ChromeGoogleApiClientImpl.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/gcore/ChromeGoogleApiClientImpl.java
+@@ -6,9 +6,6 @@ package org.chromium.chrome.browser.gcore;
+
+ import android.content.Context;
+
+-import com.google.android.gms.common.ConnectionResult;
+-import com.google.android.gms.common.api.GoogleApiClient;
+-
+ import org.chromium.base.Log;
+ import org.chromium.base.TraceEvent;
+ import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
+@@ -22,7 +19,6 @@ public class ChromeGoogleApiClientImpl implements ChromeGoogleApiClient {
+ private static final String TAG = "Icing";
+
+ private final Context mApplicationContext;
+- private final GoogleApiClient mClient;
+
+ /**
+ * @param context its application context will be exposed through
+@@ -31,10 +27,9 @@ public class ChromeGoogleApiClientImpl implements ChromeGoogleApiClient {
+ * @param requireFirstPartyBuild true if the given client can only be used in a first-party
+ * build.
+ */
+- public ChromeGoogleApiClientImpl(Context context, GoogleApiClient client,
++ public ChromeGoogleApiClientImpl(Context context,
+ boolean requireFirstPartyBuild) {
+ mApplicationContext = context.getApplicationContext();
+- mClient = client;
+ if (requireFirstPartyBuild && !ExternalAuthUtils.getInstance().isChromeGoogleSigned()) {
+ throw new IllegalStateException("GoogleApiClient requires first-party build");
+ }
+@@ -42,7 +37,6 @@ public class ChromeGoogleApiClientImpl implements ChromeGoogleApiClient {
+
+ @Override
+ public void disconnect() {
+- mClient.disconnect();
+ }
+
+ @Override
+@@ -58,24 +52,11 @@ public class ChromeGoogleApiClientImpl implements ChromeGoogleApiClient {
+ @Override
+ public boolean connectWithTimeout(long timeout) {
+ TraceEvent.begin("ChromeGoogleApiClientImpl:connectWithTimeout");
+- try {
+- ConnectionResult result = mClient.blockingConnect(timeout, TimeUnit.MILLISECONDS);
+- if (!result.isSuccess()) {
+- Log.e(TAG, "Connection to GmsCore unsuccessful. Error %d", result.getErrorCode());
+- } else {
+- Log.d(TAG, "Connection to GmsCore successful.");
+- }
+- return result.isSuccess();
+- } finally {
+- TraceEvent.end("ChromeGoogleApiClientImpl:connectWithTimeout");
+- }
++ TraceEvent.end("ChromeGoogleApiClientImpl:connectWithTimeout");
++ return false;
+ }
+
+ public Context getApplicationContext() {
+ return mApplicationContext;
+ }
+-
+- public GoogleApiClient getApiClient() {
+- return mClient;
+- }
+ }
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gcore/GoogleApiClientHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/gcore/GoogleApiClientHelper.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/gcore/GoogleApiClientHelper.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/gcore/GoogleApiClientHelper.java
+@@ -7,11 +7,6 @@ package org.chromium.chrome.browser.gcore;
+ import android.os.Bundle;
+ import android.os.Handler;
+
+-import com.google.android.gms.common.ConnectionResult;
+-import com.google.android.gms.common.api.GoogleApiClient;
+-import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
+-import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
+-
+ import org.chromium.base.ApplicationStatus;
+ import org.chromium.base.ApplicationStatus.ApplicationStateListener;
+ import org.chromium.base.Log;
+@@ -67,30 +62,16 @@ import org.chromium.base.ThreadUtils;
+ * }
+ *
+ */
+-public class GoogleApiClientHelper
+- implements OnConnectionFailedListener, ConnectionCallbacks {
++public class GoogleApiClientHelper {
+ private static final String TAG = "GCore";
+
+ private int mResolutionAttempts;
+ private boolean mWasConnectedBefore;
+ private final Handler mHandler = new Handler(ThreadUtils.getUiThreadLooper());
+- private final GoogleApiClient mClient;
+ private long mDisconnectionDelayMs;
+ private Runnable mPendingDisconnect;
+
+ /**
+- * Creates a helper and enrolls it in the various connection management features.
+- * See the class documentation for {@link GoogleApiClientHelper} for more information.
+- *
+- * @param client The client to wrap.
+- */
+- public GoogleApiClientHelper(GoogleApiClient client) {
+- mClient = client;
+- enableConnectionRetrying(true);
+- enableLifecycleManagement(true);
+- }
+-
+- /**
+ * Opts in or out of lifecycle management. The client's connection will be closed and reopened
+ * when Chrome goes in and out of background.
+ *
+@@ -116,13 +97,6 @@ public class GoogleApiClientHelper
+ * Enabling or disabling it while it is already enabled or disabled has no effect.
+ */
+ public void enableConnectionRetrying(boolean enabled) {
+- if (enabled) {
+- mClient.registerConnectionCallbacks(this);
+- mClient.registerConnectionFailedListener(this);
+- } else {
+- mClient.unregisterConnectionCallbacks(this);
+- mClient.unregisterConnectionFailedListener(this);
+- }
+ }
+
+ /**
+@@ -155,21 +129,11 @@ public class GoogleApiClientHelper
+ // Cancel and reschedule the disconnection if we are in the background. We do it early to
+ // avoid race conditions between a disconnect on the UI thread and the connect below.
+ if (!ApplicationStatus.hasVisibleActivities()) scheduleDisconnection();
+-
+- // The client might be disconnected if we were idle in the background for too long.
+- if (!mClient.isConnected() && !mClient.isConnecting()) {
+- Log.d(TAG, "Reconnecting the client.");
+- mClient.connect();
+- }
+ }
+
+ void restoreConnectedState() {
+ // If we go back to the foreground before a delayed disconnect happens, cancel it.
+ cancelPendingDisconnection();
+-
+- if (mWasConnectedBefore) {
+- mClient.connect();
+- }
+ }
+
+ /**
+@@ -192,12 +156,6 @@ public class GoogleApiClientHelper
+ }
+
+ private void disconnect() {
+- if (mClient.isConnected() || mClient.isConnecting()) {
+- mWasConnectedBefore = true;
+- }
+-
+- // We always call disconnect to abort possibly pending connection requests.
+- mClient.disconnect();
+ }
+
+ private void cancelPendingDisconnection() {
+@@ -207,43 +165,7 @@ public class GoogleApiClientHelper
+ mPendingDisconnect = null;
+ }
+
+- @Override
+- public void onConnectionFailed(ConnectionResult result) {
+- if (!isErrorRecoverableByRetrying(result.getErrorCode())) {
+- Log.d(TAG, "Not retrying managed client connection. Unrecoverable error: %d",
+- result.getErrorCode());
+- return;
+- }
+-
+- if (mResolutionAttempts < ConnectedTask.RETRY_NUMBER_LIMIT) {
+- Log.d(TAG, "Retrying managed client connection. attempt %d/%d - errorCode: %d",
+- mResolutionAttempts, ConnectedTask.RETRY_NUMBER_LIMIT, result.getErrorCode());
+- mResolutionAttempts += 1;
+-
+- mHandler.postDelayed(new Runnable() {
+- @Override
+- public void run() {
+- mClient.connect();
+- }
+- }, ConnectedTask.CONNECTION_RETRY_TIME_MS);
+- }
+- }
+-
+- @Override
+- public void onConnected(Bundle connectionHint) {
+- mResolutionAttempts = 0;
+- }
+-
+- @Override
+- public void onConnectionSuspended(int cause) {
+- // GoogleApiClient handles retrying on suspension itself. Logging in case it didn't succeed
+- // for some reason.
+- Log.w(TAG, "Managed client connection suspended. Cause: %d", cause);
+- }
+-
+ private static boolean isErrorRecoverableByRetrying(int errorCode) {
+- return errorCode == ConnectionResult.INTERNAL_ERROR
+- || errorCode == ConnectionResult.NETWORK_ERROR
+- || errorCode == ConnectionResult.SERVICE_UPDATING;
++ return false;
+ }
+ }
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateStatusProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateStatusProvider.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateStatusProvider.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateStatusProvider.java
+@@ -19,8 +19,6 @@ import android.support.annotation.NonNull;
+ import android.support.annotation.Nullable;
+ import android.text.TextUtils;
+
+-import com.google.android.gms.common.GooglePlayServicesUtil;
+-
+ import org.chromium.base.ActivityState;
+ import org.chromium.base.ApplicationStatus;
+ import org.chromium.base.ApplicationStatus.ActivityStateListener;
+@@ -463,13 +461,7 @@ public class UpdateStatusProvider implements ActivityStateListener {
+ }
+
+ private boolean isGooglePlayStoreAvailable(Context context) {
+- try {
+- context.getPackageManager().getPackageInfo(
+- GooglePlayServicesUtil.GOOGLE_PLAY_STORE_PACKAGE, 0);
+- } catch (PackageManager.NameNotFoundException e) {
+- return false;
+- }
+- return true;
++ return false;
+ }
+
+ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java
+@@ -12,8 +12,6 @@ import android.os.Bundle;
+ import android.support.annotation.Nullable;
+ import android.support.v4.app.Fragment;
+
+-import com.google.android.gms.common.ConnectionResult;
+-
+ import org.chromium.base.annotations.CalledByNative;
+ import org.chromium.base.metrics.RecordHistogram;
+ import org.chromium.base.metrics.RecordUserAction;
+@@ -202,8 +200,7 @@ public class PreferencesLauncher {
+ int minGooglePlayServicesVersion = ChromeFeatureList.getFieldTrialParamByFeatureAsInt(
+ GOOGLE_ACCOUNT_PWM_UI, MIN_GOOGLE_PLAY_SERVICES_VERSION_PARAM,
+ DEFAULT_MIN_GOOGLE_PLAY_SERVICES_APK_VERSION);
+- if (AppHooks.get().isGoogleApiAvailableWithMinApkVersion(minGooglePlayServicesVersion)
+- != ConnectionResult.SUCCESS)
++ if (true)
+ return false;
+
+ if (!ChromeFeatureList.isEnabled(GOOGLE_ACCOUNT_PWM_UI)) return false;
+diff --git a/chrome/test/android/BUILD.gn b/chrome/test/android/BUILD.gn
+--- a/chrome/test/android/BUILD.gn
++++ b/chrome/test/android/BUILD.gn
+@@ -153,8 +153,6 @@ android_library("chrome_java_test_support") {
+ "javatests/src/org/chromium/chrome/test/util/TranslateUtil.java",
+ ]
+ deps = [
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//chrome/android:chrome_java",
+diff --git a/components/background_task_scheduler/BUILD.gn b/components/background_task_scheduler/BUILD.gn
+--- a/components/background_task_scheduler/BUILD.gn
++++ b/components/background_task_scheduler/BUILD.gn
+@@ -52,9 +52,6 @@ if (is_android) {
+ deps = [
+ ":background_task_scheduler_task_ids_java",
+ ":scheduled_task_java",
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//content/public/android:content_java",
+ "//third_party/android_deps:com_android_support_support_annotations_java",
+@@ -75,9 +72,6 @@ if (is_android) {
+ deps = [
+ ":background_task_scheduler_java",
+ ":background_task_scheduler_task_ids_java",
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//content/public/test/android:content_java_test_support",
+@@ -104,10 +98,6 @@ if (is_android) {
+
+ deps = [
+ ":background_task_scheduler_java",
+- "$google_play_services_package:google_play_services_auth_base_java",
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//base:base_junit_test_support",
+diff --git a/components/signin/core/browser/android/BUILD.gn b/components/signin/core/browser/android/BUILD.gn
+--- a/components/signin/core/browser/android/BUILD.gn
++++ b/components/signin/core/browser/android/BUILD.gn
+@@ -15,8 +15,6 @@ generate_jni("jni_headers") {
+
+ android_library("java") {
+ deps = [
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+ "//base:base_java",
+ "//base:jni_java",
+ "//net/android:net_java",
+diff --git a/components/signin/core/browser/android/java/src/org/chromium/components/signin/GmsAvailabilityException.java b/components/signin/core/browser/android/java/src/org/chromium/components/signin/GmsAvailabilityException.java
+--- a/components/signin/core/browser/android/java/src/org/chromium/components/signin/GmsAvailabilityException.java
++++ b/components/signin/core/browser/android/java/src/org/chromium/components/signin/GmsAvailabilityException.java
+@@ -4,8 +4,6 @@
+
+ package org.chromium.components.signin;
+
+-import com.google.android.gms.common.GoogleApiAvailability;
+-
+ /**
+ * This class encapsulates return code if GMSCore package is not available.
+ */
+@@ -27,6 +25,6 @@ public class GmsAvailabilityException extends AccountManagerDelegateException {
+ }
+
+ public boolean isUserResolvableError() {
+- return GoogleApiAvailability.getInstance().isUserResolvableError(mResultCode);
++ return false;
+ }
+ }
+diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
+--- a/content/public/android/BUILD.gn
++++ b/content/public/android/BUILD.gn
+@@ -52,9 +52,6 @@ action("generate_sandboxed_service_srcjar") {
+ android_library("content_java") {
+ deps = [
+ ":content_java_resources",
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//base:jni_java",
+ "//components/download/public/common:public_java",
+diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
+--- a/content/test/BUILD.gn
++++ b/content/test/BUILD.gn
+@@ -2442,9 +2442,6 @@ if (is_android) {
+ testonly = true
+ java_files = content_java_sources_needing_jni
+ deps = [
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//content/public/android:content_java",
+ ]
+diff --git a/device/BUILD.gn b/device/BUILD.gn
+--- a/device/BUILD.gn
++++ b/device/BUILD.gn
+@@ -386,8 +386,6 @@ if (is_android) {
+ junit_binary("device_junit_tests") {
+ java_files = [ "gamepad/android/junit/src/org/chromium/device/gamepad/GamepadMappingsTest.java" ]
+ deps = [
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//base:base_junit_test_support",
+diff --git a/remoting/android/client_java_tmpl.gni b/remoting/android/client_java_tmpl.gni
+--- a/remoting/android/client_java_tmpl.gni
++++ b/remoting/android/client_java_tmpl.gni
+@@ -101,9 +101,6 @@ template("remoting_android_client_java_tmpl") {
+
+ if (defined(invoker.play_services_package)) {
+ deps += [
+- "${invoker.play_services_package}:google_play_services_auth_base_java",
+- "${invoker.play_services_package}:google_play_services_base_java",
+- "${invoker.play_services_package}:google_play_services_basement_java",
+ ]
+ }
+
+diff --git a/services/BUILD.gn b/services/BUILD.gn
+--- a/services/BUILD.gn
++++ b/services/BUILD.gn
+@@ -107,8 +107,6 @@ if (is_android) {
+ "shape_detection/android/junit/src/org/chromium/shape_detection/BitmapUtilsTest.java",
+ ]
+ deps = [
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//base:base_junit_test_support",
+@@ -136,8 +134,6 @@ if (is_android) {
+ "shape_detection/android/javatests/src/org/chromium/shape_detection/TextDetectionImplTest.java",
+ ]
+ deps = [
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//mojo/public/java:base_java",
+diff --git a/services/device/geolocation/BUILD.gn b/services/device/geolocation/BUILD.gn
+--- a/services/device/geolocation/BUILD.gn
++++ b/services/device/geolocation/BUILD.gn
+@@ -141,8 +141,6 @@ if (is_android) {
+ deps = [
+ ":geolocation",
+ ":geolocation_jni_headers",
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+ "//base:base_java",
+ "//components/location/android:location_java",
+ "//services/device/public/java:geolocation_java",
+diff --git a/services/shape_detection/BUILD.gn b/services/shape_detection/BUILD.gn
+--- a/services/shape_detection/BUILD.gn
++++ b/services/shape_detection/BUILD.gn
+@@ -89,8 +89,6 @@ if (is_android) {
+ ]
+
+ deps = [
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+ "//base:base_java",
+ "//mojo/public/java:base_java",
+ "//mojo/public/java:bindings_java",
+diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn
+--- a/third_party/android_deps/BUILD.gn
++++ b/third_party/android_deps/BUILD.gn
+@@ -772,44 +772,6 @@ android_aar_prebuilt("com_android_support_viewpager_java") {
+ }
+
+ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_base_java") {
+- aar_path = "libs/com_google_android_gms_play_services_base/play-services-base-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_base/com_google_android_gms_play_services_base.info"
+- deps = [
+- ":google_play_services_basement_java",
+- ":google_play_services_tasks_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_basement_java") {
+- aar_path = "libs/com_google_android_gms_play_services_basement/play-services-basement-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_basement/com_google_android_gms_play_services_basement.info"
+- deps = [
+- ":com_android_support_support_v4_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+- input_jars_paths = [ "$android_sdk/optional/org.apache.http.legacy.jar" ]
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_tasks_java") {
+- aar_path = "libs/com_google_android_gms_play_services_tasks/play-services-tasks-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_tasks/com_google_android_gms_play_services_tasks.info"
+- deps = [
+- ":google_play_services_basement_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+ android_aar_prebuilt("com_google_android_material_material_java") {
+ aar_path = "libs/com_google_android_material_material/material-1.0.0-rc02.aar"
+ info_path = "libs/com_google_android_material_material/com_google_android_material_material.info"
+diff --git a/third_party/cacheinvalidation/BUILD.gn b/third_party/cacheinvalidation/BUILD.gn
+--- a/third_party/cacheinvalidation/BUILD.gn
++++ b/third_party/cacheinvalidation/BUILD.gn
+@@ -137,7 +137,6 @@ if (is_android) {
+ jacoco_never_instrument = true
+ deps = [
+ ":cacheinvalidation_proto_java",
+- "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//third_party/android_protobuf:protobuf_nano_javalib",
+ ]
+diff --git a/third_party/robolectric/BUILD.gn b/third_party/robolectric/BUILD.gn
+--- a/third_party/robolectric/BUILD.gn
++++ b/third_party/robolectric/BUILD.gn
+@@ -938,8 +938,6 @@ java_library("shadows_play_services_java") {
+ ":robolectric_shadowapi_java",
+ ":robolectric_utils_java",
+ ":shadows_core_java",
+- "$google_play_services_package:google_play_services_base_java",
+- "$google_play_services_package:google_play_services_basement_java",
+ "//third_party/android_deps:android_support_v4_java",
+ "//third_party/gson:gson_java",
+ "//third_party/guava:guava_java",
+--
+2.11.0
+
diff --git a/build/patches/Remove-dependency-on-com.google.android.gms.fido-com.google.android.gms.iid-com.google.android.gms.instantapps-com.google.android.gms.location.patch b/build/patches/Remove-dependency-on-com.google.android.gms.fido-com.google.android.gms.iid-com.google.android.gms.instantapps-com.google.android.gms.location.patch
new file mode 100644
index 0000000000000000000000000000000000000000..0574cfca775222e325b2bd32c12edc519eddb2d5
--- /dev/null
+++ b/build/patches/Remove-dependency-on-com.google.android.gms.fido-com.google.android.gms.iid-com.google.android.gms.instantapps-com.google.android.gms.location.patch
@@ -0,0 +1,554 @@
+From: Wengling Chen
+Date: Sat, 2 Nov 2019 07:58:48 +0100
+Subject: Remove dependency on com.google.android.gms.fido,
+ com.google.android.gms.iid, com.google.android.gms.instantapps,
+ com.google.android.gms.location
+
+---
+ chrome/android/BUILD.gn | 5 -
+ .../externalnav/ExternalNavigationHandler.java | 3 -
+ .../browser/instantapps/InstantAppsHandler.java | 59 +-----------
+ components/gcm_driver/instance_id/android/BUILD.gn | 2 -
+ .../instance_id/InstanceIDWithSubtype.java | 28 +-----
+ device/BUILD.gn | 1 -
+ services/device/geolocation/BUILD.gn | 1 -
+ .../geolocation/LocationProviderGmsCore.java | 103 +--------------------
+ third_party/android_deps/BUILD.gn | 58 ------------
+ third_party/cacheinvalidation/BUILD.gn | 1 -
+ .../client/android2/AndroidManifestUpdatedGcm.xml | 3 -
+ 11 files changed, 9 insertions(+), 255 deletions(-)
+
+diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
+--- a/chrome/android/BUILD.gn
++++ b/chrome/android/BUILD.gn
+@@ -271,8 +271,6 @@ android_library("chrome_java") {
+ "$google_play_services_package:google_play_services_basement_java",
+ "$google_play_services_package:google_play_services_cast_framework_java",
+ "$google_play_services_package:google_play_services_cast_java",
+- "$google_play_services_package:google_play_services_fido_java",
+- "$google_play_services_package:google_play_services_iid_java",
+ "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//base:jni_java",
+@@ -693,7 +691,6 @@ junit_binary("chrome_junit_tests") {
+ "$google_play_services_package:google_play_services_basement_java",
+ "$google_play_services_package:google_play_services_cast_framework_java",
+ "$google_play_services_package:google_play_services_cast_java",
+- "$google_play_services_package:google_play_services_fido_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//base:base_junit_test_support",
+@@ -795,8 +792,6 @@ android_library("chrome_test_java") {
+ "$google_play_services_package:google_play_services_basement_java",
+ "$google_play_services_package:google_play_services_cast_framework_java",
+ "$google_play_services_package:google_play_services_cast_java",
+- "$google_play_services_package:google_play_services_fido_java",
+- "$google_play_services_package:google_play_services_iid_java",
+ "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java
+@@ -581,7 +581,6 @@ public class ExternalNavigationHandler {
+ if (shouldProxyForInstantApps) {
+ RecordHistogram.recordEnumeratedHistogram("Android.InstantApps.DirectInstantAppsIntent",
+ AiaIntent.SERP, AiaIntent.NUM_ENTRIES);
+- intent.putExtra(InstantAppsHandler.IS_GOOGLE_SEARCH_REFERRER, true);
+ } else if (isDirectInstantAppsIntent) {
+ // For security reasons, we disable all intent:// URLs to Instant Apps that are
+ // not coming from SERP.
+@@ -590,8 +589,6 @@ public class ExternalNavigationHandler {
+ AiaIntent.OTHER, AiaIntent.NUM_ENTRIES);
+ return OverrideUrlLoadingResult.NO_OVERRIDE;
+ } else {
+- // Make sure this extra is not sent unless we've done the verification.
+- intent.removeExtra(InstantAppsHandler.IS_GOOGLE_SEARCH_REFERRER);
+ }
+
+ boolean deviceCanHandleIntent = deviceCanHandleIntent(intent);
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/instantapps/InstantAppsHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/instantapps/InstantAppsHandler.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/instantapps/InstantAppsHandler.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/instantapps/InstantAppsHandler.java
+@@ -42,36 +42,6 @@ public class InstantAppsHandler {
+ // TODO(mariakhomenko): Use system once we roll to O SDK.
+ private static final int FLAG_DO_NOT_LAUNCH = 0x00000200;
+
+- // TODO(mariakhomenko): Depend directly on the constants once we roll to v8 libraries.
+- private static final String DO_NOT_LAUNCH_EXTRA =
+- "com.google.android.gms.instantapps.DO_NOT_LAUNCH_INSTANT_APP";
+-
+- protected static final String IS_REFERRER_TRUSTED_EXTRA =
+- "com.google.android.gms.instantapps.IS_REFERRER_TRUSTED";
+-
+- protected static final String IS_USER_CONFIRMED_LAUNCH_EXTRA =
+- "com.google.android.gms.instantapps.IS_USER_CONFIRMED_LAUNCH";
+-
+- protected static final String TRUSTED_REFERRER_PKG_EXTRA =
+- "com.google.android.gms.instantapps.TRUSTED_REFERRER_PKG";
+-
+- public static final String IS_GOOGLE_SEARCH_REFERRER =
+- "com.google.android.gms.instantapps.IS_GOOGLE_SEARCH_REFERRER";
+-
+- private static final String BROWSER_LAUNCH_REASON =
+- "com.google.android.gms.instantapps.BROWSER_LAUNCH_REASON";
+-
+- private static final String SUPERVISOR_PKG = "com.google.android.instantapps.supervisor";
+-
+- private static final String[] SUPERVISOR_START_ACTIONS = {
+- "com.google.android.instantapps.START", "com.google.android.instantapps.nmr1.INSTALL",
+- "com.google.android.instantapps.nmr1.VIEW"};
+-
+- // Instant Apps system resolver activity on N-MR1+.
+- @VisibleForTesting
+- public static final String EPHEMERAL_INSTALLER_CLASS =
+- "com.google.android.gms.instantapps.routing.EphemeralInstallerActivity";
+-
+ /** Finch experiment name. */
+ private static final String INSTANT_APPS_EXPERIMENT_NAME = "InstantApps";
+
+@@ -123,14 +93,6 @@ public class InstantAppsHandler {
+ * @return Whether the given intent is going to open an Instant App.
+ */
+ public static boolean isIntentToInstantApp(Intent intent) {
+- if (SUPERVISOR_PKG.equals(intent.getPackage())) return true;
+-
+- String intentAction = intent.getAction();
+- for (String action : SUPERVISOR_START_ACTIONS) {
+- if (action.equals(intentAction)) {
+- return true;
+- }
+- }
+ return false;
+ }
+
+@@ -167,13 +129,7 @@ public class InstantAppsHandler {
+ sFallbackIntentTimes.record(SystemClock.elapsedRealtime() - startTime);
+ intent.removeExtra(INSTANT_APP_START_TIME_EXTRA);
+ }
+- int callSource = IntentUtils.safeGetIntExtra(intent, BROWSER_LAUNCH_REASON, 0);
+- if (callSource > 0 && callSource < SOURCE_BOUNDARY) {
+- sFallbackCallSource.record(callSource);
+- intent.removeExtra(BROWSER_LAUNCH_REASON);
+- } else if (callSource >= SOURCE_BOUNDARY) {
+- Log.e(TAG, "Unexpected call source constant for Instant Apps: " + callSource);
+- }
++ Log.e(TAG, "Unexpected call source constant for Instant Apps");
+ }
+
+ /**
+@@ -208,14 +164,6 @@ public class InstantAppsHandler {
+ return false;
+ }
+
+- if (IntentUtils.safeGetBooleanExtra(intent, DO_NOT_LAUNCH_EXTRA, false)
+- || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
+- && (intent.getFlags() & FLAG_DO_NOT_LAUNCH) != 0)) {
+- maybeRecordFallbackStats(intent);
+- Log.i(TAG, "Not handling with Instant Apps (DO_NOT_LAUNCH_EXTRA)");
+- return false;
+- }
+-
+ if (IntentUtils.safeGetBooleanExtra(
+ intent, IntentHandler.EXTRA_OPEN_NEW_INCOGNITO_TAB, false)
+ || IntentUtils.safeHasExtra(intent, ShortcutHelper.EXTRA_SOURCE)
+@@ -240,7 +188,6 @@ public class InstantAppsHandler {
+ }
+
+ Intent callbackIntent = new Intent(intent);
+- callbackIntent.putExtra(DO_NOT_LAUNCH_EXTRA, true);
+ callbackIntent.putExtra(INSTANT_APP_START_TIME_EXTRA, startTime);
+
+ return tryLaunchingInstantApp(context, intent, isCustomTabsIntent, callbackIntent);
+@@ -343,12 +290,9 @@ public class InstantAppsHandler {
+ Intent iaIntent = data.getIntent();
+ if (data.getReferrer() != null) {
+ iaIntent.putExtra(Intent.EXTRA_REFERRER, data.getReferrer());
+- iaIntent.putExtra(IS_REFERRER_TRUSTED_EXTRA, true);
+ }
+
+ Context appContext = ContextUtils.getApplicationContext();
+- iaIntent.putExtra(TRUSTED_REFERRER_PKG_EXTRA, appContext.getPackageName());
+- iaIntent.putExtra(IS_USER_CONFIRMED_LAUNCH_EXTRA, true);
+
+ try {
+ appContext.startActivity(iaIntent);
+@@ -394,7 +338,6 @@ public class InstantAppsHandler {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ return info.isInstantAppAvailable;
+ } else if (info.activityInfo != null) {
+- return EPHEMERAL_INSTALLER_CLASS.equals(info.activityInfo.name);
+ }
+
+ return false;
+diff --git a/components/gcm_driver/instance_id/android/BUILD.gn b/components/gcm_driver/instance_id/android/BUILD.gn
+--- a/components/gcm_driver/instance_id/android/BUILD.gn
++++ b/components/gcm_driver/instance_id/android/BUILD.gn
+@@ -18,7 +18,6 @@ generate_jni("test_support_jni_headers") {
+
+ android_library("instance_id_driver_java") {
+ deps = [
+- "$google_play_services_package:google_play_services_iid_java",
+ "//base:base_java",
+ "//components/gcm_driver/android:gcm_driver_java",
+ ]
+@@ -34,7 +33,6 @@ android_library("instance_id_driver_java") {
+ android_library("instance_id_driver_test_support_java") {
+ deps = [
+ ":instance_id_driver_java",
+- "$google_play_services_package:google_play_services_iid_java",
+ "//base:base_java",
+ ]
+
+diff --git a/components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDWithSubtype.java b/components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDWithSubtype.java
+--- a/components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDWithSubtype.java
++++ b/components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDWithSubtype.java
+@@ -8,8 +8,6 @@ import android.content.Context;
+ import android.os.Bundle;
+ import android.text.TextUtils;
+
+-import com.google.android.gms.iid.InstanceID;
+-
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.VisibleForTesting;
+
+@@ -25,8 +23,6 @@ public class InstanceIDWithSubtype {
+ // Must match the private InstanceID.OPTION_SUBTYPE, which is guaranteed to not change.
+ private static final String OPTION_SUBTYPE = "subtype";
+
+- private final InstanceID mInstanceID;
+-
+ /**
+ * Cached instances. May be accessed from multiple threads; synchronize on sSubtypeInstancesLock
+ */
+@@ -38,10 +34,6 @@ public class InstanceIDWithSubtype {
+ @VisibleForTesting
+ protected static FakeFactory sFakeFactoryForTesting;
+
+- protected InstanceIDWithSubtype(InstanceID instanceID) {
+- mInstanceID = instanceID;
+- }
+-
+ /**
+ * Returns an instance of this class. Unlike {@link InstanceID#getInstance(Context)}, it is not
+ * a singleton, but instead a different instance will be returned for each {@code subtype}.
+@@ -57,11 +49,6 @@ public class InstanceIDWithSubtype {
+ if (sFakeFactoryForTesting != null) {
+ existing = sFakeFactoryForTesting.create(subtype);
+ } else {
+- Bundle options = new Bundle();
+- options.putCharSequence(OPTION_SUBTYPE, subtype);
+- InstanceID instanceID =
+- InstanceID.getInstance(ContextUtils.getApplicationContext(), options);
+- existing = new InstanceIDWithSubtype(instanceID);
+ }
+ sSubtypeInstances.put(subtype, existing);
+ }
+@@ -70,35 +57,30 @@ public class InstanceIDWithSubtype {
+ }
+
+ public String getSubtype() {
+- return mInstanceID.getSubtype();
++ return "";
+ }
+
+ public String getId() {
+- return mInstanceID.getId();
++ return "";
+ }
+
+ public long getCreationTime() {
+- return mInstanceID.getCreationTime();
++ return 0;
+ }
+
+ public void deleteInstanceID() throws IOException {
+- synchronized (sSubtypeInstancesLock) {
+- sSubtypeInstances.remove(mInstanceID.getSubtype());
+- mInstanceID.deleteInstanceID();
+- }
+ }
+
+ public void deleteToken(String authorizedEntity, String scope) throws IOException {
+- mInstanceID.deleteToken(authorizedEntity, scope);
+ }
+
+ public String getToken(String authorizedEntity, String scope) throws IOException {
+- return mInstanceID.getToken(authorizedEntity, scope);
++ return "";
+ }
+
+ public String getToken(String authorizedEntity, String scope, Bundle extras)
+ throws IOException {
+- return mInstanceID.getToken(authorizedEntity, scope, extras);
++ return "";
+ }
+
+ /** Fake subclasses can set {@link #sFakeFactoryForTesting} to an implementation of this. */
+diff --git a/device/BUILD.gn b/device/BUILD.gn
+--- a/device/BUILD.gn
++++ b/device/BUILD.gn
+@@ -388,7 +388,6 @@ if (is_android) {
+ deps = [
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_location_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//base:base_junit_test_support",
+diff --git a/services/device/geolocation/BUILD.gn b/services/device/geolocation/BUILD.gn
+--- a/services/device/geolocation/BUILD.gn
++++ b/services/device/geolocation/BUILD.gn
+@@ -143,7 +143,6 @@ if (is_android) {
+ ":geolocation_jni_headers",
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_location_java",
+ "//base:base_java",
+ "//components/location/android:location_java",
+ "//services/device/public/java:geolocation_java",
+diff --git a/services/device/geolocation/android/java/src/org/chromium/device/geolocation/LocationProviderGmsCore.java b/services/device/geolocation/android/java/src/org/chromium/device/geolocation/LocationProviderGmsCore.java
+--- a/services/device/geolocation/android/java/src/org/chromium/device/geolocation/LocationProviderGmsCore.java
++++ b/services/device/geolocation/android/java/src/org/chromium/device/geolocation/LocationProviderGmsCore.java
+@@ -8,16 +8,6 @@ import android.content.Context;
+ import android.location.Location;
+ import android.os.Bundle;
+
+-import com.google.android.gms.common.ConnectionResult;
+-import com.google.android.gms.common.GoogleApiAvailability;
+-import com.google.android.gms.common.api.GoogleApiClient;
+-import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
+-import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
+-import com.google.android.gms.location.FusedLocationProviderApi;
+-import com.google.android.gms.location.LocationListener;
+-import com.google.android.gms.location.LocationRequest;
+-import com.google.android.gms.location.LocationServices;
+-
+ import org.chromium.base.Log;
+ import org.chromium.base.ThreadUtils;
+ import org.chromium.components.location.LocationUtils;
+@@ -27,126 +17,39 @@ import org.chromium.components.location.LocationUtils;
+ *
+ * https://developers.google.com/android/reference/com/google/android/gms/location/package-summary
+ */
+-public class LocationProviderGmsCore implements ConnectionCallbacks, OnConnectionFailedListener,
+- LocationListener, LocationProvider {
++public class LocationProviderGmsCore implements LocationProvider {
+ private static final String TAG = "cr_LocationProvider";
+
+ // Values for the LocationRequest's setInterval for normal and high accuracy, respectively.
+ private static final long UPDATE_INTERVAL_MS = 1000;
+ private static final long UPDATE_INTERVAL_FAST_MS = 500;
+
+- private final GoogleApiClient mGoogleApiClient;
+- private FusedLocationProviderApi mLocationProviderApi = LocationServices.FusedLocationApi;
+-
+ private boolean mEnablehighAccuracy;
+- private LocationRequest mLocationRequest;
+
+ public static boolean isGooglePlayServicesAvailable(Context context) {
+- return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context)
+- == ConnectionResult.SUCCESS;
++ return false;
+ }
+
+ LocationProviderGmsCore(Context context) {
+ Log.i(TAG, "Google Play Services");
+- mGoogleApiClient = new GoogleApiClient.Builder(context)
+- .addApi(LocationServices.API)
+- .addConnectionCallbacks(this)
+- .addOnConnectionFailedListener(this)
+- .build();
+- assert mGoogleApiClient != null;
+- }
+-
+- LocationProviderGmsCore(GoogleApiClient client, FusedLocationProviderApi locationApi) {
+- mGoogleApiClient = client;
+- mLocationProviderApi = locationApi;
+- }
+-
+- // ConnectionCallbacks implementation
+- @Override
+- public void onConnected(Bundle connectionHint) {
+- ThreadUtils.assertOnUiThread();
+-
+- mLocationRequest = LocationRequest.create();
+- if (mEnablehighAccuracy) {
+- // With enableHighAccuracy, request a faster update interval and configure the provider
+- // for high accuracy mode.
+- mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
+- .setInterval(UPDATE_INTERVAL_FAST_MS);
+- } else {
+- // Use balanced mode by default. In this mode, the API will prefer the network provider
+- // but may use sensor data (for instance, GPS) if high accuracy is requested by another
+- // app.
+- //
+- // If location is configured for sensors-only then elevate the priority to ensure GPS
+- // and other sensors are used.
+- if (LocationUtils.getInstance().isSystemLocationSettingSensorsOnly()) {
+- mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
+- } else {
+- mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
+- }
+- mLocationRequest.setInterval(UPDATE_INTERVAL_MS);
+- }
+-
+- final Location location = mLocationProviderApi.getLastLocation(mGoogleApiClient);
+- if (location != null) {
+- LocationProviderAdapter.onNewLocationAvailable(location);
+- }
+-
+- try {
+- // Request updates on UI Thread replicating LocationProviderAndroid's behaviour.
+- mLocationProviderApi.requestLocationUpdates(
+- mGoogleApiClient, mLocationRequest, this, ThreadUtils.getUiThreadLooper());
+- } catch (IllegalStateException | SecurityException e) {
+- // IllegalStateException is thrown "If this method is executed in a thread that has not
+- // called Looper.prepare()". SecurityException is thrown if there is no permission, see
+- // https://crbug.com/731271.
+- Log.e(TAG, " mLocationProviderApi.requestLocationUpdates() " + e);
+- LocationProviderAdapter.newErrorAvailable(
+- "Failed to request location updates: " + e.toString());
+- assert false;
+- }
+- }
+-
+- @Override
+- public void onConnectionSuspended(int cause) {}
+-
+- // OnConnectionFailedListener implementation
+- @Override
+- public void onConnectionFailed(ConnectionResult result) {
+- LocationProviderAdapter.newErrorAvailable(
+- "Failed to connect to Google Play Services: " + result.toString());
+ }
+
+ // LocationProvider implementation
+ @Override
+ public void start(boolean enableHighAccuracy) {
+ ThreadUtils.assertOnUiThread();
+- if (mGoogleApiClient.isConnected()) mGoogleApiClient.disconnect();
+
+ mEnablehighAccuracy = enableHighAccuracy;
+- mGoogleApiClient.connect(); // Should return via onConnected().
+ }
+
+ @Override
+ public void stop() {
+ ThreadUtils.assertOnUiThread();
+- if (!mGoogleApiClient.isConnected()) return;
+-
+- mLocationProviderApi.removeLocationUpdates(mGoogleApiClient, this);
+-
+- mGoogleApiClient.disconnect();
+ }
+
+ @Override
+ public boolean isRunning() {
+ assert ThreadUtils.runningOnUiThread();
+- if (mGoogleApiClient == null) return false;
+- return mGoogleApiClient.isConnecting() || mGoogleApiClient.isConnected();
+- }
+-
+- // LocationListener implementation
+- @Override
+- public void onLocationChanged(Location location) {
+- LocationProviderAdapter.onNewLocationAvailable(location);
++ return false;
+ }
+ }
+diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn
+--- a/third_party/android_deps/BUILD.gn
++++ b/third_party/android_deps/BUILD.gn
+@@ -830,64 +830,6 @@ android_aar_prebuilt("google_play_services_cast_framework_java") {
+ }
+
+ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_fido_java") {
+- aar_path = "libs/com_google_android_gms_play_services_fido/play-services-fido-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_fido/com_google_android_gms_play_services_fido.info"
+- deps = [
+- ":google_play_services_base_java",
+- ":google_play_services_basement_java",
+- ":google_play_services_tasks_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_iid_java") {
+- aar_path = "libs/com_google_android_gms_play_services_iid/play-services-iid-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_iid/com_google_android_gms_play_services_iid.info"
+- deps = [
+- ":google_play_services_base_java",
+- ":google_play_services_basement_java",
+- ":google_play_services_stats_java",
+- ":google_play_services_tasks_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_instantapps_java") {
+- aar_path = "libs/com_google_android_gms_play_services_instantapps/play-services-instantapps-16.0.0.aar"
+- info_path = "libs/com_google_android_gms_play_services_instantapps/com_google_android_gms_play_services_instantapps.info"
+- deps = [
+- ":google_play_services_base_java",
+- ":google_play_services_basement_java",
+- ":google_play_services_tasks_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_location_java") {
+- aar_path = "libs/com_google_android_gms_play_services_location/play-services-location-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_location/com_google_android_gms_play_services_location.info"
+- deps = [
+- ":google_play_services_base_java",
+- ":google_play_services_basement_java",
+- ":google_play_services_places_placereport_java",
+- ":google_play_services_tasks_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+ android_aar_prebuilt("google_play_services_tasks_java") {
+ aar_path = "libs/com_google_android_gms_play_services_tasks/play-services-tasks-15.0.1.aar"
+ info_path = "libs/com_google_android_gms_play_services_tasks/com_google_android_gms_play_services_tasks.info"
+diff --git a/third_party/cacheinvalidation/BUILD.gn b/third_party/cacheinvalidation/BUILD.gn
+--- a/third_party/cacheinvalidation/BUILD.gn
++++ b/third_party/cacheinvalidation/BUILD.gn
+@@ -137,7 +137,6 @@ if (is_android) {
+ jacoco_never_instrument = true
+ deps = [
+ ":cacheinvalidation_proto_java",
+- "$google_play_services_package:google_play_services_iid_java",
+ "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//third_party/android_protobuf:protobuf_nano_javalib",
+diff --git a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/android2/AndroidManifestUpdatedGcm.xml b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/android2/AndroidManifestUpdatedGcm.xml
+--- a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/android2/AndroidManifestUpdatedGcm.xml
++++ b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/android2/AndroidManifestUpdatedGcm.xml
+@@ -27,9 +27,6 @@
+
+
+-
+-
+-
+
+
+
+--
+2.11.0
+
diff --git a/build/patches/Remove-dependency-on-com.google.android.gms.flags-com.google.android.gms.location.places-com.google.android.gms.stats.patch b/build/patches/Remove-dependency-on-com.google.android.gms.flags-com.google.android.gms.location.places-com.google.android.gms.stats.patch
new file mode 100644
index 0000000000000000000000000000000000000000..1c641ea63f0a2e80b062fed5c94a428d01372609
--- /dev/null
+++ b/build/patches/Remove-dependency-on-com.google.android.gms.flags-com.google.android.gms.location.places-com.google.android.gms.stats.patch
@@ -0,0 +1,71 @@
+From: Wengling Chen
+Date: Sat, 2 Nov 2019 07:57:37 +0100
+Subject: Remove dependency on com.google.android.gms.flags,
+ com.google.android.gms.location.places, com.google.android.gms.stats
+
+---
+ third_party/android_deps/BUILD.gn | 49 ---------------------------------------
+ 1 file changed, 49 deletions(-)
+
+diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn
+--- a/third_party/android_deps/BUILD.gn
++++ b/third_party/android_deps/BUILD.gn
+@@ -1499,55 +1499,6 @@ android_aar_prebuilt("com_android_support_versionedparcelable_java") {
+ }
+
+ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_flags_java") {
+- aar_path = "libs/com_google_android_gms_play_services_flags/play-services-flags-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_flags/com_google_android_gms_play_services_flags.info"
+-
+- # To remove visibility constraint, add this dependency to
+- # //tools/android/roll/android_deps/build.gradle.
+- visibility = [ ":*" ]
+- deps = [
+- ":google_play_services_base_java",
+- ":google_play_services_basement_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_places_placereport_java") {
+- aar_path = "libs/com_google_android_gms_play_services_places_placereport/play-services-places-placereport-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_places_placereport/com_google_android_gms_play_services_places_placereport.info"
+-
+- # To remove visibility constraint, add this dependency to
+- # //tools/android/roll/android_deps/build.gradle.
+- visibility = [ ":*" ]
+- deps = [
+- ":google_play_services_basement_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_stats_java") {
+- aar_path = "libs/com_google_android_gms_play_services_stats/play-services-stats-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_stats/com_google_android_gms_play_services_stats.info"
+-
+- # To remove visibility constraint, add this dependency to
+- # //tools/android/roll/android_deps/build.gradle.
+- visibility = [ ":*" ]
+- deps = [
+- ":google_play_services_basement_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+ java_prebuilt("com_google_code_findbugs_jsr305_java") {
+ jar_path = "libs/com_google_code_findbugs_jsr305/jsr305-1.3.9.jar"
+ output_name = "com_google_code_findbugs_jsr305"
+--
+2.11.0
+
diff --git a/build/patches/Remove-dependency-on-com.google.android.gms.gcm.patch b/build/patches/Remove-dependency-on-com.google.android.gms.gcm.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d4ece443a961762acdbf4de46ed15b97072e096a
--- /dev/null
+++ b/build/patches/Remove-dependency-on-com.google.android.gms.gcm.patch
@@ -0,0 +1,749 @@
+From: Wengling Chen
+Date: Sat, 2 Nov 2019 07:56:44 +0100
+Subject: Remove dependency on com.google.android.gms.gcm
+
+It also disalbes Snippets, auto-update of offline pages and launching browser from background service.
+The snippets are already disabled in native codes, this will disable it on Java level.
+---
+ chrome/android/BUILD.gn | 3 -
+ .../chrome/browser/BackgroundSyncLauncher.java | 17 +----
+ .../chrome/browser/ChromeBackgroundService.java | 79 +------------------
+ .../invalidation/InvalidationController.java | 1 +
+ .../browser/ntp/snippets/SnippetsLauncher.java | 2 +-
+ .../services/gcm/ChromeGcmListenerService.java | 58 +-------------
+ components/background_task_scheduler/BUILD.gn | 3 -
+ .../BackgroundTaskGcmTaskService.java | 63 +--------------
+ .../BackgroundTaskSchedulerFactory.java | 6 +-
+ .../BackgroundTaskSchedulerGcmNetworkManager.java | 14 +---
+ third_party/android_deps/BUILD.gn | 15 ----
+ third_party/cacheinvalidation/BUILD.gn | 1 -
+ .../client/android2/AndroidManifestUpdatedGcm.xml | 20 -----
+ .../android2/channel/AndroidGcmController.java | 42 +---------
+ .../channel/AndroidInstanceIDListenerService.java | 13 +---
+ .../channel/GcmRegistrationTaskService.java | 89 +---------------------
+ 16 files changed, 14 insertions(+), 412 deletions(-)
+
+diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
+--- a/chrome/android/BUILD.gn
++++ b/chrome/android/BUILD.gn
+@@ -272,7 +272,6 @@ android_library("chrome_java") {
+ "$google_play_services_package:google_play_services_cast_framework_java",
+ "$google_play_services_package:google_play_services_cast_java",
+ "$google_play_services_package:google_play_services_fido_java",
+- "$google_play_services_package:google_play_services_gcm_java",
+ "$google_play_services_package:google_play_services_iid_java",
+ "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+@@ -798,7 +797,6 @@ android_library("chrome_test_java") {
+ "$google_play_services_package:google_play_services_cast_framework_java",
+ "$google_play_services_package:google_play_services_cast_java",
+ "$google_play_services_package:google_play_services_fido_java",
+- "$google_play_services_package:google_play_services_gcm_java",
+ "$google_play_services_package:google_play_services_iid_java",
+ "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+@@ -1543,7 +1541,6 @@ android_library("browser_java_test_support") {
+ ]
+ deps = [
+ ":chrome_java",
+- "$google_play_services_package:google_play_services_gcm_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//chrome/android/public/profiles:java",
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/BackgroundSyncLauncher.java b/chrome/android/java/src/org/chromium/chrome/browser/BackgroundSyncLauncher.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/BackgroundSyncLauncher.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/BackgroundSyncLauncher.java
+@@ -41,7 +41,7 @@ public class BackgroundSyncLauncher {
+ * Automatic GCM use is disabled by tests, and also by this class if it is determined on
+ * creation that the installed Play Services library is out of date.
+ */
+- private static boolean sGCMEnabled = true;
++ private static boolean sGCMEnabled;
+
+ @VisibleForTesting
+ protected AsyncTask mLaunchBrowserIfStoppedTask;
+@@ -140,20 +140,7 @@ public class BackgroundSyncLauncher {
+ */
+ @CalledByNative
+ private static boolean shouldDisableBackgroundSync() {
+- // Check to see if Play Services is up to date, and disable GCM if not.
+- // This will not automatically set {@link sGCMEnabled} to true, in case it has been
+- // disabled in tests.
+- if (sGCMEnabled) {
+- boolean isAvailable = true;
+- if (!ExternalAuthUtils.canUseGooglePlayServices()) {
+- setGCMEnabled(false);
+- Log.i(TAG, "Disabling Background Sync because Play Services is not up to date.");
+- isAvailable = false;
+- }
+- RecordHistogram.recordBooleanHistogram(
+- "BackgroundSync.LaunchTask.PlayServicesAvailable", isAvailable);
+- }
+- return !sGCMEnabled;
++ return true;
+ }
+
+ @VisibleForTesting
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackgroundService.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackgroundService.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackgroundService.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackgroundService.java
+@@ -6,10 +6,6 @@ package org.chromium.chrome.browser;
+
+ import android.content.Context;
+
+-import com.google.android.gms.gcm.GcmNetworkManager;
+-import com.google.android.gms.gcm.GcmTaskService;
+-import com.google.android.gms.gcm.TaskParams;
+-
+ import org.chromium.base.Log;
+ import org.chromium.base.VisibleForTesting;
+ import org.chromium.base.library_loader.ProcessInitException;
+@@ -27,67 +23,9 @@ import org.chromium.content_public.browser.UiThreadTaskTraits;
+ * browser needs to be launched for scheduled tasks, or in response to changing network or power
+ * conditions.
+ */
+-public class ChromeBackgroundService extends GcmTaskService {
++public class ChromeBackgroundService {
+ private static final String TAG = "BackgroundService";
+
+- @Override
+- @VisibleForTesting
+- public int onRunTask(final TaskParams params) {
+- final String taskTag = params.getTag();
+- final Context context = this;
+- PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> {
+- switch (taskTag) {
+- case BackgroundSyncLauncher.TASK_TAG:
+- handleBackgroundSyncEvent(context, taskTag);
+- break;
+-
+- case OfflinePageUtils.TASK_TAG:
+- // Offline pages are migrating to BackgroundTaskScheduler, therefore getting
+- // a task through ChromeBackgroundSerivce should cause a rescheduling using
+- // the new component.
+- rescheduleOfflinePages();
+- break;
+-
+- case SnippetsLauncher.TASK_TAG_WIFI:
+- case SnippetsLauncher.TASK_TAG_FALLBACK:
+- handleSnippetsOnPersistentSchedulerWakeUp(context, taskTag);
+- break;
+-
+- // This is only for tests.
+- case ServiceManagerStartupUtils.TASK_TAG:
+- handleServicificationStartupTask(context, taskTag);
+- break;
+-
+- default:
+- Log.i(TAG, "Unknown task tag " + taskTag);
+- break;
+- }
+- });
+-
+- return GcmNetworkManager.RESULT_SUCCESS;
+- }
+-
+- private void handleBackgroundSyncEvent(Context context, String tag) {
+- if (!BackgroundSyncLauncher.hasInstance()) {
+- // Start the browser. The browser's BackgroundSyncManager (for the active profile) will
+- // start, check the network, and run any necessary sync events. This task runs with a
+- // wake lock, but has a three minute timeout, so we need to start the browser in its
+- // own task.
+- // TODO(jkarlin): Protect the browser sync event with a wake lock.
+- // See crbug.com/486020.
+- launchBrowser(context, tag);
+- }
+- }
+-
+- private void handleSnippetsOnPersistentSchedulerWakeUp(Context context, String tag) {
+- if (!SnippetsLauncher.hasInstance()) launchBrowser(context, tag);
+- snippetsOnPersistentSchedulerWakeUp();
+- }
+-
+- private void handleServicificationStartupTask(Context context, String tag) {
+- launchBrowser(context, tag);
+- }
+-
+ @VisibleForTesting
+ protected void snippetsOnPersistentSchedulerWakeUp() {
+ SnippetsBridge.onPersistentSchedulerWakeUp();
+@@ -115,23 +53,8 @@ public class ChromeBackgroundService extends GcmTaskService {
+ protected void rescheduleBackgroundSyncTasksOnUpgrade() {
+ }
+
+- private void handleSnippetsOnBrowserUpgraded() {
+- if (SnippetsLauncher.shouldNotifyOnBrowserUpgraded()) {
+- if (!SnippetsLauncher.hasInstance()) {
+- launchBrowser(this, /*tag=*/""); // The |tag| doesn't matter here.
+- }
+- snippetsOnBrowserUpgraded();
+- }
+- }
+-
+ /** Reschedules offline pages (using appropriate version of Background Task Scheduler). */
+ protected void rescheduleOfflinePages() {
+ BackgroundScheduler.getInstance().reschedule();
+ }
+-
+- @Override
+- public void onInitializeTasks() {
+- rescheduleBackgroundSyncTasksOnUpgrade();
+- handleSnippetsOnBrowserUpgraded();
+- }
+ }
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/invalidation/InvalidationController.java b/chrome/android/java/src/org/chromium/chrome/browser/invalidation/InvalidationController.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/invalidation/InvalidationController.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/invalidation/InvalidationController.java
+@@ -167,6 +167,7 @@ public class InvalidationController implements ApplicationStatus.ApplicationStat
+
+ // Ensure GCM has been initialized.
+ ensureGcmIsInitialized();
++ if (!mGcmInitialized) return;
+
+ // Do not apply changes to {@link #mSessionInvalidationsEnabled} yet because the timer task
+ // may be scheduled far into the future.
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetsLauncher.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetsLauncher.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetsLauncher.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetsLauncher.java
+@@ -35,7 +35,7 @@ public class SnippetsLauncher {
+ // If it is non-null then the browser is running.
+ private static SnippetsLauncher sInstance;
+
+- private boolean mGCMEnabled = true;
++ private boolean mGCMEnabled;
+
+ /**
+ * Create a SnippetsLauncher object, which is owned by C++.
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java
+@@ -11,7 +11,6 @@ import android.os.Bundle;
+ import android.os.SystemClock;
+ import android.text.TextUtils;
+
+-import com.google.android.gms.gcm.GcmListenerService;
+ import com.google.ipc.invalidation.ticl.android2.channel.AndroidGcmController;
+
+ import org.chromium.base.ContextUtils;
+@@ -35,62 +34,9 @@ import org.chromium.content_public.browser.UiThreadTaskTraits;
+ /**
+ * Receives Downstream messages and status of upstream messages from GCM.
+ */
+-public class ChromeGcmListenerService extends GcmListenerService {
++public class ChromeGcmListenerService {
+ private static final String TAG = "ChromeGcmListener";
+
+- @Override
+- public void onCreate() {
+- ProcessInitializationHandler.getInstance().initializePreNative();
+- super.onCreate();
+- }
+-
+- @Override
+- public void onMessageReceived(final String from, final Bundle data) {
+- boolean hasCollapseKey = !TextUtils.isEmpty(data.getString("collapse_key"));
+- GcmUma.recordDataMessageReceived(ContextUtils.getApplicationContext(), hasCollapseKey);
+-
+- String invalidationSenderId = AndroidGcmController.get(this).getSenderId();
+- if (from.equals(invalidationSenderId)) {
+- AndroidGcmController.get(this).onMessageReceived(data);
+- return;
+- }
+-
+- // Dispatch the message to the GCM Driver for native features.
+- PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> {
+- GCMMessage message = null;
+- try {
+- message = new GCMMessage(from, data);
+- } catch (IllegalArgumentException e) {
+- Log.e(TAG, "Received an invalid GCM Message", e);
+- return;
+- }
+-
+- scheduleOrDispatchMessageToDriver(message);
+- });
+- }
+-
+- @Override
+- public void onMessageSent(String msgId) {
+- Log.d(TAG, "Message sent successfully. Message id: " + msgId);
+- GcmUma.recordGcmUpstreamHistogram(
+- ContextUtils.getApplicationContext(), GcmUma.UMA_UPSTREAM_SUCCESS);
+- }
+-
+- @Override
+- public void onSendError(String msgId, String error) {
+- Log.w(TAG, "Error in sending message. Message id: " + msgId + " Error: " + error);
+- GcmUma.recordGcmUpstreamHistogram(
+- ContextUtils.getApplicationContext(), GcmUma.UMA_UPSTREAM_SEND_FAILED);
+- }
+-
+- @Override
+- public void onDeletedMessages() {
+- // TODO(johnme): Ask GCM to include the subtype in this event.
+- Log.w(TAG, "Push messages were deleted, but we can't tell the Service Worker as we don't"
+- + "know what subtype (app ID) it occurred for.");
+- GcmUma.recordDeletedMessages(ContextUtils.getApplicationContext());
+- }
+-
+ /**
+ * Returns if we deliver the GCMMessage with a background service by calling
+ * Context#startService. This will only work if Android has put us in a whitelist to allow
+@@ -225,8 +171,6 @@ public class ChromeGcmListenerService extends GcmListenerService {
+
+ try {
+ ChromeBrowserInitializer.getInstance(applicationContext).handleSynchronousStartup();
+- GCMDriver.dispatchMessage(message);
+-
+ } catch (ProcessInitException e) {
+ Log.e(TAG, "ProcessInitException while starting the browser process");
+
+diff --git a/components/background_task_scheduler/BUILD.gn b/components/background_task_scheduler/BUILD.gn
+--- a/components/background_task_scheduler/BUILD.gn
++++ b/components/background_task_scheduler/BUILD.gn
+@@ -54,7 +54,6 @@ if (is_android) {
+ ":scheduled_task_java",
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_gcm_java",
+ "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//content/public/android:content_java",
+@@ -78,7 +77,6 @@ if (is_android) {
+ ":background_task_scheduler_task_ids_java",
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_gcm_java",
+ "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+@@ -109,7 +107,6 @@ if (is_android) {
+ "$google_play_services_package:google_play_services_auth_base_java",
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_gcm_java",
+ "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+diff --git a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskGcmTaskService.java b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskGcmTaskService.java
+--- a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskGcmTaskService.java
++++ b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskGcmTaskService.java
+@@ -6,10 +6,6 @@ package org.chromium.components.background_task_scheduler;
+
+ import android.os.Build;
+
+-import com.google.android.gms.gcm.GcmNetworkManager;
+-import com.google.android.gms.gcm.GcmTaskService;
+-import com.google.android.gms.gcm.TaskParams;
+-
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.Log;
+ import org.chromium.base.ThreadUtils;
+@@ -20,7 +16,7 @@ import java.util.concurrent.TimeUnit;
+ import java.util.concurrent.atomic.AtomicBoolean;
+
+ /** Delegates calls out to various tasks that need to run in the background. */
+-public class BackgroundTaskGcmTaskService extends GcmTaskService {
++public class BackgroundTaskGcmTaskService {
+ private static final String TAG = "BkgrdTaskGcmTS";
+
+ private BackgroundTaskSchedulerGcmNetworkManager.Clock mClock = System::currentTimeMillis;
+@@ -90,63 +86,6 @@ public class BackgroundTaskGcmTaskService extends GcmTaskService {
+ }
+
+ @Override
+- public int onRunTask(TaskParams params) {
+- final TaskParameters taskParams =
+- BackgroundTaskSchedulerGcmNetworkManager.getTaskParametersFromTaskParams(params);
+-
+- final BackgroundTask backgroundTask =
+- BackgroundTaskSchedulerFactory.getBackgroundTaskFromTaskId(taskParams.getTaskId());
+- if (backgroundTask == null) {
+- Log.w(TAG, "Failed to start task. Could not instantiate BackgroundTask class.");
+- // Cancel task if the BackgroundTask class is not found anymore. We assume this means
+- // that the task has been deprecated.
+- BackgroundTaskSchedulerFactory.getScheduler().cancel(
+- ContextUtils.getApplicationContext(), taskParams.getTaskId());
+- return GcmNetworkManager.RESULT_FAILURE;
+- }
+-
+- if (BackgroundTaskSchedulerGcmNetworkManager.didTaskExpire(
+- params, mClock.currentTimeMillis())) {
+- BackgroundTaskSchedulerUma.getInstance().reportTaskExpired(taskParams.getTaskId());
+- return GcmNetworkManager.RESULT_FAILURE;
+- }
+-
+- final Waiter waiter = new Waiter(Waiter.MAX_TIMEOUT_SECONDS);
+-
+- final AtomicBoolean taskNeedsBackgroundProcessing = new AtomicBoolean();
+- ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+- @Override
+- public void run() {
+- BackgroundTaskSchedulerUma.getInstance().reportTaskStarted(taskParams.getTaskId());
+- taskNeedsBackgroundProcessing.set(
+- backgroundTask.onStartTask(ContextUtils.getApplicationContext(), taskParams,
+- new TaskFinishedCallbackGcmTaskService(waiter)));
+- }
+- });
+-
+- if (!taskNeedsBackgroundProcessing.get()) return GcmNetworkManager.RESULT_SUCCESS;
+-
+- waiter.startWaiting();
+-
+- if (waiter.isRescheduleNeeded()) return GcmNetworkManager.RESULT_RESCHEDULE;
+- if (!waiter.hasTaskTimedOut()) return GcmNetworkManager.RESULT_SUCCESS;
+-
+- final AtomicBoolean taskNeedsRescheduling = new AtomicBoolean();
+- ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+- @Override
+- public void run() {
+- BackgroundTaskSchedulerUma.getInstance().reportTaskStopped(taskParams.getTaskId());
+- taskNeedsRescheduling.set(backgroundTask.onStopTask(
+- ContextUtils.getApplicationContext(), taskParams));
+- }
+- });
+-
+- if (taskNeedsRescheduling.get()) return GcmNetworkManager.RESULT_RESCHEDULE;
+-
+- return GcmNetworkManager.RESULT_SUCCESS;
+- }
+-
+- @Override
+ public void onInitializeTasks() {
+ // Ignore the event on OSs supporting JobScheduler.
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) return;
+diff --git a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerFactory.java b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerFactory.java
+--- a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerFactory.java
++++ b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerFactory.java
+@@ -17,11 +17,7 @@ public final class BackgroundTaskSchedulerFactory {
+ private static BackgroundTaskFactory sBackgroundTaskFactory;
+
+ static BackgroundTaskSchedulerDelegate getSchedulerDelegateForSdk(int sdkInt) {
+- if (sdkInt >= Build.VERSION_CODES.M) {
+- return new BackgroundTaskSchedulerJobService();
+- } else {
+- return new BackgroundTaskSchedulerGcmNetworkManager();
+- }
++ return new BackgroundTaskSchedulerJobService(); /* minSDK is 24 */
+ }
+
+ /**
+diff --git a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerGcmNetworkManager.java b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerGcmNetworkManager.java
+--- a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerGcmNetworkManager.java
++++ b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerGcmNetworkManager.java
+@@ -18,7 +18,7 @@ import java.util.concurrent.TimeUnit;
+ * An implementation of {@link BackgroundTaskSchedulerDelegate} that uses the Play Services
+ * {@link GcmNetworkManager} to schedule jobs.
+ */
+-class BackgroundTaskSchedulerGcmNetworkManager implements BackgroundTaskSchedulerDelegate {
++class BackgroundTaskSchedulerGcmNetworkManager {
+ private static final String TAG = "BkgrdTaskSchedGcmNM";
+
+ /** Delta time for expiration checks, after the end time. */
+@@ -34,18 +34,6 @@ class BackgroundTaskSchedulerGcmNetworkManager implements BackgroundTaskSchedule
+ sClock = clock;
+ }
+
+- @Override
+- public boolean schedule(Context context, @NonNull TaskInfo taskInfo) {
+- ThreadUtils.assertOnUiThread();
+-
+- return false;
+- }
+-
+- @Override
+- public void cancel(Context context, int taskId) {
+- ThreadUtils.assertOnUiThread();
+- }
+-
+ private static String taskIdToTaskTag(int taskId) {
+ return Integer.toString(taskId);
+ }
+diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn
+--- a/third_party/android_deps/BUILD.gn
++++ b/third_party/android_deps/BUILD.gn
+@@ -844,21 +844,6 @@ android_aar_prebuilt("google_play_services_fido_java") {
+ }
+
+ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_gcm_java") {
+- aar_path = "libs/com_google_android_gms_play_services_gcm/play-services-gcm-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_gcm/com_google_android_gms_play_services_gcm.info"
+- deps = [
+- ":google_play_services_base_java",
+- ":google_play_services_basement_java",
+- ":google_play_services_iid_java",
+- ":google_play_services_stats_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+ android_aar_prebuilt("google_play_services_iid_java") {
+ aar_path = "libs/com_google_android_gms_play_services_iid/play-services-iid-15.0.1.aar"
+ info_path = "libs/com_google_android_gms_play_services_iid/com_google_android_gms_play_services_iid.info"
+diff --git a/third_party/cacheinvalidation/BUILD.gn b/third_party/cacheinvalidation/BUILD.gn
+--- a/third_party/cacheinvalidation/BUILD.gn
++++ b/third_party/cacheinvalidation/BUILD.gn
+@@ -137,7 +137,6 @@ if (is_android) {
+ jacoco_never_instrument = true
+ deps = [
+ ":cacheinvalidation_proto_java",
+- "$google_play_services_package:google_play_services_gcm_java",
+ "$google_play_services_package:google_play_services_iid_java",
+ "$google_play_services_package:google_play_services_tasks_java",
+ "//base:base_java",
+diff --git a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/android2/AndroidManifestUpdatedGcm.xml b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/android2/AndroidManifestUpdatedGcm.xml
+--- a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/android2/AndroidManifestUpdatedGcm.xml
++++ b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/android2/AndroidManifestUpdatedGcm.xml
+@@ -24,17 +24,6 @@
+
+
+-
+-
+-
+-
+-
+-
+-
+-
+-
+
+
+@@ -42,14 +31,5 @@
+
+
+
+-
+-
+-
+-
+-
+-
+-
+
+
+diff --git a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidGcmController.java b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidGcmController.java
+--- a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidGcmController.java
++++ b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidGcmController.java
+@@ -15,8 +15,6 @@
+ */
+ package com.google.ipc.invalidation.ticl.android2.channel;
+
+-import com.google.android.gms.gcm.GcmNetworkManager;
+-import com.google.android.gms.gcm.OneoffTask;
+ import com.google.ipc.invalidation.common.GcmSharedConstants;
+ import com.google.ipc.invalidation.external.client.SystemResources.Logger;
+ import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
+@@ -50,7 +48,7 @@ public class AndroidGcmController {
+
+ private static AndroidGcmController androidGcmController;
+
+- private GcmNetworkManager gcmNetworkManager;
++// private GcmNetworkManager gcmNetworkManager;
+
+ private Context context;
+
+@@ -64,33 +62,13 @@ public class AndroidGcmController {
+ public static AndroidGcmController get(Context context) {
+ synchronized (lock) {
+ if (androidGcmController == null) {
+- androidGcmController =
+- new AndroidGcmController(context, GcmNetworkManager.getInstance(context));
++ androidGcmController = null;
+ }
+ }
+ return androidGcmController;
+ }
+
+ /**
+- * Override AndroidGcmController with a custom GcmNetworkManager in tests. This overrides the
+- * existing instance of AndroidGcmController if any.
+- *
+- * @param context the application context.
+- * @param gcmNetworkManager the custom GcmNetworkManager to use.
+- */
+- public static void overrideAndroidGcmControllerForTests(
+- Context context, GcmNetworkManager gcmNetworkManager) {
+- synchronized (lock) {
+- androidGcmController = new AndroidGcmController(context, gcmNetworkManager);
+- }
+- }
+-
+- private AndroidGcmController(Context context, GcmNetworkManager gcmNetworkManager) {
+- this.context = context;
+- this.gcmNetworkManager = gcmNetworkManager;
+- }
+-
+- /**
+ * Returns true if no registration token is stored or the current application version is higher
+ * than the version for the token stored.
+ */
+@@ -142,21 +120,7 @@ public class AndroidGcmController {
+ return;
+ }
+
+- OneoffTask registrationTask =
+- new OneoffTask.Builder()
+- .setExecutionWindow(0, 1)
+- .setTag(AndroidChannelConstants.GCM_REGISTRATION_TASK_SERVICE_TAG)
+- .setService(GcmRegistrationTaskService.class)
+- .build();
+-
+- try {
+- gcmNetworkManager.schedule(registrationTask);
+- } catch (IllegalArgumentException exception) {
+- // Scheduling the service can throw an exception due to a framework error on Android when
+- // the the look up for the GCMTaskService being scheduled to be run fails.
+- // See crbug/548314.
+- logger.warning("Failed to schedule GCM registration task. Exception: %s", exception);
+- }
++ logger.warning("Failed to schedule GCM registration task.");
+ }
+
+ /**
+diff --git a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidInstanceIDListenerService.java b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidInstanceIDListenerService.java
+--- a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidInstanceIDListenerService.java
++++ b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidInstanceIDListenerService.java
+@@ -15,7 +15,6 @@
+ */
+ package com.google.ipc.invalidation.ticl.android2.channel;
+
+-import com.google.android.gms.iid.InstanceIDListenerService;
+ import com.google.ipc.invalidation.external.client.SystemResources.Logger;
+ import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
+
+@@ -23,16 +22,6 @@ import com.google.ipc.invalidation.external.client.android.service.AndroidLogger
+ * Implementation of {@link InstanceIDListenerService} to receive notifications from GCM to
+ * update the registration token.
+ */
+-public class AndroidInstanceIDListenerService extends InstanceIDListenerService {
++public class AndroidInstanceIDListenerService {
+ private static final Logger logger = AndroidLogger.forTag("InstanceIDListener");
+-
+- /**
+- * Called when the token needs to updated. {@link AndroidGcmController#fetchToken} clears the
+- * current token and schedules a task to fetch a new token.
+- */
+- @Override
+- public void onTokenRefresh() {
+- logger.info("Received token refresh request");
+- AndroidGcmController.get(this).fetchToken();
+- }
+ }
+diff --git a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/GcmRegistrationTaskService.java b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/GcmRegistrationTaskService.java
+--- a/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/GcmRegistrationTaskService.java
++++ b/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/GcmRegistrationTaskService.java
+@@ -15,11 +15,6 @@
+ */
+ package com.google.ipc.invalidation.ticl.android2.channel;
+
+-import com.google.android.gms.gcm.GcmNetworkManager;
+-import com.google.android.gms.gcm.GcmTaskService;
+-import com.google.android.gms.gcm.GoogleCloudMessaging;
+-import com.google.android.gms.gcm.TaskParams;
+-import com.google.android.gms.iid.InstanceID;
+ import com.google.ipc.invalidation.common.GcmSharedConstants;
+ import com.google.ipc.invalidation.external.client.SystemResources.Logger;
+ import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
+@@ -42,88 +37,6 @@ import java.io.IOException;
+ * failure to fetch the token, the task is rescheduled using the GcmNetworkManager which uses
+ * exponential back-offs to control when the task is executed.
+ */
+-public class GcmRegistrationTaskService extends GcmTaskService {
++public class GcmRegistrationTaskService {
+ private static final Logger logger = AndroidLogger.forTag("RegistrationTaskService");
+-
+- public InstanceID getInstanceID(Context context) {
+- return InstanceID.getInstance(context);
+- }
+-
+- /**
+- * Called when the task is ready to be executed. Registers with GCM using
+- * {@link InstanceID#getToken} and stores the registration token.
+- *
+- *
Returns {@link GcmNetworkManager#RESULT_SUCCESS} when the token is successfully retrieved.
+- * On failure {@link GcmNetworkManager#RESULT_RESCHEDULE} is used which reschedules the service
+- * to be executed again using exponential back-off.
+- */
+- @Override
+- public int onRunTask(TaskParams params) {
+- if (!AndroidChannelConstants.GCM_REGISTRATION_TASK_SERVICE_TAG.equals(params.getTag())) {
+- logger.warning("Unknown task received with tag: %s", params.getTag());
+- return GcmNetworkManager.RESULT_FAILURE;
+- }
+-
+- String senderId = GcmSharedConstants.GCM_UPDATED_SENDER_ID;
+- try {
+- String token = getInstanceID(this).getToken(
+- senderId, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
+- storeToken(token);
+- return GcmNetworkManager.RESULT_SUCCESS;
+- } catch (IOException exception) {
+- logger.warning("Failed to get token for sender: %s. Exception : %s", senderId, exception);
+- return GcmNetworkManager.RESULT_RESCHEDULE;
+- } catch (SecurityException exception) {
+- // InstanceID#getToken occasionally throws a security exception when trying send the
+- // registration intent to GMSCore. Catching the exception here to prevent crashes.
+- logger.warning("Security exception when fetching token: %s", exception);
+- return GcmNetworkManager.RESULT_RESCHEDULE;
+- }
+- }
+-
+- /** Stores the registration token and the current application version in Shared Preferences. */
+- private void storeToken(String token) {
+- AndroidChannelPreferences.setRegistrationToken(token);
+- AndroidChannelPreferences.setAppVersion(
+- CommonUtils.getPackageVersion(this, getPackageName()));
+- // Send the updated token to the server.
+- updateServer();
+- }
+-
+- /** Sends a message to the server to update the GCM registration token. */
+- private void updateServer() {
+- // Inform the sender service that the registration token has changed. If the sender service
+- // had buffered a message because no registration token was previously available, this intent
+- // will cause it to send that message.
+- Intent sendBuffered = new Intent();
+- final String ignoredData = "";
+- sendBuffered.putExtra(AndroidChannelConstants.MESSAGE_SENDER_SVC_GCM_REGID_CHANGE, ignoredData);
+-
+- // Select the sender service to use for upstream message.
+- if (AndroidChannelPreferences.getGcmChannelType() == GcmChannelType.GCM_UPSTREAM) {
+- String upstreamServiceClass = new AndroidTiclManifest(this).getGcmUpstreamServiceClass();
+- if (upstreamServiceClass == null) {
+- logger.warning("GcmUpstreamSenderService class not found.");
+- return;
+- }
+- sendBuffered.setClassName(this, upstreamServiceClass);
+- } else {
+- sendBuffered.setClass(this, AndroidMessageSenderService.class);
+- }
+- try {
+- startService(sendBuffered);
+- } catch (IllegalStateException exception) {
+- logger.warning("Unable to send buffered message(s): %s", exception);
+- }
+-
+- // Inform the Ticl service that the registration id has changed. This will cause it to send
+- // a message to the data center and update the GCM registration id stored at the data center.
+- Intent updateServer = ProtocolIntents.InternalDowncalls.newNetworkAddrChangeIntent();
+- updateServer.setClassName(this, new AndroidTiclManifest(this).getTiclServiceClass());
+- try {
+- startService(updateServer);
+- } catch (IllegalStateException exception) {
+- logger.warning("Unable to inform server about new registration id: %s", exception);
+- }
+- }
+ }
+--
+2.11.0
+
diff --git a/build/patches/Remove-dependency-on-com.google.android.gms.vision-com.google.android.gms.clearcut-com.google.android.gms.phenotype.patch b/build/patches/Remove-dependency-on-com.google.android.gms.vision-com.google.android.gms.clearcut-com.google.android.gms.phenotype.patch
new file mode 100644
index 0000000000000000000000000000000000000000..73e3da195fcb1ac86f2ce33337f05a90e1ca77aa
--- /dev/null
+++ b/build/patches/Remove-dependency-on-com.google.android.gms.vision-com.google.android.gms.clearcut-com.google.android.gms.phenotype.patch
@@ -0,0 +1,575 @@
+From: Wengling Chen
+Date: Fri, 1 Nov 2019 23:10:47 +0100
+Subject: Remove dependency on com.google.android.gms.vision,
+ com.google.android.gms.clearcut, com.google.android.gms.phenotype
+
+---
+ services/BUILD.gn | 4 -
+ services/shape_detection/BUILD.gn | 2 -
+ .../shape_detection/BarcodeDetectionImpl.java | 114 +------------------
+ .../BarcodeDetectionProviderImpl.java | 18 +--
+ .../shape_detection/FaceDetectionImplGmsCore.java | 122 +--------------------
+ .../shape_detection/TextDetectionImpl.java | 60 +---------
+ third_party/android_deps/BUILD.gn | 66 -----------
+ 7 files changed, 10 insertions(+), 376 deletions(-)
+
+diff --git a/services/BUILD.gn b/services/BUILD.gn
+--- a/services/BUILD.gn
++++ b/services/BUILD.gn
+@@ -109,8 +109,6 @@ if (is_android) {
+ deps = [
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_vision_common_java",
+- "$google_play_services_package:google_play_services_vision_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//base:base_junit_test_support",
+@@ -140,8 +138,6 @@ if (is_android) {
+ deps = [
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_vision_common_java",
+- "$google_play_services_package:google_play_services_vision_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//mojo/public/java:base_java",
+diff --git a/services/shape_detection/BUILD.gn b/services/shape_detection/BUILD.gn
+--- a/services/shape_detection/BUILD.gn
++++ b/services/shape_detection/BUILD.gn
+@@ -91,8 +91,6 @@ if (is_android) {
+ deps = [
+ "$google_play_services_package:google_play_services_base_java",
+ "$google_play_services_package:google_play_services_basement_java",
+- "$google_play_services_package:google_play_services_vision_common_java",
+- "$google_play_services_package:google_play_services_vision_java",
+ "//base:base_java",
+ "//mojo/public/java:base_java",
+ "//mojo/public/java:bindings_java",
+diff --git a/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionImpl.java b/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionImpl.java
+--- a/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionImpl.java
++++ b/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionImpl.java
+@@ -8,10 +8,6 @@ import android.graphics.Point;
+ import android.graphics.Rect;
+ import android.util.SparseArray;
+
+-import com.google.android.gms.vision.Frame;
+-import com.google.android.gms.vision.barcode.Barcode;
+-import com.google.android.gms.vision.barcode.BarcodeDetector;
+-
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.Log;
+ import org.chromium.gfx.mojom.PointF;
+@@ -28,50 +24,7 @@ import org.chromium.shape_detection.mojom.BarcodeFormat;
+ public class BarcodeDetectionImpl implements BarcodeDetection {
+ private static final String TAG = "BarcodeDetectionImpl";
+
+- private BarcodeDetector mBarcodeDetector;
+-
+ public BarcodeDetectionImpl(BarcodeDetectorOptions options) {
+- int formats = Barcode.ALL_FORMATS;
+- if (options.formats != null && options.formats.length > 0) {
+- formats = 0;
+- // Keep this list in sync with the constants defined in
+- // com.google.android.gms.vision.barcode.Barcode and the list of
+- // supported formats in BarcodeDetectionProviderImpl.
+- for (int i = 0; i < options.formats.length; ++i) {
+- if (options.formats[i] == BarcodeFormat.AZTEC) {
+- formats |= Barcode.AZTEC;
+- } else if (options.formats[i] == BarcodeFormat.CODE_128) {
+- formats |= Barcode.CODE_128;
+- } else if (options.formats[i] == BarcodeFormat.CODE_39) {
+- formats |= Barcode.CODE_39;
+- } else if (options.formats[i] == BarcodeFormat.CODE_93) {
+- formats |= Barcode.CODE_93;
+- } else if (options.formats[i] == BarcodeFormat.CODABAR) {
+- formats |= Barcode.CODABAR;
+- } else if (options.formats[i] == BarcodeFormat.DATA_MATRIX) {
+- formats |= Barcode.DATA_MATRIX;
+- } else if (options.formats[i] == BarcodeFormat.EAN_13) {
+- formats |= Barcode.EAN_13;
+- } else if (options.formats[i] == BarcodeFormat.EAN_8) {
+- formats |= Barcode.EAN_8;
+- } else if (options.formats[i] == BarcodeFormat.ITF) {
+- formats |= Barcode.ITF;
+- } else if (options.formats[i] == BarcodeFormat.PDF417) {
+- formats |= Barcode.PDF417;
+- } else if (options.formats[i] == BarcodeFormat.QR_CODE) {
+- formats |= Barcode.QR_CODE;
+- } else if (options.formats[i] == BarcodeFormat.UPC_A) {
+- formats |= Barcode.UPC_A;
+- } else if (options.formats[i] == BarcodeFormat.UPC_E) {
+- formats |= Barcode.UPC_E;
+- } else {
+- Log.e(TAG, "Unsupported barcode format hint: " + options.formats[i]);
+- }
+- }
+- }
+- mBarcodeDetector = new BarcodeDetector.Builder(ContextUtils.getApplicationContext())
+- .setBarcodeFormats(formats)
+- .build();
+ }
+
+ @Override
+@@ -80,47 +33,12 @@ public class BarcodeDetectionImpl implements BarcodeDetection {
+ // on the device; this happens "fast", but it might have not completed,
+ // bail in this case. Also, the API was disabled between and v.9.0 and
+ // v.9.2, see https://developers.google.com/android/guides/releases.
+- if (!mBarcodeDetector.isOperational()) {
+- Log.e(TAG, "BarcodeDetector is not operational");
+- callback.call(new BarcodeDetectionResult[0]);
+- return;
+- }
+-
+- Frame frame = BitmapUtils.convertToFrame(bitmapData);
+- if (frame == null) {
+- Log.e(TAG, "Error converting Mojom Bitmap to Frame");
+- callback.call(new BarcodeDetectionResult[0]);
+- return;
+- }
+-
+- final SparseArray barcodes = mBarcodeDetector.detect(frame);
+-
+- BarcodeDetectionResult[] barcodeArray = new BarcodeDetectionResult[barcodes.size()];
+- for (int i = 0; i < barcodes.size(); i++) {
+- barcodeArray[i] = new BarcodeDetectionResult();
+- final Barcode barcode = barcodes.valueAt(i);
+- barcodeArray[i].rawValue = barcode.rawValue;
+- final Rect rect = barcode.getBoundingBox();
+- barcodeArray[i].boundingBox = new RectF();
+- barcodeArray[i].boundingBox.x = rect.left;
+- barcodeArray[i].boundingBox.y = rect.top;
+- barcodeArray[i].boundingBox.width = rect.width();
+- barcodeArray[i].boundingBox.height = rect.height();
+- final Point[] corners = barcode.cornerPoints;
+- barcodeArray[i].cornerPoints = new PointF[corners.length];
+- for (int j = 0; j < corners.length; j++) {
+- barcodeArray[i].cornerPoints[j] = new PointF();
+- barcodeArray[i].cornerPoints[j].x = corners[j].x;
+- barcodeArray[i].cornerPoints[j].y = corners[j].y;
+- }
+- barcodeArray[i].format = toBarcodeFormat(barcode.format);
+- }
+- callback.call(barcodeArray);
++ Log.e(TAG, "BarcodeDetector is not operational");
++ callback.call(new BarcodeDetectionResult[0]);
+ }
+
+ @Override
+ public void close() {
+- mBarcodeDetector.release();
+ }
+
+ @Override
+@@ -129,34 +47,6 @@ public class BarcodeDetectionImpl implements BarcodeDetection {
+ }
+
+ private int toBarcodeFormat(int format) {
+- switch (format) {
+- case Barcode.CODE_128:
+- return BarcodeFormat.CODE_128;
+- case Barcode.CODE_39:
+- return BarcodeFormat.CODE_39;
+- case Barcode.CODE_93:
+- return BarcodeFormat.CODE_93;
+- case Barcode.CODABAR:
+- return BarcodeFormat.CODABAR;
+- case Barcode.DATA_MATRIX:
+- return BarcodeFormat.DATA_MATRIX;
+- case Barcode.EAN_13:
+- return BarcodeFormat.EAN_13;
+- case Barcode.EAN_8:
+- return BarcodeFormat.EAN_8;
+- case Barcode.ITF:
+- return BarcodeFormat.ITF;
+- case Barcode.QR_CODE:
+- return BarcodeFormat.QR_CODE;
+- case Barcode.UPC_A:
+- return BarcodeFormat.UPC_A;
+- case Barcode.UPC_E:
+- return BarcodeFormat.UPC_E;
+- case Barcode.PDF417:
+- return BarcodeFormat.PDF417;
+- case Barcode.AZTEC:
+- return BarcodeFormat.AZTEC;
+- }
+ return BarcodeFormat.UNKNOWN;
+ }
+ }
+diff --git a/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionProviderImpl.java b/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionProviderImpl.java
+--- a/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionProviderImpl.java
++++ b/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionProviderImpl.java
+@@ -4,9 +4,6 @@
+
+ package org.chromium.shape_detection;
+
+-import com.google.android.gms.common.ConnectionResult;
+-import com.google.android.gms.common.GoogleApiAvailability;
+-
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.Log;
+ import org.chromium.mojo.bindings.InterfaceRequest;
+@@ -35,12 +32,6 @@ public class BarcodeDetectionProviderImpl implements BarcodeDetectionProvider {
+ // Keep this list in sync with the constants defined in
+ // com.google.android.gms.vision.barcode.Barcode and the format hints
+ // supported by BarcodeDetectionImpl.
+- int[] supportedFormats = {BarcodeFormat.AZTEC, BarcodeFormat.CODE_128,
+- BarcodeFormat.CODE_39, BarcodeFormat.CODE_93, BarcodeFormat.CODABAR,
+- BarcodeFormat.DATA_MATRIX, BarcodeFormat.EAN_13, BarcodeFormat.EAN_8,
+- BarcodeFormat.ITF, BarcodeFormat.PDF417, BarcodeFormat.QR_CODE, BarcodeFormat.UPC_A,
+- BarcodeFormat.UPC_E};
+- callback.call(supportedFormats);
+ }
+
+ @Override
+@@ -50,12 +41,7 @@ public class BarcodeDetectionProviderImpl implements BarcodeDetectionProvider {
+ public void onConnectionError(MojoException e) {}
+
+ public static BarcodeDetectionProvider create() {
+- if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(
+- ContextUtils.getApplicationContext())
+- != ConnectionResult.SUCCESS) {
+- Log.e(TAG, "Google Play Services not available");
+- return null;
+- }
+- return new BarcodeDetectionProviderImpl();
++ Log.e(TAG, "Google Play Services not available");
++ return null;
+ }
+ }
+diff --git a/services/shape_detection/android/java/src/org/chromium/shape_detection/FaceDetectionImplGmsCore.java b/services/shape_detection/android/java/src/org/chromium/shape_detection/FaceDetectionImplGmsCore.java
+--- a/services/shape_detection/android/java/src/org/chromium/shape_detection/FaceDetectionImplGmsCore.java
++++ b/services/shape_detection/android/java/src/org/chromium/shape_detection/FaceDetectionImplGmsCore.java
+@@ -7,11 +7,6 @@ package org.chromium.shape_detection;
+ import android.graphics.PointF;
+ import android.util.SparseArray;
+
+-import com.google.android.gms.vision.Frame;
+-import com.google.android.gms.vision.face.Face;
+-import com.google.android.gms.vision.face.FaceDetector;
+-import com.google.android.gms.vision.face.Landmark;
+-
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.Log;
+ import org.chromium.gfx.mojom.RectF;
+@@ -36,133 +31,20 @@ public class FaceDetectionImplGmsCore implements FaceDetection {
+ private static final int MAX_EULER_Z = 15;
+ private final int mMaxFaces;
+ private final boolean mFastMode;
+- private final FaceDetector mFaceDetector;
+
+ FaceDetectionImplGmsCore(FaceDetectorOptions options) {
+- FaceDetector.Builder builder =
+- new FaceDetector.Builder(ContextUtils.getApplicationContext());
+ mMaxFaces = Math.min(options.maxDetectedFaces, MAX_FACES);
+ mFastMode = options.fastMode;
+-
+- try {
+- builder.setMode(mFastMode ? FaceDetector.FAST_MODE : FaceDetector.ACCURATE_MODE);
+- builder.setLandmarkType(FaceDetector.ALL_LANDMARKS);
+- if (mMaxFaces == 1) {
+- builder.setProminentFaceOnly(true);
+- }
+- } catch (IllegalArgumentException e) {
+- Log.e(TAG, "Unexpected exception " + e);
+- assert false;
+- }
+-
+- mFaceDetector = builder.build();
+ }
+
+ @Override
+ public void detect(org.chromium.skia.mojom.Bitmap bitmapData, DetectResponse callback) {
+- // The vision library will be downloaded the first time the API is used
+- // on the device; this happens "fast", but it might have not completed,
+- // bail in this case.
+- if (!mFaceDetector.isOperational()) {
+- Log.e(TAG, "FaceDetector is not operational");
+-
+- // Fallback to Android's FaceDetectionImpl.
+- FaceDetectorOptions options = new FaceDetectorOptions();
+- options.fastMode = mFastMode;
+- options.maxDetectedFaces = mMaxFaces;
+- FaceDetectionImpl detector = new FaceDetectionImpl(options);
+- detector.detect(bitmapData, callback);
+- return;
+- }
+-
+- Frame frame = BitmapUtils.convertToFrame(bitmapData);
+- if (frame == null) {
+- Log.e(TAG, "Error converting Mojom Bitmap to Frame");
+- callback.call(new FaceDetectionResult[0]);
+- return;
+- }
+-
+- final SparseArray faces = mFaceDetector.detect(frame);
+-
+- FaceDetectionResult[] faceArray = new FaceDetectionResult[faces.size()];
+- for (int i = 0; i < faces.size(); i++) {
+- faceArray[i] = new FaceDetectionResult();
+- final Face face = faces.valueAt(i);
+-
+- final List landmarks = face.getLandmarks();
+- ArrayList mojoLandmarks =
+- new ArrayList(landmarks.size());
+-
+- int leftEyeIndex = -1;
+- int rightEyeIndex = -1;
+- int bottomMouthIndex = -1;
+- for (int j = 0; j < landmarks.size(); j++) {
+- final Landmark landmark = landmarks.get(j);
+- final int landmarkType = landmark.getType();
+- if (landmarkType != Landmark.LEFT_EYE && landmarkType != Landmark.RIGHT_EYE
+- && landmarkType != Landmark.BOTTOM_MOUTH
+- && landmarkType != Landmark.NOSE_BASE) {
+- continue;
+- }
+-
+- org.chromium.shape_detection.mojom.Landmark mojoLandmark =
+- new org.chromium.shape_detection.mojom.Landmark();
+- mojoLandmark.locations = new org.chromium.gfx.mojom.PointF[1];
+- mojoLandmark.locations[0] = new org.chromium.gfx.mojom.PointF();
+- mojoLandmark.locations[0].x = landmark.getPosition().x;
+- mojoLandmark.locations[0].y = landmark.getPosition().y;
+-
+- if (landmarkType == Landmark.LEFT_EYE) {
+- mojoLandmark.type = LandmarkType.EYE;
+- leftEyeIndex = j;
+- } else if (landmarkType == Landmark.RIGHT_EYE) {
+- mojoLandmark.type = LandmarkType.EYE;
+- rightEyeIndex = j;
+- } else if (landmarkType == Landmark.BOTTOM_MOUTH) {
+- mojoLandmark.type = LandmarkType.MOUTH;
+- bottomMouthIndex = j;
+- } else {
+- assert landmarkType == Landmark.NOSE_BASE;
+- mojoLandmark.type = LandmarkType.NOSE;
+- }
+- mojoLandmarks.add(mojoLandmark);
+- }
+- faceArray[i].landmarks = mojoLandmarks.toArray(
+- new org.chromium.shape_detection.mojom.Landmark[mojoLandmarks.size()]);
+-
+- final PointF corner = face.getPosition();
+- faceArray[i].boundingBox = new RectF();
+- if (leftEyeIndex != -1 && rightEyeIndex != -1
+- && Math.abs(face.getEulerZ()) < MAX_EULER_Z) {
+- // Tighter calculation of the bounding box because the GMScore
+- // and Android Face APIs give different results.
+- final PointF leftEyePoint = landmarks.get(leftEyeIndex).getPosition();
+- final PointF rightEyePoint = landmarks.get(rightEyeIndex).getPosition();
+- final float eyesDistance = leftEyePoint.x - rightEyePoint.x;
+- final float eyeMouthDistance = bottomMouthIndex != -1
+- ? landmarks.get(bottomMouthIndex).getPosition().y - leftEyePoint.y
+- : -1;
+- final PointF midEyePoint =
+- new PointF(corner.x + face.getWidth() / 2, leftEyePoint.y);
+- faceArray[i].boundingBox.x = 2 * rightEyePoint.x - midEyePoint.x;
+- faceArray[i].boundingBox.y = midEyePoint.y - eyesDistance;
+- faceArray[i].boundingBox.width = 2 * eyesDistance;
+- faceArray[i].boundingBox.height = eyeMouthDistance > eyesDistance
+- ? eyeMouthDistance + eyesDistance
+- : 2 * eyesDistance;
+- } else {
+- faceArray[i].boundingBox.x = corner.x;
+- faceArray[i].boundingBox.y = corner.y;
+- faceArray[i].boundingBox.width = face.getWidth();
+- faceArray[i].boundingBox.height = face.getHeight();
+- }
+- }
+- callback.call(faceArray);
++ Log.e(TAG, "FaceDetector is not operational");
++ callback.call(new FaceDetectionResult[0]);
+ }
+
+ @Override
+ public void close() {
+- mFaceDetector.release();
+ }
+
+ @Override
+diff --git a/services/shape_detection/android/java/src/org/chromium/shape_detection/TextDetectionImpl.java b/services/shape_detection/android/java/src/org/chromium/shape_detection/TextDetectionImpl.java
+--- a/services/shape_detection/android/java/src/org/chromium/shape_detection/TextDetectionImpl.java
++++ b/services/shape_detection/android/java/src/org/chromium/shape_detection/TextDetectionImpl.java
+@@ -8,12 +8,6 @@ import android.graphics.Point;
+ import android.graphics.Rect;
+ import android.util.SparseArray;
+
+-import com.google.android.gms.common.ConnectionResult;
+-import com.google.android.gms.common.GoogleApiAvailability;
+-import com.google.android.gms.vision.Frame;
+-import com.google.android.gms.vision.text.TextBlock;
+-import com.google.android.gms.vision.text.TextRecognizer;
+-
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.Log;
+ import org.chromium.gfx.mojom.PointF;
+@@ -29,58 +23,17 @@ import org.chromium.shape_detection.mojom.TextDetectionResult;
+ public class TextDetectionImpl implements TextDetection {
+ private static final String TAG = "TextDetectionImpl";
+
+- private TextRecognizer mTextRecognizer;
+-
+ public TextDetectionImpl() {
+- mTextRecognizer = new TextRecognizer.Builder(ContextUtils.getApplicationContext()).build();
+ }
+
+ @Override
+ public void detect(org.chromium.skia.mojom.Bitmap bitmapData, DetectResponse callback) {
+- // The vision library will be downloaded the first time the API is used
+- // on the device; this happens "fast", but it might have not completed,
+- // bail in this case. Also, the API was disabled between and v.9.0 and
+- // v.9.2, see https://developers.google.com/android/guides/releases.
+- if (!mTextRecognizer.isOperational()) {
+- Log.e(TAG, "TextDetector is not operational");
+- callback.call(new TextDetectionResult[0]);
+- return;
+- }
+-
+- Frame frame = BitmapUtils.convertToFrame(bitmapData);
+- if (frame == null) {
+- Log.e(TAG, "Error converting Mojom Bitmap to Frame");
+- callback.call(new TextDetectionResult[0]);
+- return;
+- }
+-
+- final SparseArray textBlocks = mTextRecognizer.detect(frame);
+-
+- TextDetectionResult[] detectedTextArray = new TextDetectionResult[textBlocks.size()];
+- for (int i = 0; i < textBlocks.size(); i++) {
+- detectedTextArray[i] = new TextDetectionResult();
+- final TextBlock textBlock = textBlocks.valueAt(i);
+- detectedTextArray[i].rawValue = textBlock.getValue();
+- final Rect rect = textBlock.getBoundingBox();
+- detectedTextArray[i].boundingBox = new RectF();
+- detectedTextArray[i].boundingBox.x = rect.left;
+- detectedTextArray[i].boundingBox.y = rect.top;
+- detectedTextArray[i].boundingBox.width = rect.width();
+- detectedTextArray[i].boundingBox.height = rect.height();
+- final Point[] corners = textBlock.getCornerPoints();
+- detectedTextArray[i].cornerPoints = new PointF[corners.length];
+- for (int j = 0; j < corners.length; j++) {
+- detectedTextArray[i].cornerPoints[j] = new PointF();
+- detectedTextArray[i].cornerPoints[j].x = corners[j].x;
+- detectedTextArray[i].cornerPoints[j].y = corners[j].y;
+- }
+- }
+- callback.call(detectedTextArray);
++ Log.e(TAG, "TextDetector is not operational");
++ callback.call(new TextDetectionResult[0]);
+ }
+
+ @Override
+ public void close() {
+- mTextRecognizer.release();
+ }
+
+ @Override
+@@ -89,12 +42,7 @@ public class TextDetectionImpl implements TextDetection {
+ }
+
+ public static TextDetection create() {
+- if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(
+- ContextUtils.getApplicationContext())
+- != ConnectionResult.SUCCESS) {
+- Log.e(TAG, "Google Play Services not available");
+- return null;
+- }
+- return new TextDetectionImpl();
++ Log.e(TAG, "Google Play Services not available");
++ return null;
+ }
+ }
+diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn
+--- a/third_party/android_deps/BUILD.gn
++++ b/third_party/android_deps/BUILD.gn
+@@ -900,35 +900,6 @@ android_aar_prebuilt("google_play_services_tasks_java") {
+ }
+
+ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_vision_java") {
+- aar_path = "libs/com_google_android_gms_play_services_vision/play-services-vision-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_vision/com_google_android_gms_play_services_vision.info"
+- deps = [
+- ":google_play_services_base_java",
+- ":google_play_services_basement_java",
+- ":google_play_services_vision_common_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_vision_common_java") {
+- aar_path = "libs/com_google_android_gms_play_services_vision_common/play-services-vision-common-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_vision_common/com_google_android_gms_play_services_vision_common.info"
+- deps = [
+- ":google_play_services_base_java",
+- ":google_play_services_basement_java",
+- ":google_play_services_clearcut_java",
+- ":google_play_services_flags_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+ android_aar_prebuilt("com_google_android_material_material_java") {
+ aar_path = "libs/com_google_android_material_material/material-1.0.0-rc02.aar"
+ info_path = "libs/com_google_android_material_material/com_google_android_material_material.info"
+@@ -1528,25 +1499,6 @@ android_aar_prebuilt("com_android_support_versionedparcelable_java") {
+ }
+
+ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_clearcut_java") {
+- aar_path = "libs/com_google_android_gms_play_services_clearcut/play-services-clearcut-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_clearcut/com_google_android_gms_play_services_clearcut.info"
+-
+- # To remove visibility constraint, add this dependency to
+- # //tools/android/roll/android_deps/build.gradle.
+- visibility = [ ":*" ]
+- deps = [
+- ":google_play_services_base_java",
+- ":google_play_services_basement_java",
+- ":google_play_services_phenotype_java",
+- ":google_play_services_tasks_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+ android_aar_prebuilt("google_play_services_flags_java") {
+ aar_path = "libs/com_google_android_gms_play_services_flags/play-services-flags-15.0.1.aar"
+ info_path = "libs/com_google_android_gms_play_services_flags/com_google_android_gms_play_services_flags.info"
+@@ -1564,24 +1516,6 @@ android_aar_prebuilt("google_play_services_flags_java") {
+ }
+
+ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+-android_aar_prebuilt("google_play_services_phenotype_java") {
+- aar_path = "libs/com_google_android_gms_play_services_phenotype/play-services-phenotype-15.0.1.aar"
+- info_path = "libs/com_google_android_gms_play_services_phenotype/com_google_android_gms_play_services_phenotype.info"
+-
+- # To remove visibility constraint, add this dependency to
+- # //tools/android/roll/android_deps/build.gradle.
+- visibility = [ ":*" ]
+- deps = [
+- ":google_play_services_base_java",
+- ":google_play_services_basement_java",
+- ":google_play_services_tasks_java",
+- ]
+-
+- # Removing drawables from GMS .aars as they are unused bloat.
+- strip_drawables = true
+-}
+-
+-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+ android_aar_prebuilt("google_play_services_places_placereport_java") {
+ aar_path = "libs/com_google_android_gms_play_services_places_placereport/play-services-places-placereport-15.0.1.aar"
+ info_path = "libs/com_google_android_gms_play_services_places_placereport/com_google_android_gms_play_services_places_placereport.info"
+--
+2.11.0
+
diff --git a/build/patches/Remove-dependency-on-com.google.android.play.patch b/build/patches/Remove-dependency-on-com.google.android.play.patch
new file mode 100644
index 0000000000000000000000000000000000000000..4c9730f1a3133865eeed9381b2c2b5fd763564c6
--- /dev/null
+++ b/build/patches/Remove-dependency-on-com.google.android.play.patch
@@ -0,0 +1,496 @@
+From: Wengling Chen
+Date: Fri, 1 Nov 2019 23:01:41 +0100
+Subject: Remove dependency on com.google.android.play
+
+---
+ chrome/android/BUILD.gn | 1 -
+ .../omaha/inline/FakeAppUpdateManagerWrapper.java | 60 +-----
+ .../inline/InlineUpdateControllerFactory.java | 16 --
+ .../omaha/inline/PlayInlineUpdateController.java | 226 +--------------------
+ components/module_installer/android/BUILD.gn | 1 -
+ third_party/google_android_play_core/BUILD.gn | 5 -
+ 6 files changed, 3 insertions(+), 306 deletions(-)
+
+diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
+--- a/chrome/android/BUILD.gn
++++ b/chrome/android/BUILD.gn
+@@ -387,7 +387,6 @@ android_library("chrome_java") {
+ "//third_party/cct_dynamic_module:cct_dynamic_module_java",
+ "//third_party/feed:feed_lib_proto_java",
+ "//third_party/gif_player:gif_player_java",
+- "//third_party/google_android_play_core:com_google_android_play_core_java",
+ "//third_party/jsr-305:jsr_305_javalib",
+ "//ui/android:ui_java",
+ "//ui/base/mojom:mojom_java",
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/inline/FakeAppUpdateManagerWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/inline/FakeAppUpdateManagerWrapper.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/inline/FakeAppUpdateManagerWrapper.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/inline/FakeAppUpdateManagerWrapper.java
+@@ -10,11 +10,6 @@ import android.os.Looper;
+ import android.os.Message;
+ import android.support.annotation.IntDef;
+
+-import com.google.android.play.core.appupdate.AppUpdateInfo;
+-import com.google.android.play.core.appupdate.testing.FakeAppUpdateManager;
+-import com.google.android.play.core.install.model.AppUpdateType;
+-import com.google.android.play.core.tasks.Task;
+-
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.task.PostTask;
+ import org.chromium.chrome.browser.ChromeActivity;
+@@ -30,7 +25,7 @@ import java.lang.ref.WeakReference;
+ * wrapper isn't meant to be used for a full integration test, but simulating all of the possible
+ * error cases is a bit easier to do here.
+ */
+-public class FakeAppUpdateManagerWrapper extends FakeAppUpdateManager {
++public class FakeAppUpdateManagerWrapper {
+ private static final int RESULT_IN_APP_UPDATE_FAILED = 1;
+ private static final int STEP_DELAY_MS = 5000;
+ private static final int TOAST_DURATION_MS = 2000;
+@@ -107,15 +102,12 @@ public class FakeAppUpdateManagerWrapper extends FakeAppUpdateManager {
+ switch (event) {
+ case Event.UPDATE_AVAILABLE:
+ w.toast("Making app update available.");
+- w.setUpdateAvailable(10000 /* Figure out a better version? */);
+ return;
+ case Event.USER_ACCEPTS_UPDATE:
+ w.toast("User accepts update.");
+- w.userAcceptsUpdate();
+ return;
+ case Event.USER_REJECTS_UPDATE:
+ w.toast("User rejects update.");
+- w.userRejectsUpdate();
+ return;
+ case Event.TRIGGER_DOWNLOAD:
+ w.toast("Triggering download.");
+@@ -123,27 +115,21 @@ public class FakeAppUpdateManagerWrapper extends FakeAppUpdateManager {
+ return;
+ case Event.DOWNLOAD_STARTS:
+ w.toast("Download has started.");
+- w.downloadStarts();
+ return;
+ case Event.DOWNLOAD_FAILS:
+ w.toast("Triggering download failure.");
+- w.downloadFails();
+ return;
+ case Event.USER_CANCELS_DOWNLOAD:
+ w.toast("Triggering cancellation of download.");
+- w.userCancelsDownload();
+ return;
+ case Event.DOWNLOAD_COMPLETES:
+ w.toast("Download completes.");
+- w.downloadCompletes();
+ return;
+ case Event.INSTALL_FAILS:
+ w.toast("Triggering install failure.");
+- w.installFails();
+ return;
+ case Event.INSTALL_COMPLETES:
+ w.toast("Triggering install completion.");
+- w.installCompletes();
+ return;
+ default:
+ w.toast("Unknown event.");
+@@ -158,56 +144,12 @@ public class FakeAppUpdateManagerWrapper extends FakeAppUpdateManager {
+ * @param endState at which point should the inline update flow end.
+ */
+ FakeAppUpdateManagerWrapper(@Type int endState) {
+- super(ContextUtils.getApplicationContext());
+ mType = endState;
+ mEventHandler = new EventHandler(this);
+
+ if (mType != Type.NONE) execute(Event.UPDATE_AVAILABLE);
+ }
+
+- // FakeAppUpdateManager implementation.
+- @Override
+- public boolean startUpdateFlowForResult(AppUpdateInfo appUpdateInfo,
+- @AppUpdateType int appUpdateType, Activity activity, int requestCode) {
+- toast("Starting update flow.");
+- // TODO(dtrainor): Simulate exceptions being thrown or returning false from the super call.
+- boolean success =
+- super.startUpdateFlowForResult(appUpdateInfo, appUpdateType, activity, requestCode);
+- if (!success) return false;
+-
+- assert activity instanceof ChromeActivity : "Unexpected triggering activity.";
+-
+- final int resultCode;
+- if (mType == Type.FAIL_DIALOG_CANCEL) {
+- resultCode = Activity.RESULT_CANCELED;
+- } else if (mType == Type.FAIL_DIALOG_UPDATE_FAILED) {
+- resultCode = RESULT_IN_APP_UPDATE_FAILED;
+- } else {
+- resultCode = Activity.RESULT_OK;
+- }
+-
+- PostTask.postDelayedTask(UiThreadTaskTraits.DEFAULT, () -> {
+- triggerDialogResponse((ChromeActivity) activity, requestCode, resultCode);
+- }, STEP_DELAY_MS);
+-
+- return true;
+- }
+-
+- @Override
+- public Task completeUpdate() {
+- toast("Completing update.");
+- Task result = super.completeUpdate();
+-
+- if (mType == Type.FAIL_INSTALL) {
+- postDelayedEvent(Event.INSTALL_FAILS);
+- } else {
+- postDelayedEvent(Event.INSTALL_COMPLETES);
+- // This doesn't actually restart Chrome in this case.
+- }
+-
+- return result;
+- }
+-
+ private void triggerDialogResponse(ChromeActivity activity, int requestCode, int resultCode) {
+ if (resultCode == Activity.RESULT_OK) {
+ execute(Event.USER_ACCEPTS_UPDATE);
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/inline/InlineUpdateControllerFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/inline/InlineUpdateControllerFactory.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/inline/InlineUpdateControllerFactory.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/inline/InlineUpdateControllerFactory.java
+@@ -4,8 +4,6 @@
+
+ package org.chromium.chrome.browser.omaha.inline;
+
+-import com.google.android.play.core.appupdate.AppUpdateManagerFactory;
+-
+ import org.chromium.base.ContextUtils;
+ import org.chromium.chrome.browser.ChromeFeatureList;
+ import org.chromium.chrome.browser.omaha.UpdateConfigs;
+@@ -20,20 +18,6 @@ public class InlineUpdateControllerFactory {
+ public static InlineUpdateController create(Runnable callback) {
+ @FakeAppUpdateManagerWrapper.Type
+ int mockInlineEndState = UpdateConfigs.getMockInlineScenarioEndState();
+- if (mockInlineEndState != FakeAppUpdateManagerWrapper.Type.NO_SIMULATION) {
+- // The config requires to run through a test controller, using the
+- // PlayInlineUpdateController, but with a fake Google Play backend that automatically
+- // goes through a scenario flow.
+- return new PlayInlineUpdateController(
+- callback, new FakeAppUpdateManagerWrapper(mockInlineEndState));
+- }
+-
+- if (ChromeFeatureList.isEnabled(ChromeFeatureList.INLINE_UPDATE_FLOW)) {
+- // The application configuration requires to use the real Google Play backend for inline
+- // updates.
+- return new PlayInlineUpdateController(
+- callback, AppUpdateManagerFactory.create(ContextUtils.getApplicationContext()));
+- }
+
+ // No test scenario was in place, and the inline flow has not been enabled, so use a
+ // controller with no functionality.
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/inline/PlayInlineUpdateController.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/inline/PlayInlineUpdateController.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/inline/PlayInlineUpdateController.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/inline/PlayInlineUpdateController.java
+@@ -9,15 +9,6 @@ import android.content.IntentSender.SendIntentException;
+ import android.support.annotation.IntDef;
+ import android.support.annotation.Nullable;
+
+-import com.google.android.play.core.appupdate.AppUpdateInfo;
+-import com.google.android.play.core.appupdate.AppUpdateManager;
+-import com.google.android.play.core.install.InstallState;
+-import com.google.android.play.core.install.InstallStateUpdatedListener;
+-import com.google.android.play.core.install.model.AppUpdateType;
+-import com.google.android.play.core.install.model.InstallErrorCode;
+-import com.google.android.play.core.install.model.InstallStatus;
+-import com.google.android.play.core.install.model.UpdateAvailability;
+-
+ import org.chromium.base.Log;
+ import org.chromium.base.metrics.RecordHistogram;
+ import org.chromium.chrome.browser.omaha.UpdateStatusProvider.UpdateState;
+@@ -31,7 +22,7 @@ import java.lang.annotation.RetentionPolicy;
+ * in the foreground.
+ */
+ public class PlayInlineUpdateController
+- implements InlineUpdateController, InstallStateUpdatedListener {
++ implements InlineUpdateController {
+ /**
+ * Converts Play's InstallErrorCode enum to a stable monotomically incrementing Chrome enum.
+ * This is used for metric stability.
+@@ -126,26 +117,9 @@ public class PlayInlineUpdateController
+ private static final int RESULT_IN_APP_UPDATE_FAILED = 1;
+ private static final int REQUEST_CODE = 8123;
+
+- private final Runnable mCallback;
+- private final AppUpdateManager mAppUpdateManager;
+-
+ private boolean mEnabled;
+ private @Nullable @UpdateState Integer mUpdateState;
+
+- private AppUpdateInfo mAppUpdateInfo;
+- private @Nullable @UpdateAvailability Integer mUpdateAvailability;
+- private @Nullable @InstallStatus Integer mInstallStatus;
+-
+- /**
+- * Builds an instance of {@link PlayInlineUpdateController}.
+- * @param callback The {@link Runnable} to notify when an inline update state change occurs.
+- */
+- PlayInlineUpdateController(Runnable callback, AppUpdateManager appUpdateManager) {
+- mCallback = callback;
+- mAppUpdateManager = appUpdateManager;
+- setEnabled(true);
+- }
+-
+ // InlineUpdateController implementation.
+ @Override
+ public void setEnabled(boolean enabled) {
+@@ -154,10 +128,8 @@ public class PlayInlineUpdateController
+
+ if (mEnabled) {
+ mUpdateState = UpdateState.NONE;
+- mAppUpdateManager.registerListener(this);
+ pullCurrentState();
+ } else {
+- mAppUpdateManager.unregisterListener(this);
+ }
+ }
+
+@@ -168,220 +140,26 @@ public class PlayInlineUpdateController
+
+ @Override
+ public void startUpdate(Activity activity) {
+- try {
+- boolean success = mAppUpdateManager.startUpdateFlowForResult(
+- mAppUpdateInfo, AppUpdateType.FLEXIBLE, activity, REQUEST_CODE);
+- Log.i(TAG, "startUpdateFlowForResult() returned " + success);
+-
+- if (!success) recordCallFailure(CallFailure.START_FAILED);
+- } catch (SendIntentException exception) {
+- mInstallStatus = InstallStatus.FAILED;
+- Log.i(TAG, "startUpdateFlowForResult() threw an exception.");
+- recordCallFailure(CallFailure.START_EXCEPTION);
+- }
+- // TODO(dtrainor): Use success.
+ }
+
+ @Override
+ public void completeUpdate() {
+- mAppUpdateManager.completeUpdate()
+- .addOnSuccessListener(unused -> {
+- Log.i(TAG, "completeUpdate() success.");
+- pushStatus();
+- })
+- .addOnFailureListener(exception -> {
+- Log.i(TAG, "completeUpdate() failed.");
+- recordCallFailure(CallFailure.COMPLETE_FAILED);
+- mInstallStatus = InstallStatus.FAILED;
+- pushStatus();
+- });
+- }
+-
+- // InstallStateUpdatedListener implementation.
+- @Override
+- public void onStateUpdate(InstallState state) {
+- Log.i(TAG,
+- "onStateUpdate(" + state.installStatus() + ", " + state.installErrorCode() + ")");
+-
+- if (state.installStatus() != mInstallStatus) {
+- RecordHistogram.recordEnumeratedHistogram("GoogleUpdate.Inline.StateChange.Error."
+- + installStatusToEnumSuffix(state.installStatus()),
+- installErrorCodeToMetrics(state.installErrorCode()),
+- InstallErrorCodeMetrics.NUM_ENTRIES);
+- }
+-
+- mInstallStatus = state.installStatus();
+- pushStatus();
+ }
+
+ private void pullCurrentState() {
+- mAppUpdateManager.getAppUpdateInfo()
+- .addOnSuccessListener(info -> {
+- mAppUpdateInfo = info;
+- mUpdateAvailability = info.updateAvailability();
+- mInstallStatus = info.installStatus();
+- Log.i(TAG,
+- "pullCurrentState(" + mUpdateAvailability + ", " + mInstallStatus
+- + ") success.");
+- recordOnAppUpdateInfo(info);
+- pushStatus();
+- })
+- .addOnFailureListener(exception -> {
+- mAppUpdateInfo = null;
+- mUpdateAvailability = UpdateAvailability.UNKNOWN;
+- mInstallStatus = InstallStatus.UNKNOWN;
+- Log.i(TAG, "pullCurrentState() failed.");
+- recordCallFailure(CallFailure.QUERY_FAILED);
+- pushStatus();
+- });
+ }
+
+ private void pushStatus() {
+- if (!mEnabled || mUpdateAvailability == null || mInstallStatus == null) return;
+-
+- @UpdateState
+- int newState = toUpdateState(mUpdateAvailability, mInstallStatus);
+- if (mUpdateState != null && mUpdateState == newState) return;
+-
+- Log.i(TAG, "Pushing inline update state to " + newState);
+- mUpdateState = newState;
+- mCallback.run();
+ }
+
+ private static @UpdateState int toUpdateState(
+- @UpdateAvailability int updateAvailability, @InstallStatus int installStatus) {
++ int updateAvailability, int installStatus) {
+ @UpdateState
+ int newStatus = UpdateState.NONE;
+
+- // Note, use InstallStatus first then UpdateAvailability if InstallStatus doesn't indicate
+- // a currently active install.
+- switch (installStatus) {
+- case InstallStatus.PENDING:
+- // Intentional fall through.
+- case InstallStatus.DOWNLOADING:
+- newStatus = UpdateState.INLINE_UPDATE_DOWNLOADING;
+- break;
+- case InstallStatus.DOWNLOADED:
+- newStatus = UpdateState.INLINE_UPDATE_READY;
+- break;
+- case InstallStatus.FAILED:
+- newStatus = UpdateState.INLINE_UPDATE_FAILED;
+- break;
+- }
+-
+- if (newStatus == UpdateState.NONE) {
+- switch (updateAvailability) {
+- case UpdateAvailability.UPDATE_AVAILABLE:
+- newStatus = UpdateState.INLINE_UPDATE_AVAILABLE;
+- break;
+- }
+- }
+-
+ return newStatus;
+ }
+
+- private static String installStatusToEnumSuffix(@InstallStatus int status) {
+- switch (status) {
+- case InstallStatus.UNKNOWN:
+- return "Unknown";
+- case InstallStatus.REQUIRES_UI_INTENT:
+- return "RequiresUiIntent";
+- case InstallStatus.PENDING:
+- return "Pending";
+- case InstallStatus.DOWNLOADING:
+- return "Downloading";
+- case InstallStatus.DOWNLOADED:
+- return "Downloaded";
+- case InstallStatus.INSTALLING:
+- return "Installing";
+- case InstallStatus.INSTALLED:
+- return "Installed";
+- case InstallStatus.FAILED:
+- return "Failed";
+- case InstallStatus.CANCELED:
+- return "Canceled";
+- default:
+- return "Untracked";
+- }
+- }
+-
+- private static @InstallErrorCodeMetrics int installErrorCodeToMetrics(
+- @InstallErrorCode int error) {
+- switch (error) {
+- case InstallErrorCode.NO_ERROR:
+- return InstallErrorCodeMetrics.NO_ERROR;
+- case InstallErrorCode.NO_ERROR_PARTIALLY_ALLOWED:
+- return InstallErrorCodeMetrics.NO_ERROR_PARTIALLY_ALLOWED;
+- case InstallErrorCode.ERROR_UNKNOWN:
+- return InstallErrorCodeMetrics.ERROR_UNKNOWN;
+- case InstallErrorCode.ERROR_API_NOT_AVAILABLE:
+- return InstallErrorCodeMetrics.ERROR_API_NOT_AVAILABLE;
+- case InstallErrorCode.ERROR_INVALID_REQUEST:
+- return InstallErrorCodeMetrics.ERROR_INVALID_REQUEST;
+- case InstallErrorCode.ERROR_INSTALL_UNAVAILABLE:
+- return InstallErrorCodeMetrics.ERROR_INSTALL_UNAVAILABLE;
+- case InstallErrorCode.ERROR_INSTALL_NOT_ALLOWED:
+- return InstallErrorCodeMetrics.ERROR_INSTALL_NOT_ALLOWED;
+- case InstallErrorCode.ERROR_DOWNLOAD_NOT_PRESENT:
+- return InstallErrorCodeMetrics.ERROR_DOWNLOAD_NOT_PRESENT;
+- case InstallErrorCode.ERROR_INTERNAL_ERROR:
+- return InstallErrorCodeMetrics.ERROR_INTERNAL_ERROR;
+- default:
+- return InstallErrorCodeMetrics.ERROR_UNTRACKED;
+- }
+- }
+-
+- private static @UpdateAvailabilityMetric int updateAvailabilityToMetrics(
+- @UpdateAvailability int updateAvailability) {
+- switch (updateAvailability) {
+- case UpdateAvailability.UNKNOWN:
+- return UpdateAvailabilityMetric.UNKNOWN;
+- case UpdateAvailability.UPDATE_NOT_AVAILABLE:
+- return UpdateAvailabilityMetric.UPDATE_NOT_AVAILABLE;
+- case UpdateAvailability.UPDATE_AVAILABLE:
+- return UpdateAvailabilityMetric.UPDATE_AVAILABLE;
+- case UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS:
+- return UpdateAvailabilityMetric.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS;
+- default:
+- return UpdateAvailabilityMetric.UNTRACKED;
+- }
+- }
+-
+- private static @InstallStatusMetric int installStatusToMetrics(
+- @InstallStatus int installStatus) {
+- switch (installStatus) {
+- case InstallStatus.UNKNOWN:
+- return InstallStatusMetric.UNKNOWN;
+- case InstallStatus.REQUIRES_UI_INTENT:
+- return InstallStatusMetric.REQUIRES_UI_INTENT;
+- case InstallStatus.PENDING:
+- return InstallStatusMetric.PENDING;
+- case InstallStatus.DOWNLOADING:
+- return InstallStatusMetric.DOWNLOADING;
+- case InstallStatus.DOWNLOADED:
+- return InstallStatusMetric.DOWNLOADED;
+- case InstallStatus.INSTALLING:
+- return InstallStatusMetric.INSTALLING;
+- case InstallStatus.INSTALLED:
+- return InstallStatusMetric.INSTALLED;
+- case InstallStatus.FAILED:
+- return InstallStatusMetric.FAILED;
+- case InstallStatus.CANCELED:
+- return InstallStatusMetric.CANCELED;
+- default:
+- return InstallStatusMetric.UNTRACKED;
+- }
+- }
+-
+- private static void recordOnAppUpdateInfo(AppUpdateInfo info) {
+- RecordHistogram.recordEnumeratedHistogram(
+- "GoogleUpdate.Inline.AppUpdateInfo.UpdateAvailability",
+- updateAvailabilityToMetrics(info.updateAvailability()),
+- UpdateAvailabilityMetric.NUM_ENTRIES);
+- RecordHistogram.recordEnumeratedHistogram("GoogleUpdate.Inline.AppUpdateInfo.InstallStatus",
+- installStatusToMetrics(info.installStatus()), InstallStatusMetric.NUM_ENTRIES);
+- }
+-
+ private static void recordCallFailure(@CallFailure int failure) {
+ RecordHistogram.recordEnumeratedHistogram(
+ "GoogleUpdate.Inline.CallFailure", failure, CallFailure.NUM_ENTRIES);
+diff --git a/components/module_installer/android/BUILD.gn b/components/module_installer/android/BUILD.gn
+--- a/components/module_installer/android/BUILD.gn
++++ b/components/module_installer/android/BUILD.gn
+@@ -23,7 +23,6 @@ android_library("module_installer_java") {
+ deps = [
+ "//base:base_java",
+ "//components/crash/android:java",
+- "//third_party/google_android_play_core:com_google_android_play_core_java",
+ ]
+
+ srcjar_deps = [ ":module_installer_build_config" ]
+diff --git a/third_party/google_android_play_core/BUILD.gn b/third_party/google_android_play_core/BUILD.gn
+--- a/third_party/google_android_play_core/BUILD.gn
++++ b/third_party/google_android_play_core/BUILD.gn
+@@ -3,8 +3,3 @@
+ # found in the LICENSE file.
+
+ import("//build/config/android/rules.gni")
+-
+-android_aar_prebuilt("com_google_android_play_core_java") {
+- aar_path = "core-1.6.4.aar"
+- info_path = "com_google_android_play_core.info"
+-}
+--
+2.11.0
+
diff --git a/build/patches/Remove-help-menu-item.patch b/build/patches/Remove-help-menu-item.patch
index 7e5c7025033b40e7a0f5742155996ae453c93ff8..c890338d4d47e4b436fe2a88f03f65748203cb9b 100644
--- a/build/patches/Remove-help-menu-item.patch
+++ b/build/patches/Remove-help-menu-item.patch
@@ -25,7 +25,7 @@ diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/re
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
-@@ -2087,15 +2087,6 @@ public abstract class ChromeActivity
+@@ -2076,15 +2076,6 @@ public abstract class ChromeActivity
final Tab currentTab = getActivityTab();
@@ -57,7 +57,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/KeyboardShortcu
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
-@@ -626,7 +626,7 @@ public class CustomTabActivity extends ChromeActivity
+Date: Sat, 2 Nov 2019 16:27:51 +0100
+Subject: Remove play dependency for module installer
+
+---
+ .../FakeModuleInstallerBackend.java | 16 +-
+ .../module_installer/ModuleInstallerImpl.java | 150 ---------------
+ .../PlayCoreModuleInstallerBackend.java | 210 +--------------------
+ 3 files changed, 10 insertions(+), 366 deletions(-)
+
+diff --git a/components/module_installer/android/java/src/org/chromium/components/module_installer/FakeModuleInstallerBackend.java b/components/module_installer/android/java/src/org/chromium/components/module_installer/FakeModuleInstallerBackend.java
+--- a/components/module_installer/android/java/src/org/chromium/components/module_installer/FakeModuleInstallerBackend.java
++++ b/components/module_installer/android/java/src/org/chromium/components/module_installer/FakeModuleInstallerBackend.java
+@@ -7,9 +7,6 @@ package org.chromium.components.module_installer;
+ import android.content.Context;
+ import android.content.pm.PackageManager;
+
+-import com.google.android.play.core.splitcompat.SplitCompat;
+-import com.google.android.play.core.splitcompat.ingestion.Verifier;
+-
+ import org.chromium.base.BuildInfo;
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.Log;
+@@ -132,18 +129,7 @@ class FakeModuleInstallerBackend extends ModuleInstallerBackend {
+ return false;
+ }
+
+- // Check that the module's signature matches Chrome's.
+- try {
+- Verifier verifier = new Verifier(context);
+- if (!verifier.verifySplits()) {
+- return false;
+- }
+- } catch (IOException | PackageManager.NameNotFoundException e) {
+- return false;
+- }
+-
+- // Tell SplitCompat to do a full emulation of the module.
+- return SplitCompat.fullInstall(context);
++ return false;
+ }
+
+ private File joinPaths(String... paths) {
+diff --git a/components/module_installer/android/java/src/org/chromium/components/module_installer/ModuleInstallerImpl.java b/components/module_installer/android/java/src/org/chromium/components/module_installer/ModuleInstallerImpl.java
+--- a/components/module_installer/android/java/src/org/chromium/components/module_installer/ModuleInstallerImpl.java
++++ b/components/module_installer/android/java/src/org/chromium/components/module_installer/ModuleInstallerImpl.java
+@@ -11,9 +11,6 @@ import android.content.pm.PackageManager.NameNotFoundException;
+ import android.os.Build;
+ import android.text.TextUtils;
+
+-import com.google.android.play.core.splitcompat.SplitCompat;
+-import com.google.android.play.core.splitinstall.SplitInstallManagerFactory;
+-
+ import org.chromium.base.BuildInfo;
+ import org.chromium.base.CommandLine;
+ import org.chromium.base.ContextUtils;
+@@ -57,152 +54,5 @@ import java.util.TreeSet;
+ sInstance = moduleInstaller;
+ }
+
+- @Override
+- public void init() {
+- try (Timer ignored1 = new Timer()) {
+- if (sAppContextSplitCompatted) return;
+- // SplitCompat.install may copy modules into Chrome's internal folder or clean them up.
+- try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) {
+- SplitCompat.install(ContextUtils.getApplicationContext());
+- sAppContextSplitCompatted = true;
+- }
+- // SplitCompat.install may add emulated modules. Thus, update crash keys.
+- updateCrashKeys();
+- }
+- }
+-
+- @Override
+- public void initActivity(Activity activity) {
+- try (Timer ignored = new Timer()) {
+- // SplitCompat#install should always be run for the application first before it is run
+- // for any activities.
+- init();
+- SplitCompat.installActivity(activity);
+- }
+- }
+-
+- @Override
+- public void recordModuleAvailability() {
+- try (Timer ignored = new Timer()) {
+- getBackend().recordModuleAvailability();
+- }
+- }
+-
+- @Override
+- public void recordStartupTime() {
+- getBackend().recordStartupTime(Timer.getTotalTime());
+- }
+-
+- @Override
+- public void updateCrashKeys() {
+- try (Timer ignored = new Timer()) {
+- Context context = ContextUtils.getApplicationContext();
+-
+- // Get modules that are fully installed as split APKs (excluding base which is always
+- // installed). Tree set to have ordered and, thus, deterministic results.
+- Set fullyInstalledModules = new TreeSet<>();
+- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+- // Split APKs are only supported on Android L+.
+- try {
+- PackageInfo packageInfo = context.getPackageManager().getPackageInfo(
+- BuildInfo.getInstance().packageName, 0);
+- if (packageInfo.splitNames != null) {
+- fullyInstalledModules.addAll(Arrays.asList(packageInfo.splitNames));
+- }
+- } catch (NameNotFoundException e) {
+- throw new RuntimeException(e);
+- }
+- }
+-
+- // Create temporary split install manager to retrieve both fully installed and emulated
+- // modules. Then remove fully installed ones to get emulated ones only. Querying the
+- // installed modules can only be done if splitcompat has already been called. Otherwise,
+- // emulation of later modules won't work. If splitcompat has not been called no modules
+- // are emulated. Therefore, use an empty set in that case.
+- Set emulatedModules = new TreeSet<>();
+- if (sAppContextSplitCompatted) {
+- emulatedModules.addAll(
+- SplitInstallManagerFactory.create(context).getInstalledModules());
+- emulatedModules.removeAll(fullyInstalledModules);
+- }
+-
+- CrashKeys.getInstance().set(
+- CrashKeyIndex.INSTALLED_MODULES, encodeCrashKeyValue(fullyInstalledModules));
+- CrashKeys.getInstance().set(
+- CrashKeyIndex.EMULATED_MODULES, encodeCrashKeyValue(emulatedModules));
+- }
+- }
+-
+- @Override
+- public void install(String moduleName, OnModuleInstallFinishedListener onFinishedListener) {
+- try (Timer ignored = new Timer()) {
+- ThreadUtils.assertOnUiThread();
+-
+- if (!mModuleNameListenerMap.containsKey(moduleName)) {
+- mModuleNameListenerMap.put(moduleName, new LinkedList<>());
+- }
+- List onFinishedListeners =
+- mModuleNameListenerMap.get(moduleName);
+- onFinishedListeners.add(onFinishedListener);
+- if (onFinishedListeners.size() > 1) {
+- // Request is already running.
+- return;
+- }
+- getBackend().install(moduleName);
+- }
+- }
+-
+- @Override
+- public void installDeferred(String moduleName) {
+- try (Timer ignored = new Timer()) {
+- ThreadUtils.assertOnUiThread();
+- getBackend().installDeferred(moduleName);
+- }
+- }
+-
+- private void onFinished(boolean success, List moduleNames) {
+- // Add timer to this private method since it is passed as a callback.
+- try (Timer ignored = new Timer()) {
+- ThreadUtils.assertOnUiThread();
+-
+- mActivityObserver.onModuleInstalled();
+-
+- for (String moduleName : moduleNames) {
+- List onFinishedListeners =
+- mModuleNameListenerMap.get(moduleName);
+- if (onFinishedListeners == null) continue;
+-
+- for (OnModuleInstallFinishedListener listener : onFinishedListeners) {
+- listener.onFinished(success);
+- }
+- mModuleNameListenerMap.remove(moduleName);
+- }
+-
+- if (mModuleNameListenerMap.isEmpty()) {
+- mBackend.close();
+- mBackend = null;
+- }
+-
+- updateCrashKeys();
+- }
+- }
+-
+- private ModuleInstallerBackend getBackend() {
+- if (mBackend == null) {
+- ModuleInstallerBackend.OnFinishedListener listener = this::onFinished;
+- mBackend = CommandLine.getInstance().hasSwitch(FAKE_FEATURE_MODULE_INSTALL)
+- ? new FakeModuleInstallerBackend(listener)
+- : new PlayCoreModuleInstallerBackend(listener);
+- }
+- return mBackend;
+- }
+-
+- private String encodeCrashKeyValue(Set moduleNames) {
+- if (moduleNames.isEmpty()) return "";
+- // Values with dots are interpreted as URLs. Some module names have dots in them. Make sure
+- // they don't get sanitized.
+- return TextUtils.join(",", moduleNames).replace('.', '$');
+- }
+-
+ private ModuleInstallerImpl() {}
+ }
+diff --git a/components/module_installer/android/java/src/org/chromium/components/module_installer/PlayCoreModuleInstallerBackend.java b/components/module_installer/android/java/src/org/chromium/components/module_installer/PlayCoreModuleInstallerBackend.java
+--- a/components/module_installer/android/java/src/org/chromium/components/module_installer/PlayCoreModuleInstallerBackend.java
++++ b/components/module_installer/android/java/src/org/chromium/components/module_installer/PlayCoreModuleInstallerBackend.java
+@@ -7,15 +7,6 @@ package org.chromium.components.module_installer;
+ import android.content.SharedPreferences;
+ import android.util.SparseLongArray;
+
+-import com.google.android.play.core.splitinstall.SplitInstallException;
+-import com.google.android.play.core.splitinstall.SplitInstallManager;
+-import com.google.android.play.core.splitinstall.SplitInstallManagerFactory;
+-import com.google.android.play.core.splitinstall.SplitInstallRequest;
+-import com.google.android.play.core.splitinstall.SplitInstallSessionState;
+-import com.google.android.play.core.splitinstall.SplitInstallStateUpdatedListener;
+-import com.google.android.play.core.splitinstall.model.SplitInstallErrorCode;
+-import com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus;
+-
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.Log;
+ import org.chromium.base.metrics.CachedMetrics.EnumeratedHistogramSample;
+@@ -33,14 +24,13 @@ import java.util.Set;
+ * Backend that uses the Play Core SDK to download a module from Play and install it subsequently.
+ */
+ /* package */ class PlayCoreModuleInstallerBackend
+- extends ModuleInstallerBackend implements SplitInstallStateUpdatedListener {
++ extends ModuleInstallerBackend {
+ private static class InstallTimes {
+ public final boolean mIsCached;
+ public final SparseLongArray mInstallTimes = new SparseLongArray();
+
+ public InstallTimes(boolean isCached) {
+ mIsCached = isCached;
+- mInstallTimes.put(SplitInstallSessionStatus.UNKNOWN, System.currentTimeMillis());
+ }
+ }
+
+@@ -50,7 +40,6 @@ import java.util.Set;
+ private static final String KEY_MODULES_DEFERRED_REQUESTED_PREVIOUSLY =
+ "key_modules_deferred_requested_previously";
+ private final Map mInstallTimesMap = new HashMap<>();
+- private final SplitInstallManager mManager;
+ private boolean mIsClosed;
+
+ // FeatureModuleInstallStatus defined in //tools/metrics/histograms/enums.xml.
+@@ -90,183 +79,31 @@ import java.util.Set;
+ // Keep this one at the end and increment appropriately when adding new status.
+ private static final int AVAILABILITY_STATUS_COUNT = 3;
+
+- /** Records via UMA all modules that have been requested and are currently installed. */
+- @Override
+- /* package */ void recordModuleAvailability() {
+- SharedPreferences prefs = ContextUtils.getAppSharedPreferences();
+- Set requestedModules = new HashSet<>();
+- requestedModules.addAll(
+- prefs.getStringSet(KEY_MODULES_ONDEMAND_REQUESTED_PREVIOUSLY, new HashSet<>()));
+- requestedModules.addAll(
+- prefs.getStringSet(KEY_MODULES_DEFERRED_REQUESTED_PREVIOUSLY, new HashSet<>()));
+- Set installedModules = mManager.getInstalledModules();
+-
+- for (String name : requestedModules) {
+- EnumeratedHistogramSample sample = new EnumeratedHistogramSample(
+- "Android.FeatureModules.AvailabilityStatus." + name, AVAILABILITY_STATUS_COUNT);
+- if (installedModules.contains(name)) {
+- sample.record(AVAILABILITY_STATUS_INSTALLED_REQUESTED);
+- } else {
+- sample.record(AVAILABILITY_STATUS_REQUESTED);
+- }
+- }
+-
+- for (String name : installedModules) {
+- if (!requestedModules.contains(name)) {
+- // Module appeared without being requested. Weird.
+- EnumeratedHistogramSample sample = new EnumeratedHistogramSample(
+- "Android.FeatureModules.AvailabilityStatus." + name,
+- AVAILABILITY_STATUS_COUNT);
+- sample.record(AVAILABILITY_STATUS_INSTALLED_UNREQUESTED);
+- }
+- }
+- }
+-
+- @Override
+- /* package */ void recordStartupTime(long durationMs) {
+- TimesHistogramSample sample =
+- new TimesHistogramSample("Android.FeatureModules.StartupTime");
+- sample.record(durationMs);
+- }
+-
+ /* package */ PlayCoreModuleInstallerBackend(OnFinishedListener listener) {
+ super(listener);
+- // MUST call init before creating a SplitInstallManager.
+- ModuleInstaller.getInstance().init();
+- mManager = SplitInstallManagerFactory.create(ContextUtils.getApplicationContext());
+- mManager.registerListener(this);
+ }
+
+ @Override
+- public void install(String moduleName) {
++ public void close() {
+ assert !mIsClosed;
+-
+- // Record start time in order to later report the install duration via UMA. We want to make
+- // a difference between modules that have been requested first before and after the last
+- // Chrome start. Modules that have been requested before may install quicker as they may be
+- // installed form cache. To do this, we use shared prefs to track modules previously
+- // requested. Additionally, storing requested modules helps us to record module install
+- // status at next Chrome start.
+- assert !mInstallTimesMap.containsKey(moduleName);
+- mInstallTimesMap.put(moduleName,
+- new InstallTimes(storeModuleRequested(
+- moduleName, KEY_MODULES_ONDEMAND_REQUESTED_PREVIOUSLY)));
+-
+- SplitInstallRequest request =
+- SplitInstallRequest.newBuilder().addModule(moduleName).build();
+-
+- mManager.startInstall(request).addOnFailureListener(exception -> {
+- int status = exception instanceof SplitInstallException
+- ? getHistogramCode(((SplitInstallException) exception).getErrorCode())
+- : INSTALL_STATUS_UNKNOWN_REQUEST_ERROR;
+- Log.e(TAG, "Failed to request module '%s': error code %s", moduleName, status);
+- // If we reach this error condition |onStateUpdate| won't be called. Thus, call
+- // |onFinished| here.
+- finish(false, Collections.singletonList(moduleName), status);
+- });
++ mIsClosed = true;
+ }
+
+ @Override
+- public void installDeferred(String moduleName) {
+- assert !mIsClosed;
+- mManager.deferredInstall(Collections.singletonList(moduleName));
+- storeModuleRequested(moduleName, KEY_MODULES_DEFERRED_REQUESTED_PREVIOUSLY);
++ /* package */ void recordModuleAvailability() {
++ SharedPreferences prefs = ContextUtils.getAppSharedPreferences();
+ }
+
+ @Override
+- public void close() {
+- assert !mIsClosed;
+- mManager.unregisterListener(this);
+- mIsClosed = true;
++ /* package */ void recordStartupTime(long durationMs) {
+ }
+
+ @Override
+- public void onStateUpdate(SplitInstallSessionState state) {
+- assert !mIsClosed;
+- Log.i(TAG, "Status for modules '%s' updated to %d", state.moduleNames(), state.status());
+- switch (state.status()) {
+- case SplitInstallSessionStatus.DOWNLOADING:
+- case SplitInstallSessionStatus.INSTALLING:
+- case SplitInstallSessionStatus.INSTALLED:
+- for (String name : state.moduleNames()) {
+- mInstallTimesMap.get(name).mInstallTimes.put(
+- state.status(), System.currentTimeMillis());
+- }
+- if (state.status() == SplitInstallSessionStatus.INSTALLED) {
+- finish(true, state.moduleNames(), INSTALL_STATUS_SUCCESS);
+- }
+- break;
+- // DOWNLOADED only gets sent if SplitCompat is not enabled. That's an error.
+- // SplitCompat should always be enabled.
+- case SplitInstallSessionStatus.DOWNLOADED:
+- case SplitInstallSessionStatus.CANCELED:
+- case SplitInstallSessionStatus.FAILED:
+- int status;
+- if (state.status() == SplitInstallSessionStatus.DOWNLOADED) {
+- status = INSTALL_STATUS_NO_SPLITCOMPAT;
+- } else if (state.status() == SplitInstallSessionStatus.CANCELED) {
+- status = INSTALL_STATUS_CANCELLATION;
+- } else {
+- status = getHistogramCode(state.errorCode());
+- }
+- Log.e(TAG, "Failed to install modules '%s': error code %s", state.moduleNames(),
+- status);
+- finish(false, state.moduleNames(), status);
+- break;
+- }
+- }
+-
+- private void finish(boolean success, List moduleNames, int eventId) {
+- for (String name : moduleNames) {
+- RecordHistogram.recordEnumeratedHistogram(
+- "Android.FeatureModules.InstallStatus." + name, eventId, INSTALL_STATUS_COUNT);
+- if (success) {
+- recordInstallTimes(name);
+- }
+- }
+- onFinished(success, moduleNames);
++ public void install(String moduleName) {
+ }
+
+- /**
+- * Gets the UMA code based on a SplitInstall error code
+- * @param errorCode The error code
+- * @return int The User Metric Analysis code
+- */
+- private int getHistogramCode(@SplitInstallErrorCode int errorCode) {
+- switch (errorCode) {
+- case SplitInstallErrorCode.ACCESS_DENIED:
+- return INSTALL_STATUS_ACCESS_DENIED;
+- case SplitInstallErrorCode.ACTIVE_SESSIONS_LIMIT_EXCEEDED:
+- return INSTALL_STATUS_ACTIVE_SESSIONS_LIMIT_EXCEEDED;
+- case SplitInstallErrorCode.API_NOT_AVAILABLE:
+- return INSTALL_STATUS_API_NOT_AVAILABLE;
+- case SplitInstallErrorCode.INCOMPATIBLE_WITH_EXISTING_SESSION:
+- return INSTALL_STATUS_INCOMPATIBLE_WITH_EXISTING_SESSION;
+- case SplitInstallErrorCode.INSUFFICIENT_STORAGE:
+- return INSTALL_STATUS_INSUFFICIENT_STORAGE;
+- case SplitInstallErrorCode.INVALID_REQUEST:
+- return INSTALL_STATUS_INVALID_REQUEST;
+- case SplitInstallErrorCode.MODULE_UNAVAILABLE:
+- return INSTALL_STATUS_MODULE_UNAVAILABLE;
+- case SplitInstallErrorCode.NETWORK_ERROR:
+- return INSTALL_STATUS_NETWORK_ERROR;
+- case SplitInstallErrorCode.NO_ERROR:
+- return INSTALL_STATUS_NO_ERROR;
+- case SplitInstallErrorCode.SERVICE_DIED:
+- return INSTALL_STATUS_SERVICE_DIED;
+- case SplitInstallErrorCode.SESSION_NOT_FOUND:
+- return INSTALL_STATUS_SESSION_NOT_FOUND;
+- case SplitInstallErrorCode.SPLITCOMPAT_COPY_ERROR:
+- return INSTALL_STATUS_SPLITCOMPAT_COPY_ERROR;
+- case SplitInstallErrorCode.SPLITCOMPAT_EMULATION_ERROR:
+- return INSTALL_STATUS_SPLITCOMPAT_EMULATION_ERROR;
+- case SplitInstallErrorCode.SPLITCOMPAT_VERIFICATION_ERROR:
+- return INSTALL_STATUS_SPLITCOMPAT_VERIFICATION_ERROR;
+- case SplitInstallErrorCode.INTERNAL_ERROR:
+- return INSTALL_STATUS_INTERNAL_ERROR;
+- default:
+- return INSTALL_STATUS_UNKNOWN_SPLITINSTALL_ERROR;
+- }
++ @Override
++ public void installDeferred(String moduleName) {
+ }
+
+ /**
+@@ -286,33 +123,4 @@ import java.util.Set;
+ editor.apply();
+ return modulesRequestedPreviously.contains(moduleName);
+ }
+-
+- /** Records via UMA module install times divided into install steps. */
+- private void recordInstallTimes(String moduleName) {
+- recordInstallTime(moduleName, "", SplitInstallSessionStatus.UNKNOWN,
+- SplitInstallSessionStatus.INSTALLED);
+- recordInstallTime(moduleName, ".PendingDownload", SplitInstallSessionStatus.UNKNOWN,
+- SplitInstallSessionStatus.DOWNLOADING);
+- recordInstallTime(moduleName, ".Download", SplitInstallSessionStatus.DOWNLOADING,
+- SplitInstallSessionStatus.INSTALLING);
+- recordInstallTime(moduleName, ".Installing", SplitInstallSessionStatus.INSTALLING,
+- SplitInstallSessionStatus.INSTALLED);
+- }
+-
+- private void recordInstallTime(
+- String moduleName, String histogramSubname, int startKey, int endKey) {
+- assert mInstallTimesMap.containsKey(moduleName);
+- InstallTimes installTimes = mInstallTimesMap.get(moduleName);
+- if (installTimes.mInstallTimes.get(startKey) == 0
+- || installTimes.mInstallTimes.get(endKey) == 0) {
+- // Time stamps for install times have not been stored. Don't record anything to not skew
+- // data.
+- return;
+- }
+- RecordHistogram.recordLongTimesHistogram(
+- String.format("Android.FeatureModules.%sInstallDuration%s.%s",
+- installTimes.mIsCached ? "Cached" : "Uncached", histogramSubname,
+- moduleName),
+- installTimes.mInstallTimes.get(endKey) - installTimes.mInstallTimes.get(startKey));
+- }
+ }
+--
+2.11.0
+
diff --git a/build/patches/Remove-recent-tabs-signin.patch b/build/patches/Remove-recent-tabs-signin.patch
deleted file mode 100644
index b1175c36bb6b299ed07492d3db65e06a68e2972c..0000000000000000000000000000000000000000
--- a/build/patches/Remove-recent-tabs-signin.patch
+++ /dev/null
@@ -1,180 +0,0 @@
-From: csagan5 <32685696+csagan5@users.noreply.github.com>
-Date: Wed, 15 May 2019 17:08:35 +0200
-Subject: Remove recent tabs signin
-
----
- .../chrome/browser/signin/SigninManager.java | 63 +++-------------------
- .../android/signin/signin_manager_android.cc | 3 +-
- 2 files changed, 7 insertions(+), 59 deletions(-)
-
-diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
---- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
-+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
-@@ -27,10 +27,7 @@ import org.chromium.base.annotations.NativeMethods;
- import org.chromium.base.metrics.RecordHistogram;
- import org.chromium.base.metrics.RecordUserAction;
- import org.chromium.base.task.PostTask;
--import org.chromium.components.signin.AccountIdProvider;
- import org.chromium.components.signin.AccountManagerFacade;
--import org.chromium.components.signin.AccountTrackerService;
--import org.chromium.components.signin.ChromeSigninController;
- import org.chromium.content_public.browser.UiThreadTaskTraits;
-
- import java.util.ArrayList;
-@@ -46,7 +43,7 @@ import java.util.List;
- *
- * See chrome/browser/signin/signin_manager_android.h for more details.
- */
--public class SigninManager implements AccountTrackerService.OnSystemAccountsSeededListener {
-+public class SigninManager {
- private static final String TAG = "SigninManager";
-
- /**
-@@ -187,7 +184,6 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
- private long mNativeSigninManagerAndroid;
- private final Context mContext;
- private final SigninManagerDelegate mDelegate;
-- private final AccountTrackerService mAccountTrackerService;
- private final ObserverList mSignInStateObservers = new ObserverList<>();
- private final ObserverList mSignInAllowedObservers =
- new ObserverList<>();
-@@ -222,28 +218,23 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
- */
- @CalledByNative
- private static SigninManager create(long nativeSigninManagerAndroid,
-- SigninManagerDelegate delegate, AccountTrackerService accountTrackerService) {
-+ SigninManagerDelegate delegate) {
- assert nativeSigninManagerAndroid != 0;
- assert delegate != null;
-- assert accountTrackerService != null;
- return new SigninManager(ContextUtils.getApplicationContext(), nativeSigninManagerAndroid,
-- delegate, accountTrackerService);
-+ delegate);
- }
-
- @VisibleForTesting
-- SigninManager(Context context, long nativeSigninManagerAndroid, SigninManagerDelegate delegate,
-- AccountTrackerService accountTrackerService) {
-+ SigninManager(Context context, long nativeSigninManagerAndroid, SigninManagerDelegate delegate) {
- ThreadUtils.assertOnUiThread();
- assert context != null;
- mContext = context;
- mNativeSigninManagerAndroid = nativeSigninManagerAndroid;
- mDelegate = delegate;
-- mAccountTrackerService = accountTrackerService;
-
- mSigninAllowedByPolicy =
- SigninManagerJni.get().isSigninAllowedByPolicy(this, mNativeSigninManagerAndroid);
--
-- mAccountTrackerService.addSystemAccountsSeededListener(this);
- }
-
- /**
-@@ -252,7 +243,6 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
- */
- @CalledByNative
- public void destroy() {
-- mAccountTrackerService.removeSystemAccountsSeededListener(this);
- mNativeSigninManagerAndroid = 0;
- }
-
-@@ -289,8 +279,7 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
- * Returns true if signin can be started now.
- */
- public boolean isSignInAllowed() {
-- return !mFirstRunCheckIsPending && mSignInState == null && mSigninAllowedByPolicy
-- && ChromeSigninController.get().getSignedInUser() == null && isSigninSupported();
-+ return false;
- }
-
- /**
-@@ -348,27 +337,6 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
- }
-
- /**
-- * Continue pending sign in after system accounts have been seeded into AccountTrackerService.
-- */
-- @Override
-- public void onSystemAccountsSeedingComplete() {
-- if (mSignInState != null && mSignInState.mBlockedOnAccountSeeding) {
-- mSignInState.mBlockedOnAccountSeeding = false;
-- progressSignInFlowCheckPolicy();
-- }
-- }
--
-- /**
-- * Clear pending sign in when system accounts in AccountTrackerService were refreshed.
-- */
-- @Override
-- public void onSystemAccountsChanged() {
-- if (mSignInState != null) {
-- abortSignIn();
-- }
-- }
--
-- /**
- * Starts the sign-in flow, and executes the callback when finished.
- *
- * If an activity is provided, it is considered an "interactive" sign-in and the user can be
-@@ -423,16 +391,7 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
- }
-
- private void progressSignInFlowSeedSystemAccounts() {
-- if (mAccountTrackerService.checkAndSeedSystemAccounts()) {
-- progressSignInFlowCheckPolicy();
-- } else if (AccountIdProvider.getInstance().canBeUsed()) {
-- mSignInState.mBlockedOnAccountSeeding = true;
-- } else {
-- Activity activity = mSignInState.mActivity;
-- mDelegate.handleGooglePlayServicesUnavailability(activity, !isForceSigninEnabled());
-- Log.w(TAG, "Cancelling the sign-in process as Google Play services is unavailable");
-- abortSignIn();
-- }
-+ mSignInState.mBlockedOnAccountSeeding = true;
- }
-
- /**
-@@ -467,14 +426,6 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
- // This method should be called at most once per sign-in flow.
- assert mSignInState != null;
-
-- SigninManagerJni.get().onSignInCompleted(
-- this, mNativeSigninManagerAndroid, mSignInState.mAccount.name);
--
-- // Cache the signed-in account name. This must be done after the native call, otherwise
-- // sync tries to start without being signed in natively and crashes.
-- ChromeSigninController.get().setSignedInAccountName(mSignInState.mAccount.name);
-- mDelegate.enableSync(mSignInState.mAccount);
--
- if (mSignInState.mCallback != null) {
- mSignInState.mCallback.onSignInComplete();
- }
-@@ -642,12 +593,10 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
-
- // Native sign-out must happen before resetting the account so data is deleted correctly.
- // http://crbug.com/589028
-- ChromeSigninController.get().setSignedInAccountName(null);
- if (mSignOutState.mWipeDataHooks != null) mSignOutState.mWipeDataHooks.preWipeData();
- mDelegate.disableSyncAndWipeData(
- mSignOutState.mManagementDomain != null || mSignOutState.mForceWipeUserData,
- this::onProfileDataWiped);
-- mAccountTrackerService.invalidateAccountSeedStatus(true);
- }
-
- @VisibleForTesting
-diff --git a/chrome/browser/android/signin/signin_manager_android.cc b/chrome/browser/android/signin/signin_manager_android.cc
---- a/chrome/browser/android/signin/signin_manager_android.cc
-+++ b/chrome/browser/android/signin/signin_manager_android.cc
-@@ -53,8 +53,7 @@ SigninManagerAndroid::SigninManagerAndroid(
-
- java_signin_manager_ = Java_SigninManager_create(
- base::android::AttachCurrentThread(), reinterpret_cast(this),
-- signin_manager_delegate_->GetJavaObject(),
-- identity_manager_->LegacyGetAccountTrackerServiceJavaObject());
-+ signin_manager_delegate_->GetJavaObject());
- }
-
- base::android::ScopedJavaLocalRef
---
-2.11.0
-
diff --git a/build/patches/Remove-signin-and-data-saver-integrations.patch b/build/patches/Remove-signin-and-data-saver-integrations.patch
new file mode 100644
index 0000000000000000000000000000000000000000..31e3c598a7d6db2bf364f72f813210680524020f
--- /dev/null
+++ b/build/patches/Remove-signin-and-data-saver-integrations.patch
@@ -0,0 +1,1090 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Tue, 12 Jun 2018 14:23:07 +0200
+Subject: Remove signin and data saver integrations
+
+Prevents authorization prompt for Play services on reboot
+Remove recent tabs signin
+Disable data saver
+Never show the data saver promo snackbar
+Disable unused permissions from manifest
+Disable sync adaptive and invalidation services from manifest
+More permissions removal from manifest
+
+Fix building with debug symbols:
+
+ld.lld: error: undefined symbol: notifier::NotifierOptions::NotifierOptions()
+>>> referenced by invalidation_service_util.cc:17 (../../components/invalidation/impl/invalidation_service_util.cc:17)
+>>> impl/invalidation_service_util.o:(invalidation::ParseNotifierOptions(base::CommandLine const&)) in archive obj/components/invalidation/impl/libimpl.a
+---
+ chrome/android/BUILD.gn | 4 +-
+ chrome/android/java/AndroidManifest.xml | 27 -----
+ chrome/android/java/res/xml/main_preferences.xml | 14 ---
+ .../chromium/chrome/browser/ChromeActivity.java | 34 ------
+ .../browser/preferences/MainPreferences.java | 86 +--------------
+ .../DataReductionPreferenceFragment.java | 17 +--
+ .../preferences/privacy/PrivacyPreferences.java | 15 ---
+ .../sync/SyncAndServicesPreferences.java | 7 --
+ .../preferences/sync/SyncPreferenceUtils.java | 3 -
+ .../chrome/browser/signin/SigninManager.java | 73 +-----------
+ .../java/strings/android_chrome_strings.grd | 18 ---
+ .../android/signin/signin_manager_android.cc | 3 +-
+ .../invalidation/impl/invalidation_service_util.cc | 21 ----
+ .../invalidation/impl/invalidation_service_util.h | 6 +-
+ .../signin/SystemAccountManagerDelegate.java | 38 +------
+ .../components/sync/AndroidSyncSettings.java | 24 +---
+ .../chromium/net/HttpNegotiateAuthenticator.java | 122 +--------------------
+ .../chromoting/base/OAuthTokenFetcher.java | 2 -
+ 18 files changed, 26 insertions(+), 488 deletions(-)
+
+diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
+--- a/chrome/android/BUILD.gn
++++ b/chrome/android/BUILD.gn
+@@ -1158,8 +1158,7 @@ jinja_template_resources("chrome_public_apk_template_resources") {
+ resources = [
+ "java/res_template/xml/file_paths.xml",
+ "java/res_template/xml/launchershortcuts.xml",
+- "java/res_template/xml/searchable.xml",
+- "java/res_template/xml/syncadapter.xml",
++ "java/res_template/xml/searchable.xml"
+ ]
+ res_dir = "java/res_template"
+ variables = [ "manifest_package=$chrome_public_manifest_package" ]
+@@ -1170,7 +1169,6 @@ jinja_template_resources("chrome_test_apk_template_resources") {
+ "java/res_template/xml/file_paths.xml",
+ "java/res_template/xml/launchershortcuts.xml",
+ "java/res_template/xml/searchable.xml",
+- "java/res_template/xml/syncadapter.xml",
+ ]
+ res_dir = "java/res_template"
+
+diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
+--- a/chrome/android/java/AndroidManifest.xml
++++ b/chrome/android/java/AndroidManifest.xml
+@@ -47,22 +47,16 @@ by a child template that "extends" this file.
+ {% if target_sdk_version|int > 27 or target_sdk_version == "Q" %}
+
+ {% endif %}
+-
+
+-
+
+
+
+-
+-
+
+
+-
+
+
+
+
+-
+ {% set enable_vr = enable_vr|default(0) %}
+ {% if enable_vr == "true" %}
+
+@@ -103,8 +97,6 @@ by a child template that "extends" this file.
+
+
+
+-
+-
+ {% block extra_uses_permissions %}
+ {% endblock %}
+
+@@ -1009,16 +1001,6 @@ by a child template that "extends" this file.
+ android:resource="@xml/file_paths" />
+
+
+-
+-
+-
+-
+-
+-
+-
+-
+
+
+
+@@ -1126,15 +1108,6 @@ by a child template that "extends" this file.
+
+
+-
+-
+-
+-
+-
+-
+-
+
+
+
+
+-
+-
+-
+@@ -85,11 +76,6 @@
+ android:order="16"
+ android:title="@string/prefs_languages"/>
+
+-
+ @SuppressLint("NewApi")
+ private TouchExplorationStateChangeListener mTouchExplorationStateChangeListener;
+
+- // Observes when sync becomes ready to create the mContextReporter.
+- private ProfileSyncService.SyncStateChangedListener mSyncStateChangedListener;
+-
+ @Nullable
+ private ChromeFullscreenManager mFullscreenManager;
+
+@@ -906,28 +901,6 @@ public abstract class ChromeActivity
+ private void createContextReporterIfNeeded() {
+ if (!mStarted) return; // Sync state reporting should work only in started state.
+ if (mContextReporter != null || getActivityTab() == null) return;
+-
+- final SyncController syncController = SyncController.get(this);
+- final ProfileSyncService syncService = ProfileSyncService.get();
+-
+- if (syncController != null && syncController.isSyncingUrlsWithKeystorePassphrase()) {
+- assert syncService != null;
+- mContextReporter = AppHooks.get().createGsaHelper().getContextReporter(this);
+-
+- if (mSyncStateChangedListener != null) {
+- syncService.removeSyncStateChangedListener(mSyncStateChangedListener);
+- mSyncStateChangedListener = null;
+- }
+-
+- return;
+- } else {
+- ContextReporter.reportSyncStatus(syncService);
+- }
+-
+- if (mSyncStateChangedListener == null && syncService != null) {
+- mSyncStateChangedListener = () -> createContextReporterIfNeeded();
+- syncService.addSyncStateChangedListener(mSyncStateChangedListener);
+- }
+ }
+
+ @Override
+@@ -995,13 +968,6 @@ public abstract class ChromeActivity
+ if (GSAState.getInstance(this).isGsaAvailable() && !SysUtils.isLowEndDevice()) {
+ GSAAccountChangeListener.getInstance().disconnect();
+ }
+- if (mSyncStateChangedListener != null) {
+- ProfileSyncService syncService = ProfileSyncService.get();
+- if (syncService != null) {
+- syncService.removeSyncStateChangedListener(mSyncStateChangedListener);
+- }
+- mSyncStateChangedListener = null;
+- }
+ if (mContextReporter != null) mContextReporter.disable();
+
+ super.onStopWithNative();
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
+@@ -17,13 +17,11 @@ import org.chromium.base.ContextUtils;
+ import org.chromium.base.VisibleForTesting;
+ import org.chromium.chrome.R;
+ import org.chromium.chrome.browser.ChromeFeatureList;
+-import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
+ import org.chromium.chrome.browser.night_mode.NightModeUtils;
+ import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchConfiguration;
+ import org.chromium.chrome.browser.partnercustomizations.HomepageManager;
+ import org.chromium.chrome.browser.password_manager.ManagePasswordsReferrer;
+ import org.chromium.chrome.browser.preferences.autofill_assistant.AutofillAssistantPreferences;
+-import org.chromium.chrome.browser.preferences.datareduction.DataReductionPreferenceFragment;
+ import org.chromium.chrome.browser.preferences.developer.DeveloperPreferences;
+ import org.chromium.chrome.browser.preferences.sync.SignInPreference;
+ import org.chromium.chrome.browser.preferences.sync.SyncPreferenceUtils;
+@@ -42,16 +40,11 @@ import java.util.Map;
+ * The main settings screen, shown when the user first opens Settings.
+ */
+ public class MainPreferences extends PreferenceFragmentCompat
+- implements TemplateUrlService.LoadListener, ProfileSyncService.SyncStateChangedListener,
+- SigninManager.SignInStateObserver {
+- public static final String PREF_ACCOUNT_SECTION = "account_section";
+- public static final String PREF_SIGN_IN = "sign_in";
+- public static final String PREF_SYNC_AND_SERVICES = "sync_and_services";
++ implements TemplateUrlService.LoadListener {
+ public static final String PREF_SEARCH_ENGINE = "search_engine";
+ public static final String PREF_SAVED_PASSWORDS = "saved_passwords";
+ public static final String PREF_HOMEPAGE = "homepage";
+ public static final String PREF_UI_THEME = "ui_theme";
+- public static final String PREF_DATA_REDUCTION = "data_reduction";
+ public static final String PREF_NOTIFICATIONS = "notifications";
+ public static final String PREF_LANGUAGES = "languages";
+ public static final String PREF_DOWNLOADS = "downloads";
+@@ -65,7 +58,6 @@ public class MainPreferences extends PreferenceFragmentCompat
+
+ private final ManagedPreferenceDelegate mManagedPreferenceDelegate;
+ private final Map mAllPreferences = new HashMap<>();
+- private SignInPreference mSignInPreference;
+
+ public MainPreferences() {
+ setHasOptionsMenu(true);
+@@ -88,35 +80,16 @@ public class MainPreferences extends PreferenceFragmentCompat
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+- mSignInPreference.onPreferenceFragmentDestroyed();
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+- SigninManager signinManager = IdentityServicesProvider.getSigninManager();
+- if (signinManager.isSigninSupported()) {
+- signinManager.addSignInStateObserver(this);
+- mSignInPreference.registerForUpdates();
+- }
+- ProfileSyncService syncService = ProfileSyncService.get();
+- if (syncService != null) {
+- syncService.addSyncStateChangedListener(this);
+- }
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+- SigninManager signinManager = IdentityServicesProvider.getSigninManager();
+- if (signinManager.isSigninSupported()) {
+- signinManager.removeSignInStateObserver(this);
+- mSignInPreference.unregisterForUpdates();
+- }
+- ProfileSyncService syncService = ProfileSyncService.get();
+- if (syncService != null) {
+- syncService.removeSyncStateChangedListener(this);
+- }
+ }
+
+ @Override
+@@ -129,12 +102,9 @@ public class MainPreferences extends PreferenceFragmentCompat
+ PreferenceUtils.addPreferencesFromResource(this, R.xml.main_preferences);
+ cachePreferences();
+
+- mSignInPreference.setOnStateChangedCallback(this::onSignInPreferenceStateChanged);
+-
+ updatePasswordsPreference();
+
+ setManagedPreferenceDelegateForPreference(PREF_SEARCH_ENGINE);
+- setManagedPreferenceDelegateForPreference(PREF_DATA_REDUCTION);
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ // If we are on Android O+ the Notifications preference should lead to the Android
+@@ -188,7 +158,6 @@ public class MainPreferences extends PreferenceFragmentCompat
+ Preference preference = getPreferenceScreen().getPreference(index);
+ mAllPreferences.put(preference.getKey(), preference);
+ }
+- mSignInPreference = (SignInPreference) mAllPreferences.get(PREF_SIGN_IN);
+ }
+
+ private void setManagedPreferenceDelegateForPreference(String key) {
+@@ -197,13 +166,6 @@ public class MainPreferences extends PreferenceFragmentCompat
+ }
+
+ private void updatePreferences() {
+- if (IdentityServicesProvider.getSigninManager().isSigninSupported()) {
+- addPreferenceIfAbsent(PREF_SIGN_IN);
+- } else {
+- removePreferenceIfPresent(PREF_SIGN_IN);
+- }
+-
+- updateSyncAndServicesPreference();
+ updateSearchEnginePreference();
+
+ Preference homepagePref = addPreferenceIfAbsent(PREF_HOMEPAGE);
+@@ -223,10 +185,6 @@ public class MainPreferences extends PreferenceFragmentCompat
+ } else {
+ removePreferenceIfPresent(PREF_DEVELOPER);
+ }
+-
+- ChromeBasePreference dataReduction =
+- (ChromeBasePreference) findPreference(PREF_DATA_REDUCTION);
+- dataReduction.setSummary(DataReductionPreferenceFragment.generateSummary(getResources()));
+ }
+
+ private Preference addPreferenceIfAbsent(String key) {
+@@ -240,13 +198,6 @@ public class MainPreferences extends PreferenceFragmentCompat
+ if (preference != null) getPreferenceScreen().removePreference(preference);
+ }
+
+- private void updateSyncAndServicesPreference() {
+- ChromeBasePreference syncAndServices =
+- (ChromeBasePreference) findPreference(PREF_SYNC_AND_SERVICES);
+- syncAndServices.setIcon(SyncPreferenceUtils.getSyncStatusIcon(getActivity()));
+- syncAndServices.setSummary(SyncPreferenceUtils.getSyncStatusSummary(getActivity()));
+- }
+-
+ private void updateSearchEnginePreference() {
+ if (!TemplateUrlServiceFactory.get().isLoaded()) {
+ ChromeBasePreference searchEnginePref =
+@@ -278,28 +229,6 @@ public class MainPreferences extends PreferenceFragmentCompat
+ pref.setSummary(getResources().getString(isOn ? R.string.text_on : R.string.text_off));
+ }
+
+- // SigninManager.SignInStateObserver implementation.
+- @Override
+- public void onSignedIn() {
+- // After signing in or out of a managed account, preferences may change or become enabled
+- // or disabled.
+- new Handler().post(() -> updatePreferences());
+- }
+-
+- @Override
+- public void onSignedOut() {
+- updatePreferences();
+- }
+-
+- private void onSignInPreferenceStateChanged() {
+- // Remove "Account" section header if the personalized sign-in promo is shown.
+- if (mSignInPreference.getState() == SignInPreference.State.PERSONALIZED_PROMO) {
+- removePreferenceIfPresent(PREF_ACCOUNT_SECTION);
+- } else {
+- addPreferenceIfAbsent(PREF_ACCOUNT_SECTION);
+- }
+- }
+-
+ // TemplateUrlService.LoadListener implementation.
+ @Override
+ public void onTemplateUrlServiceLoaded() {
+@@ -307,11 +236,6 @@ public class MainPreferences extends PreferenceFragmentCompat
+ updateSearchEnginePreference();
+ }
+
+- @Override
+- public void syncStateChanged() {
+- updateSyncAndServicesPreference();
+- }
+-
+ @VisibleForTesting
+ ManagedPreferenceDelegate getManagedPreferenceDelegateForTest() {
+ return mManagedPreferenceDelegate;
+@@ -321,9 +245,6 @@ public class MainPreferences extends PreferenceFragmentCompat
+ return new ManagedPreferenceDelegate() {
+ @Override
+ public boolean isPreferenceControlledByPolicy(Preference preference) {
+- if (PREF_DATA_REDUCTION.equals(preference.getKey())) {
+- return DataReductionProxySettings.getInstance().isDataReductionProxyManaged();
+- }
+ if (PREF_SEARCH_ENGINE.equals(preference.getKey())) {
+ return TemplateUrlServiceFactory.get().isDefaultSearchManaged();
+ }
+@@ -332,11 +253,6 @@ public class MainPreferences extends PreferenceFragmentCompat
+
+ @Override
+ public boolean isPreferenceClickDisabledByPolicy(Preference preference) {
+- if (PREF_DATA_REDUCTION.equals(preference.getKey())) {
+- DataReductionProxySettings settings = DataReductionProxySettings.getInstance();
+- return settings.isDataReductionProxyManaged()
+- && !settings.isDataReductionProxyEnabled();
+- }
+ if (PREF_SEARCH_ENGINE.equals(preference.getKey())) {
+ return TemplateUrlServiceFactory.get().isDefaultSearchManaged();
+ }
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java
+@@ -45,10 +45,10 @@ public class DataReductionPreferenceFragment extends PreferenceFragmentCompat {
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ PreferenceUtils.addPreferencesFromResource(this, R.xml.data_reduction_preferences);
+ getActivity().setTitle(R.string.data_reduction_title_lite_mode);
+- boolean isEnabled = DataReductionProxySettings.getInstance().isDataReductionProxyEnabled();
+- mIsEnabled = !isEnabled;
+- mWasEnabledAtCreation = isEnabled;
+- updatePreferences(isEnabled);
++
++ mIsEnabled = false;
++ mWasEnabledAtCreation = false;
++ updatePreferences(false);
+
+ setHasOptionsMenu(true);
+
+@@ -143,14 +143,7 @@ public class DataReductionPreferenceFragment extends PreferenceFragmentCompat {
+ * Returns summary string.
+ */
+ public static String generateSummary(Resources resources) {
+- if (DataReductionProxySettings.getInstance().isDataReductionProxyEnabled()) {
+- String percent =
+- DataReductionProxySettings.getInstance().getContentLengthPercentSavings();
+- return resources.getString(
+- R.string.data_reduction_menu_item_summary_lite_mode, percent);
+- } else {
+- return (String) resources.getText(R.string.text_off);
+- }
++ return (String) resources.getText(R.string.text_off);
+ }
+
+ private void createDataReductionSwitch(boolean isEnabled) {
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
+@@ -24,7 +24,6 @@ import org.chromium.chrome.browser.preferences.Pref;
+ import org.chromium.chrome.browser.preferences.PrefServiceBridge;
+ import org.chromium.chrome.browser.preferences.PreferenceUtils;
+ import org.chromium.chrome.browser.preferences.PreferencesLauncher;
+-import org.chromium.chrome.browser.preferences.sync.SyncAndServicesPreferences;
+ import org.chromium.chrome.browser.profiles.Profile;
+ import org.chromium.chrome.browser.usage_stats.UsageStatsConsentDialog;
+ import org.chromium.ui.text.NoUnderlineClickableSpan;
+@@ -41,9 +40,6 @@ public class PrivacyPreferences
+ private static final String PREF_NETWORK_PREDICTIONS = "preload_pages";
+ private static final String PREF_DO_NOT_TRACK = "do_not_track";
+ private static final String PREF_CLEAR_BROWSING_DATA = "clear_browsing_data";
+- private static final String PREF_SYNC_AND_SERVICES_LINK_DIVIDER =
+- "sync_and_services_link_divider";
+- private static final String PREF_SYNC_AND_SERVICES_LINK = "sync_and_services_link";
+
+ private ManagedPreferenceDelegate mManagedPreferenceDelegate;
+
+@@ -86,20 +82,9 @@ public class PrivacyPreferences
+ networkPredictionPref.setOrder(canMakePaymentPref.getOrder());
+ preferenceScreen.addPreference(networkPredictionPref);
+
+- Preference syncAndServicesLink = findPreference(PREF_SYNC_AND_SERVICES_LINK);
+- NoUnderlineClickableSpan linkSpan = new NoUnderlineClickableSpan(getResources(), view -> {
+- PreferencesLauncher.launchSettingsPage(getActivity(), SyncAndServicesPreferences.class,
+- SyncAndServicesPreferences.createArguments(false));
+- });
+- syncAndServicesLink.setSummary(
+- SpanApplier.applySpans(getString(R.string.privacy_sync_and_services_link),
+- new SpanApplier.SpanInfo("", "", linkSpan)));
+-
+ updateSummaries();
+ return;
+ }
+- preferenceScreen.removePreference(findPreference(PREF_SYNC_AND_SERVICES_LINK_DIVIDER));
+- preferenceScreen.removePreference(findPreference(PREF_SYNC_AND_SERVICES_LINK));
+
+ ChromeBaseCheckBoxPreference searchSuggestionsPref =
+ (ChromeBaseCheckBoxPreference) findPreference(PREF_SEARCH_SUGGESTIONS);
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncAndServicesPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncAndServicesPreferences.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncAndServicesPreferences.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncAndServicesPreferences.java
+@@ -163,14 +163,7 @@ public class SyncAndServicesPreferences extends PreferenceFragmentCompat
+
+ mPrivacyPrefManager.migrateNetworkPredictionPreferences();
+
+- getActivity().setTitle(R.string.prefs_sync_and_services);
+ setHasOptionsMenu(true);
+- if (mIsFromSigninScreen) {
+- ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
+- assert actionBar != null;
+- actionBar.setHomeActionContentDescription(
+- R.string.prefs_sync_and_services_content_description);
+- }
+
+ PreferenceUtils.addPreferencesFromResource(this, R.xml.sync_and_services_preferences);
+
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncPreferenceUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncPreferenceUtils.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncPreferenceUtils.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncPreferenceUtils.java
+@@ -119,9 +119,6 @@ public class SyncPreferenceUtils {
+ if (profileSyncService.isPassphraseRequiredForDecryption()) {
+ return res.getString(R.string.sync_need_passphrase);
+ }
+- if (ChromeFeatureList.isEnabled(ChromeFeatureList.UNIFIED_CONSENT)) {
+- return context.getString(R.string.sync_and_services_summary_sync_on);
+- }
+ return context.getString(R.string.account_management_sync_summary, accountName);
+ }
+ return context.getString(R.string.sync_is_disabled);
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
+@@ -27,10 +27,7 @@ import org.chromium.base.metrics.RecordUserAction;
+ import org.chromium.base.task.PostTask;
+ import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
+ import org.chromium.chrome.browser.externalauth.UserRecoverableErrorHandler;
+-import org.chromium.components.signin.AccountIdProvider;
+ import org.chromium.components.signin.AccountManagerFacade;
+-import org.chromium.components.signin.AccountTrackerService;
+-import org.chromium.components.signin.ChromeSigninController;
+ import org.chromium.components.sync.AndroidSyncSettings;
+ import org.chromium.content_public.browser.UiThreadTaskTraits;
+
+@@ -47,7 +44,7 @@ import java.util.List;
+ *
+ * See chrome/browser/signin/signin_manager_android.h for more details.
+ */
+-public class SigninManager implements AccountTrackerService.OnSystemAccountsSeededListener {
++public class SigninManager {
+ private static final String TAG = "SigninManager";
+
+ /**
+@@ -183,7 +180,6 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
+ */
+ private long mNativeSigninManagerAndroid;
+ private final Context mContext;
+- private final AccountTrackerService mAccountTrackerService;
+ private final AndroidSyncSettings mAndroidSyncSettings;
+ private final ObserverList mSignInStateObservers = new ObserverList<>();
+ private final ObserverList mSignInAllowedObservers =
+@@ -219,28 +215,24 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
+ */
+ @CalledByNative
+ private static SigninManager create(
+- long nativeSigninManagerAndroid, AccountTrackerService accountTrackerService) {
++ long nativeSigninManagerAndroid) {
+ assert nativeSigninManagerAndroid != 0;
+- assert accountTrackerService != null;
+ return new SigninManager(ContextUtils.getApplicationContext(), nativeSigninManagerAndroid,
+- accountTrackerService, AndroidSyncSettings.get());
++ AndroidSyncSettings.get());
+ }
+
+ @VisibleForTesting
+ SigninManager(Context context, long nativeSigninManagerAndroid,
+- AccountTrackerService accountTrackerService, AndroidSyncSettings androidSyncSettings) {
++ AndroidSyncSettings androidSyncSettings) {
+ ThreadUtils.assertOnUiThread();
+ assert context != null;
+ assert androidSyncSettings != null;
+ mContext = context;
+ mNativeSigninManagerAndroid = nativeSigninManagerAndroid;
+- mAccountTrackerService = accountTrackerService;
+ mAndroidSyncSettings = androidSyncSettings;
+
+ mSigninAllowedByPolicy =
+ SigninManagerJni.get().isSigninAllowedByPolicy(mNativeSigninManagerAndroid);
+-
+- mAccountTrackerService.addSystemAccountsSeededListener(this);
+ }
+
+ /**
+@@ -249,7 +241,6 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
+ */
+ @CalledByNative
+ public void destroy() {
+- mAccountTrackerService.removeSystemAccountsSeededListener(this);
+ mNativeSigninManagerAndroid = 0;
+ }
+
+@@ -286,8 +277,7 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
+ * Returns true if signin can be started now.
+ */
+ public boolean isSignInAllowed() {
+- return !mFirstRunCheckIsPending && mSignInState == null && mSigninAllowedByPolicy
+- && ChromeSigninController.get().getSignedInUser() == null && isSigninSupported();
++ return false;
+ }
+
+ /**
+@@ -344,27 +334,6 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
+ }
+
+ /**
+- * Continue pending sign in after system accounts have been seeded into AccountTrackerService.
+- */
+- @Override
+- public void onSystemAccountsSeedingComplete() {
+- if (mSignInState != null && mSignInState.mBlockedOnAccountSeeding) {
+- mSignInState.mBlockedOnAccountSeeding = false;
+- progressSignInFlowCheckPolicy();
+- }
+- }
+-
+- /**
+- * Clear pending sign in when system accounts in AccountTrackerService were refreshed.
+- */
+- @Override
+- public void onSystemAccountsChanged() {
+- if (mSignInState != null) {
+- abortSignIn();
+- }
+- }
+-
+- /**
+ * Starts the sign-in flow, and executes the callback when finished.
+ *
+ * If an activity is provided, it is considered an "interactive" sign-in and the user can be
+@@ -419,16 +388,7 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
+ }
+
+ private void progressSignInFlowSeedSystemAccounts() {
+- if (mAccountTrackerService.checkAndSeedSystemAccounts()) {
+- progressSignInFlowCheckPolicy();
+- } else if (AccountIdProvider.getInstance().canBeUsed()) {
+- mSignInState.mBlockedOnAccountSeeding = true;
+- } else {
+- Activity activity = mSignInState.mActivity;
+- handleGooglePlayServicesUnavailability(activity, !isForceSigninEnabled());
+- Log.w(TAG, "Cancelling the sign-in process as Google Play services is unavailable");
+- abortSignIn();
+- }
++ mSignInState.mBlockedOnAccountSeeding = true;
+ }
+
+ /**
+@@ -462,18 +422,6 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
+ // This method should be called at most once per sign-in flow.
+ assert mSignInState != null;
+
+- if (!SigninManagerJni.get().setPrimaryAccount(
+- mNativeSigninManagerAndroid, mSignInState.mAccount.name)) {
+- Log.w(TAG, "Failed to set the PrimaryAccount in IdentityManager, aborting signin");
+- abortSignIn();
+- return;
+- }
+-
+- // Cache the signed-in account name. This must be done after the native call, otherwise
+- // sync tries to start without being signed in natively and crashes.
+- ChromeSigninController.get().setSignedInAccountName(mSignInState.mAccount.name);
+- enableSync(mSignInState.mAccount);
+-
+ if (mSignInState.mCallback != null) {
+ mSignInState.mCallback.onSignInComplete();
+ }
+@@ -640,10 +588,8 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
+
+ // Native sign-out must happen before resetting the account so data is deleted correctly.
+ // http://crbug.com/589028
+- ChromeSigninController.get().setSignedInAccountName(null);
+ if (mSignOutState.mWipeDataHooks != null) mSignOutState.mWipeDataHooks.preWipeData();
+ disableSyncAndWipeData(mSignOutState.mShouldWipeUserData, this::onProfileDataWiped);
+- mAccountTrackerService.invalidateAccountSeedStatus(true);
+ }
+
+ @VisibleForTesting
+@@ -719,13 +665,6 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
+ SigninManagerJni.get().stopApplyingCloudPolicy(mNativeSigninManagerAndroid);
+ }
+
+- private void enableSync(Account account) {
+- // Cache the signed-in account name. This must be done after the native call, otherwise
+- // sync tries to start without being signed in the native code and crashes.
+- mAndroidSyncSettings.updateAccount(account);
+- mAndroidSyncSettings.enableChromeSync();
+- }
+-
+ private void disableSyncAndWipeData(
+ boolean shouldWipeUserData, final Runnable wipeDataCallback) {
+ mAndroidSyncSettings.updateAccount(null);
+diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
+--- a/chrome/android/java/strings/android_chrome_strings.grd
++++ b/chrome/android/java/strings/android_chrome_strings.grd
+@@ -345,24 +345,12 @@ CHAR-LIMIT guidelines:
+
+
+
+-
+- Account
+-
+
+ Sign in to Chrome
+
+-
+- Sync and Google services
+-
+-
+- You are currently customizing your Sync and Google service settings. To finish turning on sync, tap the Confirm button near the bottom of the screen. Navigate up
+-
+
+ Sync and personalize across devices
+
+-
+- Sync is on
+-
+
+ Disabled by the administrator of this device
+
+@@ -412,9 +400,6 @@ CHAR-LIMIT guidelines:
+
+ Sends URLs of pages you visit to Google
+
+-
+- For more settings that relate to privacy, security, and data collection, see <link>Sync and Google services</link>
+-
+
+ Cancel sync?
+
+@@ -1282,9 +1267,6 @@ Your Google account may have other forms of browsing history like searches and a
+
+ When Lite mode is on, Chrome uses Google servers to make pages load faster. Lite mode rewrites very slow pages to load only essential content. Lite mode does not apply to Incognito tabs.
+
+-
+- %1$s49% data savings
+-
+
+ data saved
+
+diff --git a/chrome/browser/android/signin/signin_manager_android.cc b/chrome/browser/android/signin/signin_manager_android.cc
+--- a/chrome/browser/android/signin/signin_manager_android.cc
++++ b/chrome/browser/android/signin/signin_manager_android.cc
+@@ -145,8 +145,7 @@ SigninManagerAndroid::SigninManagerAndroid(
+ g_browser_process->local_state());
+
+ java_signin_manager_ = Java_SigninManager_create(
+- base::android::AttachCurrentThread(), reinterpret_cast(this),
+- identity_manager_->LegacyGetAccountTrackerServiceJavaObject());
++ base::android::AttachCurrentThread(), reinterpret_cast(this));
+ }
+
+ base::android::ScopedJavaLocalRef
+diff --git a/components/invalidation/impl/invalidation_service_util.cc b/components/invalidation/impl/invalidation_service_util.cc
+--- a/components/invalidation/impl/invalidation_service_util.cc
++++ b/components/invalidation/impl/invalidation_service_util.cc
+@@ -12,27 +12,6 @@
+
+ namespace invalidation {
+
+-notifier::NotifierOptions ParseNotifierOptions(
+- const base::CommandLine& command_line) {
+- notifier::NotifierOptions notifier_options;
+-
+- if (command_line.HasSwitch(switches::kSyncNotificationHostPort)) {
+- notifier_options.xmpp_host_port =
+- net::HostPortPair::FromString(
+- command_line.GetSwitchValueASCII(
+- switches::kSyncNotificationHostPort));
+- DVLOG(1) << "Using " << notifier_options.xmpp_host_port.ToString()
+- << " for test sync notification server.";
+- }
+-
+- notifier_options.allow_insecure_connection =
+- command_line.HasSwitch(switches::kSyncAllowInsecureXmppConnection);
+- DVLOG_IF(1, notifier_options.allow_insecure_connection)
+- << "Allowing insecure XMPP connections.";
+-
+- return notifier_options;
+-}
+-
+ std::string GenerateInvalidatorClientId() {
+ // Generate a GUID with 128 bits worth of base64-encoded randomness.
+ // This format is similar to that of sync's cache_guid.
+diff --git a/components/invalidation/impl/invalidation_service_util.h b/components/invalidation/impl/invalidation_service_util.h
+--- a/components/invalidation/impl/invalidation_service_util.h
++++ b/components/invalidation/impl/invalidation_service_util.h
+@@ -5,7 +5,7 @@
+ #ifndef COMPONENTS_INVALIDATION_IMPL_INVALIDATION_SERVICE_UTIL_H_
+ #define COMPONENTS_INVALIDATION_IMPL_INVALIDATION_SERVICE_UTIL_H_
+
+-#include "jingle/notifier/base/notifier_options.h"
++#include
+
+ namespace base {
+ class CommandLine;
+@@ -13,10 +13,6 @@ class CommandLine;
+
+ namespace invalidation {
+
+-// Parses the given command line for notifier options.
+-notifier::NotifierOptions ParseNotifierOptions(
+- const base::CommandLine& command_line);
+-
+ // Generates a unique client ID for the invalidator.
+ std::string GenerateInvalidatorClientId();
+
+diff --git a/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java b/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
+--- a/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
++++ b/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
+@@ -167,16 +167,6 @@ public class SystemAccountManagerDelegate implements AccountManagerDelegate {
+
+ @Override
+ public boolean hasFeatures(Account account, String[] features) {
+- if (!hasGetAccountsPermission()) {
+- return false;
+- }
+- try {
+- return mAccountManager.hasFeatures(account, features, null, null).getResult();
+- } catch (AuthenticatorException | IOException e) {
+- Log.e(TAG, "Error while checking features: ", e);
+- } catch (OperationCanceledException e) {
+- Log.e(TAG, "Checking features was cancelled. This should not happen.");
+- }
+ return false;
+ }
+
+@@ -216,32 +206,10 @@ public class SystemAccountManagerDelegate implements AccountManagerDelegate {
+ public void updateCredentials(
+ Account account, Activity activity, final Callback callback) {
+ ThreadUtils.assertOnUiThread();
+- if (!hasManageAccountsPermission()) {
+- if (callback != null) {
+- ThreadUtils.postOnUiThread(() -> callback.onResult(false));
+- }
+- return;
++ if (callback != null) {
++ ThreadUtils.postOnUiThread(() -> callback.onResult(false));
+ }
+-
+- AccountManagerCallback realCallback = future -> {
+- Bundle bundle = null;
+- try {
+- bundle = future.getResult();
+- } catch (AuthenticatorException | IOException e) {
+- Log.e(TAG, "Error while update credentials: ", e);
+- } catch (OperationCanceledException e) {
+- Log.w(TAG, "Updating credentials was cancelled.");
+- }
+- boolean success =
+- bundle != null && bundle.getString(AccountManager.KEY_ACCOUNT_TYPE) != null;
+- if (callback != null) {
+- callback.onResult(success);
+- }
+- };
+- // Android 4.4 throws NullPointerException if null is passed
+- Bundle emptyOptions = new Bundle();
+- mAccountManager.updateCredentials(
+- account, "android", emptyOptions, activity, realCallback, null);
++ return;
+ }
+
+ protected boolean hasGetAccountsPermission() {
+diff --git a/components/sync/android/java/src/org/chromium/components/sync/AndroidSyncSettings.java b/components/sync/android/java/src/org/chromium/components/sync/AndroidSyncSettings.java
+--- a/components/sync/android/java/src/org/chromium/components/sync/AndroidSyncSettings.java
++++ b/components/sync/android/java/src/org/chromium/components/sync/AndroidSyncSettings.java
+@@ -212,13 +212,7 @@ public class AndroidSyncSettings {
+
+ private void setChromeSyncEnabled(boolean value) {
+ synchronized (mLock) {
+- updateSyncability(null);
+- if (value == mChromeSyncEnabled || mAccount == null) return;
+- mChromeSyncEnabled = value;
+-
+- StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
+- mSyncContentResolverDelegate.setSyncAutomatically(mAccount, mContractAuthority, value);
+- StrictMode.setThreadPolicy(oldPolicy);
++ mChromeSyncEnabled = false;
+ }
+ notifyObservers();
+ }
+@@ -299,19 +293,9 @@ public class AndroidSyncSettings {
+ boolean oldChromeSyncEnabled = mChromeSyncEnabled;
+ boolean oldMasterSyncEnabled = mMasterSyncEnabled;
+
+- StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
+- if (mAccount != null) {
+- mIsSyncable =
+- mSyncContentResolverDelegate.getIsSyncable(mAccount, mContractAuthority)
+- == 1;
+- mChromeSyncEnabled = mSyncContentResolverDelegate.getSyncAutomatically(
+- mAccount, mContractAuthority);
+- } else {
+- mIsSyncable = false;
+- mChromeSyncEnabled = false;
+- }
+- mMasterSyncEnabled = mSyncContentResolverDelegate.getMasterSyncAutomatically();
+- StrictMode.setThreadPolicy(oldPolicy);
++ mIsSyncable = false;
++ mChromeSyncEnabled = false;
++ mMasterSyncEnabled = false;
+
+ return oldChromeSyncEnabled != mChromeSyncEnabled
+ || oldMasterSyncEnabled != mMasterSyncEnabled;
+diff --git a/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java b/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java
+--- a/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java
++++ b/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java
+@@ -96,50 +96,7 @@ public class HttpNegotiateAuthenticator {
+
+ @Override
+ public void run(AccountManagerFuture future) {
+- Account[] accounts;
+- try {
+- accounts = future.getResult();
+- } catch (OperationCanceledException | AuthenticatorException | IOException e) {
+- Log.w(TAG, "ERR_UNEXPECTED: Error while attempting to retrieve accounts.", e);
+- nativeSetResult(mRequestData.nativeResultObject, NetError.ERR_UNEXPECTED, null);
+- return;
+- }
+-
+- if (accounts.length == 0) {
+- Log.w(TAG, "ERR_MISSING_AUTH_CREDENTIALS: No account provided for the kerberos "
+- + "authentication. Please verify the configuration policies and "
+- + "that the CONTACTS runtime permission is granted. ");
+- nativeSetResult(mRequestData.nativeResultObject,
+- NetError.ERR_MISSING_AUTH_CREDENTIALS, null);
+- return;
+- }
+-
+- if (accounts.length > 1) {
+- Log.w(TAG, "ERR_MISSING_AUTH_CREDENTIALS: Found %d accounts eligible for the "
+- + "kerberos authentication. Please fix the configuration by "
+- + "providing a single account.",
+- accounts.length);
+- nativeSetResult(mRequestData.nativeResultObject,
+- NetError.ERR_MISSING_AUTH_CREDENTIALS, null);
+- return;
+- }
+-
+- if (lacksPermission(ContextUtils.getApplicationContext(),
+- "android.permission.USE_CREDENTIALS", true)) {
+- // Protecting the AccountManager#getAuthToken call.
+- // API < 23 Requires the USE_CREDENTIALS permission or throws an exception.
+- // API >= 23 USE_CREDENTIALS permission is removed
+- Log.e(TAG, "ERR_MISCONFIGURED_AUTH_ENVIRONMENT: USE_CREDENTIALS permission not "
+- + "granted. Aborting authentication.");
+- nativeSetResult(mRequestData.nativeResultObject,
+- NetError.ERR_MISCONFIGURED_AUTH_ENVIRONMENT, null);
+- return;
+- }
+- mRequestData.account = accounts[0];
+- mRequestData.accountManager.getAuthToken(mRequestData.account,
+- mRequestData.authTokenType, mRequestData.options, true /* notifyAuthFailure */,
+- new GetTokenCallback(mRequestData),
+- new Handler(ThreadUtils.getUiThreadLooper()));
++ // account-based authentication removed for privacy-violations concerns
+ }
+ }
+
+@@ -152,41 +109,7 @@ public class HttpNegotiateAuthenticator {
+
+ @Override
+ public void run(AccountManagerFuture future) {
+- Bundle result;
+- try {
+- result = future.getResult();
+- } catch (OperationCanceledException | AuthenticatorException | IOException e) {
+- Log.w(TAG, "ERR_UNEXPECTED: Error while attempting to obtain a token.", e);
+- nativeSetResult(mRequestData.nativeResultObject, NetError.ERR_UNEXPECTED, null);
+- return;
+- }
+-
+- if (result.containsKey(AccountManager.KEY_INTENT)) {
+- final Context appContext = ContextUtils.getApplicationContext();
+-
+- // We wait for a broadcast that should be sent once the user is done interacting
+- // with the notification
+- // TODO(dgn) We currently hang around if the notification is swiped away, until
+- // a LOGIN_ACCOUNTS_CHANGED_ACTION filter is received. It might be for something
+- // unrelated then we would wait again here. Maybe we should limit the number of
+- // retries in some way?
+- BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
+-
+- @Override
+- public void onReceive(Context context, Intent intent) {
+- appContext.unregisterReceiver(this);
+- mRequestData.accountManager.getAuthToken(mRequestData.account,
+- mRequestData.authTokenType, mRequestData.options,
+- true /* notifyAuthFailure */, new GetTokenCallback(mRequestData),
+- null);
+- }
+-
+- };
+- appContext.registerReceiver(broadcastReceiver,
+- new IntentFilter(AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION));
+- } else {
+- processResult(result, mRequestData);
+- }
++ // ditto
+ }
+ }
+
+@@ -300,22 +223,7 @@ public class HttpNegotiateAuthenticator {
+ */
+ private void requestTokenWithoutActivity(
+ Context ctx, RequestData requestData, String[] features) {
+- if (lacksPermission(ctx, Manifest.permission.GET_ACCOUNTS, true /* onlyPreM */)) {
+- // Protecting the AccountManager#getAccountsByTypeAndFeatures call.
+- // API < 23 Requires the GET_ACCOUNTS permission or throws an exception.
+- // API >= 23 Requires the GET_ACCOUNTS permission (CONTACTS permission group) or
+- // returns only the accounts whose authenticator has a signature that
+- // matches our app. Working with this restriction and not requesting
+- // the permission is a valid use case in the context of WebView, so we
+- // don't require it on M+
+- Log.e(TAG, "ERR_MISCONFIGURED_AUTH_ENVIRONMENT: GET_ACCOUNTS permission not "
+- + "granted. Aborting authentication.");
+- nativeSetResult(requestData.nativeResultObject,
+- NetError.ERR_MISCONFIGURED_AUTH_ENVIRONMENT, null);
+- return;
+- }
+- requestData.accountManager.getAccountsByTypeAndFeatures(mAccountType, features,
+- new GetAccountsCallback(requestData), new Handler(ThreadUtils.getUiThreadLooper()));
++ // ditto
+ }
+
+ /**
+@@ -334,29 +242,7 @@ public class HttpNegotiateAuthenticator {
+ */
+ private void requestTokenWithActivity(
+ Context ctx, Activity activity, RequestData requestData, String[] features) {
+- boolean isPreM = Build.VERSION.SDK_INT < Build.VERSION_CODES.M;
+- String permission = isPreM
+- ? "android.permission.MANAGE_ACCOUNTS"
+- : Manifest.permission.GET_ACCOUNTS;
+-
+- // Check if the AccountManager#getAuthTokenByFeatures call can be made.
+- // API < 23 Requires the MANAGE_ACCOUNTS permission.
+- // API >= 23 Requires the GET_ACCOUNTS permission to behave properly. When it's not granted,
+- // accounts not managed by the current application can't be retrieved. Depending
+- // on the authenticator implementation, it might prompt to create an account, but
+- // that won't be saved. This would be a bad user experience, so we also consider
+- // it a failure case.
+- if (lacksPermission(ctx, permission, isPreM)) {
+- Log.e(TAG, "ERR_MISCONFIGURED_AUTH_ENVIRONMENT: %s permission not granted. "
+- + "Aborting authentication", permission);
+- nativeSetResult(requestData.nativeResultObject,
+- NetError.ERR_MISCONFIGURED_AUTH_ENVIRONMENT, null);
+- return;
+- }
+-
+- requestData.accountManager.getAuthTokenByFeatures(mAccountType, requestData.authTokenType,
+- features, activity, null, requestData.options, new GetTokenCallback(requestData),
+- new Handler(ThreadUtils.getUiThreadLooper()));
++ // ditto
+ }
+
+ /**
+diff --git a/remoting/android/java/src/org/chromium/chromoting/base/OAuthTokenFetcher.java b/remoting/android/java/src/org/chromium/chromoting/base/OAuthTokenFetcher.java
+--- a/remoting/android/java/src/org/chromium/chromoting/base/OAuthTokenFetcher.java
++++ b/remoting/android/java/src/org/chromium/chromoting/base/OAuthTokenFetcher.java
+@@ -92,7 +92,6 @@ public class OAuthTokenFetcher {
+
+ /** Begins fetching a token. Should be called on the main thread. */
+ public void fetch() {
+- fetchImpl(null);
+ }
+
+ /**
+@@ -101,7 +100,6 @@ public class OAuthTokenFetcher {
+ * @param expiredToken A previously-fetched token which has expired.
+ */
+ public void clearAndFetch(String expiredToken) {
+- fetchImpl(expiredToken);
+ }
+
+ private void fetchImpl(final String expiredToken) {
+--
+2.11.0
+
diff --git a/build/patches/Replace-DoH-probe-domain-with-RIPE-domain.patch b/build/patches/Replace-DoH-probe-domain-with-RIPE-domain.patch
new file mode 100644
index 0000000000000000000000000000000000000000..baf843aa31dd2ff087270c41235e6a89405a757d
--- /dev/null
+++ b/build/patches/Replace-DoH-probe-domain-with-RIPE-domain.patch
@@ -0,0 +1,23 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Sun, 27 Oct 2019 10:00:13 +0100
+Subject: Replace DoH probe domain with RIPE domain
+
+---
+ net/dns/dns_transaction.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/net/dns/dns_transaction.cc b/net/dns/dns_transaction.cc
+--- a/net/dns/dns_transaction.cc
++++ b/net/dns/dns_transaction.cc
+@@ -816,7 +816,7 @@ class DnsTCPAttempt : public DnsAttempt {
+
+ // ----------------------------------------------------------------------------
+
+-const char kDoHProbeHostname[] = "www.gstatic.com";
++const char kDoHProbeHostname[] = "www.ripe.net";
+
+ const net::BackoffEntry::Policy kProbeBackoffPolicy = {
+ // Apply exponential backoff rules after the first error.
+--
+2.11.0
+
diff --git a/build/patches/Revert-Cleanup-Search-Ready-Omnibox-flag-since-it-has-launched.patch b/build/patches/Revert-Cleanup-Search-Ready-Omnibox-flag-since-it-has-launched.patch
new file mode 100644
index 0000000000000000000000000000000000000000..0c4d6a3bea6b2767107c6a49271375d261fe23ac
--- /dev/null
+++ b/build/patches/Revert-Cleanup-Search-Ready-Omnibox-flag-since-it-has-launched.patch
@@ -0,0 +1,135 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Thu, 10 Oct 2019 23:30:16 +0200
+Subject: Revert "Cleanup Search Ready Omnibox flag since it has launched"
+
+This reverts commit ae458edcc8422d0815d0e82261e71fe10d7d6fc2.
+---
+ .../java/src/org/chromium/chrome/browser/ChromeFeatureList.java | 1 +
+ .../chrome/browser/omnibox/suggestions/AutocompleteMediator.java | 7 +++++++
+ chrome/browser/about_flags.cc | 3 +++
+ chrome/browser/android/chrome_feature_list.cc | 4 ++++
+ chrome/browser/android/chrome_feature_list.h | 1 +
+ chrome/browser/flag-metadata.json | 5 +++++
+ chrome/browser/flag_descriptions.cc | 5 +++++
+ chrome/browser/flag_descriptions.h | 3 +++
+ 8 files changed, 29 insertions(+)
+
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+@@ -303,6 +303,7 @@ public abstract class ChromeFeatureList {
+ public static final String REMOVE_NAVIGATION_HISTORY = "RemoveNavigationHistory";
+ public static final String REORDER_BOOKMARKS = "ReorderBookmarks";
+ public static final String REVAMPED_CONTEXT_MENU = "RevampedContextMenu";
++ public static final String SEARCH_READY_OMNIBOX = "SearchReadyOmnibox";
+ public static final String SEND_TAB_TO_SELF = "SyncSendTabToSelf";
+ public static final String SERVICE_MANAGER_FOR_DOWNLOAD = "ServiceManagerForDownload";
+ public static final String SERVICE_WORKER_PAYMENT_APPS = "ServiceWorkerPaymentApps";
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
+@@ -321,6 +321,13 @@ class AutocompleteMediator
+ void onNativeInitialized() {
+ mNativeInitialized = true;
+
++ // The feature is instantiated in the constructor to simplify plumbing. If the feature is
++ // actually disabled, null out the coordinator.
++ if (!ChromeFeatureList.isEnabled(ChromeFeatureList.SEARCH_READY_OMNIBOX)) {
++ mEditUrlProcessor.destroy();
++ mEditUrlProcessor = null;
++ }
++
+ mShowSuggestionFavicons =
+ ChromeFeatureList.isEnabled(ChromeFeatureList.OMNIBOX_SHOW_SUGGESTION_FAVICONS);
+
+diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
+--- a/chrome/browser/about_flags.cc
++++ b/chrome/browser/about_flags.cc
+@@ -1966,6 +1966,9 @@ const FeatureEntry kFeatureEntries[] = {
+ {"enable-homepage-tile", flag_descriptions::kHomepageTileName,
+ flag_descriptions::kHomepageTileDescription, kOsAndroid,
+ FEATURE_VALUE_TYPE(chrome::android::kHomepageTile)},
++ {"enable-search-ready-omnibox", flag_descriptions::kSearchReadyOmniboxName,
++ flag_descriptions::kSearchReadyOmniboxDescription, kOsAndroid,
++ FEATURE_VALUE_TYPE(chrome::android::kSearchReadyOmniboxFeature)},
+ {"enable-bookmark-reorder", flag_descriptions::kReorderBookmarksName,
+ flag_descriptions::kReorderBookmarksDescription, kOsAndroid,
+ FEATURE_VALUE_TYPE(chrome::android::kReorderBookmarks)},
+diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
+--- a/chrome/browser/android/chrome_feature_list.cc
++++ b/chrome/browser/android/chrome_feature_list.cc
+@@ -164,6 +164,7 @@ const base::Feature* kFeaturesExposedToJava[] = {
+ &kReaderModeInCCT,
+ &kReorderBookmarks,
+ &kRevampedContextMenu,
++ &kSearchReadyOmniboxFeature,
+ &kSearchEnginePromoExistingDevice,
+ &kSearchEnginePromoNewDevice,
+ &kServiceManagerForBackgroundPrefetch,
+@@ -516,6 +517,9 @@ const base::Feature kReorderBookmarks{"ReorderBookmarks",
+ const base::Feature kRevampedContextMenu{"RevampedContextMenu",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+
++const base::Feature kSearchReadyOmniboxFeature{
++ "SearchReadyOmnibox", base::FEATURE_ENABLED_BY_DEFAULT};
++
+ const base::Feature kServiceManagerForBackgroundPrefetch{
+ "ServiceManagerForBackgroundPrefetch", base::FEATURE_DISABLED_BY_DEFAULT};
+
+diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h
+--- a/chrome/browser/android/chrome_feature_list.h
++++ b/chrome/browser/android/chrome_feature_list.h
+@@ -101,6 +101,7 @@ extern const base::Feature kReaderModeInCCT;
+ extern const base::Feature kRevampedContextMenu;
+ extern const base::Feature kSearchEnginePromoExistingDevice;
+ extern const base::Feature kSearchEnginePromoNewDevice;
++extern const base::Feature kSearchReadyOmniboxFeature;
+ extern const base::Feature kServiceManagerForBackgroundPrefetch;
+ extern const base::Feature kServiceManagerForDownload;
+ extern const base::Feature kSettingsModernStatusBar;
+diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
+--- a/chrome/browser/flag-metadata.json
++++ b/chrome/browser/flag-metadata.json
+@@ -1626,6 +1626,11 @@
+ "expiry_milestone": 78
+ },
+ {
++ "name": "enable-search-ready-omnibox",
++ "owners": [ "mdjones" ],
++ "expiry_milestone": -1
++ },
++ {
+ "name": "enable-send-tab-to-self",
+ "owners": [ "//components/send_tab_to_self/OWNERS" ],
+ "expiry_milestone": 77
+diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
+--- a/chrome/browser/flag_descriptions.cc
++++ b/chrome/browser/flag_descriptions.cc
+@@ -2695,6 +2695,11 @@ const char kSafeBrowsingUseLocalBlacklistsV2Description[] =
+ "process to check the Safe Browsing reputation of URLs without calling "
+ "into GmsCore for every URL.";
+
++const char kSearchReadyOmniboxName[] = "Search Ready Omnibox";
++const char kSearchReadyOmniboxDescription[] =
++ "Clears the omnibox and adds a suggestion item to share, copy, or edit the "
++ "URL.";
++
+ const char kSetMarketUrlForTestingName[] = "Set market URL for testing";
+ const char kSetMarketUrlForTestingDescription[] =
+ "When enabled, sets the market URL for use in testing the update menu "
+diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
+--- a/chrome/browser/flag_descriptions.h
++++ b/chrome/browser/flag_descriptions.h
+@@ -1594,6 +1594,9 @@ extern const char kReaderModeInCCTDescription[];
+ extern const char kSafeBrowsingUseLocalBlacklistsV2Name[];
+ extern const char kSafeBrowsingUseLocalBlacklistsV2Description[];
+
++extern const char kSearchReadyOmniboxName[];
++extern const char kSearchReadyOmniboxDescription[];
++
+ extern const char kSetMarketUrlForTestingName[];
+ extern const char kSetMarketUrlForTestingDescription[];
+
+--
+2.11.0
+
diff --git a/build/patches/Revert-Merge-to-M78-Enable-AImageReader-by-default.patch b/build/patches/Revert-Merge-to-M78-Enable-AImageReader-by-default.patch
new file mode 100644
index 0000000000000000000000000000000000000000..66a5fe5d2a2d3ab1c87d6964e89ba04bbf2e6e93
--- /dev/null
+++ b/build/patches/Revert-Merge-to-M78-Enable-AImageReader-by-default.patch
@@ -0,0 +1,37 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Mon, 14 Oct 2019 20:27:33 +0200
+Subject: Revert "[Merge to M78] Enable AImageReader by default."
+
+This reverts commit 60c3d4531b180b911767fb3ea7c3553d7f408c25.
+---
+ gpu/config/gpu_finch_features.cc | 2 +-
+ media/base/media_switches.cc | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc
+--- a/gpu/config/gpu_finch_features.cc
++++ b/gpu/config/gpu_finch_features.cc
+@@ -31,7 +31,7 @@ bool FieldIsInBlacklist(const char* current_value, std::string blacklist_str) {
+ #if defined(OS_ANDROID)
+ // Use android AImageReader when playing videos with MediaPlayer.
+ const base::Feature kAImageReaderMediaPlayer{"AImageReaderMediaPlayer",
+- base::FEATURE_ENABLED_BY_DEFAULT};
++ base::FEATURE_DISABLED_BY_DEFAULT};
+
+ // Use android SurfaceControl API for managing display compositor's buffer queue
+ // and using overlays on Android.
+diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
+--- a/media/base/media_switches.cc
++++ b/media/base/media_switches.cc
+@@ -417,7 +417,7 @@ const base::Feature kMediaDrmPreprovisioningAtStartup{
+
+ // Enables the Android Image Reader path for Video decoding(for AVDA and MCVD)
+ const base::Feature kAImageReaderVideoOutput{"AImageReaderVideoOutput",
+- base::FEATURE_ENABLED_BY_DEFAULT};
++ base::FEATURE_DISABLED_BY_DEFAULT};
+
+ // Prevents using SurfaceLayer for videos. This is meant to be used by embedders
+ // that cannot support SurfaceLayer at the moment.
+--
+2.11.0
+
diff --git a/build/patches/Revert-Remove-UnifiedConsent-from-ChromeFeatureList.patch b/build/patches/Revert-Remove-UnifiedConsent-from-ChromeFeatureList.patch
index 7d0ba3428684017693be4514b6558686136cc442..602241300fe3bf4caa994cd1d6cbabbcac730ab8 100644
--- a/build/patches/Revert-Remove-UnifiedConsent-from-ChromeFeatureList.patch
+++ b/build/patches/Revert-Remove-UnifiedConsent-from-ChromeFeatureList.patch
@@ -10,9 +10,9 @@ This reverts commit c513d4c926a42ba6cc5eccfd5e85ba64c38bf0c1.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
-@@ -327,6 +327,7 @@ public abstract class ChromeFeatureList {
+@@ -339,6 +339,7 @@ public abstract class ChromeFeatureList {
+ public static final String TRUSTED_WEB_ACTIVITY_NOTIFICATION_DELEGATION_ENROLMENT =
"TrustedWebActivityNotificationDelegationAutoEnrolment";
- public static final String TWO_PANES_START_SURFACE_ANDROID = "TwoPanesStartSurfaceAndroid";
public static final String VIDEO_PERSISTENCE = "VideoPersistence";
+ public static final String UNIFIED_CONSENT = "UnifiedConsent";
public static final String USAGE_STATS = "UsageStats";
diff --git a/build/patches/Revert-Remove-pre-unified-consent-code-in-sync-and-privacy-directory.patch b/build/patches/Revert-Remove-pre-unified-consent-code-in-sync-and-privacy-directory.patch
index 8f6a27d4f1f59447c7d492f9ed2599345a0bdad4..0595ca4f8ac6dee93da566d5a4a94a3192f6ad51 100644
--- a/build/patches/Revert-Remove-pre-unified-consent-code-in-sync-and-privacy-directory.patch
+++ b/build/patches/Revert-Remove-pre-unified-consent-code-in-sync-and-privacy-directory.patch
@@ -6,12 +6,13 @@ Subject: Revert "Remove pre unified consent code in sync and privacy
This reverts commit c672a0683e89eba3554e2562156b3c8532136f21.
Restore translations
+Restore contextual search preference toggle
---
- .../android/java/res/xml/privacy_preferences.xml | 40 +++++-
- .../preferences/privacy/PrivacyPreferences.java | 158 +++++++++++++++++++--
- .../preferences/sync/SyncPreferenceUtils.java | 6 +-
+ .../android/java/res/xml/privacy_preferences.xml | 30 ++++
+ .../preferences/privacy/PrivacyPreferences.java | 157 +++++++++++++++++++--
+ .../preferences/sync/SyncPreferenceUtils.java | 5 +-
.../browser/sync/SyncNotificationController.java | 17 ++-
- .../java/strings/android_chrome_strings.grd | 21 +++
+ .../java/strings/android_chrome_strings.grd | 15 ++
.../translations/android_chrome_strings_am.xtb | 19 ++-
.../translations/android_chrome_strings_ar.xtb | 19 ++-
.../translations/android_chrome_strings_bg.xtb | 19 ++-
@@ -66,63 +67,53 @@ Restore translations
.../translations/android_chrome_strings_zh-TW.xtb | 19 ++-
.../chromium/chrome/browser/sync/SyncTestRule.java | 9 +-
.../org/chromium/chrome/browser/sync/UkmTest.java | 50 ++++++-
- 59 files changed, 1210 insertions(+), 79 deletions(-)
+ 59 files changed, 1198 insertions(+), 73 deletions(-)
diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
--- a/chrome/android/java/res/xml/privacy_preferences.xml
+++ b/chrome/android/java/res/xml/privacy_preferences.xml
-@@ -7,27 +7,57 @@
+@@ -7,6 +7,24 @@
xmlns:app="http://schemas.android.com/apk/res-auto">
-
-+
-+
-+
-+
-+
--
-
-
-+
-
-+
- {
-- PreferencesLauncher.launchSettingsPageCompat(getActivity(),
-- SyncAndServicesPreferences.class,
+- PreferencesLauncher.launchSettingsPage(getActivity(), SyncAndServicesPreferences.class,
- SyncAndServicesPreferences.createArguments(false));
- });
- syncAndServicesLink.setSummary(
@@ -220,12 +209,10 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/pri
+ preferenceScreen.addPreference(networkPredictionPref);
+
+ Preference syncAndServicesLink = findPreference(PREF_SYNC_AND_SERVICES_LINK);
-+ NoUnderlineClickableSpan linkSpan =
-+ new NoUnderlineClickableSpan(getResources(), view -> {
-+ PreferencesLauncher.launchSettingsPage(getActivity(),
-+ SyncAndServicesPreferences.class,
-+ SyncAndServicesPreferences.createArguments(false));
-+ });
++ NoUnderlineClickableSpan linkSpan = new NoUnderlineClickableSpan(getResources(), view -> {
++ PreferencesLauncher.launchSettingsPage(getActivity(), SyncAndServicesPreferences.class,
++ SyncAndServicesPreferences.createArguments(false));
++ });
+ syncAndServicesLink.setSummary(
+ SpanApplier.applySpans(getString(R.string.privacy_sync_and_services_link),
+ new SpanApplier.SpanInfo("", "", linkSpan)));
@@ -236,13 +223,13 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/pri
+ preferenceScreen.removePreference(findPreference(PREF_SYNC_AND_SERVICES_LINK_DIVIDER));
+ preferenceScreen.removePreference(findPreference(PREF_SYNC_AND_SERVICES_LINK));
+
-+ ChromeBaseCheckBoxPreferenceCompat navigationErrorPref =
-+ (ChromeBaseCheckBoxPreferenceCompat) findPreference(PREF_NAVIGATION_ERROR);
++ ChromeBaseCheckBoxPreference navigationErrorPref =
++ (ChromeBaseCheckBoxPreference) findPreference(PREF_NAVIGATION_ERROR);
+ navigationErrorPref.setOnPreferenceChangeListener(this);
+ navigationErrorPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
+
-+ ChromeBaseCheckBoxPreferenceCompat searchSuggestionsPref =
-+ (ChromeBaseCheckBoxPreferenceCompat) findPreference(PREF_SEARCH_SUGGESTIONS);
++ ChromeBaseCheckBoxPreference searchSuggestionsPref =
++ (ChromeBaseCheckBoxPreference) findPreference(PREF_SEARCH_SUGGESTIONS);
+ searchSuggestionsPref.setOnPreferenceChangeListener(this);
+ searchSuggestionsPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
+
@@ -251,20 +238,21 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/pri
+ }
+
+ // Listen to changes to the Extended Reporting pref.
-+ ChromeBaseCheckBoxPreferenceCompat scoutReportingPref =
-+ (ChromeBaseCheckBoxPreferenceCompat) findPreference(
++ ChromeBaseCheckBoxPreference scoutReportingPref =
++ (ChromeBaseCheckBoxPreference) findPreference(
+ PREF_SAFE_BROWSING_SCOUT_REPORTING);
+ scoutReportingPref.setOnPreferenceChangeListener(this);
+ scoutReportingPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
+
-+ ChromeBaseCheckBoxPreferenceCompat safeBrowsingPref =
-+ (ChromeBaseCheckBoxPreferenceCompat) findPreference(PREF_SAFE_BROWSING);
++ ChromeBaseCheckBoxPreference safeBrowsingPref =
++ (ChromeBaseCheckBoxPreference) findPreference(PREF_SAFE_BROWSING);
+ safeBrowsingPref.setOnPreferenceChangeListener(this);
+ safeBrowsingPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
updateSummaries();
- }
-@@ -78,11 +146,20 @@ public class PrivacyPreferences
+- }
++ }
+
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String key = preference.getKey();
@@ -282,13 +270,15 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/pri
PrefServiceBridge.getInstance().setNetworkPredictionEnabled((boolean) newValue);
+ } else if (PREF_NAVIGATION_ERROR.equals(key)) {
+ PrefServiceBridge.getInstance().setResolveNavigationErrorEnabled((boolean) newValue);
++ } else if (PREF_CONTEXTUAL_SEARCH.equals(key)) {
++ PrefServiceBridge.getInstance().setContextualSearchPreference(((boolean) newValue) ? "true" : "false");
+ } else if (PREF_CAN_MAKE_PAYMENT.equals(key)) {
+ PrefServiceBridge.getInstance().setBoolean(
+ Pref.CAN_MAKE_PAYMENT_ENABLED, (boolean) newValue);
}
return true;
-@@ -100,9 +177,37 @@ public class PrivacyPreferences
+@@ -99,9 +177,37 @@ public class PrivacyPreferences
public void updateSummaries() {
PrefServiceBridge prefServiceBridge = PrefServiceBridge.getInstance();
@@ -326,7 +316,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/pri
CheckBoxPreference canMakePaymentPref =
(CheckBoxPreference) findPreference(PREF_CAN_MAKE_PAYMENT);
if (canMakePaymentPref != null) {
-@@ -115,6 +220,19 @@ public class PrivacyPreferences
+@@ -114,6 +220,19 @@ public class PrivacyPreferences
doNotTrackPref.setSummary(prefServiceBridge.isDoNotTrackEnabled() ? textOn : textOff);
}
@@ -346,7 +336,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/pri
Preference usageStatsPref = findPreference(PREF_USAGE_STATS);
if (usageStatsPref != null) {
if (BuildInfo.isAtLeastQ() && prefServiceBridge.getBoolean(Pref.USAGE_STATS_ENABLED)) {
-@@ -139,6 +257,18 @@ public class PrivacyPreferences
+@@ -138,6 +257,18 @@ public class PrivacyPreferences
return preference -> {
String key = preference.getKey();
PrefServiceBridge prefs = PrefServiceBridge.getInstance();
@@ -368,15 +358,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/pri
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncPreferenceUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncPreferenceUtils.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncPreferenceUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncPreferenceUtils.java
-@@ -19,6 +19,7 @@ import org.chromium.base.BuildInfo;
- import org.chromium.base.metrics.RecordHistogram;
- import org.chromium.base.metrics.RecordUserAction;
- import org.chromium.chrome.R;
-+import org.chromium.chrome.browser.ChromeFeatureList;
- import org.chromium.chrome.browser.IntentHandler;
- import org.chromium.chrome.browser.LaunchIntentDispatcher;
- import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider;
-@@ -111,7 +112,10 @@ public class SyncPreferenceUtils {
+@@ -119,7 +119,10 @@ public class SyncPreferenceUtils {
if (profileSyncService.isPassphraseRequiredForDecryption()) {
return res.getString(R.string.sync_need_passphrase);
}
@@ -391,8 +373,8 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/syn
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
-@@ -7,11 +7,13 @@ package org.chromium.chrome.browser.sync;
- import android.content.ComponentName;
+@@ -6,11 +6,13 @@ package org.chromium.chrome.browser.sync;
+
import android.content.Context;
import android.content.Intent;
+import android.os.Bundle;
@@ -405,7 +387,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotifi
import org.chromium.chrome.browser.notifications.ChromeNotification;
import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder;
import org.chromium.chrome.browser.notifications.NotificationBuilderFactory;
-@@ -24,6 +26,7 @@ import org.chromium.chrome.browser.notifications.PendingIntentProvider;
+@@ -23,6 +25,7 @@ import org.chromium.chrome.browser.notifications.PendingIntentProvider;
import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions;
import org.chromium.chrome.browser.preferences.PreferencesLauncher;
import org.chromium.chrome.browser.preferences.sync.SyncAndServicesPreferences;
@@ -413,7 +395,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotifi
import org.chromium.chrome.browser.sync.GoogleServiceAuthError.State;
import org.chromium.chrome.browser.sync.ui.PassphraseActivity;
import org.chromium.components.sync.AndroidSyncSettings;
-@@ -146,9 +149,17 @@ public class SyncNotificationController implements ProfileSyncService.SyncStateC
+@@ -145,9 +148,17 @@ public class SyncNotificationController implements ProfileSyncService.SyncStateC
* @return the intent for opening the settings
*/
private Intent createSettingsIntent() {
@@ -437,7 +419,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotifi
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
-@@ -710,6 +710,18 @@ CHAR-LIMIT guidelines:
+@@ -728,6 +728,18 @@ CHAR-LIMIT guidelines:
Privacy
@@ -456,20 +438,7 @@ diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/and
Help improve Chrome security
-@@ -722,6 +734,12 @@ CHAR-LIMIT guidelines:
-
- Sends URLs of some pages you visit to Google, when your security is at risk
-
-+
-+ Use page predictions
-+
-+
-+ Preload pages for faster loading and offline reading
-+
-
- Tap to Search
-
-@@ -1488,6 +1506,9 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -1506,6 +1518,9 @@ Your Google account may have other forms of browsing history like searches and a
Signed in to Google as
@@ -482,7 +451,7 @@ diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/and
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@
ይህ ለሁሉም ጣቢያዎች ውሂብን ያጸዳል፣ የሚከተሉትን ጨምሮ፦ሁሉንም ትሮች ይዝጉአጠቃላይ
@@ -509,7 +478,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@
سيؤدي هذا إلى محو بيانات جميع المواقع، بما في ذلك:إغلاق جميع علامات التبويبعام
@@ -536,7 +505,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@
Това действие ще изчисти данните за всички сайтове, включително:Затваряне на всички разделиОбщи
@@ -563,7 +532,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
-@@ -1137,4 +1137,21 @@
+@@ -1143,4 +1143,21 @@
এটা সব সাইটের জন্য ডেটা সাফ করবে, এতে অন্তর্ভুক্ত আছে:সমস্ত ট্যাবগুলি বন্ধ করুনসাধারণ
@@ -590,7 +559,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bn.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
-@@ -1135,4 +1135,21 @@ El lloc web NO obté accés a la càmera. Només tu pots veure les imatges de la
+@@ -1141,4 +1141,21 @@ El lloc web NO obté accés a la càmera. Només tu pots veure les imatges de la
S'esborraran les dades de tots els llocs web, com ara:Tanca totes les pestanyesGeneral
@@ -617,7 +586,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
-@@ -1135,4 +1135,21 @@ Web NEZÍSKÁ přístup k fotoaparátu. Fotky z fotoaparátu uvidíte pouze vy
+@@ -1141,4 +1141,21 @@ Web NEZÍSKÁ přístup k fotoaparátu. Fotky z fotoaparátu uvidíte pouze vy
Tímto vymažete data všech webů včetně těchto:Zavřít všechny kartyVšeobecné
@@ -644,7 +613,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
-@@ -1135,4 +1135,21 @@ Websitet får IKKE adgang til kameraet. Kameraets billeder kan kun ses af dig.
+@@ -1141,4 +1141,21 @@ Websitet får IKKE adgang til kameraet. Kameraets billeder kan kun ses af dig.
Denne handling rydder dataene for alle websites, herunder:Luk alle fanerGenerelt
@@ -671,7 +640,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
-@@ -1135,4 +1135,21 @@ Die Website erhält KEINEN Zugriff auf die Kamera. Die Kamerabilder sind nur fü
+@@ -1141,4 +1141,21 @@ Die Website erhält KEINEN Zugriff auf die Kamera. Die Kamerabilder sind nur fü
Alle Daten für alle Websites werden gelöscht, darunter:Alle Tabs schließenAllgemein
@@ -698,7 +667,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@
Αυτή η ενέργεια θα εκκαθαρίσει τα δεδομένα για όλους τους ιστότοπους, όπως:Κλείσιμο όλων των καρτελώνΓενικά
@@ -725,7 +694,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
-@@ -1135,4 +1135,21 @@ The site does NOT gain access to the camera. The camera images are only visible
+@@ -1141,4 +1141,21 @@ The site does NOT gain access to the camera. The camera images are only visible
This will clear data for all sites, including:Close all tabsGeneral
@@ -752,7 +721,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
-@@ -1135,4 +1135,21 @@ El sitio NO podrá acceder a la cámara. Solo tú podrás ver las imágenes de l
+@@ -1141,4 +1141,21 @@ El sitio NO podrá acceder a la cámara. Solo tú podrás ver las imágenes de l
Esta acción borrará los datos de todos los sitios, entre los que se incluyen:Cerrar todas las pestañasGeneral
@@ -779,7 +748,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
-@@ -1135,4 +1135,21 @@ El sitio web no obtendrá acceso a la cámara. Solo tú puedes ver las imágenes
+@@ -1141,4 +1141,21 @@ El sitio web no obtendrá acceso a la cámara. Solo tú puedes ver las imágenes
Se borrarán los datos de todos los sitios web, incluidos:Cerrar todas las pestañasGeneral
@@ -806,7 +775,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
-@@ -1135,4 +1135,21 @@ Sait EI saa juurdepääsu kaamerale. Kaamera jäädvustatud pildid on nähtavad
+@@ -1141,4 +1141,21 @@ Sait EI saa juurdepääsu kaamerale. Kaamera jäädvustatud pildid on nähtavad
See kustutab kõikide saitide andmed, sealhulgas:Sule kõik vahelehedÜldine
@@ -833,7 +802,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_et.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@
با این کار دادههای همه سایتها پاک میشود، از جمله:بستن همه برگههاموارد کلی
@@ -860,7 +829,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
-@@ -1135,4 +1135,21 @@ Sivusto EI saa kameran käyttöoikeutta. Kamerakuvat näkyvät vain sinulle.Kaikkien sivustojen tiedot poistetaan, esimerkiksi:
Sulje kaikki välilehdetYleistä
@@ -887,7 +856,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
-@@ -1135,4 +1135,21 @@ HINDI magkakaroon ng access sa camera ang site. Ikaw lang ang makakakita ng mga
+@@ -1141,4 +1141,21 @@ HINDI magkakaroon ng access sa camera ang site. Ikaw lang ang makakakita ng mga
Iki-clear nito ang data para sa lahat ng site, kabilang ang:Isara ang lahat ng tabPangkalahatan
@@ -914,7 +883,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
-@@ -1135,4 +1135,21 @@ En revanche, le site n'a PAS accès à la caméra. Vous seul pouvez voir les ima
+@@ -1141,4 +1141,21 @@ En revanche, le site n'a PAS accès à la caméra. Vous seul pouvez voir les ima
Cette action entraînera la suppression des données pour tous les sites, y compris :Fermer tous les ongletsGénéral
@@ -941,7 +910,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@ VR મોડમાં દાખલ થતા પહેલા ખાતરી ક
આ બધી સાઇટ્સ પરથી ડેટા સાફ કરશે, આ સહિત:બધા ટેબ્સ બંધ કરોસામાન્ય
@@ -968,7 +937,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_gu.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@
इससे इन सभी साइटों का डेटा साफ़ हो जाएगा:सभी टैब बंद करेंसामान्य
@@ -995,7 +964,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
-@@ -1135,4 +1135,21 @@ Web-lokacija NE dobiva pristup fotoaparatu. Slike fotoaparata možete vidjeti sa
+@@ -1141,4 +1141,21 @@ Web-lokacija NE dobiva pristup fotoaparatu. Slike fotoaparata možete vidjeti sa
Izbrisat će se podaci za sve web-lokacije, uključujući:Zatvori sve karticeOpćenito
@@ -1022,7 +991,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
-@@ -1135,4 +1135,21 @@ A webhely NEM kap hozzáférést a kamerához. A kamera képét csak Ön láthat
+@@ -1141,4 +1141,21 @@ A webhely NEM kap hozzáférést a kamerához. A kamera képét csak Ön láthat
Ezzel törli az összes webhely adatait, beleértve a következőket:Az összes lap bezárásaÁltalános
@@ -1049,7 +1018,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
-@@ -1135,4 +1135,21 @@ Situs TIDAK mendapatkan akses ke kamera. Gambar kamera hanya dapat dilihat oleh
+@@ -1141,4 +1141,21 @@ Situs TIDAK mendapatkan akses ke kamera. Gambar kamera hanya dapat dilihat oleh
Tindakan ini akan menghapus data untuk semua situs, termasuk:Tutup semua tabUmum
@@ -1076,7 +1045,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
-@@ -1135,4 +1135,21 @@ Il sito NON ottiene l'accesso alla videocamera. Le immagini della videocamera so
+@@ -1141,4 +1141,21 @@ Il sito NON ottiene l'accesso alla videocamera. Le immagini della videocamera so
Questa operazione cancellerà i dati di tutti i siti, inclusi:Chiudi tutte le schedeGenerali
@@ -1103,7 +1072,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@
פעולה זו תמחק נתונים של כל האתרים, כולל:סגור את כל הכרטיסיותכללי
@@ -1130,7 +1099,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@ VR を開始する前に、信頼できるサイトかどうかを確認して
この操作を行うと、次を含むすべてのサイトのデータが削除されます。すべてのタブを閉じる全般
@@ -1157,7 +1126,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
-@@ -1136,4 +1136,21 @@
+@@ -1142,4 +1142,21 @@ VR ಗೆ ಪ್ರವೇಶಿಸುವ ಮೊದಲು ನೀವು ಈ ವೆ
ಇದು ಎಲ್ಲಾ ಸೈಟ್ಗಳಿಗೆ ಡೇಟಾ ತೆರವುಗೊಳಿಸುತ್ತದೆ, ಇವುಗಳನ್ನೂ ಒಳಗೊಂಡು:ಎಲ್ಲ ಟ್ಯಾಬ್ಗಳನ್ನು ಮುಚ್ಚಿಸಾಮಾನ್ಯ
@@ -1184,7 +1153,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_kn.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@ VR로 들어가기 전에 이 사이트를 신뢰할 수 있는지 확인하세
다음을 포함한 모든 사이트의 데이터가 삭제됩니다.탭 모두 닫기일반
@@ -1211,7 +1180,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
-@@ -1135,4 +1135,21 @@ Svetainė NETURI prieigos prie fotoaparato. Fotoaparato vaizdai matomi tik jums.
+@@ -1141,4 +1141,21 @@ Svetainė NETURI prieigos prie fotoaparato. Fotoaparato vaizdai matomi tik jums.
Bus išvalyti visų svetainių duomenys, įskaitant:Uždar. visų skirtukų lapusBendra
@@ -1238,7 +1207,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
-@@ -1135,4 +1135,21 @@ Vietnei NAV piekļuves kamerai. Kameras attēli ir redzami tikai jums.Tādējādi tiks dzēsti dati no visām vietnēm, tostarp:
Aizvērt visas cilnesVispārīgi
@@ -1265,7 +1234,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@ VR-ൽ പ്രവേശിക്കുന്നതിന് മുമ്പ്
ഇത് ഇനിപ്പറയുന്നവ ഉൾപ്പെടെയുള്ള എല്ലാ സൈറ്റുകളുടെയും വിവരങ്ങൾ മായ്ക്കുന്നതിനിടയാക്കും:എല്ലാ ടാബുകളും അടയ്ക്കുകപൊതുവായ
@@ -1292,7 +1261,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ml.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@ VR मध्ये एंटर करण्यापूर्वी तुम
हे यासह सर्व साइटसाठी डेटा साफ करेल:सर्व टॅब बंद करासामान्य
@@ -1319,7 +1288,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_mr.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
-@@ -1135,4 +1135,21 @@ Tapak TIDAK memperoleh akses kepada kamera. Hanya anda dapat melihat imej kamera
+@@ -1141,4 +1141,21 @@ Tapak TIDAK memperoleh akses kepada kamera. Hanya anda dapat melihat imej kamera
Ini akan memadamkan data untuk semua tapak web, termasuk:Tutup semua tabUmum
@@ -1346,7 +1315,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ms.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
-@@ -1135,4 +1135,21 @@ De site krijgt GEEN toegang tot de camera. De camerabeelden zijn alleen zichtbaa
+@@ -1141,4 +1141,21 @@ De site krijgt GEEN toegang tot de camera. De camerabeelden zijn alleen zichtbaa
Hiermee worden de gegevens voor alle sites gewist, inclusief:Alle tabbladen sluitenAlgemeen
@@ -1373,7 +1342,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
-@@ -1135,4 +1135,21 @@ Nettstedet får IKKE tilgang til kameraet. Kamerabildene er kun synlige for deg.
+@@ -1141,4 +1141,21 @@ Nettstedet får IKKE tilgang til kameraet. Kamerabildene er kun synlige for deg.
Dette fører til at dataene for alle nettsteder slettes, deriblant disse:Lukk alle fanerGenerelt
@@ -1400,7 +1369,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
-@@ -1135,4 +1135,21 @@ Witryna NIE uzyskuje dostępu do kamery. Tylko Ty widzisz rejestrowany obraz.Spowoduje to usunięcie danych wszystkich witryn, w tym:
Zamknij wszystkie kartyOgólne
@@ -1427,7 +1396,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
-@@ -1136,4 +1136,21 @@ O site NÃO terá acesso à câmera. As imagens da câmera são visíveis apenas
+@@ -1142,4 +1142,21 @@ O site NÃO terá acesso à câmera. As imagens da câmera são visíveis apenas
Essa ação limpará os dados de todos os sites, incluindo:Fechar todas as guiasGeral
@@ -1454,7 +1423,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
-@@ -1135,4 +1135,21 @@ O site NÃO fica com acesso à câmara. As imagens da câmara estão visíveis a
+@@ -1141,4 +1141,21 @@ O site NÃO fica com acesso à câmara. As imagens da câmara estão visíveis a
Esta ação limpa os dados de todos os sites, incluindo:Fechar todos os separadoresGeral
@@ -1481,7 +1450,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
-@@ -1135,4 +1135,21 @@ Acest site NU primește acces la cameră. Imaginile camerei sunt vizibile doar p
+@@ -1141,4 +1141,21 @@ Acest site NU primește acces la cameră. Imaginile camerei sunt vizibile doar p
Astfel, se vor șterge datele pentru toate site-urile, inclusiv:Închide toate fileleGeneral
@@ -1508,7 +1477,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@
Будут удалены данные всех сайтов, в том числе:Закрыть все вкладкиОбщие
@@ -1535,7 +1504,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
-@@ -1135,4 +1135,21 @@ Web NEZÍSKA prístup k fotoaparátu. Obrázky fotoaparátu sú viditeľné iba
+@@ -1141,4 +1141,21 @@ Web NEZÍSKA prístup k fotoaparátu. Obrázky fotoaparátu sú viditeľné iba
Vymažete dáta všetkých webov vrátane týchto:Zavrieť všetky kartyVšeobecné
@@ -1562,7 +1531,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
-@@ -1135,4 +1135,21 @@ Spletno mesto NIMA dostopa do kamere. Posnetki kamere so vidni samo vam.S tem bodo izbrisani podatki za vsa spletna mesta, vključno s temi:
Zapri vse zavihkeSplošno
@@ -1589,7 +1558,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
-@@ -1135,4 +1135,21 @@ Google налог можда има друге облике историје п
+@@ -1141,4 +1141,21 @@ Google налог можда има друге облике историје п
Овим бришете податке за све сајтове, укључујући:Затвори све картицеОпште
@@ -1616,7 +1585,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
-@@ -1135,4 +1135,21 @@ Webbplatsen får INTE tillgång till kameran. Bara du kan se kamerabilderna.Åtgärden raderar data för alla webbplatser, inklusive:
Stäng alla flikarAllmänt
@@ -1643,7 +1612,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
-@@ -1134,4 +1134,21 @@ Tovuti hii HAIPATI idhini ya kufikia kamera. Ni wewe pekee utaona picha hizi za
+@@ -1139,4 +1139,21 @@ Tovuti hii HAIPATI idhini ya kufikia kamera. Ni wewe pekee utaona picha hizi za
Hatua hii itafuta data ya tovuti zote, ikiwa ni pamoja na:Funga vichupo vyoteJumla
@@ -1670,7 +1639,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@ VRரைத் தொடங்குவதற்கு முன் இது
இதனால் எல்லா தளங்களுக்கான தரவும் அழிக்கப்படும், இதில் அடங்குபவை:எல்லா தாவல்களையும் மூடுபொது
@@ -1697,7 +1666,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ta.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@ VRలోకి ప్రవేశించడానికి ముందు,
ఇది వీటితో సహా అన్ని సైట్ల డేటాను తీసివేస్తుంది:అన్ని ట్యాబ్లను మూసివేయిసాధారణం
@@ -1724,7 +1693,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_te.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@
การดำเนินการนี้จะล้างข้อมูลสำหรับทุกเว็บไซต์ รวมถึงปิดแท็บทั้งหมดทั่วไป
@@ -1751,7 +1720,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
-@@ -1135,4 +1135,21 @@ Site kameraya ERİŞMEZ. Kamera görüntülerini yalnızca siz görebilirsiniz.<
+@@ -1141,4 +1141,21 @@ Site kameraya ERİŞMEZ. Kamera görüntülerini yalnızca siz görebilirsiniz.<
Bu işlem, aşağıdakiler de dahil olmak üzere tüm sitelere ilişkin verileri temizleyecek:Tüm sekmeleri kapatGenel
@@ -1778,7 +1747,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@
Буде видалено дані всіх сайтів, зокрема:Закрити всі вкладкиЗагальне
@@ -1805,7 +1774,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
-@@ -1135,4 +1135,21 @@ Trang web này KHÔNG có quyền truy cập vào máy ảnh. Chỉ bạn mới
+@@ -1141,4 +1141,21 @@ Trang web này KHÔNG có quyền truy cập vào máy ảnh. Chỉ bạn mới
Thao tác này sẽ xóa dữ liệu của tất cả các trang web, bao gồm:Đóng tất cả các tabChung
@@ -1832,7 +1801,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@
这会清除所有网站的数据,包括:关闭所有标签页常规
@@ -1859,7 +1828,7 @@ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
-@@ -1135,4 +1135,21 @@
+@@ -1141,4 +1141,21 @@
這會清除所有網站的資料,包括:關閉所有分頁一般
diff --git a/build/patches/Revert-flags-remove-disable-pull-to-refresh-effect.patch b/build/patches/Revert-flags-remove-disable-pull-to-refresh-effect.patch
new file mode 100644
index 0000000000000000000000000000000000000000..c6271d655dad2332df09dc981a0f176e80cd0017
--- /dev/null
+++ b/build/patches/Revert-flags-remove-disable-pull-to-refresh-effect.patch
@@ -0,0 +1,71 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Mon, 2 Dec 2019 21:15:32 +0100
+Subject: Revert "flags: remove disable-pull-to-refresh-effect"
+
+This reverts commit 4e598f38a0e6dd3dbede009c6a99b2a520a94e1f.
+---
+ chrome/browser/about_flags.cc | 4 ++++
+ chrome/browser/flag-metadata.json | 5 +++++
+ chrome/browser/flag_descriptions.cc | 4 ++++
+ chrome/browser/flag_descriptions.h | 3 +++
+ 4 files changed, 16 insertions(+)
+
+diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
+--- a/chrome/browser/about_flags.cc
++++ b/chrome/browser/about_flags.cc
+@@ -1927,6 +1927,10 @@ const FeatureEntry kFeatureEntries[] = {
+ SINGLE_VALUE_TYPE(switches::kHostedAppQuitNotification)},
+ #endif // OS_MACOSX
+ #if defined(OS_ANDROID)
++ {"disable-pull-to-refresh-effect",
++ flag_descriptions::kPullToRefreshEffectName,
++ flag_descriptions::kPullToRefreshEffectDescription, kOsAndroid,
++ SINGLE_DISABLE_VALUE_TYPE(switches::kDisablePullToRefreshEffect)},
+ {"translate-force-trigger-on-english",
+ flag_descriptions::kTranslateForceTriggerOnEnglishName,
+ flag_descriptions::kTranslateForceTriggerOnEnglishDescription, kOsAndroid,
+diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
+--- a/chrome/browser/flag-metadata.json
++++ b/chrome/browser/flag-metadata.json
+@@ -681,6 +681,11 @@
+ "expiry_milestone": 83
+ },
+ {
++ "name": "disable-pull-to-refresh-effect",
++ // "owners": [ "your-team" ],
++ "expiry_milestone": -1
++ },
++ {
+ // See https://crbug.com/882238.
+ "name": "disable-pushstate-throttle",
+ "owners": [ "arthursonzogni@chromium.org", "palmer@chromium.org" ],
+diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
+--- a/chrome/browser/flag_descriptions.cc
++++ b/chrome/browser/flag_descriptions.cc
+@@ -2679,6 +2679,10 @@ extern const char kProcessSharingWithStrictSiteInstancesDescription[] =
+ "separated like strict site isolation, but process selection puts multiple "
+ "site instances in a single process.";
+
++const char kPullToRefreshEffectName[] = "The pull-to-refresh effect";
++const char kPullToRefreshEffectDescription[] =
++ "Page reloads triggered by vertically overscrolling content.";
++
+ const char kReaderModeHeuristicsName[] = "Reader Mode triggering";
+ const char kReaderModeHeuristicsDescription[] =
+ "Determines what pages the Reader Mode infobar is shown on.";
+diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
+--- a/chrome/browser/flag_descriptions.h
++++ b/chrome/browser/flag_descriptions.h
+@@ -1583,6 +1583,9 @@ extern const char kProcessSharingWithDefaultSiteInstancesDescription[];
+ extern const char kProcessSharingWithStrictSiteInstancesName[];
+ extern const char kProcessSharingWithStrictSiteInstancesDescription[];
+
++extern const char kPullToRefreshEffectName[];
++extern const char kPullToRefreshEffectDescription[];
++
+ extern const char kReaderModeHeuristicsName[];
+ extern const char kReaderModeHeuristicsDescription[];
+ extern const char kReaderModeHeuristicsMarkup[];
+--
+2.11.0
+
diff --git a/build/patches/Skip-the-first-run-and-metrics.patch b/build/patches/Skip-the-first-run-and-metrics.patch
index 07c72986bd77558fee2e8944834cf203abed9785..963cf5743bfec5f36f6ad166421639089b9a2e00 100644
--- a/build/patches/Skip-the-first-run-and-metrics.patch
+++ b/build/patches/Skip-the-first-run-and-metrics.patch
@@ -30,7 +30,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstR
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunUtils.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunUtils.java
-@@ -30,16 +30,12 @@ public class FirstRunUtils {
+@@ -28,16 +28,12 @@ public class FirstRunUtils {
// - checkAnyUserHasSeenToS() may be true which needs to sync its state to the prefs.
boolean javaPrefValue = javaPrefs.getBoolean(CACHED_TOS_ACCEPTED_PREF, false);
boolean nativePrefValue = prefsBridge.isFirstRunEulaAccepted();
diff --git a/build/patches/Switch-to-fstack-protector-strong.patch b/build/patches/Switch-to-fstack-protector-strong.patch
index 493d52c87a9ecbab04f004f1534812bebcae9968..96d2d32dd7d8b3d264de8f583e695acc20fdd7df 100644
--- a/build/patches/Switch-to-fstack-protector-strong.patch
+++ b/build/patches/Switch-to-fstack-protector-strong.patch
@@ -16,7 +16,7 @@ higher memory/cache usage but not by the full 2-3%.
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
-@@ -279,16 +279,12 @@ config("compiler") {
+@@ -273,16 +273,12 @@ config("compiler") {
cflags += [ "-fstack-protector" ]
}
} else if ((is_posix && !is_chromeos && !is_nacl) || is_fuchsia) {
diff --git a/build/patches/Use-4-tile-rows-never-show-logo.patch b/build/patches/Use-4-tile-rows-never-show-logo.patch
index 43d4c1282e4cb168530ea70cae1763b71a44bfe6..a9cd70f4d350955a93a6fb8138c44936d0fdf7a1 100644
--- a/build/patches/Use-4-tile-rows-never-show-logo.patch
+++ b/build/patches/Use-4-tile-rows-never-show-logo.patch
@@ -13,7 +13,7 @@ Subject: Use 4 tile rows, never show logo
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
-@@ -117,7 +117,7 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer
+@@ -110,7 +110,7 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer
/** Observer for overview mode. */
private EmptyOverviewModeObserver mOverviewObserver;
@@ -22,7 +22,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageL
private boolean mSearchProviderIsGoogle;
private boolean mInitialized;
-@@ -546,7 +546,7 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer
+@@ -538,7 +538,7 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer
&& mInitialized) {
return;
}
@@ -31,7 +31,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageL
mSearchProviderIsGoogle = isGoogle;
updateTileGridPadding();
-@@ -838,7 +838,7 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer
+@@ -822,7 +822,7 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer
}
private static int getMaxTileRows() {
@@ -79,7 +79,7 @@ diff --git a/chrome/browser/engagement/important_sites_util.cc b/chrome/browser/
diff --git a/components/history/core/browser/top_sites_impl.h b/components/history/core/browser/top_sites_impl.h
--- a/components/history/core/browser/top_sites_impl.h
+++ b/components/history/core/browser/top_sites_impl.h
-@@ -54,7 +54,7 @@ class TopSitesImpl : public TopSites, public HistoryServiceObserver {
+@@ -48,7 +48,7 @@ class TopSitesImpl : public TopSites, public HistoryServiceObserver {
using CanAddURLToHistoryFn = base::Callback;
// How many top sites to store in the cache.
diff --git a/build/patches/User-Agent-anonymize.patch b/build/patches/User-Agent-anonymize.patch
index 4cd33523aa5e635848452bc8b0bd995e45bf7d02..7b91240b751cdcb1c6fda14a84d2ddf4269a3d45 100644
--- a/build/patches/User-Agent-anonymize.patch
+++ b/build/patches/User-Agent-anonymize.patch
@@ -12,13 +12,13 @@ disclosing the specific build of Bromite.
diff --git a/components/version_info/version_info.cc b/components/version_info/version_info.cc
--- a/components/version_info/version_info.cc
+++ b/components/version_info/version_info.cc
-@@ -15,7 +15,8 @@
+@@ -16,7 +16,8 @@
namespace version_info {
std::string GetProductNameAndVersionForUserAgent() {
- return "Chrome/" + GetVersionNumber();
-+ // a common version for Android 8.0.0
-+ return "Chrome/74.0.3729.157";
++ // latest stable version
++ return "Chrome/78.0.3904.108";
}
std::string GetProductName() {
@@ -30,7 +30,7 @@ diff --git a/content/common/user_agent.cc b/content/common/user_agent.cc
}
#elif defined(OS_ANDROID)
- std::string android_version_str = base::SysInfo::OperatingSystemVersion();
-+ std::string android_version_str = "8.0.0";
++ std::string android_version_str = "9.0.0";
std::string android_info_str = GetAndroidOSInfo(include_android_build_number);
#elif defined(OS_POSIX) && !defined(OS_MACOSX)
// Should work on any Posix system.
@@ -49,7 +49,7 @@ diff --git a/content/common/user_agent.cc b/content/common/user_agent.cc
- semicolon_inserted = true;
- }
+ // Send spoofed information about the device.
-+ std::string android_info_str = "; SM-G960F";
++ std::string android_info_str = "; SM-G955U";
+ bool semicolon_inserted = true;
// Append the build ID.
diff --git a/build/patches/autofill-disable-autofill-download-manager.patch b/build/patches/autofill-disable-autofill-download-manager.patch
index d059bd5849af437cb80ec8b982e1f560165ffb76..25595cf67251a1feaceb6f9b51be108054d08a0e 100644
--- a/build/patches/autofill-disable-autofill-download-manager.patch
+++ b/build/patches/autofill-disable-autofill-download-manager.patch
@@ -11,7 +11,7 @@ Disables the autofill download manager (trk:158).
diff --git a/components/autofill/core/browser/autofill_download_manager.cc b/components/autofill/core/browser/autofill_download_manager.cc
--- a/components/autofill/core/browser/autofill_download_manager.cc
+++ b/components/autofill/core/browser/autofill_download_manager.cc
-@@ -58,7 +58,6 @@ constexpr std::pair kAutofillExperimentRanges[] = {
+@@ -63,7 +63,6 @@ constexpr std::pair kAutofillExperimentRanges[] = {
{3314445, 3314448}, {3314854, 3314883},
};
@@ -19,7 +19,7 @@ diff --git a/components/autofill/core/browser/autofill_download_manager.cc b/com
const size_t kAutofillDownloadManagerMaxFormCacheSize = 16;
const size_t kMaxFieldsPerQueryRequest = 100;
-@@ -446,35 +445,6 @@ bool GetUploadPayloadForApi(const AutofillUploadContents& upload,
+@@ -519,35 +518,6 @@ bool GetUploadPayloadForApi(const AutofillUploadContents& upload,
return upload_request.SerializeToString(payload);
}
@@ -55,7 +55,7 @@ diff --git a/components/autofill/core/browser/autofill_download_manager.cc b/com
// Gets HTTP body payload for API POST request.
bool GetAPIBodyPayload(const std::string& payload,
AutofillDownloadManager::RequestType type,
-@@ -680,6 +650,7 @@ size_t AutofillDownloadManager::GetPayloadLength(
+@@ -771,6 +741,7 @@ size_t AutofillDownloadManager::GetPayloadLength(
std::tuple AutofillDownloadManager::GetRequestURLAndMethod(
const FormRequestData& request_data) const {
@@ -63,7 +63,7 @@ diff --git a/components/autofill/core/browser/autofill_download_manager.cc b/com
std::string method("POST");
std::string query_str;
-@@ -702,35 +673,18 @@ std::tuple AutofillDownloadManager::GetRequestURLAndMethod(
+@@ -793,35 +764,18 @@ std::tuple AutofillDownloadManager::GetRequestURLAndMethod(
GURL url = autofill_server_url_
.Resolve(RequestTypeToString(request_data.request_type))
.ReplaceComponents(replacements);
@@ -108,7 +108,7 @@ diff --git a/components/autofill/core/browser/autofill_download_manager.cc b/com
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc
--- a/components/autofill/core/browser/autofill_manager.cc
+++ b/components/autofill/core/browser/autofill_manager.cc
-@@ -181,19 +181,6 @@ void LogDeveloperEngagementUkm(ukm::UkmRecorder* ukm_recorder,
+@@ -180,19 +180,6 @@ void LogDeveloperEngagementUkm(ukm::UkmRecorder* ukm_recorder,
}
}
@@ -128,14 +128,14 @@ diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/a
ValuePatternsMetric GetValuePattern(const base::string16& value) {
if (IsUPIVirtualPaymentAddress(value))
return ValuePatternsMetric::kUpiVpa;
-@@ -1360,11 +1347,6 @@ AutofillManager::AutofillManager(
- is_rich_query_enabled_(IsRichQueryEnabled(client->GetChannel())) {
- DCHECK(driver);
- DCHECK(client_);
+@@ -1478,11 +1465,6 @@ AutofillManager::AutofillManager(
+ : std::make_unique(
+ driver, client_, personal_data_,
+ credit_card_form_event_logger_.get());
- if (enable_download_manager == ENABLE_AUTOFILL_DOWNLOAD_MANAGER) {
- version_info::Channel channel = client_->GetChannel();
-- download_manager_.reset(
-- new AutofillDownloadManager(driver, this, GetAPIKeyForUrl(channel)));
+- download_manager_.reset(new AutofillDownloadManager(
+- driver, this, GetAPIKeyForUrl(channel), client_->GetLogManager()));
- }
CountryNames::SetLocaleString(app_locale_);
}
diff --git a/build/patches/build-remove-calling-untrusted-hooks.patch b/build/patches/build-remove-calling-untrusted-hooks.patch
index 9a51524ec8657b800247f3b173ea0d24cac38dd7..94a48c3589fc394693b4e39853687f2d2df0a2be 100644
--- a/build/patches/build-remove-calling-untrusted-hooks.patch
+++ b/build/patches/build-remove-calling-untrusted-hooks.patch
@@ -20,9 +20,9 @@ diff --git a/DEPS b/DEPS
# By default, do not check out src-internal. This can be overridden e.g. with
# custom_vars.
-@@ -97,8 +97,8 @@ vars = {
- # By default do not checkout the OpenXR loader library.
- 'checkout_openxr' : False,
+@@ -99,8 +99,8 @@ vars = {
+ # support for other platforms may be added in the future.
+ 'checkout_openxr' : 'checkout_win',
- 'checkout_traffic_annotation_tools': 'checkout_configuration != "small"',
- 'checkout_instrumented_libraries': 'checkout_linux and checkout_configuration != "small"',
@@ -31,7 +31,7 @@ diff --git a/DEPS b/DEPS
# By default, do not check out WebKit for iOS, as it is not needed unless
# running against ToT WebKit rather than system WebKit. This can be overridden
-@@ -2323,49 +2323,6 @@ hooks = [
+@@ -3055,49 +3055,6 @@ hooks = [
],
},
{
@@ -81,8 +81,8 @@ diff --git a/DEPS b/DEPS
# Case-insensitivity for the Win SDK. Must run before win_toolchain below.
'name': 'ciopfs_linux',
'pattern': '.',
-@@ -2392,43 +2349,6 @@ hooks = [
- 'condition': 'checkout_ios or checkout_mac',
+@@ -3124,43 +3081,6 @@ hooks = [
+ 'condition': 'checkout_mac',
'action': ['python', 'src/build/mac_toolchain.py'],
},
- # Pull binutils for linux, enabled debug fission for faster linking /
@@ -125,7 +125,7 @@ diff --git a/DEPS b/DEPS
{
# Mac doesn't use lld so it's not included in the default clang bundle
# there. lld is however needed in win and Fuchsia cross builds, so
-@@ -2488,18 +2408,6 @@ hooks = [
+@@ -3220,18 +3140,6 @@ hooks = [
'-s', 'src/buildtools/mac/clang-format.sha1',
],
},
@@ -144,7 +144,7 @@ diff --git a/DEPS b/DEPS
# Pull rc binaries using checked-in hashes.
{
'name': 'rc_win',
-@@ -2525,29 +2433,6 @@ hooks = [
+@@ -3257,29 +3165,6 @@ hooks = [
'-s', 'src/build/toolchain/win/rc/mac/rc.sha1',
],
},
diff --git a/build/patches/disable-AdsBlockedInfoBar.patch b/build/patches/disable-AdsBlockedInfoBar.patch
index 9c307947ff2d6564e0f97dedaa6840cac8d7f2e3..a011b5b3727e8f8cc99ec040d0efea6d4cf0f0d0 100644
--- a/build/patches/disable-AdsBlockedInfoBar.patch
+++ b/build/patches/disable-AdsBlockedInfoBar.patch
@@ -9,7 +9,7 @@ Subject: disable AdsBlockedInfoBar
diff --git a/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc b/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc
--- a/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc
+++ b/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc
-@@ -147,11 +147,6 @@ void ChromeSubresourceFilterClient::LogAction(SubresourceFilterAction action) {
+@@ -148,11 +148,6 @@ void ChromeSubresourceFilterClient::LogAction(SubresourceFilterAction action) {
}
void ChromeSubresourceFilterClient::ShowUI(const GURL& url) {
diff --git a/build/patches/disable-background-sync-by-default.patch b/build/patches/disable-background-sync-by-default.patch
index 945baecf95e913b5b70ea3b5f403d3760159db2f..6542a2520d77e4daafc4a55daef31b766c681713 100644
--- a/build/patches/disable-background-sync-by-default.patch
+++ b/build/patches/disable-background-sync-by-default.patch
@@ -9,7 +9,7 @@ Subject: disable background sync by default
diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc
--- a/components/content_settings/core/browser/content_settings_registry.cc
+++ b/components/content_settings/core/browser/content_settings_registry.cc
-@@ -308,7 +308,7 @@ void ContentSettingsRegistry::Init() {
+@@ -309,7 +309,7 @@ void ContentSettingsRegistry::Init() {
ContentSettingsInfo::EXCEPTIONS_ON_SECURE_ORIGINS_ONLY);
Register(CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC, "background-sync",
diff --git a/build/patches/disable-sensors-access-site-setting-by-default.patch b/build/patches/disable-sensors-access-site-setting-by-default.patch
index a6d85c77886e9699b2a9125a078d331cb6f2f965..aecf09455bcaf91fc9bf73c2b9f25aa05cf74374 100644
--- a/build/patches/disable-sensors-access-site-setting-by-default.patch
+++ b/build/patches/disable-sensors-access-site-setting-by-default.patch
@@ -9,7 +9,7 @@ Subject: disable sensors access site setting by default
diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc
--- a/components/content_settings/core/browser/content_settings_registry.cc
+++ b/components/content_settings/core/browser/content_settings_registry.cc
-@@ -408,7 +408,7 @@ void ContentSettingsRegistry::Init() {
+@@ -412,7 +412,7 @@ void ContentSettingsRegistry::Init() {
// TODO(crbug.com/904439): Update this to "SECURE_ONLY" once
// DeviceOrientationEvents and DeviceMotionEvents are only fired in secure
// contexts.
diff --git a/build/patches/dns-send-IPv6-connectivity-probes-to-RIPE-DNS.patch b/build/patches/dns-send-IPv6-connectivity-probes-to-RIPE-DNS.patch
index ba691b4fba48bdb265d8eb40a6a5162e0e0e8dd9..ce969d73968650a76af2f4a425e807f3d686af87 100644
--- a/build/patches/dns-send-IPv6-connectivity-probes-to-RIPE-DNS.patch
+++ b/build/patches/dns-send-IPv6-connectivity-probes-to-RIPE-DNS.patch
@@ -13,7 +13,7 @@ Increase probe period from 1s to 15s
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc
--- a/net/dns/host_resolver_manager.cc
+++ b/net/dns/host_resolver_manager.cc
-@@ -120,12 +120,12 @@ const unsigned kMinimumTTLSeconds = kCacheEntryTTLSeconds;
+@@ -121,12 +121,12 @@ const unsigned kMinimumTTLSeconds = kCacheEntryTTLSeconds;
// Time between IPv6 probes, i.e. for how long results of each IPv6 probe are
// cached.
diff --git a/build/patches/e-disable-autofill.patch b/build/patches/e-disable-autofill.patch
index 32d55424ebd463882339bf357ff48aaafdff7954..b7b9a42c6dd3f02371a4bc9afdd4420db7df63f6 100644
--- a/build/patches/e-disable-autofill.patch
+++ b/build/patches/e-disable-autofill.patch
@@ -1,7 +1,7 @@
-From b6c3fcef19cb14d0fd00a60bf76e4a79f1612614 Mon Sep 17 00:00:00 2001
+From ed623302a6b91263ea23f73b8e1d464cbb8eae74 Mon Sep 17 00:00:00 2001
From: root
Date: Mon, 11 Feb 2019 11:59:35 +0100
-Subject: [PATCH] Disable Google Assistant in Chrome
+Subject: [PATCH 3/7] Disable Google Assistant in Chrome
---
chrome/android/java/res/xml/main_preferences.xml | 5 -----
@@ -10,23 +10,23 @@ Subject: [PATCH] Disable Google Assistant in Chrome
3 files changed, 2 insertions(+), 7 deletions(-)
diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml
-index 3f61c2cdefa7..d1e9c2efeed0 100644
+index 55806c223988..7b035bae9799 100644
--- a/chrome/android/java/res/xml/main_preferences.xml
+++ b/chrome/android/java/res/xml/main_preferences.xml
@@ -30,11 +30,6 @@
android:key="autofill_addresses"
android:order="7"
android:title="@string/autofill_addresses_settings_title"/>
--
-
Date: Fri, 10 May 2019 00:12:37 +0530
-Subject: [PATCH] Enable custom tabs by default
+Subject: [PATCH 6/7] Enable custom tabs by default
Signed-off-by: Sumit Pundir
---
- chrome/android/java/res/xml/privacy_preferences.xml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ chrome/android/java/res/xml/privacy_preferences.xml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
-index 132aef01a051..ccb47c09459d 100644
+index 7649427ff6b4..4ee4daad7b38 100644
--- a/chrome/android/java/res/xml/privacy_preferences.xml
+++ b/chrome/android/java/res/xml/privacy_preferences.xml
-@@ -36,7 +36,7 @@
+@@ -37,7 +37,7 @@
android:key="allow_custom_tab_intents"
android:title="@string/allow_custom_tab_intents_title"
android:summary="@string/allow_custom_tab_intents_summary"
- android:defaultValue="false" />
+ android:defaultValue="true" />
++ android:fragment="org.chromium.chrome.browser.preferences.privacy.ClearBrowsingDataTabsFragment"
+ app:allowDividerBelow="false" />
+
--
-2.17.1
+2.23.0
diff --git a/build/patches/e-fix-settings-crash-issue.patch b/build/patches/e-fix-settings-crash-issue.patch
index c09d6d0a30ea25099c8afe94409c72403eff25d4..7e1f363a003ba804c307ab03ba45a0d0ed42d139 100644
--- a/build/patches/e-fix-settings-crash-issue.patch
+++ b/build/patches/e-fix-settings-crash-issue.patch
@@ -1,32 +1,31 @@
-From 577d0e90a8447319238c9e318099d32175a8ab3a Mon Sep 17 00:00:00 2001
+From a242281dd6e239c6d623dd9d122f739d33968bc5 Mon Sep 17 00:00:00 2001
From: Sumit Pundir
Date: Wed, 8 May 2019 20:03:02 +0530
-Subject: [PATCH] Fix settings crash
+Subject: [PATCH 5/7] Fix settings crash
Partial revert of build/patches/e-disable-autofill.patch
Signed-off-by: Sumit Pundir
---
- chrome/android/java/res/xml/main_preferences.xml | 7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
+ chrome/android/java/res/xml/main_preferences.xml | 5 +++++
+ 1 file changed, 5 insertions(+)
diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml
-index d1e9c2efeed0..6cd0ba9a0dff 100644
+index 7b035bae9799..55806c223988 100644
--- a/chrome/android/java/res/xml/main_preferences.xml
+++ b/chrome/android/java/res/xml/main_preferences.xml
-@@ -29,7 +29,12 @@
- android:fragment="org.chromium.chrome.browser.preferences.autofill.AutofillProfilesFragment"
+@@ -30,6 +30,11 @@
android:key="autofill_addresses"
android:order="7"
-- android:title="@string/autofill_addresses_settings_title"/>
-+ android:title="@string/autofill_addresses_settings_title"/>
-+
++
-
Date: Tue, 16 Apr 2019 22:46:24 +0200
-Subject: [PATCH] remove google
+Subject: [PATCH 4/7] remove google
---
- .../java/strings/translations/android_chrome_strings_am.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_ar.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_bg.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_bn.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_ca.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_cs.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_da.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_de.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_el.xtb | 2 +-
- .../strings/translations/android_chrome_strings_en-GB.xtb | 2 +-
- .../strings/translations/android_chrome_strings_es-419.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_es.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_et.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_fa.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_fi.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_fil.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_fr.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_gu.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_hi.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_hr.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_hu.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_id.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_it.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_iw.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_ja.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_kn.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_ko.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_lt.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_lv.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_ml.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_mr.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_ms.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_nl.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_no.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_pl.xtb | 2 +-
- .../strings/translations/android_chrome_strings_pt-BR.xtb | 2 +-
- .../strings/translations/android_chrome_strings_pt-PT.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_ro.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_ru.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_sk.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_sl.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_sr.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_sv.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_sw.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_ta.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_te.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_th.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_tr.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_uk.xtb | 2 +-
- .../java/strings/translations/android_chrome_strings_vi.xtb | 2 +-
- .../strings/translations/android_chrome_strings_zh-CN.xtb | 2 +-
- .../strings/translations/android_chrome_strings_zh-TW.xtb | 2 +-
- chrome/app/resources/google_chrome_strings_am.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_ar.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_bg.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_bn.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_ca.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_cs.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_da.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_de.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_el.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_en-GB.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_es-419.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_es.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_et.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_fa.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_fi.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_fil.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_fr.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_gu.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_hi.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_hr.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_hu.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_id.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_it.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_iw.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_ja.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_kn.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_ko.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_lt.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_lv.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_ml.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_mr.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_ms.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_nl.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_no.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_pl.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_pt-BR.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_pt-PT.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_ro.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_ru.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_sk.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_sl.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_sr.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_sv.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_sw.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_ta.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_te.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_th.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_tr.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_uk.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_vi.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_zh-CN.xtb | 4 ++--
- chrome/app/resources/google_chrome_strings_zh-TW.xtb | 4 ++--
- 104 files changed, 156 insertions(+), 156 deletions(-)
+ .../java/strings/translations/android_chrome_strings_am.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_ar.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_bg.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_bn.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_ca.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_cs.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_da.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_de.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_el.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_en-GB.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_es-419.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_es.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_et.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_fa.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_fi.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_fil.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_fr.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_gu.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_hi.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_hr.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_hu.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_id.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_it.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_iw.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_ja.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_kn.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_ko.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_lt.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_lv.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_ml.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_mr.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_ms.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_nl.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_no.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_pl.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_pt-BR.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_pt-PT.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_ro.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_ru.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_sk.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_sl.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_sr.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_sv.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_sw.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_ta.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_te.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_th.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_tr.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_uk.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_vi.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_zh-CN.xtb | 2 +-
+ .../java/strings/translations/android_chrome_strings_zh-TW.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_am.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_ar.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_bg.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_bn.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_ca.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_cs.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_da.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_de.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_el.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_en-GB.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_es-419.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_es.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_et.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_fa.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_fi.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_fil.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_fr.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_gu.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_hi.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_hr.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_hu.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_id.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_it.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_iw.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_ja.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_kn.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_ko.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_lt.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_lv.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_ml.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_mr.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_ms.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_nl.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_no.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_pl.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_pt-BR.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_pt-PT.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_ro.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_ru.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_sk.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_sl.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_sr.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_sv.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_sw.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_ta.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_te.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_th.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_tr.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_uk.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_vi.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_zh-CN.xtb | 2 +-
+ chrome/app/resources/google_chrome_strings_zh-TW.xtb | 2 +-
+ 104 files changed, 104 insertions(+), 104 deletions(-)
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
-index 1a5487907420..9c97a2cf4ba0 100644
+index 8ec43906524c..a596affda331 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
ጣቢያቀዳሚ ትራክየእርስዎ ደኅንነት አደጋ ላይ ሲወድቅ እርስዎ የሚጎበኙዋቸውን አንዳንድ ገጾች ዩአርኤሎች ወደ Google ይልካል።
-ስለChrome
-+About Browser
++ስለBrowserገጹን መጫን አቁምGoogle ፍለጋን እና ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ ሲል ታሪክዎን ሊጠቀም ይችላል።የተከማቸ ይለፍ ቃል ያርትዑ
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
-index 9b46d597dd32..234d774e6840 100644
+index a2881806a9f8..26fbe5edd300 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
الموقعالمقطع الصوتي السابقيتم إرسال عناوين URL لبعض الصفحات التي تزورها إلى Google، عندما يكون أمانك في خطر
-لمحة عن Chrome
-+About Browser
++لمحة عن Browserإيقاف تحميل الصفحةقد تستخدم Google سجلّك لتخصيص البحث وخدمات Google الأخرى.تعديل كلمة المرور المخزنة
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
-index 1b5aee7c5584..c274d00c2b82 100644
+index 155b610e3a5a..285f5b3eefad 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
СайтПредишен записКогато сигурността ви е застрашена, изпраща до Google URL адресите на някои от страниците, които посещавате.
-Всичко за Chrome
-+About Chrome
++Всичко за BrowserСпиране на зареждането на страницатаВъзможно е да използваме историята ви, за да персонализираме търсенето и други услуги на GoogleРедактиране на съхранената парола
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
-index 9ebe102fc838..413517a8ae49 100644
+index ab5da831442e..4b609fb5b3f5 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
সাইটপূর্ববর্তী ট্র্যাকনিরাপত্তা সংক্রান্ত কোনও ঝুঁকি থাকলে, আপনার দেখা কিছু পৃষ্ঠার ইউআরএল Google-কে পাঠায়
-Chrome সম্বন্ধে
-+About Browser
++Browser সম্বন্ধেপৃষ্ঠা লোড করা বন্ধ করুনসার্চ এবং অন্যান্য Google পরিষেবাকে আপনার মতো করে সাজিয়ে নিতে Google আপনার ইতিহাস ব্যবহার করতে পারেস্টোর করা পাসওয়ার্ড এডিট করুন
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
-index e57139ab306e..dadbcec6109f 100644
+index 841a90c36e91..e7582d05edbf 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
Lloc webPista anteriorEnvia a Google els URL d'algunes de les pàgines que visites quan la teva seguretat està en risc
-Sobre Chrome
-+About Browser
++Sobre BrowserAtura la càrrega de la pàginaÉs possible que Google utilitzi el teu historial per personalitzar la Cerca i altres serveis de GoogleEdita la contrasenya emmagatzemada
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
-index 62d57e153c01..8760b0739729 100644
+index a2df2dc8c881..7a9dab480cf8 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
StránkyPředchozí skladbaKdyž je ohrožena vaše bezpečnost, odesílá adresy URL některých navštívených stránek do Googlu
-O aplikaci Chrome
-+About Browser
++O aplikaci BrowserZastavit načítání stránkyGoogle vaši historii může používat k personalizaci Vyhledávání a dalších služeb GoogleUpravit uložené heslo
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
-index 2d3928fb0b21..5d8fa42009c1 100644
+index 2712ec76bc24..6ea1940408b2 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
WebsiteForrige nummerSender webadresser på nogle sider, som du besøger, til Google, når din sikkerhed er truet
-Om Chrome
-+About Browser
++Om BrowserStop sideindlæsningGoogle kan bruge din historik til at tilpasse Søgning og andre Google-tjenesterRediger gemt adgangskode
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
-index 3c6924bc2cbd..acef9c139d40 100644
+index 71a8d509264c..5d2d38c268b0 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
WebsiteVorheriger TitelURLs einiger von mir besuchter Seiten an Google senden, wenn meine Sicherheit gefährdet ist
-Über Google Chrome
-+About Browser
++Über Google BrowserLaden der Seite anhaltenAnhand Ihres Verlaufs kann Google die Google-Suche und andere Google-Dienste personalisierenGespeichertes Passwort bearbeiten
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
-index cf9d95d4e5c7..34a79c73ddbe 100644
+index f2013869bde7..8c7cd03ffbbd 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
ΙστότοποςΠροηγούμενο κομμάτιΣτέλνει URL από ορισμένες σελίδες που επισκέπτεστε στο Google, όταν η ασφάλειά σας βρίσκεται σε κίνδυνο
-Σχετικά με το Chrome
-+About Browser
++Σχετικά με το BrowserΔιακοπή φόρτωσης σελίδαςΗ Google μπορεί να χρησιμοποιήσει το ιστορικό σας για την εξατομίκευση της Αναζήτησης και άλλων υπηρεσιών GoogleΕπεξεργασία αποθηκευμένου κωδικού πρόσβασης.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
-index 761162ddba77..4af4451eb085 100644
+index 85e7b849833d..9bef26810708 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
SitePrevious trackSends URLs of some pages that you visit to Google, when your security is at risk
@@ -241,736 +241,673 @@ index 761162ddba77..4af4451eb085 100644
Google may use your history to personalise Search and other Google servicesEdit stored password
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
-index ed63548e223f..8775f0def614 100644
+index 6bb476d4debd..7bc2093d77f5 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
SitioPista anteriorEnviar a Google las URL de algunas páginas que visitas, cuando tu seguridad esté en riesgo
-Acerca de Chrome
-+About Browser
++Acerca de BrowserDetener la carga de la páginaEs posible que Google use tu historial para personalizar la Búsqueda, los anuncios y otros servicios de GoogleEdita la contraseña almacenada
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
-index b9e640fe4c5b..a721643f3591 100644
+index 51ca7b0a1947..1736915aeb68 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
SitioPista anteriorEnvía a Google las URL de algunas de las páginas que visitas cuando tu seguridad corre peligro
-Información de Chrome
-+About Browser
++Información de BrowserDetener la carga de la páginaEs posible que Google utilice tu historial para personalizar la Búsqueda y otros servicios de GoogleEdita la contraseña almacenada
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
-index 9900411050e1..9a3d537df28a 100644
+index fc3b7e33ed06..b69aceec10f0 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
SaitEelmine luguSaadab mõnede teie külastatud lehtede URL-id Google'ile, kui teie turvalisus ohtu satub
-Teave Chrome'i kohta
-+About Browser
++Teave Browser'i kohtaPeata lehe laadimineGoogle võib kasutada teie ajalugu otsingu ja muude Google'i teenuste isikupärastamiseksSalvestatud parooli muutmine
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
-index 74d24f1f6c00..2136e3a6b34d 100644
+index 018457a2af2e..faf94f017cc3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
سایتآهنگ قبلیاگر امنیتتان درخطر باشد، نشانی وب برخی از صفحههایی را که بازدید میکنید به Google میفرستد
-درباره Chrome
-+About Browser
++درباره Browserتوقف بارگیری صفحهGoogle ممکن است از سابقه مرور شما برای شخصی کردن جستجو و سایر سرویسهای Google استفاده کندویرایش گذرواژه ذخیرهشده
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
-index 7a84580c64f2..c911bb4b4cdc 100644
+index 87ef0cc785c9..6ee133f82c80 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
SivustoEdellinen kappaleLähettää joidenkin avattujen sivujen URL-osoitteet Googlelle, kun turvallisuutesi on vaarassa
-Tietoja Chromesta
-+About Browser
++Tietoja BrowserstaPysäytä sivun latausGoogle voi muokata Hakua ja muita Googlen palveluita historiasi perusteellaMuokkaa tallennettua salasanaa
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
-index f48d0c587616..a6e2c75f280a 100644
+index 0f211e55e54f..5e49c4a06cf1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
SiteNakaraang trackIpadala ang mga URL ng ilang page na binibisita mo sa Google kapag nanganganib ang iyong seguridad
-Tungkol sa Chrome
-+About Browser
++Tungkol sa BrowserIhinto ang pag-load ng pageMaaaring gamitin ng Google ang iyong history para i-personalize ang Search at iba pang serbisyo ng GoogleI-edit ang naka-store na password
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
-index 7191614f7ce2..87c873afd1e6 100644
+index 32280a5f6534..b52625d70f5a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
SitePiste précédenteEnvoyer à Google les URL des pages que vous consultez présentant un risque pour votre sécurité
-À propos de Chrome
-+About Browser
++À propos de BrowserArrêter le chargement de la pageGoogle peut utiliser votre historique pour personnaliser la recherche et d'autres services GoogleModifier le mot de passe enregistré
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
-index b87d20c57f55..20ae4844ef2c 100644
+index 38fb81ecc7e1..fc2acec6dbb6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
સાઇટપાછલું ટ્રૅકતમારી સુરક્ષા જોખમમાં હોય ત્યારે, તમે મુલાકાત લેતા હો તે કેટલાક પેજના URLs Googleને મોકલે છે
-Chrome વિશે
-+About Browser
++Browser વિશેપૃષ્ઠ લોડ કરવાનું રોકોGoogle, શોધ અને અન્ય Google સેવાઓને વ્યક્તિગત કરવા માટે તમારા ઇતિહાસનો ઉપયોગ કરી શકે છેસાચવેલા પાસવર્ડમાં ફેરફાર કરો
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
-index 652991cd508f..a216782c37a8 100644
+index a3142997ae18..08f19f82fe81 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
साइटपिछला ट्रैकआपकी सुरक्षा को खतरा होने पर उन पेज के यूआरएल भेजे जाते हैं जिन पर आप Google के ज़रिए जाते हैं.
-Chrome के बारे में
-+About Browser
++Browser के बारे मेंपेज को लोड करना रोकेंखोज और दूसरी Google सेवाओं को मनमुताबिक बनाने के लिए, Google आपके इतिहास का इस्तेमाल कर सकता हैसेव किया गया पासवर्ड बदलें
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
-index c08567335b30..6282156d68d6 100644
+index f8eb4cfc154e..6a1f280eca4c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
Web lokacijaPrethodna pjesmaGoogleu šalje URL-ove nekih stranica koje posjećujete kada je ugrožena vaša sigurnost
-O Chromeu
-+About Browser
++O BrowseruZaustavljanje učitavanja straniceGoogle može upotrebljavati vašu povijest za prilagodbu Pretraživanja i drugih Googleovih uslugaUredite pohranjenu zaporku
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
-index 68ce2f8351ec..fd17d0be52f8 100644
+index 9a048afd928a..cc29b45fe5a2 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
WebhelyElőző számElküldi egyes felkeresett oldalak URL-jét a Google-nak, ha veszélyben van az Ön biztonsága
-A Chrome névjegye
-+About Browser
++A Browser névjegyeOldal betöltésének leállításaA Google felhasználhatja az Ön előzményeit a Keresés és más Google-szolgáltatások személyre szabásáraTárolt jelszó módosítása
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
-index 66b928f7aa9e..ac495a4bfb8d 100644
+index 5d749d229a07..67a844890165 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
SitusLagu sebelumnyaMengirimkan URL beberapa halaman yang Anda kunjungi ke Google, jika keamanan Anda berisiko
-Tentang Chrome
-+About Browser
++Tentang BrowserHentikan pemuatan halamanGoogle dapat menggunakan histori Anda untuk mempersonalisasi Penelusuran dan layanan Google lainnyaEdit sandi yang disimpan
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
-index e201168cb5e0..60594c272763 100644
+index 98b0dfe59df3..47300aafd689 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
SitoTraccia precedenteInvia a Google gli URL di alcune pagine che visiti quando la tua sicurezza è a rischio
-Informazioni su Chrome
-+About Browser
++Informazioni su BrowserInterrompe il caricamento della paginaGoogle può utilizzare la tua cronologia per personalizzare la Ricerca e altri servizi GoogleModifica la password memorizzata
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
-index d728ca13ff67..c5844e3aa41d 100644
+index 6bedd2398bd4..c9a0ae74437e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
אתרהרצועה הקודמתשולחת ל-Google כתובות URL של חלק מהדפים שאליהם נכנסת, אם מתגלה סיכון אבטחה
-מידע כללי על Chrome
-+About Browser
++מידע כללי על Browserהפסק את טעינת הדףGoogle עשויה להשתמש בהיסטוריית הגלישה שלך לצורך התאמה אישית של החיפוש ושירותי Google אחריםעריכת הסיסמה השמורה
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
-index a1fa252aa703..cfc78061b687 100644
+index 8154f667c281..33a199016b2c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
サイト前のトラックセキュリティ上のリスクがある場合に、アクセスした一部のページの URL が Google に送信されます
-Chrome について
-+About Browser
++Browser についてページの読み込みを停止検索やその他の Google サービスをカスタマイズするために、Google で履歴が使用されることがあります保存したパスワードを編集します
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
-index e4398ca3cc97..da8bd2a2e145 100644
+index b6c3c17d3bab..dfa273b30f8f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
-@@ -261,7 +261,7 @@
+@@ -263,7 +263,7 @@
ಸೈಟ್ಹಿಂದಿನ ಟ್ರ್ಯಾಕ್ನಿಮ್ಮ ಭದ್ರತೆಯು ಅಪಾಯದಲ್ಲಿದ್ದಾಗ, ನೀವು ಭೇಟಿ ನೀಡುವ ಕೆಲವು ಪುಟಗಳ URL ಗಳನ್ನು Google ಗೆ ಕಳುಹಿಸುತ್ತದೆ
-Chrome ಕುರಿತು
-+About Browser
++Browser ಕುರಿತುಪುಟ ಲೋಡ್ ಮಾಡುವುದನ್ನು ನಿಲ್ಲಿಸಿಹುಡುಕಾಟ ಮತ್ತು ಇತರ Google ಸೇವೆಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಇತಿಹಾಸವನ್ನು Google ಬಳಸಬಹುದು.ಸಂಗ್ರಹಿಸಿರುವ ಪಾಸ್ವರ್ಡ್ ಎಡಿಟ್ ಮಾಡಿ
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
-index db55092fc6cd..082a9ba7640e 100644
+index dd2e5f100272..22e3656f2775 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
사이트이전 트랙보안상의 위험이 있을 때 일부 방문 페이지의 URL을 Google로 전송함
-Chrome 정보
-+About Browser
++Browser 정보페이지 로딩 중지Google에서 내 방문 기록을 사용하여 Google 검색 및 다른 Google 서비스를 맞춤설정할 수 있습니다.저장된 비밀번호 수정
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
-index 7eca17fef74a..e559be864a8b 100644
+index 12faf9105a70..ecc6336d25cd 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
SvetainėAnkstesnis takelisSiunčia „Google“ kai kurių puslapių, kuriuose lankotės, URL, kai kyla pavojus jūsų saugai
-Apie „Chrome“
-+About Browser
++Apie „Browser“Sustabdyti puslapio įkėlimą„Google“ gali naudoti jūsų istoriją, kad suasmenintų Paiešką ir kitas „Google“ paslaugasRedaguoti išsaugotus slaptažodžius
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
-index 9d524b45aaa9..82f182fcdf1a 100644
+index 82ba19297d1e..d5f287e37d04 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
VietneIepriekšējais ierakstsNosūta Google serveriem dažu apmeklēto lapu vietrāžus URL, ja jūsu drošība ir apdraudēta
-Par Chrome
-+About Browser
++Par BrowserPārtraukt lapas ielādiGoogle var izmantot jūsu vēsturi, lai personalizētu Meklēšanu un citus Google pakalpojumus.Rediģēt saglabāto paroli
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
-index 087f988db7a9..23d0a832d51d 100644
+index 935b19f61b3d..5b624c6cdb85 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
സൈറ്റ്മുമ്പത്തെ ട്രാക്ക്നിങ്ങളുടെ സുരക്ഷ അപകടത്തിലാകുമ്പോൾ നിങ്ങൾ സന്ദർശിക്കുന്ന ചില പേജുകളുടെ URL-കൾ Google-ലേക്ക് അയയ്ക്കുന്നു
-Chrome-നെ കുറിച്ച്
-+About Browser
++Browser-നെ കുറിച്ച്പേജ് ലോഡുചെയ്യുന്നത് നിർത്തുകതിരയലും മറ്റ് Google സേവനങ്ങളും വ്യക്തിപരമാക്കാൻ Google നിങ്ങളുടെ ചരിത്രം ഉപയോഗിച്ചേക്കാംസംഭരിച്ചിരിക്കുന്ന പാസ്വേഡ് എഡിറ്റ് ചെയ്യുക
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
-index 733687824c01..7877dfa04d85 100644
+index ee72e7e4f133..141492a57580 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
साइटमागील ट्रॅकतुमची सुरक्षा धोक्यात असते तेव्हा, तुम्ही भेट दिलेल्या काही पेजचे URL Google ला पाठवते
-Chrome बद्दल
-+About Browser
++Browser बद्दलपृष्ठ लोड करणे थांबवाशोध आणि इतर Google सेवा पर्सनलाइझ करण्यासाठी Google कदाचित तुमच्या इतिहासाचा वापर करू शकते.स्टोअर केलेला पासवर्ड संपादित करा
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
-index 004aef5343ab..8bbd99ff98d0 100644
+index fddbe896823a..a8801a83861e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
TapakLagu sebelumnyaMenghantar URL sesetengah halaman yang anda lawati kepada Google, apabila keselamatan anda terancam
-Perihal Chrome
-+About Browser
++Perihal BrowserHentikan pemuatan halamanGoogle boleh menggunakan sejarah anda untuk memperibadikan Carian dan perkhidmatan Google yang lainEdit kata laluan yang disimpan
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
-index 4d1894d8ff63..5d8d6fc47627 100644
+index ab4e21414923..81ca7d4cdb91 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
SiteVorig nummerVerzendt URL's van bepaalde pagina's die je bezoekt naar Google wanneer je beveiliging risico loopt
-Over Chrome
-+About Browser
++Over BrowserStoppen met het laden van de paginaGoogle kan je geschiedenis gebruiken om Google Zoeken en andere Google-services te personaliserenOpgeslagen wachtwoord bewerken
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
-index 7a213d8d0765..5d14ffbba5ff 100644
+index 61d60c86f7cd..094e32eb4b50 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
NettstedForrige sporSender Google nettadressene til noen av sidene du besøker, når sikkerheten din står i fare
-Om Chrome
-+About Browser
++Om BrowserStopp innlastingen av sidenGoogle kan bruke loggen din for å gi Søk og andre Google-tjenester et personlig pregEndre det lagrede passordet
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
-index c726a7d1c86a..84cd6dd5fdc7 100644
+index 5869517d0d22..9cc1acab5c3d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
WitrynaPoprzedni utwórGdy Twoje bezpieczeństwo jest zagrożone, wysyła do Google adresy URL odwiedzanych stron
-Chrome – informacje
-+About Browser
++Browser – informacjeZatrzymaj wczytywanie stronyGoogle może korzystać z Twojej historii, by personalizować wyniki wyszukiwania i działanie innych usług.Edytuj zapisane hasło
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
-index dd3a82c932c6..269d358b473a 100644
+index 96d538d91684..e6771cd5d5ca 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
SiteFaixa anteriorQuando há risco de segurança, envia para o Google os URLs de algumas páginas que você visita
-Sobre o Google Chrome
-+About Browser
++Sobre o Google BrowserPara de carregar a páginaO Google pode usar seu histórico para personalizar a Pesquisa e outros serviços que ele ofereceEditar senha armazenada
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
-index e697dcc413ce..a0440d403014 100644
+index 3b66e26ea647..ecaf41f99625 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
SiteFaixa anteriorQuando a sua segurança está em risco, envia para a Google URLs de algumas páginas que visita.
-Acerca do Chrome
-+About Browser
++Acerca do BrowserParar carregamento da páginaA Google pode utilizar o seu histórico para personalizar a Pesquisa e outros serviços Google.Editar a palavra-passe armazenada
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
-index 91fa60a045fa..bf3c53440836 100644
+index 2284dded88c3..5056afc565d6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
SiteMelodia anterioarăTrimite la Google adrese URL ale unor pagini pe care le accesezi, când securitatea este în pericol
-Despre Chrome
-+About Browser
++Despre BrowserOprește încărcarea paginiiGoogle poate folosi istoricul pentru a personaliza Căutarea și alte servicii GoogleEditează parola stocată
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
-index f84ba2c99ba4..3a430a1721b6 100644
+index f7516aed2f95..e780758a4c29 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
СайтПредыдущий трекПри угрозе безопасности отправлять в Google URL некоторых страниц, которые вы открываете
-О браузере Chrome
-+About Browser
++О браузере BrowserОстановить загрузку страницыGoogle может использовать вашу историю, чтобы персонализировать Поиск и другие сервисы.Изменение сохраненного пароля.
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
-index c895da047f51..7f6334453d37 100644
+index e2cb261e14eb..978b72571d4a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
WebPredchádzajúca skladbaPri ohrození zabezpečenia odosiela Googlu webové adresy niektorých navštívených stránok
-O prehliadači Chrome
-+About Browser
++O prehliadači BrowserZastaviť načítavanie stránkyGoogle môže pomocou vašej histórie prispôsobiť Vyhľadávanie a ďalšie služby GoogluÚprava uloženého hesla
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
-index 3091a627d80b..38513007d9aa 100644
+index 8b4d7f7c36d3..249b5f719053 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
Spletno mestoPrejšnja skladbaGooglu pošlje URL-je nekaterih strani, ki jih obiščete, kadar je ogrožena vaša varnost
-O brskalniku Chrome
-+About Browser
++O brskalniku BrowserUstavi nalaganje straniGoogle lahko vašo zgodovino uporabi za prilagajanje Iskanja Google in drugih Googlovih storitevUrejanje shranjenega gesla
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
-index f7b8f4e09bf0..82ed03b6cd9e 100644
+index 0fbd343dbaf2..1d8a1494ea7e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
СајтПретходна песмаШаље URL-ове неких страница које посећујете Google-у када је безбедност угрожена
-О Chrome прегледачу
-+About Browser
++О Browser прегледачуЗаустави учитавање страницеGoogle може да користи историју за персонализацију Претраге и других Google услугаИзмените сачувану лозинку
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
-index deb15b508d15..889182bb83e2 100644
+index 21eb08d0da82..d624a2c210e2 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
WebbplatsFöregående spårWebbadresser till vissa sidor som du besöker skickas till Google när din säkerhet är utsatt för risk.
-Om Chrome
-+About Browser
++Om BrowserAvbryt inläsningen av sidanGoogle kan anpassa Sök och andra Google-tjänster utifrån historikenRedigera sparat lösenord
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
-index 14c7719ba519..c14874f0abff 100644
+index f2d5ff533537..0b132a0ecc9e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
TovutiWimbo uliotanguliaHutuma kwa Google URL za baadhi ya kurasa ambazo umetembelea wakati usalama wako uko hatarini
-Kuhusu Chrome
-+About Browser
++Kuhusu BrowserSimamisha upakiaji wa ukurasaGoogle inaweza kutumia historia yako ili kuweka mapendeleo kwenye huduma ya Tafuta na Google na huduma nyingine za Google.Badilisha nenosiri lililohifadhiwa
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
-index d300515b2677..450173634845 100644
+index 34d222a13bbe..333f20618a55 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
தளம்முந்தைய ட்ராக்ஆபத்தான தளங்களைப் பார்ப்பதால் உங்கள் பாதுகாப்பிற்கு ஆபத்து ஏற்படும்போது நீங்கள் பார்வையிடும் சில பக்கங்களின் URLகளை Googleளுக்கு அனுப்பும்
-Chrome அறிமுகம்
-+About Browser
++Browser அறிமுகம்பக்கத்தை ஏற்றுவதை நிறுத்து‘தேடல்’ மற்றும் பிற Google சேவைகளைத் தனிப்பயனாக்க, உங்கள் வரலாற்றை Google பயன்படுத்தக்கூடும்சேமிக்கப்பட்ட கடவுச்சொல்லைத் திருத்தும் பட்டன்
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
-index 6e84c8e2cd67..57831e3c5ae8 100644
+index 6cb415bd9b73..baa9c061aefb 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
సైట్మునుపటి ట్రాక్మీ భద్రతకు ప్రమాదం పొంచి ఉన్నప్పుడు, మీరు సందర్శించే కొన్ని పేజీల URLలను Googleకు పంపుతుంది
-Chrome పరిచయం
-+About Browser
++Browser పరిచయంపేజీ లోడ్ కాకుండా ఆపివేయండిశోధన, ఇతర Google సేవలను వ్యక్తిగతీకరించడానికి Google మీ చరిత్రను ఉపయోగించే అవకాశం ఉంటుందినిల్వ చేసిన పాస్వర్డ్ను సవరించండి
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
-index a5d4dc24ed91..08cb66306347 100644
+index b450bbb8c195..7856babb05f5 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
เว็บไซต์แทร็กก่อนหน้าส่ง URL ของหน้าบางส่วนที่คุณเข้าชมไปให้ Google เมื่อการรักษาความปลอดภัยมีความเสี่ยง
-เกี่ยวกับ Chrome
-+About Browser
++เกี่ยวกับ Browserหยุดการโหลดหน้าGoogle อาจใช้ประวัติการเข้าชมเพื่อปรับเปลี่ยน Search และบริการอื่นๆ ของ Google ให้เข้ากับคุณแก้ไขรหัสผ่านที่เก็บไว้
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
-index 00ef79290855..3c1107673b5f 100644
+index e275d708fb6d..ba1ffb7a3652 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
SiteÖnceki parçaGüvenliğiniz risk altında olduğunda ziyaret ettiğiniz bazı sayfaların URL'lerini Google'a gönderir
-Chrome hakkında
-+About Browser
++Browser hakkındaSayfa yüklemeyi durdurGoogle; Arama ve diğer Google hizmetlerini kişiselleştirmek için geçmişinizi kullanabilirSaklı şifreyi düzenleyin
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
-index 1352848733a0..e675eca245ec 100644
+index 5213a13ec32b..b0ecf421c165 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
СайтПопередня композиціяНадсилає в Google URL-адреси деяких відвіданих сторінок, коли ваша безпека під загрозою
-Про Chrome
-+About Browser
++Про BrowserПрипинити завантаження сторінкиGoogle може використовувати вашу історію, щоб персоналізувати Пошук та інші сервіси GoogleЗмінити збережений пароль
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
-index 1c79be525131..63ab386eed52 100644
+index b62db986f6de..2befca09859f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
Trang webBản nhạc trướcGửi URL của một số trang mà bạn truy cập cho Google khi bạn gặp rủi ro về bảo mật
-Giới thiệu về Chrome
-+About Browser
++Giới thiệu về BrowserNgừng tải trangGoogle có thể sử dụng lịch sử của bạn để điều chỉnh tính năng Tìm kiếm và các dịch vụ khác của Google cho phù hợp với bạnChỉnh sửa mật khẩu đã lưu trữ
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
-index ad9acc74289e..1602ca949e98 100644
+index 1b7f7a80a759..7962585d7f06 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
网站上一曲当您面临安全风险时,将您所访问的部分网页的网址发送给 Google
-关于 Chrome
-+About Browser
++关于 Browser停止加载网页Google 可能会利用您的历史记录为您提供个性化的 Google 搜索和其他 Google 服务修改存储的密码
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
-index d43d133ba8bf..eeba7ad4a846 100644
+index 708ef6f82053..fd7f3b860f9d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
-@@ -260,7 +260,7 @@
+@@ -262,7 +262,7 @@
網站上一首曲目當網站具有安全性風險時,Chrome 會將你造訪的部分網頁網址傳送給 Google
-關於 Chrome
-+About Browser
++關於 Browser停止載入網頁Google 可能會使用你的歷史記錄,為你提供個人化的搜尋服務和其他各項 Google 服務編輯已儲存的密碼
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb
-index a6ccf39378a9..90c2c4d85aed 100644
+index 84e6770f994f..0506839d76bd 100644
--- a/chrome/app/resources/google_chrome_strings_am.xtb
+++ b/chrome/app/resources/google_chrome_strings_am.xtb
-@@ -82,7 +82,7 @@
+@@ -85,7 +85,7 @@
Google Chromeን በዚህ ቋንቋ አሳይChromeን በማስጀመር ላይ...ወደ Chrome ገብተዋል!
-ስለChrome
-+About Browser
++ስለBrowserGoogle Chrome በጀርባ ሁኔታ ላይ ነው።ን ግንኙነት ማቋረጥ ታሪክዎን፣ ቅንበሮችዎን እና ሌሎች በዚህ መሳሪያ ላይ የተቀመጡትን ሌሎች የChrome ውሂብ ያጸዳል። በGoogle መለያዎ ላይ ያለው ውሂብ የማይጸዳ ሲሆን በGoogle Dashboard ላይ መተዳደር ይችላል።የChrome ትር
-@@ -290,4 +290,4 @@ Google Chrome ቅንጅቶችዎን ማስመለስ አልቻለም።የእርስዎን ለውጦች ተፈጻሚ ለማድረግ፣ Chromeን ዳግም ያስጀምሩ
- ስምረትን ለመጀመር Chromeን ያዘምኑ
- Google Chrome ነባሪ አሳሽዎ ነው
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb
-index de97d4ce6db0..5f0cf41c0845 100644
+index a5b95f930a9d..4691b83313f0 100644
--- a/chrome/app/resources/google_chrome_strings_ar.xtb
+++ b/chrome/app/resources/google_chrome_strings_ar.xtb
-@@ -80,7 +80,7 @@
+@@ -83,7 +83,7 @@
عرض Google Chrome بهذه اللغةجارٍ إطلاق Chrome...تم تسجيل دخولك إلى Chrome!
-لمحة عن Chrome
-+About Browser
++لمحة عن BrowserGoogle Chrome في وضع الخلفية.سيؤدي قطع اتصال إلى مسح السجّل والإشارات المرجعية والإعدادات وبيانات Chrome الأخرى المخزنة على هذا الجهاز. لن يتم مسح البيانات المخزنة في حساب Google ويمكن إدارتها على لوحة تحكم Google.علامة تبويب Chrome
-@@ -286,4 +286,4 @@
- لتطبيق التغييرات، يُرجى إعادة تشغيل Chrome
- تحديث Chrome لبدء المزامنة
- Google Chrome هو متصفحك التلقائي
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb
-index 9f5ccd4d5922..cebbde12d9cf 100644
+index 41dd95b2390b..f50d2fa1cf24 100644
--- a/chrome/app/resources/google_chrome_strings_bg.xtb
+++ b/chrome/app/resources/google_chrome_strings_bg.xtb
-@@ -80,7 +80,7 @@
+@@ -82,7 +82,7 @@
Показване на Google Chrome на този езикChrome се стартира...Влязохте в Chrome!
-Всичко за Chrome
-+About Browser
++Всичко за BrowserGoogle Chrome работи на заден план.Прекратяването на връзката с/ъс ще изчисти историята, отметките, настройките и другите данни в Chrome, съхранени на това устройство. Данните в профила ви в Google няма да бъдат изчистени и могат да се управляват в Google Табло за управление.Раздел в Chrome
-@@ -284,4 +284,4 @@
- За да приложите промените си, рестартирайте Chrome
- Актуализирайте Chrome, за да стартира синхронизирането
- Google Chrome е браузърът ви по подразбиране
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb
-index 3a33ed692e9b..7c20b73a9f3f 100644
+index fa83c35447ac..450e5462707c 100644
--- a/chrome/app/resources/google_chrome_strings_bn.xtb
+++ b/chrome/app/resources/google_chrome_strings_bn.xtb
-@@ -80,7 +80,7 @@
+@@ -83,7 +83,7 @@
এই ভাষায় Google Chrome প্রদর্শন করুনChrome লঞ্চ করা হচ্ছে...আপনি Chrome এ প্রবেশ করেছেন৷
-Chrome সম্বন্ধে
-+About Browser
++Browser সম্বন্ধেGoogle Chrome পটভূমি মোডে রয়েছে। ডিসকানেক্ট করলে তা আপনার ইতিহাস, বুকমার্ক, সেটিংস এবং এই ডিভাইসে সঞ্চিত অন্যান্য Chrome ডেটা মুছে দেবে। আপনার Google অ্যাকাউন্টে সঞ্চিত ডেটা সাফ করা হবে না এবং Google ড্যাশবোর্ড -এ তা পরিচালনা করা যেতে পারে।Chrome ট্যাব
-@@ -286,4 +286,4 @@
- আপনার পরিবর্তনগুলি প্রয়োগ করতে, Chrome রিলঞ্চ করুন
- সিঙ্ক শুরু করতে Chrome আপডেট করুন
- Google Chrome আপনার ডিফল্ট ব্রাউজার
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb
-index d0d3e1aed828..5c0d2db63a07 100644
+index 61c9cac9e6fb..7acd045a86dd 100644
--- a/chrome/app/resources/google_chrome_strings_ca.xtb
+++ b/chrome/app/resources/google_chrome_strings_ca.xtb
-@@ -78,7 +78,7 @@ En iniciar la sessió, sigui amb l'usuari que sigui, es combinarà amb Mostra Google Chrome en aquest idioma
S'està iniciant Chrome...Teniu la sessió iniciada a Chrome.
-Sobre Chrome
-+About Browser
++Sobre BrowserGoogle Chrome està en mode de segon pla.Si desconnecteu s'esborraran l'historial, les adreces d'interès, la configuració i totes les dades de Chrome que hi hagi desades en aquest dispositiu. Les dades emmagatzemades al compte de Google no s'esborraran, i es poden gestionar des del Tauler de Google.Pestanya de Chrome
-@@ -282,4 +282,4 @@ Per obtenir més instruccions, consulteu el correu electrònic a Torna a iniciar Chrome perquè s'apliquin els canvis
- Actualitza Chrome per iniciar la sincronització
- Google Chrome és el navegador predeterminat
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb
-index 142c4251ebc7..824c87a8d57a 100644
+index d52ae338243b..038401edf726 100644
--- a/chrome/app/resources/google_chrome_strings_cs.xtb
+++ b/chrome/app/resources/google_chrome_strings_cs.xtb
-@@ -82,7 +82,7 @@ Pokud se přesto přihlásíte, budou data prohlížeče Chrome (například zá
+@@ -84,7 +84,7 @@ Pokud se přesto přihlásíte, budou data prohlížeče Chrome (například zá
Zobrazit Google Chrome v tomto jazyceSpouštění Chromu...Nyní jste přihlášeni do Chromu.
-O aplikaci Chrome
-+About Browser
++O aplikaci BrowserGoogle Chrome je v režimu na pozadí.Odpojení uživatele smaže také historii, záložky, nastavení a další data Chromu uložená v tomto zařízení. Data uložená ve vašem účtu Google nebudou vymazána a lze je spravovat na Hlavním panelu Google.Karta prohlížeče Chrome
-@@ -290,4 +290,4 @@ Aplikace Google Chrome nemůže vaše nastavení obnovit.
- Chcete-li změny použít, restartujte Chrome
- Chcete-li zahájit synchronizaci, aktualizujte Chrome
- Google Chrome je vaším výchozím prohlížečem
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb
-index 23e70197f241..488763c2ed50 100644
+index 25913c748730..c260b5ddf340 100644
--- a/chrome/app/resources/google_chrome_strings_da.xtb
+++ b/chrome/app/resources/google_chrome_strings_da.xtb
-@@ -78,7 +78,7 @@ Hvis du logger ind alligevel, flettes Chrome-oplysninger, som f.eks. bogmærker,
+@@ -81,7 +81,7 @@ Hvis du logger ind alligevel, flettes Chrome-oplysninger, som f.eks. bogmærker,
Vis Google Chrome på dette sprogStarter Chrome...Du er logget ind på Chrome.
-Om Chrome
-+About Browser
++Om BrowserGoogle Chrome kører i baggrunden.
- Hvis du afbryder forbindelsen for , slettes din historik, dine bogmærker, dine indstillinger og andre Chrome-data, der er gemt på denne enhed. Data, der er gemt på din Google-konto, slettes ikke og kan administreres i Google Betjeningspanel.
+ Hvis du afbryder forbindelsen for , slettes din historik, dine bogmærker, dine indstillinger og andre Chrome-data, der er gemt på denne enhed. Data, der er gemt på din Google-konto, slettes ikke og kan administreres i Google Kontrolpanel.Fanen Chrome
-@@ -282,4 +282,4 @@ Gå til din mail på for at få yderligere vejlednin
- Åbn Chrome igen for at anvende ændringerne
- Opdater Chrome for at starte synkroniseringen
- Google Chrome er din standardbrowser
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb
-index 73a3406ff3aa..492baee8a13d 100644
+index f58833763350..ed060d3d5512 100644
--- a/chrome/app/resources/google_chrome_strings_de.xtb
+++ b/chrome/app/resources/google_chrome_strings_de.xtb
-@@ -78,7 +78,7 @@ Sollten Sie sich trotzdem anmelden, werden die Chrome-Daten wie Lesezeichen, Ver
+@@ -80,7 +80,7 @@ Sollten Sie sich trotzdem anmelden, werden die Chrome-Daten wie Lesezeichen, Ver
Google Chrome in dieser Sprache anzeigenChrome wird gestartet…Sie sind in Chrome angemeldet.
-Über Google Chrome
-+About Browser
++Über Google BrowserGoogle Chrome wird im Hintergrundmodus ausgeführt.Wenn Sie die Verbindung zu trennen, werden Ihr Verlauf sowie Ihre Lesezeichen, Einstellungen und sonstigen auf diesem Gerät gespeicherten Chrome-Daten gelöscht. In Ihrem Google-Konto gespeicherte Daten bleiben erhalten und können über das Google Dashboard verwaltet werden.Chrome-Tab
-@@ -282,4 +282,4 @@ Weitere Informationen wurden per E-Mail an gesendet.
- Starten Sie Chrome neu, um die Änderungen zu übernehmen
- Aktualisieren Sie Chrome, um die Synchronisierung zu starten
- Google Chrome ist Ihr Standardbrowser
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb
-index 87fa49ad57b7..f2c4decd92ee 100644
+index 9534abfe830c..275ac71287df 100644
--- a/chrome/app/resources/google_chrome_strings_el.xtb
+++ b/chrome/app/resources/google_chrome_strings_el.xtb
-@@ -80,7 +80,7 @@
+@@ -83,7 +83,7 @@
Να εμφανίζεται το Google Chrome σε αυτήν τη γλώσσαΕκκίνηση του Chrome…Έχετε συνδεθεί στο Chrome!
-Σχετικά με το Chrome
-+About Browser
++Σχετικά με το BrowserΤο Google Chrome εκτελείται στο παρασκήνιο.Με την αποσύνδεση του λογαριασμού , θα διαγραφεί το ιστορικό, οι σελιδοδείκτες, οι ρυθμίσιες σας και άλλα δεδομένα Chrome που έχουν αποθηκευτεί σε αυτήν τη συσκευή. Τα δεδομένα που έχουν αποθηκευτεί στον Λογαριασμό σας Google δεν θα διαγραφούν και μπορείτε να τα διαχειριστείτε μέσω του Πίνακα ελέγχου Google.Καρτέλα Chrome
-@@ -286,4 +286,4 @@
- Για να εφαρμόσετε τις αλλαγές σας, επανεκκινήστε το Chrome
- Για να ξεκινήσει ο συγχρονισμός, ενημερώστε το Chrome
- Το Google Chrome είναι το προεπιλεγμένο πρόγραμμα περιήγησης
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb
-index 61f81957239b..970e7870b357 100644
+index 03be9918b890..64a63d40a4e8 100644
--- a/chrome/app/resources/google_chrome_strings_en-GB.xtb
+++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
-@@ -82,7 +82,7 @@ Signing in anyway will merge Chrome information like bookmarks, history and othe
+@@ -85,7 +85,7 @@ Signing in anyway will merge Chrome information like bookmarks, history and othe
Display Google Chrome in this languageLaunching Chrome...You're signed in to Chrome!
@@ -979,853 +916,552 @@ index 61f81957239b..970e7870b357 100644
Google Chrome is in background mode.Disconnecting will clear your history, bookmarks, settings and other Chrome data stored on this device. Data stored in your Google Account will not be cleared and can be managed on Google Dashboard.Chrome Tab
-@@ -290,4 +290,4 @@ Google Chrome is unable to recover your settings.
- To apply your changes, relaunch Chrome
- Update Chrome to start sync
- Google Chrome is your default browser
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb
-index ede62b15c0f7..49a7b146f8d6 100644
+index ce414ea9b53c..a6770ad12f5f 100644
--- a/chrome/app/resources/google_chrome_strings_es-419.xtb
+++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
-@@ -78,7 +78,7 @@ Si accedes de todos modos, se fusionará la información de Google Chrome, como
+@@ -81,7 +81,7 @@ Si accedes de todos modos, se fusionará la información de Google Chrome, como
Mostrar Google Chrome en este idiomaIniciando Chrome…Accediste a Google Chrome.
-Acerca de Chrome
-+About Browser
++Acerca de BrowserGoogle Chrome está en modo de segundo planoSi desconectas , se borrarán el historial, los favoritos, la configuración y otros datos de Chrome almacenados en este dispositivo. Los datos almacenados en la cuenta de Google no se borrarán y se pueden administrar en el Panel de control de Google.Pestaña de Chrome
-@@ -282,4 +282,4 @@ Para obtener más instrucciones, revisa tu correo electrónico en Para aplicar los cambios, vuelve a ejecutar Chrome
- Actualiza Chrome para iniciar la sincronización
- Google Chrome es tu navegador predeterminado
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb
-index 028d3a563201..2e5ac45d8e8a 100644
+index 2af7cbff6264..7506282a3ccd 100644
--- a/chrome/app/resources/google_chrome_strings_es.xtb
+++ b/chrome/app/resources/google_chrome_strings_es.xtb
-@@ -82,7 +82,7 @@ Si decides iniciar sesión de todas formas, se fusionará la información de Chr
+@@ -85,7 +85,7 @@ Si decides iniciar sesión de todas formas, se fusionará la información de Chr
Mostrar Google Chrome en este idiomaIniciando Chrome...Has iniciado sesión en Chrome
-Información de Chrome
-+About Browser
++Información de BrowserGoogle Chrome está en modo de segundo plano.Si desvinculas a , se borrarán tu historial, tus marcadores, tu configuración y otros datos de Chrome almacenados en este dispositivo. No obstante, no se borrarán los datos almacenados en tu cuenta de Google y se podrán administrar en el Panel de control de Google.Pestaña de Chrome
-@@ -290,4 +290,4 @@ Google Chrome no puede recuperar tu configuración.
- Reinicia Chrome para aplicar los cambios
- Actualiza Chrome para iniciar la sincronización
- Google Chrome es tu navegador predeterminado
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb
-index 479fea5ec67e..0ed3fad04cd7 100644
+index c2b66a680f04..d43eddff8da3 100644
--- a/chrome/app/resources/google_chrome_strings_et.xtb
+++ b/chrome/app/resources/google_chrome_strings_et.xtb
-@@ -80,7 +80,7 @@ Kui logite siiski sisse, liidetakse Chrome'i teave, nagu järjehoidjad, ajalugu
+@@ -83,7 +83,7 @@ Kui logite siiski sisse, liidetakse Chrome'i teave, nagu järjehoidjad, ajalugu
Kuva Google Chrome selles keelesChrome'i käivitamine …Olete Chrome'i sisse logitud.
-Teave Chrome'i kohta
-+About Browser
++Teave Browser'i kohtaGoogle Chrome on taustarežiimis.Kui katkestate ühenduse kasutajaga , siis kustutatakse sellesse seadmesse salvestatud ajalugu, järjehoidjad, seaded ja muud Chrome'i andmed. Google'i kontole salvestatud andmeid ei kustutata ja neid saab hallata Google'i juhtpaneelil.Chrome'i vaheleht
-@@ -286,4 +286,4 @@ Mõned funktsioonid ei pruugi saadaval olla. Määrake muu profiilikataloog või
- Muudatuste rakendamiseks käivitage Chrome uuesti
- Sünkroonimise alustamiseks värskendage Chrome'i
- Google Chrome on teie vaikebrauser
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb
-index 22e4a952cf90..a820b7e8c429 100644
+index e988c2538a51..2c25f2322548 100644
--- a/chrome/app/resources/google_chrome_strings_fa.xtb
+++ b/chrome/app/resources/google_chrome_strings_fa.xtb
-@@ -78,7 +78,7 @@
+@@ -81,7 +81,7 @@
نمایش Google Chrome به این زباندرحال راهاندازی Chrome…شما در حال حاضر وارد سیستم Chrome شدهاید!
-درباره Chrome
-+About Browser
++درباره BrowserGoogle Chrome در حالت پسزمینه است.با قطع اتصال ، سابقه، نشانکها، تنظیمات و سایر دادههای Chrome شما که در این دستگاه ذخیره شدهاند، پاک میشود. دادههای ذخیره شده در حساب Google شما پاک نمیشوند و در داشبورد Google قابل مدیریت هستند.برگه Chrome
-@@ -282,4 +282,4 @@
- برای اعمال تغییراتتان، Chrome را راهاندازی مجدد کنید
- بهروزرسانی Chrome برای شروع همگامسازی
- Google Chrome مرورگر پیشفرضتان است
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb
-index b1ab32a73bbe..30ab05661579 100644
+index bbf3282814d1..10df57641e10 100644
--- a/chrome/app/resources/google_chrome_strings_fi.xtb
+++ b/chrome/app/resources/google_chrome_strings_fi.xtb
-@@ -78,7 +78,7 @@ Jos kirjaudut silti sisään, Chrome-tiedot, kuten kirjanmerkit, historia ja ase
+@@ -81,7 +81,7 @@ Jos kirjaudut silti sisään, Chrome-tiedot, kuten kirjanmerkit, historia ja ase
Näytä Google Chrome tällä kielelläKäynnistetään Chromea…Olet kirjautunut Chromeen!
-Tietoja Chromesta
-+About Browser
++Tietoja BrowserstaGoogle Chrome on käynnissä taustalla.Jos irrotat tilin , historiasi, kirjanmerkkisi ja muut laitteelle tallennetut Chrome-tiedot poistetaan. Google-tiliisi tallennetut tiedot säilyvät ennallaan ja voit hallinnoida niitä Google Hallintapaneelin kautta.Chrome-välilehti
-@@ -282,4 +282,4 @@ Lähetimme lisäohjeita sähköpostiisi osoitteeseen
- Ota muutokset käyttöön käynnistämällä Chrome uudelleen
- Aloita synkronointi päivittämällä Chrome.
- Google Chrome on oletusselaimesi.
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb
-index df521aaefed2..67299c86af4d 100644
+index aa74bd57a029..5af7fe17c546 100644
--- a/chrome/app/resources/google_chrome_strings_fil.xtb
+++ b/chrome/app/resources/google_chrome_strings_fil.xtb
-@@ -82,7 +82,7 @@ Kapag nag-sign in ka pa rin, isasama sa ang impo
+@@ -85,7 +85,7 @@ Kapag nag-sign in ka pa rin, isasama sa ang impo
Ipakita ang Google Chrome sa wikang itoInilulunsad ang Chrome...Naka-sign in ka sa Chrome!
-Tungkol sa Chrome
-+About Browser
++Tungkol sa BrowserNasa background mode ang Google Chrome.Iki-clear ng pagdiskonekta kay ang iyong history, mga bookmark, setting at iba pang data ng Chrome na naka-imbak sa device na ito. Hindi iki-clear ang data na naka-imbak sa iyong Google Account at maaaring pamahalaan sa Google Dashboard.Tab ng Chrome
-@@ -290,4 +290,4 @@ Hindi magawang bawiin ng Google Chrome ang iyong mga setting.
- Para ilapat ang iyong mga pagbabago, muling ilunsad ang Chrome
- I-update ang Chrome upang simulan ang pag-sync
- Google Chrome ang iyong default na browser
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb
-index c7d335277595..0bec0e5b6581 100644
+index cf738854b7c8..aa06932a531e 100644
--- a/chrome/app/resources/google_chrome_strings_fr.xtb
+++ b/chrome/app/resources/google_chrome_strings_fr.xtb
-@@ -81,7 +81,7 @@ Si vous vous connectez quand même, toutes les informations Chrome, comme les fa
+@@ -83,7 +83,7 @@ Si vous vous connectez quand même, toutes les informations Chrome, comme les fa
Afficher Google Chrome dans cette langueLancement de Chrome…Vous êtes connecté à Google Chrome.
-À propos de Chrome
-+About Browser
++À propos de BrowserGoogle Chrome est exécuté en mode arrière-plan.La déconnexion de a pour effet d'effacer votre historique, vos favoris, vos paramètres et les autres données Chrome stockées sur cet appareil. Les données stockées dans votre compte Google ne sont pas effacées ; vous pouvez les gérer dans Google Dashboard.Onglet Chrome
-@@ -289,4 +289,4 @@ Google Chrome ne peut pas récupérer vos paramètres.
- Pour appliquer vos modifications, relancez Chrome
- Mettre à jour Chrome pour lancer la synchronisation
- Google Chrome est votre navigateur par défaut
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb
-index 66db4c19a862..6b58e922652d 100644
+index a2bdebddefed..844043b61e96 100644
--- a/chrome/app/resources/google_chrome_strings_gu.xtb
+++ b/chrome/app/resources/google_chrome_strings_gu.xtb
-@@ -82,7 +82,7 @@
+@@ -85,7 +85,7 @@
આ ભાષામાં Google Chrome બતાવોChrome લૉન્ચ કરી રહ્યાં છીએ…તમે હમણાં Chrome માં સાઇન ઇન છો!
-Chrome વિશે
-+About Browser
++Browser વિશેGoogle Chrome પૃષ્ઠભૂમિ મોડમાં છે.ને ડિસ્કનેક્ટ કરવાથી આ ડિવાઇસ પર તમે સ્ટોર કરેલાં ઇતિહાસ, બુકમાર્ક, સેટિંગ અને બીજો Chrome ડેટા કાઢી નંખાશે. તમારા Google એકાઉન્ટમાં સ્ટોર કરેલો ડેટા કાઢી નંખાશે નહિ અને એ Google ડૅશબોર્ડ પર મેનેજ કરી શકાય છે.Chrome ટૅબ
-@@ -290,4 +290,4 @@ Google Chrome તમારી સેટિંગ્સને પુનઃપ્
- તમારા ફેરફારો લાગુ કરવા માટે, Chromeને ફરી લૉન્ચ કરો
- સમન્વયન પ્રારંભ કરવા માટે Chrome અપડેટ કરો
- Google Chrome તમારું ડિફૉલ્ટ બ્રાઉઝર છે
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb
-index 62dd4cc7be9f..22781731cb7a 100644
+index 15923d13a3ec..9ed2435ed8ee 100644
--- a/chrome/app/resources/google_chrome_strings_hi.xtb
+++ b/chrome/app/resources/google_chrome_strings_hi.xtb
-@@ -78,7 +78,7 @@
+@@ -81,7 +81,7 @@
Google Chrome इस भाषा में दिखाएंChrome लॉन्च हो रहा है...आप Chrome में प्रवेश हैं.
-Chrome के बारे में
-+About Browser
++Browser के बारे मेंGoogle Chrome पृष्ठभूमि मोड में है. को डिसकनेक्ट करने से आपका इतिहास, बुकमार्क, सेटिंग, और इस डिवाइस पर संग्रहित अन्य Chrome डेटा साफ़ हो जाएगा. आपके Google खाते में संग्रहित डेटा साफ़ नहीं होगा और उसे Google डैशबोर्ड पर प्रबंधित किया जा सकता है.Chrome टैब
-@@ -286,4 +286,4 @@ Google Chrome आपकी सेटिंग बहाल नहीं कर
- अपने बदलाव लागू करने के लिए, Chrome को फिर से लॉन्च करें
- सिंक शुरू करने के लिए Chrome अपडेट करें
- Google Chrome आपका डिफ़ॉल्ट ब्राउज़र है
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb
-index a2ecbcb56c87..0795d18afc48 100644
+index 5c3236d9ce26..5d02c6e761f4 100644
--- a/chrome/app/resources/google_chrome_strings_hr.xtb
+++ b/chrome/app/resources/google_chrome_strings_hr.xtb
-@@ -78,7 +78,7 @@ Ako se ipak prijavite, podaci sustava Chrome kao što su oznake, povijest i osta
+@@ -81,7 +81,7 @@ Ako se ipak prijavite, podaci sustava Chrome kao što su oznake, povijest i osta
Prikaži Google Chrome na tom jezikuPokretanje Chromea...Prijavljeni ste na Chrome!
-O Chromeu
-+About Browser
++O BrowseruGoogle Chrome radi u pozadini.Prekidanjem veze s računom izbrisat ćete svoju povijest, oznake, postavke i ostale Chromeove podatke pohranjene na ovom uređaju. Podaci pohranjeni na vašem Google računu neće se izbrisati. Tim podacima možete upravljati na Google nadzornoj ploči.Chromeova kartica
-@@ -282,4 +282,4 @@ Daljnje upute poslali smo vam na e-adresu .Da bi se vaše promjene primijenile, ponovo pokrenite Chrome
- Ažurirajte Chrome da bi se pokrenula sinkronizacija
- Google Chrome vaš je zadani preglednik
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb
-index 089b350fa93e..ba8d1cbb56d3 100644
+index 9f5f09fc925a..aa0af4076159 100644
--- a/chrome/app/resources/google_chrome_strings_hu.xtb
+++ b/chrome/app/resources/google_chrome_strings_hu.xtb
-@@ -78,7 +78,7 @@ Ha mindenképp bejelentkezik, akkor egyesíti a(z) A Google Chrome megjelenítése ezen a nyelven
A Chrome indítása…Bejelentkezett a Chrome-ba.
-A Chrome névjegye
-+About Browser
++A Browser névjegyeA Google Chrome háttérmódban van. összekapcsolásának megszüntetésével törli az eszközön tárolt előzményeket, könyvjelzőket, beállításokat és egyéb Chrome-adatokat. A Google-fiókban tárolt adatokat a rendszer nem törli, és azokat Ön a Google Irányítópulton kezelheti.Chrome-lap
-@@ -282,4 +282,4 @@ További utasításokat a(z) címére küldött e-ma
- A módosítások alkalmazásához indítsa újra a Chrome-ot
- Frissítse a Chrome-ot a szinkronizálás megkezdéséhez
- A Google Chrome az alapértelmezett böngésző
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb
-index 8fe7961059b8..0e88bc6d1f33 100644
+index 03cfd865c6be..939bd86742c1 100644
--- a/chrome/app/resources/google_chrome_strings_id.xtb
+++ b/chrome/app/resources/google_chrome_strings_id.xtb
-@@ -78,7 +78,7 @@ Tetap masuk akan menggabungkan informasi Chrome seperti bookmark, histori, dan s
+@@ -81,7 +81,7 @@ Tetap masuk akan menggabungkan informasi Chrome seperti bookmark, histori, dan s
Tampilkan Google Chrome dalam bahasa iniMeluncurkan Chrome...Anda sudah masuk ke Chrome!
-Tentang Chrome
-+About Browser
++Tentang BrowserGoogle Chrome berjalan di mode latar belakang.Memutuskan sambungan akan menghapus histori, bookmark, setelan, dan data Chrome Anda lainnya yang tersimpan di perangkat. Data tersimpan di Akun Google tidak akan dihapus dan dapat dikelola di Google Dasbor.Tab Chrome
-@@ -282,4 +282,4 @@ Periksa email Anda di untuk petunjuk lebih lanjut.
- Untuk menerapkan perubahan, luncurkan ulang Chrome
- Perbarui Chrome untuk memulai sinkronisasi
- Google Chrome adalah browser default Anda
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb
-index f20f6c2b526d..ef47b66a4a79 100644
+index d02bb6ad6809..15d68c394125 100644
--- a/chrome/app/resources/google_chrome_strings_it.xtb
+++ b/chrome/app/resources/google_chrome_strings_it.xtb
-@@ -78,7 +78,7 @@ Se esegui comunque l'accesso, le informazioni di Chrome come Preferiti, cronolog
+@@ -80,7 +80,7 @@ Se esegui comunque l'accesso, le informazioni di Chrome come Preferiti, cronolog
Visualizza Google Chrome in questa linguaAvvio di Chrome...Hai eseguito l'accesso a Chrome.
-Informazioni su Chrome
-+About Browser
++Informazioni su BrowserGoogle Chrome è in modalità background.Se ti disconnetti da verranno cancellati la cronologia, i Preferiti, le impostazioni e gli altri dati di Chrome memorizzati sul dispositivo. I dati memorizzati nel tuo Account Google non verranno cancellati e potrai gestirli su Google Dashboard.Scheda Chrome
-@@ -283,4 +283,4 @@ Per ulteriori informazioni, controlla l'email all'indirizzo Riavvia Chrome per applicare le modifiche
- Aggiorna Chrome per avviare la sincronizzazione
- Google Chrome è il tuo browser predefinito
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb
-index de498ac6fa57..c9a599b37922 100644
+index b7073fa813bc..678076789406 100644
--- a/chrome/app/resources/google_chrome_strings_iw.xtb
+++ b/chrome/app/resources/google_chrome_strings_iw.xtb
-@@ -78,7 +78,7 @@
+@@ -81,7 +81,7 @@
הצג את Google Chrome בשפה זוהפעלת Chrome...נכנסת ל-Chrome!
-מידע כללי על Chrome
-+About Browser
++מידע כללי על BrowserGoogle Chrome נמצא במצב רקע.ניתוק ינקה את ההיסטוריה, הסימניות, ההגדרות ונתוני Chrome אחרים המאוחסנים במכשיר הזה. נתונים המאוחסנים בחשבון Google לא ינוקו, וניתן לנהל אותם במרכז השליטה של Google.כרטיסייה של Chrome
-@@ -282,4 +282,4 @@
- כדי להחיל את השינויים שביצעת, יש להפעיל מחדש את Chrome
- יש לעדכן את Chrome כדי להתחיל את הסנכרון
- Google Chrome הוא דפדפן ברירת המחדל
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb
-index 43d465c4b40c..0a812f4be9b0 100644
+index 1e189348cf21..23409d03319e 100644
--- a/chrome/app/resources/google_chrome_strings_ja.xtb
+++ b/chrome/app/resources/google_chrome_strings_ja.xtb
-@@ -78,7 +78,7 @@
+@@ -81,7 +81,7 @@
Google Chrome をこの言語で表示Chrome を起動しています...Chrome にログインしました
-Chrome について
-+About Browser
++Browser についてGoogle Chrome はバックグラウンド モードです。 の接続を解除すると、履歴、ブックマーク、設定、このデバイスに保存されたその他の Chrome データが消去されます。ただし、Google アカウントに保存されたデータは消去されず、引き続き Google ダッシュボードで管理できます。Chrome タブ
-@@ -282,4 +282,4 @@
- 変更を適用するには Chrome を再起動してください
- 同期を開始するには、Chrome を更新します
- 既定のブラウザは Google Chrome です
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_kn.xtb b/chrome/app/resources/google_chrome_strings_kn.xtb
-index fe1485cb5971..46d24ed84927 100644
+index a148ca0fc74b..5d944bd5aa30 100644
--- a/chrome/app/resources/google_chrome_strings_kn.xtb
+++ b/chrome/app/resources/google_chrome_strings_kn.xtb
-@@ -80,7 +80,7 @@
+@@ -82,7 +82,7 @@
ಈ ಭಾಷೆಯಲ್ಲಿ Google Chrome ಪ್ರದರ್ಶಿಸುChrome ಅನ್ನು ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ...ನೀವೀಗ Chrome ಗೆ ಸೈನ್ ಇನ್ ಆಗಿರುವಿರಿ!
-Chrome ಕುರಿತು
-+About Browser
++Browser ಕುರಿತುGoogle Chrome ಹಿನ್ನೆಲೆ ಮೋಡ್ನಲ್ಲಿದೆ. ಅವರ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸುವುದರಿಂದ ನಿಮ್ಮ ಇತಿಹಾಸ, ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಈ ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಇತರ Chrome ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಲಾಗುತ್ತದೆ ಮತ್ತು Google ಡ್ಯಾಶ್ಬೋರ್ಡ್ನಲ್ಲಿ ನಿರ್ವಹಿಸಬಹುದಾಗಿದೆ.Chrome ಟ್ಯಾಬ್
-@@ -285,4 +285,4 @@
- ನಿಮ್ಮ ಬದಲಾವಣೆಗಳನ್ನು ಅನ್ವಯಿಸಲು, Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ
- ಸಿಂಕ್ ಪ್ರಾರಂಭಿಸಲು Chrome ಅಪ್ಡೇಟ್ ಮಾಡಿ
- Google Chrome ನಿಮ್ಮ ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಆಗಿದೆ.
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb
-index a0c52dd5d218..99ce09adf433 100644
+index d0586760a4cc..6c689587bb3e 100644
--- a/chrome/app/resources/google_chrome_strings_ko.xtb
+++ b/chrome/app/resources/google_chrome_strings_ko.xtb
-@@ -82,7 +82,7 @@
+@@ -85,7 +85,7 @@
이 언어로 Chrome 표시Chrome 실행 중...Chrome에 로그인되어 있습니다.
-Chrome 정보
-+About Browser
++Browser 정보Chrome이 백그라운드 모드로 실행 중입니다.의 연결을 해제하면 이 기기에 저장된 방문 기록, 북마크, 설정 및 기타 Chrome 데이터가 삭제됩니다. Google 계정에 저장된 데이터는 삭제되지 않으며 Google 대시보드에서 관리될 수 있습니다.Chrome 탭
-@@ -290,4 +290,4 @@ Chrome에서 설정을 복구할 수 없습니다.
- 변경사항을 적용하려면 Chrome을 다시 실행하세요.
- 동기화를 시작하려면 Chrome을 업데이트하세요.
- Chrome이 기본 브라우저로 설정되어 있습니다.
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb
-index 74ecffa45217..55cbf2f23964 100644
+index 1d5371fc646b..a513490ebcef 100644
--- a/chrome/app/resources/google_chrome_strings_lt.xtb
+++ b/chrome/app/resources/google_chrome_strings_lt.xtb
-@@ -82,7 +82,7 @@ Prisijungus bet kuriuo būdu, „Chrome“ informacija, pvz., žymės, istorija
+@@ -85,7 +85,7 @@ Prisijungus bet kuriuo būdu, „Chrome“ informacija, pvz., žymės, istorija
Pateikti „Google Chrome“ šia kalbaPristatoma „Chrome“...Esate prisijungę prie „Chrome“.
-Apie „Chrome“
-+About Browser
++Apie „Browser“„Google Chrome“ veikia fono režimu.Atjungus , bus išvalyta jūsų istorija, žymės, nustatymai ir kiti „Chrome“ duomenys, saugomi šiame įrenginyje. „Google“ paskyroje saugomi duomenys nebus išvalyti. Juos galite tvarkyti „Google“ informacijos suvestinėje.„Chrome“ skirtukas
-@@ -290,4 +290,4 @@ Kai kurios funkcijos gali būti nepasiekiamos. Nurodykite kitą profilio katalog
- Norėdami pritaikyti pakeitimus, paleiskite „Chrome“ iš naujo
- Atnaujinkite „Chrome“, kad galėtumėte pradėti sinchronizuoti
- „Google Chrome“ yra numatytoji naršyklė
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_lv.xtb b/chrome/app/resources/google_chrome_strings_lv.xtb
-index 84395dc70a52..ffeb43fb3e25 100644
+index 8abda370437b..d1d80b69ae9d 100644
--- a/chrome/app/resources/google_chrome_strings_lv.xtb
+++ b/chrome/app/resources/google_chrome_strings_lv.xtb
-@@ -80,7 +80,7 @@ Ja pierakstīsieties tik un tā, Chrome informācija, piemēram, grāmatzīmes,
+@@ -83,7 +83,7 @@ Ja pierakstīsieties tik un tā, Chrome informācija, piemēram, grāmatzīmes,
Rādīt Google Chrome šajā valodāNotiek Chrome palaišana...Esat pierakstījies pārlūkā Chrome!
-Par Chrome
-+About Browser
++Par BrowserGoogle Chrome darbojas fona režīmā.Atvienojot lietotāju , tiks notīrīta vēsture, grāmatzīmes, iestatījumi un citi Chrome dati, kas ir saglabāti šajā ierīcē. Jūsu Google kontā saglabātie dati netiks notīrīti, un tos var pārvaldīt Google informācijas panelī.Chrome cilne
-@@ -286,4 +286,4 @@ Dažas funkcijas var nebūt pieejamas. Norādiet citu profila direktoriju vai li
- Lai ieviestu veiktās izmaiņas, atkārtoti palaidiet pārlūku Chrome.
- Lai sāktu sinhronizāciju, atjauniniet Chrome.
- Jūsu noklusējuma pārlūks ir Google Chrome.
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb
-index ff22959e938f..4526a97bb09d 100644
+index d5661a9bb69e..0f60404f77a9 100644
--- a/chrome/app/resources/google_chrome_strings_ml.xtb
+++ b/chrome/app/resources/google_chrome_strings_ml.xtb
-@@ -83,7 +83,7 @@
+@@ -85,7 +85,7 @@
+ ഈ ഭാഷയില് Google Chrome പ്രദര്ശിപ്പിക്കുകChrome സമാരംഭിക്കുന്നു...നിങ്ങൾ Chrome-ൽ സൈൻ ഇൻ ചെയ്തു!
- Chrome-നെ കുറിച്ച്
--Google Chrome ഒരു പശ്ചാത്തല മോഡിലാണ്.
-+About Browser
+-Chrome-നെ കുറിച്ച്
++Browser-നെ കുറിച്ച്
+ Google Chrome ഒരു പശ്ചാത്തല മോഡിലാണ്. എന്നത് വിച്ഛേദിക്കുന്നത് നിങ്ങളുടെ ചരിത്രം, ബുക്ക്മാർക്കുകൾ, ക്രമീകരണങ്ങൾ, ഈ ഉപകരണത്തിൽ സംഭരിച്ച മറ്റ് Chrome ഡാറ്റ എന്നിവയെ മായ്ക്കും. നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സംഭരിച്ച ഡാറ്റ മായ്ക്കാനാകില്ല, അവ Google ഡാഷ്ബോർഡിൽ നിയന്ത്രിക്കാനാകും.Chrome ടാബ്
- Google Chrome അടച്ചാലും പശ്ചാത്തല ആപ്ലിക്കേഷനുകള് പ്രവര്ത്തിപ്പിക്കുന്നത് തുടരുക
-@@ -290,4 +290,4 @@
- നിങ്ങളുടെ മാറ്റങ്ങൾ ബാധകമാക്കാൻ Chrome വീണ്ടും സമാരംഭിക്കുക
- സമന്വയിപ്പിക്കാൻ തുടങ്ങുന്നതിന് Chrome അപ്ഡേറ്റ് ചെയ്യുക
- Google Chrome നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറാണ്
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb
-index 30969fe09335..ef6ae81e1989 100644
+index 41fff571673a..839a322dcc11 100644
--- a/chrome/app/resources/google_chrome_strings_mr.xtb
+++ b/chrome/app/resources/google_chrome_strings_mr.xtb
-@@ -81,7 +81,7 @@
+@@ -84,7 +84,7 @@
Google Chrome या भाषेत डिस्प्ले कराChrome लाँच करत आहे...तुम्ही Chrome मध्ये साइन इन केले आहे!
-Chrome बद्दल
-+About Browser
++Browser बद्दलGoogle Chrome पार्श्वभूमी मोड मध्ये आहे. डिस्कनेक्ट केल्याने या डिव्हाइसवरील तुमचा इतिहास, बुकमार्क, सेटिंग्ज आणि अन्य Chrome डेटा साफ होईल. आपल्या Google खात्यात संचयित केलेला डेटा साफ केला जाणार नाही आणि तो Google डॅशबोर्ड वर व्यवस्थापित केला जाऊ शकतो.Chrome टॅब
-@@ -287,4 +287,4 @@ Google Chrome तुमची सेटिंग्ज पुन्हा मि
- तुम्ही केलेले बदल लागू करण्यासाठी, Chrome रीलाँच करा
- सिंक सुरू करण्यासाठी अपडेट करा
- Google Chrome तुमचा डीफॉल्ट ब्राउझर आहे
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb
-index 5c6821052677..ca48328ded4a 100644
+index e6df7859e8c9..fe24b898d22b 100644
--- a/chrome/app/resources/google_chrome_strings_ms.xtb
+++ b/chrome/app/resources/google_chrome_strings_ms.xtb
-@@ -78,7 +78,7 @@ Teruskan juga log masuk akan menggabungkan maklumat Chrome seperti penanda halam
+@@ -81,7 +81,7 @@ Teruskan juga log masuk akan menggabungkan maklumat Chrome seperti penanda halam
Paparkan Google Chrome dalam bahasa iniMelancarkan Chrome...Anda kini telah log masuk ke Chrome!
-Perihal Chrome
-+About Browser
++Perihal BrowserGoogle Chrome dalam mod latar belakang.Memutuskan sambungan akan mengosongkan sejarah anda, penanda halaman, tetapan dan data Chrome lain yang tersimpan pada peranti ini. Data yang disimpan dalam Akaun Google anda tidak akan dikosongkan dan boleh diurus pada Papan Pemuka Google.Tab Chrome
-@@ -282,4 +282,4 @@ Sila semak e-mel anda di untuk arahan lanjut.Untuk menggunakan perubahan anda, mulakan semula Chrome
- Kemas kini Chrome untuk memulakan penyegerakan
- Google Chrome ialah penyemak imbas lalai anda
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb
-index 90993f2cea06..c00aaa883775 100644
+index 1448134351e0..691e244415b4 100644
--- a/chrome/app/resources/google_chrome_strings_nl.xtb
+++ b/chrome/app/resources/google_chrome_strings_nl.xtb
-@@ -82,7 +82,7 @@ Als je inlogt, worden Chrome-gegevens zoals bladwijzers, geschiedenis en andere
+@@ -84,7 +84,7 @@ Als je inlogt, worden Chrome-gegevens zoals bladwijzers, geschiedenis en andere
Google Chrome weergegeven in deze taalChrome starten…Je bent ingelogd bij Chrome.
-Over Chrome
-+About Browser
++Over BrowserGoogle Chrome bevindt zich in de achtergrondmodus.Als je de verbinding met verbreekt, worden je geschiedenis, bladwijzers, instellingen en andere Chrome-gegevens op dit apparaat opgeslagen. De gegevens die in je Google-account zijn opgeslagen, worden niet gewist en kunnen worden beheerd via Google Dashboard.Chrome-tabblad
-@@ -288,4 +288,4 @@ Sommige functies zijn wellicht niet beschikbaar. Geef een andere profieldirector
- Als je de wijzigingen wilt toepassen, start je Chrome opnieuw
- Chrome updaten om de synchronisatie te starten
- Google Chrome is je standaardbrowser
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb
-index 5366c453d103..7cfc9878309f 100644
+index 7023ede476d3..c4da24ae866d 100644
--- a/chrome/app/resources/google_chrome_strings_no.xtb
+++ b/chrome/app/resources/google_chrome_strings_no.xtb
-@@ -78,7 +78,7 @@ Hvis du logger deg på allikevel, blir Chrome-informasjon som bokmerker, loggen
+@@ -81,7 +81,7 @@ Hvis du logger deg på allikevel, blir Chrome-informasjon som bokmerker, loggen
Vis Google Chrome på dette språketStarter Chrome ...Du er nå logget på Chrome.
-Om Chrome
-+About Browser
++Om BrowserGoogle Chrome er i bakgrunnsmodus.Hvis du kobler fra , slettes loggen din, bokmerkene, innstillingene og andre Chrome-data som er lagret på denne enheten. Data som er lagret i Google-kontoen din, blir ikke tømt og kan administreres på Google Oversikt.Chrome-fane
-@@ -282,4 +282,4 @@ Vi har sendt deg () en e-post med nærmere instruksjo
- For å bruke endringene dine må du starte Chrome på nytt
- Oppdater Chrome for å starte synkroniseringen
- Google Chrome er standardnettleseren din
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb
-index 5608fbd0f6fa..3596e5f24dca 100644
+index 504ecf54d60e..0bf6496ed5dd 100644
--- a/chrome/app/resources/google_chrome_strings_pl.xtb
+++ b/chrome/app/resources/google_chrome_strings_pl.xtb
-@@ -78,7 +78,7 @@ Jeśli jednak zalogujesz się teraz, informacje Chrome, takie jak zakładki, his
+@@ -80,7 +80,7 @@ Jeśli jednak zalogujesz się teraz, informacje Chrome, takie jak zakładki, his
Wyświetlaj Google Chrome w tym językuUruchamiam Chrome…Jesteś zalogowany w Chrome.
-Chrome – informacje
-+About Browser
++Browser – informacjeGoogle Chrome jest w trybie działania w tleOdłączenie konta spowoduje wyczyszczenie jego historii, zakładek, ustawień i innych danych Chrome zapisanych na tym urządzeniu. Dane przechowywane na koncie Google nie zostaną usunięte. Możesz nimi zarządzać w Panelu Google.Karta Chrome
-@@ -282,4 +282,4 @@ Więcej instrukcji znajdziesz w e-mailu wysłanym na adres Aby zastosować zmiany, uruchom ponownie Chrome
- Aby rozpocząć synchronizację, zaktualizuj Chrome
- Google Chrome jest domyślną przeglądarką
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
-index 253d9e62e2b0..0a9e7bbe0ffd 100644
+index 8f3ae68929a0..b175684ca75f 100644
--- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
-@@ -78,7 +78,7 @@ Se você decidir fazer login assim mesmo, as informações do Google Chrome, com
+@@ -80,7 +80,7 @@ Se você decidir fazer login assim mesmo, as informações do Google Chrome, com
Exibir o Google Chrome neste idiomaIniciando o Chrome…Você fez login no Google Chrome.
-Sobre o Google Chrome
-+About Browser
++Sobre o Google BrowserO Google Chrome está em modo de segundo plano.Ao desconectar , o histórico, os favoritos, as configurações e outros dados do Google Chrome armazenados neste dispositivo serão excluídos. Os dados armazenados na sua Conta do Google não serão excluídos e poderão ser gerenciados no Painel de Controle do Google.Guia do Chrome
-@@ -282,4 +282,4 @@ Verifique seu e-mail em para ver mais instruções.<
- Para que as alterações sejam aplicadas, reinicie o Chrome
- Atualize o Chrome para iniciar a sincronização
- O Google Chrome é seu navegador padrão
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
-index 1a3f9e099bde..0806460339f1 100644
+index 65e18330ca8a..e74ab6f3bd12 100644
--- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
-@@ -78,7 +78,7 @@ Se, mesmo assim, iniciar sessão, as informações do Chrome, como marcadores, h
+@@ -81,7 +81,7 @@ Se, mesmo assim, iniciar sessão, as informações do Chrome, como marcadores, h
Apresentar o Google Chrome neste idiomaA iniciar o Chrome…Tem sessão iniciada no Chrome!
-Acerca do Chrome
-+About Browser
++Acerca do BrowserO Google Chrome está no modo em segundo plano.Desligar irá limpar o seu histórico, os marcadores, as definições e outros dados do Chrome armazenados neste dispositivo. Os dados armazenados na Conta Google não serão limpos e podem ser geridos no Painel de controlo Google.Separador do Chrome
-@@ -282,4 +282,4 @@ Para obter mais instruções, verifique o seu email em Para aplicar as alterações, reinicie o Chrome.
- Atualize o Chrome para iniciar a sincronização
- O Google Chrome é o seu navegador predefinido
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb
-index 71b8d4d483bf..e51384f0c840 100644
+index 7ace37f41805..416840d068db 100644
--- a/chrome/app/resources/google_chrome_strings_ro.xtb
+++ b/chrome/app/resources/google_chrome_strings_ro.xtb
-@@ -78,7 +78,7 @@ Dacă totuși vă conectați, informațiile Chrome cum ar fi marcajele, istoricu
+@@ -81,7 +81,7 @@ Dacă totuși vă conectați, informațiile Chrome cum ar fi marcajele, istoricu
Afișează Google Chrome în această limbăSe lansează Chrome...V-ați conectat la Chrome!
-Despre Chrome
-+About Browser
++Despre BrowserGoogle Chrome este în modul fundal.Dacă deconectați utilizatorul , vor fi șterse istoricul, marcajele, setările și alte date Chrome salvate pe acest dispozitiv. Datele salvate în Contul Google nu vor fi șterse și pot fi gestionate din Tabloul de bord Google.Fila Chrome
-@@ -282,4 +282,4 @@ Verifică e-mailul la pentru instrucțiuni supliment
- Pentru a aplica modificările, relansează Chrome
- Actualizează Chrome pentru a începe sincronizarea
- Google Chrome este browserul prestabilit
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb
-index e2c65ead1eef..54f40024daba 100644
+index e911532296e8..0074126f142d 100644
--- a/chrome/app/resources/google_chrome_strings_ru.xtb
+++ b/chrome/app/resources/google_chrome_strings_ru.xtb
-@@ -78,7 +78,7 @@
+@@ -80,7 +80,7 @@
Отображать Google Chrome на этом языкеЗапуск Chrome...Добро пожаловать в Chrome!
-О браузере Chrome
-+About Browser
++О браузере BrowserGoogle Chrome работает в фоновом режимеЕсли вы отключите аккаунт , все сохраненные на этом устройстве закладки, настройки, история и другие данные Chrome будут удалены. Данные в вашем аккаунте Google сохранятся, и вы сможете управлять ими в Личном кабинете Google.Вкладка Chrome
-@@ -282,4 +282,4 @@
- Чтобы изменения вступили в силу, перезапустите Chrome.
- Чтобы начать синхронизацию, обновите Chrome
- Google Chrome используется как браузер по умолчанию
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb
-index 33163564d00a..c8b1cd76566d 100644
+index 9c7cc3d19f9b..a38f027514d4 100644
--- a/chrome/app/resources/google_chrome_strings_sk.xtb
+++ b/chrome/app/resources/google_chrome_strings_sk.xtb
-@@ -80,7 +80,7 @@ Ak sa chcete aj napriek tomu prihlásiť, informácie prehliadača Chrome, ako s
+@@ -82,7 +82,7 @@ Ak sa chcete aj napriek tomu prihlásiť, informácie prehliadača Chrome, ako s
Zobrazovať Google Chrome v tomto jazykuSpúšťa sa Chrome…Ste prihlásený/-á do prehliadača Chrome.
-O prehliadači Chrome
-+About Browser
++O prehliadači BrowserGoogle Chrome je v režime na pozadí.Ak odpojíte účet , vymaže sa história, záložky, nastavenia a všetky ďalšie údaje prehliadača Chrome uložené na vašom zariadení. Údaje uložené v účte Google sa nevymažú a môžete ich spravovať v službe Google Dashboard.Karta Chrome
-@@ -288,4 +288,4 @@ Prehliadač Google Chrome nedokáže obnoviť vaše nastavenia.
- Ak chcete zmeny použiť, spustite Chrome znova
- Ak chcete spustiť synchronizáciu, aktualizujte Chrome
- Google Chrome je vaším predvoleným prehliadačom
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb
-index 055ddf179f92..d37986499802 100644
+index e9bfddd76653..73b1679f4a7a 100644
--- a/chrome/app/resources/google_chrome_strings_sl.xtb
+++ b/chrome/app/resources/google_chrome_strings_sl.xtb
-@@ -82,7 +82,7 @@ Nekatere funkcije morda niso na voljo in spremembe nastavitev ne bodo shranjene.
+@@ -85,7 +85,7 @@ Nekatere funkcije morda niso na voljo in spremembe nastavitev ne bodo shranjene.
Prikaži Google Chrome v tem jezikuZagon Chroma …Zdaj ste prijavljeni v Chrome.
-O brskalniku Chrome
-+About Browser
++O brskalniku BrowserGoogle Chrome se izvaja v ozadju.Če prekinete povezavo za , boste izbrisali zgodovino, zaznamke, nastavitve in druge Chromove podatke, ki so shranjeni v tej napravi. Podatki, shranjeni v Google Računu, ne bodo izbrisani in jih je mogoče upravljati na Google Nadzorni plošči.Zavihek v Chromu
-@@ -291,4 +291,4 @@ Te storitve lahko morda onemogočite. Več o temČe želite uporabiti spremembe, znova zaženite Chrome
- Posodobite Chrome, če želite začeti sinhronizacijo
- Google Chrome je privzeti brskalnik
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb
-index ca19d4860a25..55f1d688f96d 100644
+index 077d0ecd1c4f..db9ea29123c8 100644
--- a/chrome/app/resources/google_chrome_strings_sr.xtb
+++ b/chrome/app/resources/google_chrome_strings_sr.xtb
-@@ -82,7 +82,7 @@
+@@ -85,7 +85,7 @@
Приказуј Google Chrome на овом језикуПокреће се Chrome...Пријављени сте у Chrome!
-О Chrome прегледачу
-+About Browser
++О Browser прегледачуGoogle Chrome је у позадинском режиму.Ако прекинете везу са , обрисаћете историју, обележиваче, подешавања и друге Chrome податке ускладиштене на овом уређају. Подаци сачувани на Google налогу неће бити обрисани и можете њима да управљате на Google контролној табли.Картица Chrome
-@@ -290,4 +290,4 @@ Google Chrome не може да врати подешавања.
- Да бисте применили промене, поново покрените Chrome
- Ажурирајте Chrome да бисте започели синхронизацију
- Google Chrome је подразумевани прегледач
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb
-index f578d02520e7..6209eb31331c 100644
+index fd72fc603769..b4a1686717a4 100644
--- a/chrome/app/resources/google_chrome_strings_sv.xtb
+++ b/chrome/app/resources/google_chrome_strings_sv.xtb
-@@ -82,7 +82,7 @@ Om du loggar in ändå synkroniseras din information i Chrome, till exempel bokm
+@@ -85,7 +85,7 @@ Om du loggar in ändå synkroniseras din information i Chrome, till exempel bokm
Visa Google Chrome på det här språketChrome startas …Du är inloggad i Chrome.
-Om Chrome
-+About Browser
++Om BrowserGoogle Chrome körs i bakgrundsläge.Om du kopplar från rensas din historik, dina bokmärken, dina inställningar och annan Chrome-data som du har lagrat på enheten. Data som lagras i Google-kontot rensas inte utan kan hanteras via Google Översikt.Chrome-flik
-@@ -290,4 +290,4 @@ Google Chrome kan inte återställa dina inställningar.
- Ändringarna tillämpas när du startar om Chrome
- Du måste uppdatera Chrome innan synkroniseringen kan starta
- Google Chrome är din standardwebbläsare
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb
-index 1b5a99d7bd52..40caea0c2183 100644
+index f4da9075a68e..7fb86b5aa884 100644
--- a/chrome/app/resources/google_chrome_strings_sw.xtb
+++ b/chrome/app/resources/google_chrome_strings_sw.xtb
-@@ -82,7 +82,7 @@ Kuingia bila kujali kutaunganisha maelezo ya Chrome kama vile alamisho, historia
+@@ -84,7 +84,7 @@ Kuingia bila kujali kutaunganisha maelezo ya Chrome kama vile alamisho, historia
Onyesha Google Chrome katika lugha hiiInaanzisha Chrome...Umeingia kwenye Chrome!
-Kuhusu Chrome
-+About Browser
++Kuhusu BrowserGoogle Chrome iko katika hali ya chini chini.Kuondoa kutafuta historia, alamisho, mipangilio, na data zako nyingine kwenye Chrome zilizohifadhiwa kwenye kifaa hiki. Data iliyohifadhiwa katika Akaunti ya Google haitafutwa na inaweza kudhibitiwa kwenye Dashibodi ya Google.Kichupo cha Chrome
-@@ -290,4 +290,4 @@ Google Chrome haiwezi kufufua mipangilio yako.
- Ili utumie mabadiliko uliyofanya, fungua Chrome upya
- Sasisha Chrome ili uanze kusawazisha
- Google Chrome ni kivinjari chako chaguomsingi
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb
-index 26ac3a18c261..5722356ab203 100644
+index 13219b129271..7675693f5174 100644
--- a/chrome/app/resources/google_chrome_strings_ta.xtb
+++ b/chrome/app/resources/google_chrome_strings_ta.xtb
-@@ -78,7 +78,7 @@
+@@ -81,7 +81,7 @@
Google Chromeமை இந்த மொழியில் காட்டுChromeமைத் தொடங்குகிறது...Chrome இல் உள்நுழைந்துள்ளீர்கள்!
-Chrome அறிமுகம்
-+About Browser
++Browser அறிமுகம்Google Chrome பின்புலப் பயன்முறையில் இயங்குகிறது. ஐத் துண்டிப்பது, இந்தச் சாதனத்தில் உள்ள உங்கள் வரலாறு, புத்தகக்குறிகள், அமைப்புகள் மற்றும் பிற Chrome தரவை அழிக்கும். உங்கள் Google கணக்கில் சேமிக்கப்பட்ட தரவு அழிக்கப்படாது, மேலும் Google டாஷ்போர்டில் நிர்வகிக்கலாம்.Chrome தாவல்
-@@ -282,4 +282,4 @@
- உங்கள் மாற்றங்களைச் செயல்படுத்த, Chromeமை மீண்டும் தொடங்கவும்
- ஒத்திசைவைத் தொடங்க, Chromeஐப் புதுப்பிக்கவும்
- உங்கள் இயல்புநிலை உலாவி Google Chrome ஆகும்
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb
-index dbc562b3e06a..3b9a1f9c4620 100644
+index f04b6a40eabb..54aea064bb95 100644
--- a/chrome/app/resources/google_chrome_strings_te.xtb
+++ b/chrome/app/resources/google_chrome_strings_te.xtb
-@@ -78,7 +78,7 @@
+@@ -81,7 +81,7 @@
Google Chromeను ఈ భాషలో ప్రదర్శించుChromeను ప్రారంభిస్తోంది...మీరు Chromeకు సైన్ ఇన్ చేసారు!
-Chrome పరిచయం
-+About Browser
++Browser పరిచయంGoogle Chrome నేపథ్య మోడ్లో ఉంది.ను డిస్కనెక్ట్ చేయడం వల్ల ఈ పరికరంలో నిల్వ చేయబడిన మీ చరిత్ర, బుక్మార్క్లు, సెట్టింగ్లు, ఇతర Chrome డేటా క్లియర్ చేయబడతాయి. మీ Google ఖాతాలో నిల్వ చేయబడిన డేటా క్లియర్ చేయబడదు. దాన్ని Google డాష్బోర్డ్లో నిర్వహించవచ్చు.Chrome ట్యాబ్
-@@ -282,4 +282,4 @@
- మీ మార్పులను వర్తింపజేయడానికి, Chromeని పునఃప్రారంభించండి
- సింక్ను ప్రారంభించడానికి Chromeను అప్డేట్ చేయాలి
- మీ డిఫాల్ట్ బ్రౌజర్ Google Chrome
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb
-index 30ff90ae3226..41e108df9d35 100644
+index 0fef9d8e2ea1..133b5d40139b 100644
--- a/chrome/app/resources/google_chrome_strings_th.xtb
+++ b/chrome/app/resources/google_chrome_strings_th.xtb
-@@ -78,7 +78,7 @@
+@@ -80,7 +80,7 @@
แสดง Google Chrome ในภาษานี้กำลังเปิด Chrome...คุณได้ลงชื่อเข้าใช้ Chrome แล้ว!
-เกี่ยวกับ Chrome
-+About Browser
++เกี่ยวกับ BrowserGoogle Chrome กำลังอยู่ในโหมดทำงานในพื้นหลังการยกเลิกการเชื่อมต่อกับ จะล้างประวัติการเข้าชม บุ๊กมาร์ก การตั้งค่า และข้อมูลอื่นๆ ของ Chrome ที่เก็บไว้ในอุปกรณ์นี้ ข้อมูลที่เก็บไว้ในบัญชี Google ของคุณจะไม่ถูกล้างและสามารถจัดการได้บน Google Dashboardแท็บ Chrome
-@@ -282,4 +282,4 @@
- เปิด Chrome ขึ้นมาใหม่เพื่อให้การเปลี่ยนแปลงมีผล
- อัปเดต Chrome เพื่อเริ่มการซิงค์
- Google Chrome เป็นเบราว์เซอร์เริ่มต้นของคุณ
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb
-index 91e3e0188ca2..8ccd4cb03f40 100644
+index 79757198f717..c4cc8bc5849c 100644
--- a/chrome/app/resources/google_chrome_strings_tr.xtb
+++ b/chrome/app/resources/google_chrome_strings_tr.xtb
-@@ -78,7 +78,7 @@ Yine de oturum açarsanız, yer işaretleriniz, geçmişiniz ve diğer ayarları
+@@ -81,7 +81,7 @@ Yine de oturum açarsanız, yer işaretleriniz, geçmişiniz ve diğer ayarları
Google Chrome'u bu dilde görüntüleChrome başlatılıyor...Chrome'da oturum açtınız!
-Chrome hakkında
-+About Browser
++Browser hakkındaGoogle Chrome arka plan modunda. kullanıcısının bağlantısını kesmek, geçmişinizi, yer işaretlerinizi, ayarlarınızı ve bu cihazda depolanan diğer Chrome verilerinizi temizler. Google Hesabınızda depolanan veriler temizlenmez ve Google Hesap Özeti'nden yönetilebilir.Chrome Sekmesi
-@@ -285,4 +285,4 @@ Bazı özellikler kullanılamayabilir. Lütfen farklı bir profil dizini belirti
- Yaptığınız değişiklikleri uygulamak için Chrome'u yeniden başlatın
- Senkronizasyonu başlatmak için Chrome'u güncelleyin
- Google Chrome varsayılan tarayıcınız oldu
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb
-index a514b332ce91..1fc4312da20e 100644
+index c56ff62ed4ed..c3bdbe2977e6 100644
--- a/chrome/app/resources/google_chrome_strings_uk.xtb
+++ b/chrome/app/resources/google_chrome_strings_uk.xtb
-@@ -78,7 +78,7 @@
+@@ -81,7 +81,7 @@
Вибрати цю мову для Google ChromeЗапускається Chrome…Ви ввійшли в Chrome.
-Про Chrome
-+About Browser
++Про BrowserGoogle Chrome у фоновому режимі.Якщо від’єднати користувача , вашу історію, закладки, налаштування й інші дані Chrome, збережені на цьому пристрої, буде видалено. Дані, які зберігаються в обліковому записі Google, не буде видалено. Ними можна керувати на Інформаційній панелі Google.Chrome
-@@ -282,4 +282,4 @@
- Щоб застосувати зміни, перезапустіть Chrome
- Щоб почати синхронізацію, оновіть Chrome
- Google Chrome – ваш веб-переглядач за умовчанням
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb
-index a21f9c34fa2a..9199293fe1aa 100644
+index c79457c11719..fb30b5739290 100644
--- a/chrome/app/resources/google_chrome_strings_vi.xtb
+++ b/chrome/app/resources/google_chrome_strings_vi.xtb
-@@ -80,7 +80,7 @@
+@@ -83,7 +83,7 @@
Hiển thị Google Chrome bằng ngôn ngữ nàyĐang khởi động Chrome...Bạn đã đăng nhập vào Chrome!
-Giới thiệu về Chrome
-+About Browser
++Giới thiệu về BrowserGoogle Chrome đang chạy trong nền.Ngắt kết nối sẽ xóa lịch sử, dấu trang, cài đặt và các dữ liệu Chrome khác của bạn trên thiết bị này. Dữ liệu được lưu trữ trong tài khoản Google của bạn sẽ không bị xóa và có thể được quản lý trên Trang tổng quan của Google.Tab Chrome
-@@ -286,4 +286,4 @@ Một số tính năng có thể không khả dụng. Vui lòng chỉ định th
- Để áp dụng các mục thay đổi của bạn, hãy khởi động lại Chrome
- Cập nhật Chrome để bắt đầu đồng bộ hóa
- Google Chrome là trình duyệt mặc định của bạn
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
-index e6d8f9404f83..857a91a51485 100644
+index 0cf463e82181..f0c0dfdfdd88 100644
--- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
-@@ -78,7 +78,7 @@
+@@ -81,7 +81,7 @@
以这种语言显示 Google Chrome正在启动 Chrome…您已登录 Chrome!
-关于 Chrome
-+About Browser
++关于 BrowserGoogle Chrome处于后台运行模式。取消与的关联将会清除您的历史记录、书签、设置以及存储在此设备上的其他Chrome数据。您的Google帐号中存储的数据将不会被清除,并且您可以通过Google信息中心管理这些数据。Chrome 标签页
-@@ -282,4 +282,4 @@
- 要想应用您的更改,请重新启动 Chrome
- 更新 Chrome 以开始同步
- Google Chrome 是您的默认浏览器
--
-\ No newline at end of file
-+
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
-index 46dc009c9538..44d6685201bd 100644
+index dd46c56759bc..c0b0f2a23c02 100644
--- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
-@@ -78,7 +78,7 @@
+@@ -81,7 +81,7 @@
將 Google Chrome 的介面文字設為這種語言正在啟動 Chrome…你已登入 Chrome!
-關於 Chrome
-+About Browser
++關於 BrowserGoogle Chrome 正在背景模式中執行。解除與 的連結將會清除此裝置上已儲存的歷史記錄、書籤、設定和其他 Chrome 資料。不過,這不會清除 Google 帳戶中儲存的資料,你可以在 Google 資訊主頁管理這些資料。Chrome 分頁
-@@ -284,4 +284,4 @@ Google Chrome 無法復原你的設定。
- 如要套用變更,請重新啟動 Chrome
- 如要開始同步處理,請更新 Chrome
- Google Chrome 是你的預設瀏覽器
--
-\ No newline at end of file
-+
--
-2.17.1
+2.23.0
diff --git a/build/patches/e-set-informations.patch b/build/patches/e-set-informations.patch
index d7e2436e5e4bfc30aa687993426ecb52512a3b23..994e9865c133ebcce61557a596de153730ca22b3 100644
--- a/build/patches/e-set-informations.patch
+++ b/build/patches/e-set-informations.patch
@@ -1,7 +1,7 @@
-From 4abd8753d4b1eb0069bde13d9a6aee1beedfbf6d Mon Sep 17 00:00:00 2001
+From c8432020ea991c4f01cb0f0a6a75c8249c5bc45e Mon Sep 17 00:00:00 2001
From: Romain HUNAULT
Date: Tue, 16 Apr 2019 22:27:43 +0200
-Subject: [PATCH] Add /e/ browser information in About
+Subject: [PATCH 2/7] Add /e/ browser information in About
---
chrome/android/java/res/xml/about_chrome_preferences.xml | 3 +++
@@ -10,21 +10,21 @@ Subject: [PATCH] Add /e/ browser information in About
3 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/chrome/android/java/res/xml/about_chrome_preferences.xml b/chrome/android/java/res/xml/about_chrome_preferences.xml
-index a24c0ee2dbd5..c84077ef1fc2 100644
+index e1ddc3099473..25c6c31ffc14 100644
--- a/chrome/android/java/res/xml/about_chrome_preferences.xml
+++ b/chrome/android/java/res/xml/about_chrome_preferences.xml
@@ -4,6 +4,9 @@
found in the LICENSE file. -->
-
-+
++
-
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/AboutChromePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/AboutChromePreferences.java
-index 9d26f4196d2e..099fe6465182 100644
+index 9d26f4196d2e..01aa4b24e816 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/AboutChromePreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/AboutChromePreferences.java
@@ -30,6 +30,7 @@ public class AboutChromePreferences
@@ -42,17 +42,17 @@ index 9d26f4196d2e..099fe6465182 100644
- p = findPreference(PREF_LEGAL_INFORMATION);
- int currentYear = Calendar.getInstance().get(Calendar.YEAR);
- p.setSummary(getString(R.string.legal_information_summary, currentYear));
-+ p = findPreference(PREF_E_BROWSER_INFORMATION);
++ p = findPreference(PREF_E_BROWSER_INFORMATION);
+ p.setSummary(getString(R.string.e_browser_information));
-+
++
}
/**
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
-index cfd2af8d2bb6..26c8e2feb706 100644
+index 0747354d38fb..6d5af7283bf0 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
-@@ -1449,9 +1449,6 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -1467,9 +1467,6 @@ Your Google account may have other forms of browsing history like searches and a
About Chrome
@@ -62,7 +62,7 @@ index cfd2af8d2bb6..26c8e2feb706 100644
Application version
-@@ -1464,6 +1461,12 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -1482,6 +1479,12 @@ Your Google account may have other forms of browsing history like searches and a
Chrome updates are no longer supported for this version of Android
@@ -76,5 +76,5 @@ index cfd2af8d2bb6..26c8e2feb706 100644
--
-2.17.1
+2.23.0
diff --git a/build/patches/e-set-search-engines.patch b/build/patches/e-set-search-engines.patch
index 6431fdfe34bbc37d6b6efbdd91a8da8ce93ba6ad..f1996637a98acfe444cba06f272662b8a8fcdc17 100644
--- a/build/patches/e-set-search-engines.patch
+++ b/build/patches/e-set-search-engines.patch
@@ -1,20 +1,20 @@
-From 95382d9855b0f710916bdc77934c04918c58379a Mon Sep 17 00:00:00 2001
+From d184e2de369a2a9f2420b3766fee4de960eecebf Mon Sep 17 00:00:00 2001
From: Romain HUNAULT
Date: Wed, 17 Apr 2019 10:18:04 +0200
-Subject: [PATCH] Set search engine
+Subject: [PATCH 1/7] Set search engine
---
.../chrome/browser/locale/LocaleManager.java | 1 -
- .../locale/LocaleTemplateUrlLoader.java | 8 -
- .../locale/locale_template_url_loader.cc | 37 +-
+ .../locale/LocaleTemplateUrlLoader.java | 9 -
+ .../locale/locale_template_url_loader.cc | 35 +-
.../locale/locale_template_url_loader.h | 1 -
.../search_engines/prepopulated_engines.json | 999 +-----------------
.../search_engines/search_engine_type.h | 3 +-
.../template_url_prepopulate_data.cc | 633 ++---------
- 7 files changed, 127 insertions(+), 1555 deletions(-)
+ 7 files changed, 128 insertions(+), 1553 deletions(-)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
-index 1eaf251c51e9..e41225322435 100644
+index 5dcb841960e9..cab19195e07d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
@@ -191,7 +191,6 @@ public class LocaleManager {
@@ -26,10 +26,10 @@ index 1eaf251c51e9..e41225322435 100644
}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleTemplateUrlLoader.java b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleTemplateUrlLoader.java
-index f076993dc1e8..8fa606832ea2 100644
+index f076993dc1e8..0ccdbf9dc535 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleTemplateUrlLoader.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleTemplateUrlLoader.java
-@@ -62,13 +62,6 @@ public class LocaleTemplateUrlLoader {
+@@ -62,19 +62,10 @@ public class LocaleTemplateUrlLoader {
nativeOverrideDefaultSearchProvider(mNativeLocaleTemplateUrlLoader);
}
@@ -40,20 +40,20 @@ index f076993dc1e8..8fa606832ea2 100644
- assert mNativeLocaleTemplateUrlLoader != 0;
- nativeSetGoogleAsDefaultSearch(mNativeLocaleTemplateUrlLoader);
- }
-
+-
private static native long nativeInit(String localeId);
private static native void nativeDestroy(long nativeLocaleTemplateUrlLoader);
-@@ -76,5 +69,4 @@ public class LocaleTemplateUrlLoader {
+ private static native boolean nativeLoadTemplateUrls(long nativeLocaleTemplateUrlLoader);
private static native void nativeRemoveTemplateUrls(long nativeLocaleTemplateUrlLoader);
private static native void nativeOverrideDefaultSearchProvider(
long nativeLocaleTemplateUrlLoader);
- private static native void nativeSetGoogleAsDefaultSearch(long nativeLocaleTemplateUrlLoader);
}
diff --git a/chrome/browser/android/locale/locale_template_url_loader.cc b/chrome/browser/android/locale/locale_template_url_loader.cc
-index 30926be92dae..f22df6fef551 100644
+index de77cdfb2f64..28eaf781a98a 100644
--- a/chrome/browser/android/locale/locale_template_url_loader.cc
+++ b/chrome/browser/android/locale/locale_template_url_loader.cc
-@@ -67,19 +67,6 @@ jboolean LocaleTemplateUrlLoader::LoadTemplateUrls(
+@@ -64,19 +64,6 @@ jboolean LocaleTemplateUrlLoader::LoadTemplateUrls(JNIEnv* env) {
const TemplateURL* matching_url =
template_url_service_->GetTemplateURLForKeyword(data_url->keyword());
bool exists = matching_url != nullptr;
@@ -73,7 +73,7 @@ index 30926be92dae..f22df6fef551 100644
if (exists)
continue;
-@@ -114,8 +101,7 @@ void LocaleTemplateUrlLoader::OverrideDefaultSearchProvider(
+@@ -107,8 +94,7 @@ void LocaleTemplateUrlLoader::OverrideDefaultSearchProvider(JNIEnv* env) {
// If the user has changed their default search provider, no-op.
const TemplateURL* current_dsp =
template_url_service_->GetDefaultSearchProvider();
@@ -83,13 +83,11 @@ index 30926be92dae..f22df6fef551 100644
return;
}
-@@ -127,32 +113,13 @@ void LocaleTemplateUrlLoader::OverrideDefaultSearchProvider(
+@@ -120,30 +106,13 @@ void LocaleTemplateUrlLoader::OverrideDefaultSearchProvider(JNIEnv* env) {
}
}
--void LocaleTemplateUrlLoader::SetGoogleAsDefaultSearch(
-- JNIEnv* env,
-- const JavaParamRef& obj) {
+-void LocaleTemplateUrlLoader::SetGoogleAsDefaultSearch(JNIEnv* env) {
- // If the user has changed their default search provider, no-op.
- const TemplateURL* current_dsp =
- template_url_service_->GetDefaultSearchProvider();
@@ -118,39 +116,35 @@ index 30926be92dae..f22df6fef551 100644
LocaleTemplateUrlLoader::~LocaleTemplateUrlLoader() {}
diff --git a/chrome/browser/android/locale/locale_template_url_loader.h b/chrome/browser/android/locale/locale_template_url_loader.h
-index 3e043e0a156e..ad860a993e13 100644
+index 5e5591cbf4a6..b662955807a2 100644
--- a/chrome/browser/android/locale/locale_template_url_loader.h
+++ b/chrome/browser/android/locale/locale_template_url_loader.h
-@@ -22,7 +22,6 @@ class LocaleTemplateUrlLoader {
- void RemoveTemplateUrls(JNIEnv* env, const JavaParamRef& obj);
- void OverrideDefaultSearchProvider(JNIEnv* env,
- const JavaParamRef& obj);
-- void SetGoogleAsDefaultSearch(JNIEnv* env, const JavaParamRef& obj);
+@@ -21,7 +21,6 @@ class LocaleTemplateUrlLoader {
+ jboolean LoadTemplateUrls(JNIEnv* env);
+ void RemoveTemplateUrls(JNIEnv* env);
+ void OverrideDefaultSearchProvider(JNIEnv* env);
+- void SetGoogleAsDefaultSearch(JNIEnv* env);
virtual ~LocaleTemplateUrlLoader();
diff --git a/components/search_engines/prepopulated_engines.json b/components/search_engines/prepopulated_engines.json
-index 4aea7ffdc287..7f97cd8f4b53 100644
+index 7315f5c2cc5a..49c2a80a1026 100644
--- a/components/search_engines/prepopulated_engines.json
+++ b/components/search_engines/prepopulated_engines.json
-@@ -34,66 +34,6 @@
+@@ -34,63 +34,6 @@
// The following engines are included in country lists and are added to the
// list of search engines on the first run depending on user's country.
"elements": {
-- // Ask and Ask UK have suggestion URLs reachable over HTTPS, but they
-- // throw a certificate error, so those will remain as HTTP for now.
- "ask": {
- "name": "Ask",
- "keyword": "ask.com",
- "favicon_url": "https://sp.ask.com/sh/i/a16/favicon/favicon.ico",
- "search_url": "https://www.ask.com/web?q={searchTerms}",
-- "suggest_url": "http://ss.ask.com/query?q={searchTerms}&li=ff",
+- "suggest_url": "https://lss.sse-iacapps.com/query?q={searchTerms}&li=ff",
- "type": "SEARCH_ENGINE_ASK",
- "id": 4
- },
-
-- // Baidu's suggestion URL is not reachable over HTTPS, so it remains as
-- // HTTP for now.
- "baidu": {
- "name": "\u767e\u5ea6",
- "keyword": "baidu.com",
@@ -161,7 +155,7 @@ index 4aea7ffdc287..7f97cd8f4b53 100644
- "https://www.baidu.com/s?ie={inputEncoding}&word={searchTerms}",
- "https://www.baidu.com/{google:pathWildcard}/s?ie={inputEncoding}&word={searchTerms}"
- ],
-- "suggest_url": "http://suggestion.baidu.com/su?wd={searchTerms}&action=opensearch&ie={inputEncoding}",
+- "suggest_url": "https://suggestion.baidu.com/su?wd={searchTerms}&action=opensearch&ie={inputEncoding}",
- "type": "SEARCH_ENGINE_BAIDU",
- "id": 21
- },
@@ -197,10 +191,11 @@ index 4aea7ffdc287..7f97cd8f4b53 100644
- "type": "SEARCH_ENGINE_DAUM",
- "id": 68
- },
-
+-
"duckduckgo_light": {
"name": "DuckDuckGo Light",
-@@ -102,7 +42,7 @@
+ "keyword": "duckduckgo.com/lite",
+@@ -98,7 +41,7 @@
"search_url": "https://duckduckgo.com/lite/?q={searchTerms}",
"suggest_url": "https://duckduckgo.com/ac/?q={searchTerms}&type=list",
"type": "SEARCH_ENGINE_DUCKDUCKGOLIGHT",
@@ -209,7 +204,7 @@ index 4aea7ffdc287..7f97cd8f4b53 100644
},
"duckduckgo": {
-@@ -113,74 +53,9 @@
+@@ -109,74 +52,9 @@
"suggest_url": "https://duckduckgo.com/ac/?q={searchTerms}&type=list",
"new_tab_url": "https://duckduckgo.com/chrome_newtab",
"type": "SEARCH_ENGINE_DUCKDUCKGO",
@@ -284,7 +279,7 @@ index 4aea7ffdc287..7f97cd8f4b53 100644
"qwant": {
"name": "Qwant",
"keyword": "qwant.com",
-@@ -189,871 +64,17 @@
+@@ -185,871 +63,16 @@
"suggest_url": "https://api.qwant.com/api/suggest/?q={searchTerms}&client=opensearch",
"image_url": "https://www.qwant.com/?t=images&q={searchTerms}",
"type": "SEARCH_ENGINE_QWANT",
@@ -591,9 +586,8 @@ index 4aea7ffdc287..7f97cd8f4b53 100644
-
- // Can't be 2 as this has to appear in the Canada list alongside yahoo_ca.
- "id": 5
-+ "id": 3
- },
-
+- },
+-
- "yahoo_se": {
- "name": "Yahoo! Sverige",
- "keyword": "se.yahoo.com",
@@ -1141,7 +1135,8 @@ index 4aea7ffdc287..7f97cd8f4b53 100644
- "search_url": "http://szukaj.wp.pl/szukaj.html?q={searchTerms}",
- "type": "SEARCH_ENGINE_WP",
- "id": 76
-- },
++ "id": 3
+ },
-
- "zoznam": {
- "name": "Zoznam",
@@ -1154,6 +1149,7 @@ index 4aea7ffdc287..7f97cd8f4b53 100644
- "encoding": "windows-1250",
- "type": "SEARCH_ENGINE_ZOZNAM",
- "id": 85
+- }
+ "espot": {
+ "name": "/e/ spot",
+ "keyword": "spot.ecloud.global",
@@ -1162,7 +1158,7 @@ index 4aea7ffdc287..7f97cd8f4b53 100644
+ "suggest_url": "https://ac.duckduckgo.com/ac/?q={searchTerms}&type=list",
+ "type": "SEARCH_ENGINE_ESPOT",
+ "id": 4
- }
++ }
}
}
diff --git a/components/search_engines/search_engine_type.h b/components/search_engines/search_engine_type.h
@@ -2275,5 +2271,5 @@ index 8e9cd1795a09..d9f03dee9dc0 100644
for (size_t i = 0; i < base::size(kAllEngines); ++i) {
// First check the main search URL.
--
-2.17.1
+2.23.0
diff --git a/build/patches/first_run-deactivate-autoupdate-globally.patch b/build/patches/first_run-deactivate-autoupdate-globally.patch
index 81f784855e07dd430f700f77cf79854c8d2dab1a..77ddf4256f9c547c18e076aff58d49c870bdd2dd 100644
--- a/build/patches/first_run-deactivate-autoupdate-globally.patch
+++ b/build/patches/first_run-deactivate-autoupdate-globally.patch
@@ -15,7 +15,7 @@ turn it back on.
diff --git a/chrome/browser/extensions/extension_system_impl.cc b/chrome/browser/extensions/extension_system_impl.cc
--- a/chrome/browser/extensions/extension_system_impl.cc
+++ b/chrome/browser/extensions/extension_system_impl.cc
-@@ -203,8 +203,7 @@ void ExtensionSystemImpl::Shared::Init(bool extensions_enabled) {
+@@ -204,8 +204,7 @@ void ExtensionSystemImpl::Shared::Init(bool extensions_enabled) {
// ExtensionService depends on RuntimeData.
runtime_data_.reset(new RuntimeData(ExtensionRegistry::Get(profile_)));
diff --git a/build/patches/getClientRects-getBoundingClientRect-measureText-add-fingerprinting-mitigation.patch b/build/patches/getClientRects-getBoundingClientRect-measureText-add-fingerprinting-mitigation.patch
deleted file mode 100644
index 035927badd3d500c026c18c539ed34340b65698f..0000000000000000000000000000000000000000
--- a/build/patches/getClientRects-getBoundingClientRect-measureText-add-fingerprinting-mitigation.patch
+++ /dev/null
@@ -1,206 +0,0 @@
-From: csagan5 <32685696+csagan5@users.noreply.github.com>
-Date: Fri, 30 Mar 2018 10:09:03 +0200
-Subject: getClientRects, getBoundingClientRect, measureText: add
- fingerprinting mitigation
-
-Scale the result of Range::getClientRects, Element::getBoundingClientRect and
-Canvas::measureText by a random +/-3/1000000th of the original value for each
-float in the returned Rect/Quad.
-
-Rationale is that the returned values are within the same order of magnitude
-of the floating point precision being used for fingerprinting and sufficient
-to poison the well.
-
-See also: http://www.gsd.inesc-id.pt/~mpc/pubs/fingerprinting-trustcom2016.pdf
----
- third_party/blink/renderer/core/dom/document.cc | 12 ++++++++++++
- third_party/blink/renderer/core/dom/document.h | 5 +++++
- third_party/blink/renderer/core/dom/element.cc | 16 ++++++++++++++++
- third_party/blink/renderer/core/dom/range.cc | 18 +++++++++++++++++-
- .../blink/renderer/core/html/canvas/text_metrics.cc | 18 ++++++++++++++++++
- .../blink/renderer/core/html/canvas/text_metrics.h | 2 ++
- .../canvas/canvas2d/canvas_rendering_context_2d.cc | 6 ++++++
- 7 files changed, 76 insertions(+), 1 deletion(-)
-
-diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
---- a/third_party/blink/renderer/core/dom/document.cc
-+++ b/third_party/blink/renderer/core/dom/document.cc
-@@ -1102,6 +1102,10 @@ Document::Document(const DocumentInit& initializer,
- // also depend on the url NOT getting immediately set in opened windows.
- // See fast/dom/early-frame-url.html
- // and fast/dom/location-new-window-no-crash.html, respectively.
-+ // add X/Y noise factors that will be used to mitigate fingerprinting
-+ shuffleFactorX_ = base::RandDouble();
-+ shuffleFactorY_ = base::RandDouble();
-+
- // FIXME: Can/should we unify this behavior?
- if (initializer.ShouldSetURL()) {
- SetURL(initializer.Url());
-@@ -1162,6 +1166,14 @@ Range* Document::CreateRangeAdjustedToTreeScope(const TreeScope& tree_scope,
- Position::BeforeNode(*shadow_host));
- }
-
-+double Document::GetShuffleFactorX() {
-+ return shuffleFactorX_;
-+}
-+
-+double Document::GetShuffleFactorY() {
-+ return shuffleFactorY_;
-+}
-+
- SelectorQueryCache& Document::GetSelectorQueryCache() {
- if (!selector_query_cache_)
- selector_query_cache_ = std::make_unique();
-diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
---- a/third_party/blink/renderer/core/dom/document.h
-+++ b/third_party/blink/renderer/core/dom/document.h
-@@ -398,6 +398,9 @@ class CORE_EXPORT Document : public ContainerNode,
- has_xml_declaration_ = has_xml_declaration ? 1 : 0;
- }
-
-+ double GetShuffleFactorX();
-+ double GetShuffleFactorY();
-+
- String visibilityState() const;
- bool IsPageVisible() const;
- bool hidden() const;
-@@ -1871,6 +1874,8 @@ class CORE_EXPORT Document : public ContainerNode,
- Vector ax_contexts_;
- Member ax_object_cache_;
- Member markers_;
-+ double shuffleFactorX_, shuffleFactorY_;
-+
-
- bool update_focus_appearance_after_layout_ = false;
-
-diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
---- a/third_party/blink/renderer/core/dom/element.cc
-+++ b/third_party/blink/renderer/core/dom/element.cc
-@@ -1370,6 +1370,15 @@ DOMRectList* Element::getClientRects() {
- DCHECK(element_layout_object);
- GetDocument().AdjustFloatQuadsForScrollAndAbsoluteZoom(
- quads, *element_layout_object);
-+
-+ // scale all quads
-+ auto shuffleX = 1 + (GetDocument().GetShuffleFactorX() - 0.5) * 0.000003;
-+ auto shuffleY = 1 + (GetDocument().GetShuffleFactorY() - 0.5) * 0.000003;
-+
-+ for (FloatQuad& quad : quads) {
-+ quad.Scale(shuffleX, shuffleY);
-+ }
-+
- return DOMRectList::Create(quads);
- }
-
-@@ -1387,6 +1396,13 @@ DOMRect* Element::getBoundingClientRect() {
- DCHECK(element_layout_object);
- GetDocument().AdjustFloatRectForScrollAndAbsoluteZoom(result,
- *element_layout_object);
-+
-+ // scale rect by 3/1000000th
-+ auto shuffleX = 1 + (GetDocument().GetShuffleFactorX() - 0.5) * 0.000003;
-+ auto shuffleY = 1 + (GetDocument().GetShuffleFactorY() - 0.5) * 0.000003;
-+
-+ result.Scale(shuffleX, shuffleY);
-+
- return DOMRect::FromFloatRect(result);
- }
-
-diff --git a/third_party/blink/renderer/core/dom/range.cc b/third_party/blink/renderer/core/dom/range.cc
---- a/third_party/blink/renderer/core/dom/range.cc
-+++ b/third_party/blink/renderer/core/dom/range.cc
-@@ -1631,11 +1631,27 @@ DOMRectList* Range::getClientRects() const {
- Vector quads;
- GetBorderAndTextQuads(quads);
-
-+ // scale all quads by 3/1000000th
-+ auto shuffleX = 1 + (owner_document_->GetShuffleFactorX() - 0.5) * 0.000003;
-+ auto shuffleY = 1 + (owner_document_->GetShuffleFactorY() - 0.5) * 0.000003;
-+
-+ for (FloatQuad& quad : quads) {
-+ quad.Scale(shuffleX, shuffleY);
-+ }
-+
- return DOMRectList::Create(quads);
- }
-
- DOMRect* Range::getBoundingClientRect() const {
-- return DOMRect::FromFloatRect(BoundingRect());
-+ auto rect = BoundingRect();
-+
-+ // scale rect by 3/1000000th
-+ auto shuffleX = 1 + (owner_document_->GetShuffleFactorX() - 0.5) * 0.000003;
-+ auto shuffleY = 1 + (owner_document_->GetShuffleFactorY() - 0.5) * 0.000003;
-+
-+ rect.Scale(shuffleX, shuffleY);
-+
-+ return DOMRect::FromFloatRect(rect);
- }
-
- // TODO(editing-dev): We should make
-diff --git a/third_party/blink/renderer/core/html/canvas/text_metrics.cc b/third_party/blink/renderer/core/html/canvas/text_metrics.cc
---- a/third_party/blink/renderer/core/html/canvas/text_metrics.cc
-+++ b/third_party/blink/renderer/core/html/canvas/text_metrics.cc
-@@ -54,6 +54,24 @@ TextMetrics::TextMetrics(const Font& font,
- Update(font, direction, baseline, align, text);
- }
-
-+void TextMetrics::Shuffle(const double factor) {
-+ // x-direction
-+ width_ *= factor;
-+ actual_bounding_box_left_ *= factor;
-+ actual_bounding_box_right_ *= factor;
-+
-+ // y-direction
-+ font_bounding_box_ascent_ *= factor;
-+ font_bounding_box_descent_ *= factor;
-+ actual_bounding_box_ascent_ *= factor;
-+ actual_bounding_box_descent_ *= factor;
-+ em_height_ascent_ *= factor;
-+ em_height_descent_ *= factor;
-+ baselines_->setAlphabetic(baselines_->alphabetic() * factor);
-+ baselines_->setHanging(baselines_->hanging() * factor);
-+ baselines_->setIdeographic(baselines_->ideographic() * factor);
-+}
-+
- void TextMetrics::Update(const Font& font,
- const TextDirection& direction,
- const TextBaseline& baseline,
-diff --git a/third_party/blink/renderer/core/html/canvas/text_metrics.h b/third_party/blink/renderer/core/html/canvas/text_metrics.h
---- a/third_party/blink/renderer/core/html/canvas/text_metrics.h
-+++ b/third_party/blink/renderer/core/html/canvas/text_metrics.h
-@@ -64,6 +64,8 @@ class CORE_EXPORT TextMetrics final : public ScriptWrappable {
-
- void Trace(Visitor*) override;
-
-+ void Shuffle(const double factor);
-+
- private:
- void Update(const Font&,
- const TextDirection&,
-diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
---- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
-+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
-@@ -33,6 +33,7 @@
-
- #include "third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h"
-
-+#include "base/rand_util.h"
- #include "base/metrics/histogram_functions.h"
- #include "third_party/blink/public/common/features.h"
- #include "third_party/blink/public/platform/platform.h"
-@@ -814,6 +815,11 @@ TextMetrics* CanvasRenderingContext2D::measureText(const String& text) {
- base::TimeDelta elapsed = base::TimeTicks::Now() - start_time;
- base::UmaHistogramMicrosecondsTimesUnderTenMilliseconds(
- "Canvas.TextMetrics.MeasureText", elapsed);
-+
-+ // scale text metrics by 3/1000000th
-+ auto shuffleFactor = 1 + (base::RandDouble() - 0.5) * 0.000003;
-+ text_metrics->Shuffle(shuffleFactor);
-+
- return text_metrics;
- }
-
---
-2.11.0
-
diff --git a/build/patches/google-cloud-messaging-disable-experiment-status-check.patch b/build/patches/google-cloud-messaging-disable-experiment-status-check.patch
index e5d1a2b8bf3893823db7e0ad2b4e960ea70a3587..45abd6b6bef7c474296ef9dc81bd06dd5fa25375 100644
--- a/build/patches/google-cloud-messaging-disable-experiment-status-check.patch
+++ b/build/patches/google-cloud-messaging-disable-experiment-status-check.patch
@@ -30,7 +30,7 @@ diff --git a/components/gcm_driver/gcm_channel_status_request.cc b/components/gc
return;
@@ -110,6 +113,9 @@ void GCMChannelStatusRequest::Start() {
- resource_request->allow_credentials = false;
+ resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit;
resource_request->method = "POST";
resource_request->headers.SetHeader(net::HttpRequestHeaders::kUserAgent,
+#endif
diff --git a/build/patches/kill-GCM.patch b/build/patches/kill-GCM.patch
index f73d5ddd91dd497402dbe6acd7feacff113933c5..cd685cc5d244fb2fb6799031af7945238e49ac31 100644
--- a/build/patches/kill-GCM.patch
+++ b/build/patches/kill-GCM.patch
@@ -5,35 +5,36 @@ Subject: kill GCM
---
chrome/android/BUILD.gn | 1 -
chrome/android/chrome_java_sources.gni | 6 -
- chrome/android/java/AndroidManifest.xml | 64 --------
- .../chrome/browser/BackgroundSyncLauncher.java | 97 ------------
+ chrome/android/java/AndroidManifest.xml | 64 -------
+ .../chrome/browser/BackgroundSyncLauncher.java | 97 ----------
.../chrome/browser/ChromeBackgroundService.java | 1 -
+ .../ChromeBackgroundTaskFactory.java | 3 -
.../invalidation/InvalidationController.java | 8 -
- .../browser/ntp/snippets/SnippetsLauncher.java | 44 ------
+ .../browser/ntp/snippets/SnippetsLauncher.java | 44 -----
.../browser/services/gcm/GCMBackgroundTask.java | 2 +-
- .../gcm/InvalidationGcmUpstreamSender.java | 15 --
+ .../gcm/InvalidationGcmUpstreamSender.java | 18 --
components/background_task_scheduler/BUILD.gn | 1 -
- .../BackgroundTaskSchedulerGcmNetworkManager.java | 166 +--------------------
+ .../BackgroundTaskSchedulerGcmNetworkManager.java | 206 +--------------------
components/gcm_driver/android/BUILD.gn | 1 -
components/gcm_driver/instance_id/android/BUILD.gn | 1 -
- .../gcm_driver/instance_id/InstanceIDBridge.java | 40 +----
+ .../gcm_driver/instance_id/InstanceIDBridge.java | 49 +----
components/sync/android/BUILD.gn | 1 -
third_party/cacheinvalidation/BUILD.gn | 6 -
- .../client/contrib/MultiplexingGcmListener.java | 91 +----------
+ .../client/contrib/MultiplexingGcmListener.java | 91 +--------
.../android2/channel/AndroidNetworkChannel.java | 6 +-
- 18 files changed, 9 insertions(+), 542 deletions(-)
+ 19 files changed, 9 insertions(+), 597 deletions(-)
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
-@@ -368,7 +368,6 @@ android_library("chrome_java") {
+@@ -378,7 +378,6 @@ android_library("chrome_java") {
"//third_party/android_deps:com_google_protobuf_protobuf_lite_java",
"//third_party/android_deps:javax_inject_javax_inject_java",
"//third_party/android_media:android_media_java",
- "//third_party/android_sdk:android_gcm_java",
+ "//third_party/android_sdk/androidx_browser:androidx_browser_java",
"//third_party/android_swipe_refresh:android_swipe_refresh_java",
"//third_party/blink/public:blink_headers_java",
- "//third_party/blink/public/mojom:android_mojo_bindings_java",
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
@@ -45,7 +46,7 @@ diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java
"java/src/org/chromium/chrome/browser/ChromeBackupAgent.java",
"java/src/org/chromium/chrome/browser/ChromeBackupWatcher.java",
"java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java",
-@@ -1395,11 +1394,6 @@ chrome_java_sources = [
+@@ -1424,11 +1423,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/services/AndroidEduAndChildAccountHelper.java",
"java/src/org/chromium/chrome/browser/services/AndroidEduOwnerCheckCallback.java",
"java/src/org/chromium/chrome/browser/services/GoogleServicesManager.java",
@@ -55,8 +56,8 @@ diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java
- "java/src/org/chromium/chrome/browser/services/gcm/GcmUma.java",
- "java/src/org/chromium/chrome/browser/services/gcm/InvalidationGcmUpstreamSender.java",
"java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java",
+ "java/src/org/chromium/chrome/browser/share/LensUtils.java",
"java/src/org/chromium/chrome/browser/share/OptionalShareTargetsManager.java",
- "java/src/org/chromium/chrome/browser/share/ShareActivity.java",
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
--- a/chrome/android/java/AndroidManifest.xml
+++ b/chrome/android/java/AndroidManifest.xml
@@ -83,7 +84,7 @@ diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/Andro
{% block extra_uses_permissions %}
-@@ -1040,49 +1035,8 @@ by a child template that "extends" this file.
+@@ -1068,49 +1063,8 @@ by a child template that "extends" this file.
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
android:hardwareAccelerated="false" />
@@ -133,7 +134,7 @@ diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/Andro
@@ -304,6 +305,26 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackgroun
}
private void handleSnippetsOnBrowserUpgraded() {
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/background_task_scheduler/ChromeBackgroundTaskFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/background_task_scheduler/ChromeBackgroundTaskFactory.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/background_task_scheduler/ChromeBackgroundTaskFactory.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/background_task_scheduler/ChromeBackgroundTaskFactory.java
+@@ -19,7 +19,6 @@ import org.chromium.chrome.browser.offlinepages.OfflineBackgroundTask;
+ import org.chromium.chrome.browser.offlinepages.prefetch.OfflineNotificationBackgroundTask;
+ import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchBackgroundTask;
+ import org.chromium.chrome.browser.omaha.OmahaService;
+-import org.chromium.chrome.browser.services.gcm.GCMBackgroundTask;
+ import org.chromium.chrome.browser.webapps.WebApkUpdateTask;
+ import org.chromium.components.background_task_scheduler.BackgroundTask;
+ import org.chromium.components.background_task_scheduler.BackgroundTaskFactory;
+@@ -48,8 +47,6 @@ public class ChromeBackgroundTaskFactory implements BackgroundTaskFactory {
+ switch (taskId) {
+ case TaskIds.OMAHA_JOB_ID:
+ return new OmahaService();
+- case TaskIds.GCM_BACKGROUND_TASK_JOB_ID:
+- return new GCMBackgroundTask();
+ case TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID:
+ return new OfflineBackgroundTask();
+ case TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/invalidation/InvalidationController.java b/chrome/android/java/src/org/chromium/chrome/browser/invalidation/InvalidationController.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/invalidation/InvalidationController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/invalidation/InvalidationController.java
@@ -446,7 +467,17 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/In
import com.google.ipc.invalidation.ticl.android2.channel.GcmUpstreamSenderService;
import org.chromium.base.ContextUtils;
-@@ -87,20 +86,6 @@ public class InvalidationGcmUpstreamSender extends GcmUpstreamSenderService {
+@@ -26,9 +25,6 @@ import org.chromium.components.signin.OAuth2TokenService;
+ import org.chromium.components.sync.SyncConstants;
+ import org.chromium.content_public.browser.UiThreadTaskTraits;
+
+-import java.io.IOException;
+-import java.util.UUID;
+-
+ /**
+ * Sends Upstream messages for Invalidations using GCM.
+ */
+@@ -87,20 +83,6 @@ public class InvalidationGcmUpstreamSender extends GcmUpstreamSenderService {
* This function runs on a thread pool executor thread.
*/
private void sendUpstreamMessage(String to, Bundle data, String token, Context context) {
@@ -470,14 +501,14 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/In
diff --git a/components/background_task_scheduler/BUILD.gn b/components/background_task_scheduler/BUILD.gn
--- a/components/background_task_scheduler/BUILD.gn
+++ b/components/background_task_scheduler/BUILD.gn
-@@ -30,7 +30,6 @@ if (is_android) {
- android_library("background_task_scheduler_java") {
- java_files = [
+@@ -32,7 +32,6 @@ if (is_android) {
"android/java/src/org/chromium/components/background_task_scheduler/BackgroundTask.java",
+ "android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskBroadcastReceiver.java",
+ "android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskFactory.java",
- "android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskGcmTaskService.java",
"android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskJobService.java",
- "android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskReflection.java",
"android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskScheduler.java",
+ "android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerAlarmManager.java",
diff --git a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerGcmNetworkManager.java b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerGcmNetworkManager.java
--- a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerGcmNetworkManager.java
+++ b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerGcmNetworkManager.java
@@ -496,32 +527,44 @@ diff --git a/components/background_task_scheduler/android/java/src/org/chromium/
import org.chromium.base.Log;
import org.chromium.base.ThreadUtils;
import org.chromium.base.VisibleForTesting;
-@@ -42,124 +34,6 @@ class BackgroundTaskSchedulerGcmNetworkManager implements BackgroundTaskSchedule
+@@ -42,212 +34,16 @@ class BackgroundTaskSchedulerGcmNetworkManager implements BackgroundTaskSchedule
sClock = clock;
}
-- static BackgroundTask getBackgroundTaskFromTaskParams(@NonNull TaskParams taskParams) {
-- String backgroundTaskClassName = getBackgroundTaskClassFromTaskParams(taskParams);
-- return BackgroundTaskReflection.getBackgroundTaskFromClassName(backgroundTaskClassName);
-- }
--
-- private static String getBackgroundTaskClassFromTaskParams(@NonNull TaskParams taskParams) {
-- Bundle extras = taskParams.getExtras();
-- if (extras == null) return null;
-- return extras.getString(BACKGROUND_TASK_CLASS_KEY);
-- }
--
-- static Long getDeadlineTimeFromTaskParams(@NonNull TaskParams taskParams) {
+- /**
+- * Checks if a task expired, based on the current time of the service.
+- *
+- * @param taskParams parameters sent to the service, which contain the scheduling information
+- * regarding expiration.
+- * @param currentTimeMs the current time of the service.
+- * @return true if the task expired and false otherwise.
+- */
+- static boolean didTaskExpire(TaskParams taskParams, long currentTimeMs) {
- Bundle extras = taskParams.getExtras();
-- if (extras == null || !extras.containsKey(BACKGROUND_TASK_DEADLINE_KEY)) {
-- return null;
+- if (extras == null || !extras.containsKey(BACKGROUND_TASK_SCHEDULE_TIME_KEY)) {
+- return false;
- }
-- return extras.getLong(BACKGROUND_TASK_DEADLINE_KEY);
-- }
-
-- private static long getDeadlineTime(TaskInfo taskInfo) {
-- long windowEndTimeMs = taskInfo.getOneOffInfo().getWindowEndTimeMs();
-- return sClock.currentTimeMillis() + windowEndTimeMs;
+- long scheduleTimeMs = extras.getLong(BACKGROUND_TASK_SCHEDULE_TIME_KEY);
+- if (extras.containsKey(BACKGROUND_TASK_END_TIME_KEY)) {
+- long endTimeMs =
+- extras.getLong(BackgroundTaskSchedulerDelegate.BACKGROUND_TASK_END_TIME_KEY);
+- return TaskInfo.OneOffInfo.getExpirationStatus(
+- scheduleTimeMs, endTimeMs, currentTimeMs);
+- } else {
+- long intervalTimeMs = extras.getLong(BACKGROUND_TASK_INTERVAL_TIME_KEY);
+-
+- // If flex is never set, it is given a default value of 10% of the period time, as
+- // per the GcmNetworkManager behaviour. This default value is set in
+- // https://developers.google.com/android/reference/com/google/android/gms/gcm/PeriodicTask.
+- double defaultFlexAsFractionOfInterval = 0.1f;
+-
+- long flexTimeMs = extras.getLong(BACKGROUND_TASK_FLEX_TIME_KEY,
+- /*defaultValue=*/(long) (defaultFlexAsFractionOfInterval * intervalTimeMs));
+-
+- return TaskInfo.PeriodicInfo.getExpirationStatus(
+- scheduleTimeMs, intervalTimeMs, flexTimeMs, currentTimeMs);
+- }
- }
-
- /**
@@ -553,22 +596,13 @@ diff --git a/components/background_task_scheduler/android/java/src/org/chromium/
- @VisibleForTesting
- static Task createTaskFromTaskInfo(@NonNull TaskInfo taskInfo) {
- Bundle taskExtras = new Bundle();
-- taskExtras.putString(
-- BACKGROUND_TASK_CLASS_KEY, taskInfo.getBackgroundTaskClass().getName());
-- if (!taskInfo.isPeriodic() && taskInfo.getOneOffInfo().expiresAfterWindowEndTime()) {
-- taskExtras.putLong(BACKGROUND_TASK_DEADLINE_KEY, getDeadlineTime(taskInfo));
-- }
- taskExtras.putBundle(BACKGROUND_TASK_EXTRAS_KEY, taskInfo.getExtras());
-
-- Task.Builder builder;
-- if (taskInfo.isPeriodic()) {
-- builder = getPeriodicTaskBuilder(taskInfo.getPeriodicInfo());
-- } else {
-- builder = getOneOffTaskBuilder(taskInfo.getOneOffInfo());
-- }
+- TaskBuilderVisitor taskBuilderVisitor = new TaskBuilderVisitor(taskExtras);
+- taskInfo.getTimingInfo().accept(taskBuilderVisitor);
+- Task.Builder builder = taskBuilderVisitor.getBuilder();
-
-- builder.setExtras(taskExtras)
-- .setPersisted(taskInfo.isPersisted())
+- builder.setPersisted(taskInfo.isPersisted())
- .setRequiredNetwork(getGcmNetworkManagerNetworkTypeFromTypeFromTaskNetworkType(
- taskInfo.getRequiredNetworkType()))
- .setRequiresCharging(taskInfo.requiresCharging())
@@ -579,27 +613,65 @@ diff --git a/components/background_task_scheduler/android/java/src/org/chromium/
- return builder.build();
- }
-
-- private static Task.Builder getPeriodicTaskBuilder(TaskInfo.PeriodicInfo periodicInfo) {
-- PeriodicTask.Builder builder = new PeriodicTask.Builder();
-- builder.setPeriod(TimeUnit.MILLISECONDS.toSeconds(periodicInfo.getIntervalMs()));
-- if (periodicInfo.hasFlex()) {
-- builder.setFlex(TimeUnit.MILLISECONDS.toSeconds(periodicInfo.getFlexMs()));
+- private static class TaskBuilderVisitor implements TaskInfo.TimingInfoVisitor {
+- private Task.Builder mBuilder;
+- private final Bundle mTaskExtras;
+-
+- TaskBuilderVisitor(Bundle taskExtras) {
+- mTaskExtras = taskExtras;
+- }
+-
+- // Only valid after a TimingInfo object was visited.
+- Task.Builder getBuilder() {
+- return mBuilder;
+- }
+-
+- @Override
+- public void visit(TaskInfo.OneOffInfo oneOffInfo) {
+- if (oneOffInfo.expiresAfterWindowEndTime()) {
+- mTaskExtras.putLong(BACKGROUND_TASK_SCHEDULE_TIME_KEY, sClock.currentTimeMillis());
+- mTaskExtras.putLong(BACKGROUND_TASK_END_TIME_KEY, oneOffInfo.getWindowEndTimeMs());
+- }
+-
+- OneoffTask.Builder builder = new OneoffTask.Builder();
+- long windowStartSeconds = oneOffInfo.hasWindowStartTimeConstraint()
+- ? TimeUnit.MILLISECONDS.toSeconds(oneOffInfo.getWindowStartTimeMs())
+- : 0;
+- long windowEndTimeMs = oneOffInfo.getWindowEndTimeMs();
+- if (oneOffInfo.expiresAfterWindowEndTime()) {
+- windowEndTimeMs += DEADLINE_DELTA_MS;
+- }
+- builder.setExecutionWindow(
+- windowStartSeconds, TimeUnit.MILLISECONDS.toSeconds(windowEndTimeMs));
+- builder.setExtras(mTaskExtras);
+- mBuilder = builder;
- }
-- return builder;
-- }
-
-- private static Task.Builder getOneOffTaskBuilder(TaskInfo.OneOffInfo oneOffInfo) {
-- OneoffTask.Builder builder = new OneoffTask.Builder();
-- long windowStartSeconds = oneOffInfo.hasWindowStartTimeConstraint()
-- ? TimeUnit.MILLISECONDS.toSeconds(oneOffInfo.getWindowStartTimeMs())
-- : 0;
-- long windowEndTimeMs = oneOffInfo.getWindowEndTimeMs();
-- if (oneOffInfo.expiresAfterWindowEndTime()) {
-- windowEndTimeMs += DEADLINE_DELTA_MS;
+- @Override
+- public void visit(TaskInfo.PeriodicInfo periodicInfo) {
+- if (periodicInfo.expiresAfterWindowEndTime()) {
+- mTaskExtras.putLong(BACKGROUND_TASK_SCHEDULE_TIME_KEY, sClock.currentTimeMillis());
+- mTaskExtras.putLong(
+- BACKGROUND_TASK_INTERVAL_TIME_KEY, periodicInfo.getIntervalMs());
+- if (periodicInfo.hasFlex()) {
+- mTaskExtras.putLong(BACKGROUND_TASK_FLEX_TIME_KEY, periodicInfo.getFlexMs());
+- }
+- }
+-
+- PeriodicTask.Builder builder = new PeriodicTask.Builder();
+- builder.setPeriod(TimeUnit.MILLISECONDS.toSeconds(periodicInfo.getIntervalMs()));
+- if (periodicInfo.hasFlex()) {
+- builder.setFlex(TimeUnit.MILLISECONDS.toSeconds(periodicInfo.getFlexMs()));
+- }
+- builder.setExtras(mTaskExtras);
+- mBuilder = builder;
+- }
+-
+- @Override
+- public void visit(TaskInfo.ExactInfo exactInfo) {
+- throw new RuntimeException("Exact tasks should not be scheduled with "
+- + "GcmNetworkManager.");
- }
-- builder.setExecutionWindow(
-- windowStartSeconds, TimeUnit.MILLISECONDS.toSeconds(windowEndTimeMs));
-- return builder;
- }
-
- private static int getGcmNetworkManagerNetworkTypeFromTypeFromTaskNetworkType(
@@ -621,11 +693,7 @@ diff --git a/components/background_task_scheduler/android/java/src/org/chromium/
@Override
public boolean schedule(Context context, @NonNull TaskInfo taskInfo) {
ThreadUtils.assertOnUiThread();
-@@ -170,50 +44,12 @@ class BackgroundTaskSchedulerGcmNetworkManager implements BackgroundTaskSchedule
- + " has no parameterless public constructor.");
- return false;
- }
--
+
- GcmNetworkManager gcmNetworkManager = getGcmNetworkManager(context);
- if (gcmNetworkManager == null) {
- Log.e(TAG, "GcmNetworkManager is not available.");
@@ -687,7 +755,7 @@ diff --git a/components/gcm_driver/android/BUILD.gn b/components/gcm_driver/andr
diff --git a/components/gcm_driver/instance_id/android/BUILD.gn b/components/gcm_driver/instance_id/android/BUILD.gn
--- a/components/gcm_driver/instance_id/android/BUILD.gn
+++ b/components/gcm_driver/instance_id/android/BUILD.gn
-@@ -25,7 +25,6 @@ android_library("instance_id_driver_java") {
+@@ -28,7 +28,6 @@ android_library("instance_id_driver_java") {
java_files = [
"java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDBridge.java",
@@ -698,7 +766,7 @@ diff --git a/components/gcm_driver/instance_id/android/BUILD.gn b/components/gcm
diff --git a/components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDBridge.java b/components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDBridge.java
--- a/components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDBridge.java
+++ b/components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDBridge.java
-@@ -26,7 +26,6 @@ public class InstanceIDBridge {
+@@ -28,7 +28,6 @@ public class InstanceIDBridge {
* Underlying InstanceIDWithSubtype. May be shared by multiple InstanceIDBridges. Must be
* initialized on a background thread.
*/
@@ -706,7 +774,7 @@ diff --git a/components/gcm_driver/instance_id/android/java/src/org/chromium/com
private static boolean sBlockOnAsyncTasksForTesting;
-@@ -71,7 +70,7 @@ public class InstanceIDBridge {
+@@ -73,7 +72,7 @@ public class InstanceIDBridge {
new BridgeAsyncTask() {
@Override
protected String doBackgroundWork() {
@@ -715,7 +783,7 @@ diff --git a/components/gcm_driver/instance_id/android/java/src/org/chromium/com
}
@Override
protected void sendResultToNative(String id) {
-@@ -86,7 +85,7 @@ public class InstanceIDBridge {
+@@ -88,7 +87,7 @@ public class InstanceIDBridge {
new BridgeAsyncTask() {
@Override
protected Long doBackgroundWork() {
@@ -724,15 +792,21 @@ diff --git a/components/gcm_driver/instance_id/android/java/src/org/chromium/com
}
@Override
protected void sendResultToNative(Long creationTime) {
-@@ -111,15 +110,7 @@ public class InstanceIDBridge {
+@@ -113,21 +112,7 @@ public class InstanceIDBridge {
new BridgeAsyncTask() {
@Override
protected String doBackgroundWork() {
- try {
+- // TODO(knollr): Migrate stored LazySubscriptionsManager data to
+- // SubscriptionFlagManager.
- LazySubscriptionsManager.storeLazinessInformation(
- LazySubscriptionsManager.buildSubscriptionUniqueId(
- mSubtype, authorizedEntity),
-- isLazy);
+- (flags & InstanceIDFlags.IS_LAZY) == InstanceIDFlags.IS_LAZY);
+- SubscriptionFlagManager.setFlags(
+- SubscriptionFlagManager.buildSubscriptionUniqueId(
+- mSubtype, authorizedEntity),
+- flags);
- return mInstanceID.getToken(authorizedEntity, scope, extras);
- } catch (IOException ex) {
- return "";
@@ -741,7 +815,7 @@ diff --git a/components/gcm_driver/instance_id/android/java/src/org/chromium/com
}
@Override
protected void sendResultToNative(String token) {
-@@ -135,18 +126,7 @@ public class InstanceIDBridge {
+@@ -143,21 +128,7 @@ public class InstanceIDBridge {
new BridgeAsyncTask() {
@Override
protected Boolean doBackgroundWork() {
@@ -753,6 +827,9 @@ diff --git a/components/gcm_driver/instance_id/android/java/src/org/chromium/com
- LazySubscriptionsManager.deletePersistedMessagesForSubscriptionId(
- subscriptionId);
- }
+- SubscriptionFlagManager.clearFlags(
+- SubscriptionFlagManager.buildSubscriptionUniqueId(
+- mSubtype, authorizedEntity));
- return true;
- } catch (IOException ex) {
- return false;
@@ -761,7 +838,7 @@ diff --git a/components/gcm_driver/instance_id/android/java/src/org/chromium/com
}
@Override
protected void sendResultToNative(Boolean success) {
-@@ -161,12 +141,7 @@ public class InstanceIDBridge {
+@@ -172,12 +143,7 @@ public class InstanceIDBridge {
new BridgeAsyncTask() {
@Override
protected Boolean doBackgroundWork() {
@@ -775,7 +852,7 @@ diff --git a/components/gcm_driver/instance_id/android/java/src/org/chromium/com
}
@Override
protected void sendResultToNative(Boolean success) {
-@@ -205,11 +180,6 @@ public class InstanceIDBridge {
+@@ -216,11 +182,6 @@ public class InstanceIDBridge {
@Override
@SuppressWarnings("NoSynchronizedThisCheck") // Only used/accessible by native.
protected Result doInBackground() {
diff --git a/build/patches/kill-TOS-and-metrics-opt-out.patch b/build/patches/kill-TOS-and-metrics-opt-out.patch
index 09ba7090fab0ffc7318ba52dd9f27c8b438d5b52..86540b4fd94fac6c14bd10a26dd6e7730772a8bd 100644
--- a/build/patches/kill-TOS-and-metrics-opt-out.patch
+++ b/build/patches/kill-TOS-and-metrics-opt-out.patch
@@ -23,7 +23,7 @@ diff --git a/chrome/android/java/res/layout/fre_tosanduma.xml b/chrome/android/j
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
-@@ -179,7 +179,6 @@
+@@ -197,7 +197,6 @@
12dp24dp120dp
diff --git a/build/patches/kill-Vision.patch b/build/patches/kill-Vision.patch
index d746bce96557e9436f6f69b60d71bf86256f14d9..54c2c390746111bfa77b4bfaabcfbc879a70b22d 100644
--- a/build/patches/kill-Vision.patch
+++ b/build/patches/kill-Vision.patch
@@ -4,24 +4,24 @@ Subject: kill Vision
Barcode, face and text detection APIs
---
- services/shape_detection/BUILD.gn | 4 ----
- .../src/org/chromium/shape_detection/BitmapUtils.java | 12 ------------
- .../shape_detection/FaceDetectionProviderImpl.java | 15 ++-------------
- .../org/chromium/shape_detection/InterfaceRegistrar.java | 5 -----
- 4 files changed, 2 insertions(+), 34 deletions(-)
+ services/shape_detection/BUILD.gn | 6 ------
+ .../java/src/org/chromium/shape_detection/BitmapUtils.java | 12 ------------
+ .../chromium/shape_detection/FaceDetectionProviderImpl.java | 13 +------------
+ .../org/chromium/shape_detection/InterfaceRegistrar.java | 13 -------------
+ 4 files changed, 1 insertion(+), 43 deletions(-)
diff --git a/services/shape_detection/BUILD.gn b/services/shape_detection/BUILD.gn
--- a/services/shape_detection/BUILD.gn
+++ b/services/shape_detection/BUILD.gn
-@@ -85,14 +85,10 @@ if (is_android) {
+@@ -84,14 +84,8 @@ if (is_android) {
android_library("shape_detection_java") {
java_files = [
- "android/java/src/org/chromium/shape_detection/BarcodeDetectionImpl.java",
- "android/java/src/org/chromium/shape_detection/BarcodeDetectionProviderImpl.java",
- "android/java/src/org/chromium/shape_detection/FaceDetectionImpl.java",
+- "android/java/src/org/chromium/shape_detection/FaceDetectionImpl.java",
- "android/java/src/org/chromium/shape_detection/FaceDetectionImplGmsCore.java",
- "android/java/src/org/chromium/shape_detection/FaceDetectionProviderImpl.java",
+- "android/java/src/org/chromium/shape_detection/FaceDetectionProviderImpl.java",
"android/java/src/org/chromium/shape_detection/InterfaceRegistrar.java",
"android/java/src/org/chromium/shape_detection/BitmapUtils.java",
- "android/java/src/org/chromium/shape_detection/TextDetectionImpl.java",
@@ -68,7 +68,7 @@ diff --git a/services/shape_detection/android/java/src/org/chromium/shape_detect
import org.chromium.base.ContextUtils;
import org.chromium.mojo.bindings.InterfaceRequest;
import org.chromium.mojo.system.MojoException;
-@@ -24,16 +21,8 @@ public class FaceDetectionProviderImpl implements FaceDetectionProvider {
+@@ -23,16 +20,8 @@ public class FaceDetectionProviderImpl implements FaceDetectionProvider {
@Override
public void createFaceDetection(
InterfaceRequest request, FaceDetectorOptions options) {
@@ -76,13 +76,12 @@ diff --git a/services/shape_detection/android/java/src/org/chromium/shape_detect
- GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(
- ContextUtils.getApplicationContext())
- == ConnectionResult.SUCCESS;
--
+
- if (isGmsCoreSupported) {
- FaceDetection.MANAGER.bind(new FaceDetectionImplGmsCore(options), request);
- } else {
- FaceDetection.MANAGER.bind(new FaceDetectionImpl(options), request);
- }
-+
+ FaceDetection.MANAGER.bind(new FaceDetectionImpl(options), request);
}
@@ -90,24 +89,38 @@ diff --git a/services/shape_detection/android/java/src/org/chromium/shape_detect
diff --git a/services/shape_detection/android/java/src/org/chromium/shape_detection/InterfaceRegistrar.java b/services/shape_detection/android/java/src/org/chromium/shape_detection/InterfaceRegistrar.java
--- a/services/shape_detection/android/java/src/org/chromium/shape_detection/InterfaceRegistrar.java
+++ b/services/shape_detection/android/java/src/org/chromium/shape_detection/InterfaceRegistrar.java
-@@ -8,9 +8,7 @@ import org.chromium.base.annotations.CalledByNative;
+@@ -8,9 +8,6 @@ import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
+ import org.chromium.mojo.system.MessagePipeHandle;
import org.chromium.mojo.system.impl.CoreImpl;
- import org.chromium.services.service_manager.InterfaceRegistry;
-import org.chromium.shape_detection.mojom.BarcodeDetectionProvider;
- import org.chromium.shape_detection.mojom.FaceDetectionProvider;
+-import org.chromium.shape_detection.mojom.FaceDetectionProvider;
-import org.chromium.shape_detection.mojom.TextDetection;
@JNINamespace("shape_detection")
class InterfaceRegistrar {
-@@ -21,9 +19,6 @@ class InterfaceRegistrar {
- InterfaceRegistry registry = InterfaceRegistry.create(
- CoreImpl.getInstance().acquireNativeHandle(nativeHandle).toMessagePipeHandle());
- registry.addInterface(
-- BarcodeDetectionProvider.MANAGER, new BarcodeDetectionProviderImpl.Factory());
-- registry.addInterface(
- FaceDetectionProvider.MANAGER, new FaceDetectionProviderImpl.Factory());
-- registry.addInterface(TextDetection.MANAGER, new TextDetectionImpl.Factory());
+@@ -20,23 +17,13 @@ class InterfaceRegistrar {
+
+ @CalledByNative
+ static void bindBarcodeDetectionProvider(int nativeHandle) {
+- BarcodeDetectionProvider impl = BarcodeDetectionProviderImpl.create();
+- if (impl != null) {
+- BarcodeDetectionProvider.MANAGER.bind(impl, messagePipeHandleFromNative(nativeHandle));
+- }
+ }
+
+ @CalledByNative
+ static void bindFaceDetectionProvider(int nativeHandle) {
+- FaceDetectionProvider.MANAGER.bind(
+- new FaceDetectionProviderImpl(), messagePipeHandleFromNative(nativeHandle));
+ }
+
+ @CalledByNative
+ static void bindTextDetection(int nativeHandle) {
+- TextDetection impl = TextDetectionImpl.create();
+- if (impl != null) {
+- TextDetection.MANAGER.bind(impl, messagePipeHandleFromNative(nativeHandle));
+- }
}
}
--
diff --git a/build/patches/prefs-only-keep-cookies-until-exit.patch b/build/patches/prefs-only-keep-cookies-until-exit.patch
index b1376d5ebb6189b83b4385e72c2f07616ed594f7..39104278eb9d8cf2d3fb9e873d55878b53637d1c 100644
--- a/build/patches/prefs-only-keep-cookies-until-exit.patch
+++ b/build/patches/prefs-only-keep-cookies-until-exit.patch
@@ -10,7 +10,7 @@ Out with all those tracking cookies!
diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc
--- a/components/content_settings/core/browser/content_settings_registry.cc
+++ b/components/content_settings/core/browser/content_settings_registry.cc
-@@ -134,7 +134,7 @@ void ContentSettingsRegistry::Init() {
+@@ -135,7 +135,7 @@ void ContentSettingsRegistry::Init() {
// WARNING: The string names of the permissions passed in below are used to
// generate preference names and should never be changed!
diff --git a/build/patches/safe_browsing-disable-cookie-transmission.patch b/build/patches/safe_browsing-disable-cookie-transmission.patch
index a8266a25617f66a325257af3a784e1f3040ab76f..61720e51acafc706aedac43b9d7f9d79b333ee8a 100644
--- a/build/patches/safe_browsing-disable-cookie-transmission.patch
+++ b/build/patches/safe_browsing-disable-cookie-transmission.patch
@@ -8,7 +8,7 @@ prevents the long-living tracking cookie from being set.
References: https://github.com/iridium-browser/iridium-browser/issues/37
---
chrome/browser/safe_browsing/client_side_detection_service.cc | 4 ++--
- .../download_protection/check_client_download_request.cc | 2 +-
+ .../download_protection/check_client_download_request_base.cc | 2 +-
.../safe_browsing/download_protection/ppapi_download_request.cc | 2 +-
components/safe_browsing/browser/threat_details_cache.cc | 1 +
components/safe_browsing/db/v4_update_protocol_manager.cc | 4 ++--
@@ -17,7 +17,7 @@ References: https://github.com/iridium-browser/iridium-browser/issues/37
diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chrome/browser/safe_browsing/client_side_detection_service.cc
--- a/chrome/browser/safe_browsing/client_side_detection_service.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_service.cc
-@@ -356,7 +356,7 @@ void ClientSideDetectionService::StartClientReportPhishingRequest(
+@@ -346,7 +346,7 @@ void ClientSideDetectionService::StartClientReportPhishingRequest(
auto resource_request = std::make_unique();
resource_request->url = GetClientReportUrl(kClientReportPhishingUrl);
resource_request->method = "POST";
@@ -26,7 +26,7 @@ diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chr
auto loader = network::SimpleURLLoader::Create(std::move(resource_request),
traffic_annotation);
loader->AttachStringForUpload(request_data, "application/octet-stream");
-@@ -438,7 +438,7 @@ void ClientSideDetectionService::StartClientReportMalwareRequest(
+@@ -428,7 +428,7 @@ void ClientSideDetectionService::StartClientReportMalwareRequest(
auto resource_request = std::make_unique();
resource_request->url = GetClientReportUrl(kClientReportMalwareUrl);
resource_request->method = "POST";
@@ -35,10 +35,10 @@ diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chr
auto loader = network::SimpleURLLoader::Create(std::move(resource_request),
traffic_annotation);
loader->AttachStringForUpload(request_data, "application/octet-stream");
-diff --git a/chrome/browser/safe_browsing/download_protection/check_client_download_request.cc b/chrome/browser/safe_browsing/download_protection/check_client_download_request.cc
---- a/chrome/browser/safe_browsing/download_protection/check_client_download_request.cc
-+++ b/chrome/browser/safe_browsing/download_protection/check_client_download_request.cc
-@@ -773,7 +773,7 @@ void CheckClientDownloadRequest::SendRequest() {
+diff --git a/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc b/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc
+--- a/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc
++++ b/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc
+@@ -596,7 +596,7 @@ void CheckClientDownloadRequestBase::SendRequest() {
auto resource_request = std::make_unique();
resource_request->url = PPAPIDownloadRequest::GetDownloadRequestUrl();
resource_request->method = "POST";
@@ -50,7 +50,7 @@ diff --git a/chrome/browser/safe_browsing/download_protection/check_client_downl
diff --git a/chrome/browser/safe_browsing/download_protection/ppapi_download_request.cc b/chrome/browser/safe_browsing/download_protection/ppapi_download_request.cc
--- a/chrome/browser/safe_browsing/download_protection/ppapi_download_request.cc
+++ b/chrome/browser/safe_browsing/download_protection/ppapi_download_request.cc
-@@ -251,7 +251,7 @@ void PPAPIDownloadRequest::SendRequest() {
+@@ -249,7 +249,7 @@ void PPAPIDownloadRequest::SendRequest() {
auto resource_request = std::make_unique();
resource_request->url = GetDownloadRequestUrl();
resource_request->method = "POST";
@@ -62,7 +62,7 @@ diff --git a/chrome/browser/safe_browsing/download_protection/ppapi_download_req
diff --git a/components/safe_browsing/browser/threat_details_cache.cc b/components/safe_browsing/browser/threat_details_cache.cc
--- a/components/safe_browsing/browser/threat_details_cache.cc
+++ b/components/safe_browsing/browser/threat_details_cache.cc
-@@ -114,6 +114,7 @@ void ThreatDetailsCacheCollector::OpenEntry() {
+@@ -113,6 +113,7 @@ void ThreatDetailsCacheCollector::OpenEntry() {
// Only from cache, and don't save cookies.
resource_request->load_flags = net::LOAD_ONLY_FROM_CACHE |
net::LOAD_SKIP_CACHE_VALIDATION |
@@ -73,7 +73,7 @@ diff --git a/components/safe_browsing/browser/threat_details_cache.cc b/componen
diff --git a/components/safe_browsing/db/v4_update_protocol_manager.cc b/components/safe_browsing/db/v4_update_protocol_manager.cc
--- a/components/safe_browsing/db/v4_update_protocol_manager.cc
+++ b/components/safe_browsing/db/v4_update_protocol_manager.cc
-@@ -372,8 +372,8 @@ void V4UpdateProtocolManager::IssueUpdateRequest() {
+@@ -369,8 +369,8 @@ void V4UpdateProtocolManager::IssueUpdateRequest() {
std::string req_base64 = GetBase64SerializedUpdateRequestProto();
GetUpdateUrlAndHeaders(req_base64, &resource_request->url,
&resource_request->headers);
diff --git a/build/patches/safe_browsing-disable-incident-reporting.patch b/build/patches/safe_browsing-disable-incident-reporting.patch
index 0bcf6fa5db2337e18f98e221bbed22dc9f3163eb..e859953fe13a8efed5b85c077e1e44c9f4636be2 100644
--- a/build/patches/safe_browsing-disable-incident-reporting.patch
+++ b/build/patches/safe_browsing-disable-incident-reporting.patch
@@ -28,7 +28,7 @@ diff --git a/chrome/browser/safe_browsing/incident_reporting/incident_report_upl
diff --git a/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc b/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
--- a/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
-@@ -311,11 +311,14 @@ IncidentReportingService::UploadContext::~UploadContext() {
+@@ -312,11 +312,14 @@ IncidentReportingService::UploadContext::~UploadContext() {
// static
bool IncidentReportingService::IsEnabledForProfile(Profile* profile) {
@@ -59,10 +59,10 @@ diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc b/chrom
diff --git a/chrome/browser/safe_browsing/safe_browsing_service.cc b/chrome/browser/safe_browsing/safe_browsing_service.cc
--- a/chrome/browser/safe_browsing/safe_browsing_service.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_service.cc
-@@ -257,8 +257,10 @@ SafeBrowsingUIManager* SafeBrowsingService::CreateUIManager() {
+@@ -229,8 +229,10 @@ SafeBrowsingUIManager* SafeBrowsingService::CreateUIManager() {
void SafeBrowsingService::RegisterAllDelayedAnalysis() {
- #if defined(FULL_SAFE_BROWSING)
+ #if BUILDFLAG(FULL_SAFE_BROWSING)
+#if 0
RegisterBinaryIntegrityAnalysis();
#endif
diff --git a/build/patches/safe_browsing-disable-reporting-of-safebrowsing-override.patch b/build/patches/safe_browsing-disable-reporting-of-safebrowsing-override.patch
index b0673a3e7545a7cd007b0cd443f29b3e572eedb8..55553cd824ace2245040ff9e68fee38ad9121d71 100644
--- a/build/patches/safe_browsing-disable-reporting-of-safebrowsing-override.patch
+++ b/build/patches/safe_browsing-disable-reporting-of-safebrowsing-override.patch
@@ -12,7 +12,7 @@ This prevents trk:148 (phishing) and trk:149 (malware).
diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chrome/browser/safe_browsing/client_side_detection_service.cc
--- a/chrome/browser/safe_browsing/client_side_detection_service.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_service.cc
-@@ -63,11 +63,13 @@ enum MalwareReportTypes {
+@@ -61,11 +61,13 @@ enum MalwareReportTypes {
REPORT_RESULT_MAX
};
@@ -26,7 +26,7 @@ diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chr
} // namespace
-@@ -287,6 +289,10 @@ void ClientSideDetectionService::StartClientReportPhishingRequest(
+@@ -277,6 +279,10 @@ void ClientSideDetectionService::StartClientReportPhishingRequest(
return;
}
@@ -37,7 +37,7 @@ diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chr
// Fill in metadata about which model we used.
if (is_extended_reporting) {
request->set_model_filename(model_loader_extended_->name());
-@@ -369,6 +375,7 @@ void ClientSideDetectionService::StartClientReportPhishingRequest(
+@@ -359,6 +365,7 @@ void ClientSideDetectionService::StartClientReportPhishingRequest(
// Record that we made a request
phishing_report_times_.push(base::Time::Now());
@@ -45,7 +45,7 @@ diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chr
}
void ClientSideDetectionService::StartClientReportMalwareRequest(
-@@ -383,6 +390,10 @@ void ClientSideDetectionService::StartClientReportMalwareRequest(
+@@ -373,6 +380,10 @@ void ClientSideDetectionService::StartClientReportMalwareRequest(
return;
}
@@ -56,7 +56,7 @@ diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chr
std::string request_data;
if (!request->SerializeToString(&request_data)) {
UpdateEnumUMAHistogram(REPORT_FAILED_SERIALIZATION);
-@@ -452,6 +463,7 @@ void ClientSideDetectionService::StartClientReportMalwareRequest(
+@@ -442,6 +453,7 @@ void ClientSideDetectionService::StartClientReportMalwareRequest(
// Record that we made a malware request
malware_report_times_.push(base::Time::Now());
diff --git a/build/patches/ungoogled-chromium-Always-use-local-DevTools-files-instead-of-remote-files-from-Google.patch b/build/patches/ungoogled-chromium-Always-use-local-DevTools-files-instead-of-remote-files-from-Google.patch
index 5e5a306be78fb6a9ab0702f1cdb3ccbd59d71993..bb761aa37d06eff456143296d6e20eb1cc6ea14f 100644
--- a/build/patches/ungoogled-chromium-Always-use-local-DevTools-files-instead-of-remote-files-from-Google.patch
+++ b/build/patches/ungoogled-chromium-Always-use-local-DevTools-files-instead-of-remote-files-from-Google.patch
@@ -17,7 +17,7 @@ Related comment: https://bugs.chromium.org/p/chromium/issues/detail?id=710701#c1
diff --git a/third_party/blink/renderer/devtools/BUILD.gn b/third_party/blink/renderer/devtools/BUILD.gn
--- a/third_party/blink/renderer/devtools/BUILD.gn
+++ b/third_party/blink/renderer/devtools/BUILD.gn
-@@ -1281,10 +1281,8 @@ action("generate_devtools_grd") {
+@@ -1290,10 +1290,8 @@ action("generate_devtools_grd") {
devtools_embedder_scripts +
[ "$resources_out_dir/devtools_extension_api.js" ]
diff --git a/build/patches/ungoogled-chromium-Disable-Gaia.patch b/build/patches/ungoogled-chromium-Disable-Gaia.patch
index e99c38f2738a3b3ea267458c50768d309478f5b3..ba28315eebfa1344e7d5a072211a969f7ed4853a 100644
--- a/build/patches/ungoogled-chromium-Disable-Gaia.patch
+++ b/build/patches/ungoogled-chromium-Disable-Gaia.patch
@@ -15,9 +15,9 @@ See also: https://github.com/Eloston/ungoogled-chromium/issues/104
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
-@@ -337,7 +337,6 @@
-
-
+@@ -270,7 +270,6 @@
+
+
-
@@ -37,7 +37,7 @@ diff --git a/chrome/browser/ui/webui/signin/inline_login_ui.cc b/chrome/browser/
diff --git a/google_apis/gaia/gaia_auth_fetcher.cc b/google_apis/gaia/gaia_auth_fetcher.cc
--- a/google_apis/gaia/gaia_auth_fetcher.cc
+++ b/google_apis/gaia/gaia_auth_fetcher.cc
-@@ -45,7 +45,7 @@ namespace {
+@@ -44,7 +44,7 @@ namespace {
const int kLoadFlagsIgnoreCookies = net::LOAD_DO_NOT_SEND_COOKIES |
net::LOAD_DO_NOT_SAVE_COOKIES;
@@ -46,7 +46,7 @@ diff --git a/google_apis/gaia/gaia_auth_fetcher.cc b/google_apis/gaia/gaia_auth_
constexpr char kBadAuthenticationError[] = "BadAuthentication";
constexpr char kBadAuthenticationShortError[] = "badauth";
-@@ -261,6 +261,7 @@ void GaiaAuthFetcher::CreateAndStartGaiaFetcher(
+@@ -260,6 +260,7 @@ void GaiaAuthFetcher::CreateAndStartGaiaFetcher(
const net::NetworkTrafficAnnotationTag& traffic_annotation) {
DCHECK(!fetch_pending_) << "Tried to fetch two things at once!";
@@ -54,7 +54,7 @@ diff --git a/google_apis/gaia/gaia_auth_fetcher.cc b/google_apis/gaia/gaia_auth_
auto resource_request = std::make_unique();
resource_request->url = gaia_gurl;
original_url_ = gaia_gurl;
-@@ -311,6 +312,7 @@ void GaiaAuthFetcher::CreateAndStartGaiaFetcher(
+@@ -316,6 +317,7 @@ void GaiaAuthFetcher::CreateAndStartGaiaFetcher(
base::BindOnce(&GaiaAuthFetcher::OnURLLoadComplete,
base::Unretained(this)),
kMaxMessageSize);
diff --git a/build/patches/ungoogled-chromium-Disable-Google-host-detection.patch b/build/patches/ungoogled-chromium-Disable-Google-host-detection.patch
index e07779ebb215df39c7de73de0f72834abc171ca2..b761e32904ea75a585fde4ddf8f83e807704eab0 100644
--- a/build/patches/ungoogled-chromium-Disable-Google-host-detection.patch
+++ b/build/patches/ungoogled-chromium-Disable-Google-host-detection.patch
@@ -5,8 +5,8 @@ Subject: ungoogled-chromium: Disable Google host detection
Disables various detections of Google hosts and functionality specific to them
---
.../page_load_metrics/page_load_metrics_util.cc | 4 +-
- .../page_load_metrics/page_load_metrics_util.cc | 33 +---
components/google/core/common/google_util.cc | 196 ++-------------------
+ .../common/page_load_metrics_util.cc | 33 +---
components/search_engines/template_url.cc | 6 +-
net/base/url_util.cc | 21 ---
5 files changed, 14 insertions(+), 246 deletions(-)
@@ -14,7 +14,7 @@ Disables various detections of Google hosts and functionality specific to them
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_util.cc b/chrome/browser/page_load_metrics/page_load_metrics_util.cc
--- a/chrome/browser/page_load_metrics/page_load_metrics_util.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_util.cc
-@@ -169,9 +169,7 @@ bool DidObserveLoadingBehaviorInAnyFrame(
+@@ -171,9 +171,7 @@ bool DidObserveLoadingBehaviorInAnyFrame(
}
bool IsGoogleSearchHostname(const GURL& url) {
@@ -25,53 +25,10 @@ diff --git a/chrome/browser/page_load_metrics/page_load_metrics_util.cc b/chrome
}
bool IsGoogleSearchResultUrl(const GURL& url) {
-diff --git a/chrome/common/page_load_metrics/page_load_metrics_util.cc b/chrome/common/page_load_metrics/page_load_metrics_util.cc
---- a/chrome/common/page_load_metrics/page_load_metrics_util.cc
-+++ b/chrome/common/page_load_metrics/page_load_metrics_util.cc
-@@ -12,38 +12,7 @@
- namespace page_load_metrics {
-
- base::Optional GetGoogleHostnamePrefix(const GURL& url) {
-- const size_t registry_length =
-- net::registry_controlled_domains::GetRegistryLength(
-- url,
--
-- // Do not include unknown registries (registries that don't have any
-- // matches in effective TLD names).
-- net::registry_controlled_domains::EXCLUDE_UNKNOWN_REGISTRIES,
--
-- // Do not include private registries, such as appspot.com. We don't
-- // want to match URLs like www.google.appspot.com.
-- net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES);
--
-- const base::StringPiece hostname = url.host_piece();
-- if (registry_length == 0 || registry_length == std::string::npos ||
-- registry_length >= hostname.length()) {
-- return base::Optional();
-- }
--
-- // Removes the tld and the preceding dot.
-- const base::StringPiece hostname_minus_registry =
-- hostname.substr(0, hostname.length() - (registry_length + 1));
--
-- if (hostname_minus_registry == "google")
-- return std::string("");
--
-- if (!base::EndsWith(hostname_minus_registry, ".google",
-- base::CompareCase::INSENSITIVE_ASCII)) {
-- return base::Optional();
-- }
--
-- return std::string(hostname_minus_registry.substr(
-- 0, hostname_minus_registry.length() - strlen(".google")));
-+ return base::Optional();
- }
-
- bool IsGoogleHostname(const GURL& url) {
diff --git a/components/google/core/common/google_util.cc b/components/google/core/common/google_util.cc
--- a/components/google/core/common/google_util.cc
+++ b/components/google/core/common/google_util.cc
-@@ -45,120 +45,16 @@ bool gUseMockLinkDoctorBaseURLForTesting = false;
+@@ -46,102 +46,6 @@ bool gUseMockLinkDoctorBaseURLForTesting = false;
bool g_ignore_port_numbers = false;
@@ -174,6 +131,8 @@ diff --git a/components/google/core/common/google_util.cc b/components/google/co
} // namespace
// Global functions -----------------------------------------------------------
+@@ -149,19 +53,11 @@ bool IsGoogleSearchSubdomainUrl(const GURL& url) {
+ const char kGoogleHomepageURL[] = "https://www.google.com/";
bool HasGoogleSearchQueryParam(base::StringPiece str) {
- url::Component query(0, static_cast(str.length())), key, value;
@@ -193,7 +152,7 @@ diff --git a/components/google/core/common/google_util.cc b/components/google/co
}
void SetMockLinkDoctorBaseURLForTesting() {
-@@ -172,120 +68,50 @@ std::string GetGoogleLocale(const std::string& application_locale) {
+@@ -175,120 +71,50 @@ std::string GetGoogleLocale(const std::string& application_locale) {
GURL AppendGoogleLocaleParam(const GURL& url,
const std::string& application_locale) {
@@ -324,10 +283,53 @@ diff --git a/components/google/core/common/google_util.cc b/components/google/co
}
bool IsGoogleAssociatedDomainUrl(const GURL& url) {
+diff --git a/components/page_load_metrics/common/page_load_metrics_util.cc b/components/page_load_metrics/common/page_load_metrics_util.cc
+--- a/components/page_load_metrics/common/page_load_metrics_util.cc
++++ b/components/page_load_metrics/common/page_load_metrics_util.cc
+@@ -12,38 +12,7 @@
+ namespace page_load_metrics {
+
+ base::Optional GetGoogleHostnamePrefix(const GURL& url) {
+- const size_t registry_length =
+- net::registry_controlled_domains::GetRegistryLength(
+- url,
+-
+- // Do not include unknown registries (registries that don't have any
+- // matches in effective TLD names).
+- net::registry_controlled_domains::EXCLUDE_UNKNOWN_REGISTRIES,
+-
+- // Do not include private registries, such as appspot.com. We don't
+- // want to match URLs like www.google.appspot.com.
+- net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES);
+-
+- const base::StringPiece hostname = url.host_piece();
+- if (registry_length == 0 || registry_length == std::string::npos ||
+- registry_length >= hostname.length()) {
+- return base::Optional();
+- }
+-
+- // Removes the tld and the preceding dot.
+- const base::StringPiece hostname_minus_registry =
+- hostname.substr(0, hostname.length() - (registry_length + 1));
+-
+- if (hostname_minus_registry == "google")
+- return std::string("");
+-
+- if (!base::EndsWith(hostname_minus_registry, ".google",
+- base::CompareCase::INSENSITIVE_ASCII)) {
+- return base::Optional();
+- }
+-
+- return std::string(hostname_minus_registry.substr(
+- 0, hostname_minus_registry.length() - strlen(".google")));
++ return base::Optional();
+ }
+
+ bool IsGoogleHostname(const GURL& url) {
diff --git a/components/search_engines/template_url.cc b/components/search_engines/template_url.cc
--- a/components/search_engines/template_url.cc
+++ b/components/search_engines/template_url.cc
-@@ -500,11 +500,7 @@ base::string16 TemplateURLRef::SearchTermToString16(
+@@ -505,11 +505,7 @@ base::string16 TemplateURLRef::SearchTermToString16(
bool TemplateURLRef::HasGoogleBaseURLs(
const SearchTermsData& search_terms_data) const {
ParseIfNecessary(search_terms_data);
@@ -343,7 +345,7 @@ diff --git a/components/search_engines/template_url.cc b/components/search_engin
diff --git a/net/base/url_util.cc b/net/base/url_util.cc
--- a/net/base/url_util.cc
+++ b/net/base/url_util.cc
-@@ -411,27 +411,6 @@ bool HasGoogleHost(const GURL& url) {
+@@ -394,27 +394,6 @@ bool HasGoogleHost(const GURL& url) {
}
bool IsGoogleHost(base::StringPiece host) {
diff --git a/build/patches/ungoogled-chromium-Disable-intranet-redirect-detector.patch b/build/patches/ungoogled-chromium-Disable-intranet-redirect-detector.patch
index d7fa5883de8f002ec648c7c0cad801b300850914..2cbbec62875f42c480198267e254bd14135322e7 100644
--- a/build/patches/ungoogled-chromium-Disable-intranet-redirect-detector.patch
+++ b/build/patches/ungoogled-chromium-Disable-intranet-redirect-detector.patch
@@ -12,7 +12,7 @@ See this page for more information: https://mikewest.org/2012/02/chrome-connects
diff --git a/chrome/browser/intranet_redirect_detector.cc b/chrome/browser/intranet_redirect_detector.cc
--- a/chrome/browser/intranet_redirect_detector.cc
+++ b/chrome/browser/intranet_redirect_detector.cc
-@@ -75,9 +75,7 @@ void IntranetRedirectDetector::FinishSleep() {
+@@ -96,9 +96,7 @@ void IntranetRedirectDetector::FinishSleep() {
simple_loaders_.clear();
resulting_origins_.clear();
diff --git a/build/patches/ungoogled-chromium-Disable-profile-avatar-downloading.patch b/build/patches/ungoogled-chromium-Disable-profile-avatar-downloading.patch
index b3623d776450ff2d4525a6a7da5fd1658a486e06..1d40b99b9ceed86f734e3f74497c8f610a5d2cf5 100644
--- a/build/patches/ungoogled-chromium-Disable-profile-avatar-downloading.patch
+++ b/build/patches/ungoogled-chromium-Disable-profile-avatar-downloading.patch
@@ -12,7 +12,7 @@ Added some Bromite-specific further improvements
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
-@@ -1392,8 +1392,6 @@ jumbo_split_static_library("browser") {
+@@ -1449,8 +1449,6 @@ jumbo_split_static_library("browser") {
"profiles/profile_attributes_entry.h",
"profiles/profile_attributes_storage.cc",
"profiles/profile_attributes_storage.h",
diff --git a/build/patches/ungoogled-chromium-Disable-translate-integration.patch b/build/patches/ungoogled-chromium-Disable-translate-integration.patch
index 43d83b6a804f183f9535231d348011a64344a069..22365ab3efb9cfde3e5c2c0e954086187217e79a 100644
--- a/build/patches/ungoogled-chromium-Disable-translate-integration.patch
+++ b/build/patches/ungoogled-chromium-Disable-translate-integration.patch
@@ -5,11 +5,11 @@ Subject: ungoogled-chromium: Disable translate integration
Remove translate offer
---
.../android/java/res/xml/languages_preferences.xml | 5 -----
- .../languages/LanguagesPreferences.java | 23 ----------------------
+ .../languages/LanguagesPreferences.java | 22 ----------------------
.../java/strings/android_chrome_strings.grd | 3 ---
.../translate/core/browser/translate_manager.cc | 5 +++--
.../translate/core/browser/translate_script.cc | 3 +--
- 5 files changed, 4 insertions(+), 35 deletions(-)
+ 5 files changed, 4 insertions(+), 34 deletions(-)
diff --git a/chrome/android/java/res/xml/languages_preferences.xml b/chrome/android/java/res/xml/languages_preferences.xml
--- a/chrome/android/java/res/xml/languages_preferences.xml
@@ -18,24 +18,16 @@ diff --git a/chrome/android/java/res/xml/languages_preferences.xml b/chrome/andr
android:layout="@layout/languages_preference"
android:widgetLayout="@layout/accept_languages_list" />
--
-
-
+
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguagesPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguagesPreferences.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguagesPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguagesPreferences.java
-@@ -10,7 +10,6 @@ import android.support.v7.preference.Preference;
- import android.support.v7.preference.PreferenceFragmentCompat;
-
- import org.chromium.chrome.R;
--import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
- import org.chromium.chrome.browser.preferences.PrefServiceBridge;
- import org.chromium.chrome.browser.preferences.PreferenceUtils;
- import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-@@ -25,7 +24,6 @@ public class LanguagesPreferences
+@@ -25,7 +25,6 @@ public class LanguagesPreferences
// The keys for each preference shown on the languages page.
static final String PREFERRED_LANGUAGES_KEY = "preferred_languages";
@@ -43,13 +35,13 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/lan
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
-@@ -35,27 +33,6 @@ public class LanguagesPreferences
+@@ -35,27 +34,6 @@ public class LanguagesPreferences
LanguageListPreference mLanguageListPref =
(LanguageListPreference) findPreference(PREFERRED_LANGUAGES_KEY);
mLanguageListPref.registerActivityLauncher(this);
-
-- ChromeSwitchPreferenceCompat translateSwitch =
-- (ChromeSwitchPreferenceCompat) findPreference(TRANSLATE_SWITCH_KEY);
+- ChromeSwitchPreference translateSwitch =
+- (ChromeSwitchPreference) findPreference(TRANSLATE_SWITCH_KEY);
- boolean isTranslateEnabled = PrefServiceBridge.getInstance().isTranslateEnabled();
- translateSwitch.setChecked(isTranslateEnabled);
-
@@ -74,7 +66,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/lan
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
-@@ -1193,9 +1193,6 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -1211,9 +1211,6 @@ Your Google account may have other forms of browsing history like searches and a
Websites will show text in your preferred language, when possible.
diff --git a/build/patches/ungoogled-chromium-Disable-webRTC-log-uploader.patch b/build/patches/ungoogled-chromium-Disable-webRTC-log-uploader.patch
index e8b56c8536acc3d551a49a672ca4ac42409c6301..4ee6351d3b11bea22a76f24508b5fd5819b2bd50 100644
--- a/build/patches/ungoogled-chromium-Disable-webRTC-log-uploader.patch
+++ b/build/patches/ungoogled-chromium-Disable-webRTC-log-uploader.patch
@@ -9,30 +9,30 @@ Subject: ungoogled-chromium: Disable webRTC log uploader
diff --git a/chrome/browser/media/webrtc/webrtc_log_uploader.cc b/chrome/browser/media/webrtc/webrtc_log_uploader.cc
--- a/chrome/browser/media/webrtc/webrtc_log_uploader.cc
+++ b/chrome/browser/media/webrtc/webrtc_log_uploader.cc
-@@ -127,29 +127,7 @@ void WebRtcLogUploader::LoggingStoppedDoUpload(
+@@ -125,29 +125,7 @@ void WebRtcLogUploader::LoggingStoppedDoUpload(
DCHECK(meta_data.get());
- DCHECK(!upload_done_data.log_path.empty());
+ DCHECK(!upload_done_data.paths.directory.empty());
- std::string compressed_log = CompressLog(log_buffer.get());
-
- std::string local_log_id;
-
-- if (base::PathExists(upload_done_data.log_path)) {
-- webrtc_logging::DeleteOldWebRtcLogFiles(upload_done_data.log_path);
+- if (base::PathExists(upload_done_data.paths.directory)) {
+- webrtc_logging::DeleteOldWebRtcLogFiles(upload_done_data.paths.directory);
-
- local_log_id = base::NumberToString(base::Time::Now().ToDoubleT());
- base::FilePath log_file_path =
-- upload_done_data.log_path.AppendASCII(local_log_id)
+- upload_done_data.paths.directory.AppendASCII(local_log_id)
- .AddExtension(FILE_PATH_LITERAL(".gz"));
- WriteCompressedLogToFile(compressed_log, log_file_path);
-
- base::FilePath log_list_path =
- webrtc_logging::TextLogList::GetWebRtcLogListFileForDirectory(
-- upload_done_data.log_path);
+- upload_done_data.paths.directory);
- AddLocallyStoredLogInfoToUploadListFile(log_list_path, local_log_id);
- }
-
-- WebRtcLogUploadDoneData upload_done_data_with_log_id = upload_done_data;
+- UploadDoneData upload_done_data_with_log_id = upload_done_data;
- upload_done_data_with_log_id.local_log_id = local_log_id;
- PrepareMultipartPostData(compressed_log, std::move(meta_data),
- upload_done_data_with_log_id);
@@ -40,7 +40,7 @@ diff --git a/chrome/browser/media/webrtc/webrtc_log_uploader.cc b/chrome/browser
}
void WebRtcLogUploader::PrepareMultipartPostData(
-@@ -160,6 +138,9 @@ void WebRtcLogUploader::PrepareMultipartPostData(
+@@ -158,6 +136,9 @@ void WebRtcLogUploader::PrepareMultipartPostData(
DCHECK(!compressed_log.empty());
DCHECK(meta_data.get());
@@ -49,7 +49,7 @@ diff --git a/chrome/browser/media/webrtc/webrtc_log_uploader.cc b/chrome/browser
+
std::unique_ptr post_data(new std::string());
SetupMultipart(post_data.get(), compressed_log,
- upload_done_data.incoming_rtp_dump,
+ upload_done_data.paths.incoming_rtp_dump,
--
2.11.0
diff --git a/build/patches_list.txt b/build/patches_list.txt
deleted file mode 100644
index 331624560fb2ae6371a8024c0d02f91b5f915e61..0000000000000000000000000000000000000000
--- a/build/patches_list.txt
+++ /dev/null
@@ -1,143 +0,0 @@
-Disable-third-party-cookies-by-default.patch
-Revert-Remove-pre-unified-consent-code-in-sync-and-privacy-directory.patch
-Revert-Remove-UnifiedConsent-from-ChromeFeatureList.patch
-Restore-classic-new-tab-page.patch
-Always-use-new-tab-page-for-default-home-page.patch
-Always-allow-partner-customisation.patch
-Always-show-home-page-settings.patch
-battery_status_service-disable-more-privacy-nightmares.patch
-Battery-API-return-nothing.patch
-google-cloud-messaging-disable-experiment-status-check.patch
-updater-disable-updater-pings.patch
-prefs-only-keep-cookies-until-exit.patch
-Remove-EV-certificates.patch
-promo-disable-Google-promotion-fetching.patch
-Disable-omission-of-URL-elements-in-Omnibox.patch
-Modify-default-preferences.patch
-Disable-contextual-search-by-default.patch
-Do-not-store-passwords-by-default.patch
-Disable-NTP-remote-suggestions-by-default.patch
-Disable-references-to-fonts.googleapis.com.patch
-Disable-WebRTC-by-default.patch
-Disable-data-saver.patch
-Skip-the-first-run-and-metrics.patch
-Disable-signin-and-data-saver-preferences.patch
-Disable-signin-data-reduction-promos.patch
-Remove-recent-tabs-signin.patch
-Remove-background-sync-and-translate-menu-options.patch
-Disable-unused-permissions.patch
-Never-send-any-crash-upload-data.patch
-Hide-send-reports-checkbox.patch
-Never-fetch-popular-sites.patch
-ungoogled-chromium-Disable-webRTC-log-uploader.patch
-ungoogled-chromium-Disable-untraceable-URLs.patch
-ungoogled-chromium-Disable-translate-integration.patch
-ungoogled-chromium-Disable-profile-avatar-downloading.patch
-ungoogled-chromium-Disable-intranet-redirect-detector.patch
-ungoogled-chromium-Disable-Google-host-detection.patch
-ungoogled-chromium-Disable-GCM.patch
-ungoogled-chromium-Disable-Gaia.patch
-ungoogled-chromium-Disable-domain-reliability.patch
-ungoogled-chromium-Disable-Network-Time-Tracker.patch
-ungoogled-chromium-Always-use-local-DevTools-files-instead-of-remote-files-from-Google.patch
-safe_browsing-disable-incident-reporting.patch
-safe_browsing-disable-reporting-of-safebrowsing-override.patch
-safe_browsing-disable-cookie-transmission.patch
-Disable-safe-browsing.patch
-Hide-passwords-manager-link.patch
-Disable-Omaha-update-checks.patch
-Disable-update-scheduler.patch
-Add-StartPage-search-engine.patch
-Add-English-only-search-engine.patch
-Add-DuckDuckGo-Lite-search-engine.patch
-Add-Qwant-search-engine.patch
-Fix-crash-when-accessing-page-info-site-settings.patch
-openH264-enable-ARM-ARM64-optimizations.patch
-Switch-to-fstack-protector-strong.patch
-Enable-fwrapv-in-Clang-for-non-UBSan-builds.patch
-build-remove-calling-untrusted-hooks.patch
-AV1-codec-support.patch
-Inject-scripts-for-AMP-tracking-ads-and-video-functionality.patch
-Allow-playing-audio-in-background.patch
-Add-flag-to-control-video-playback-resume-feature.patch
-Open-YouTube-links-in-Bromite.patch
-Add-exit-menu-item.patch
-Remove-help-menu-item.patch
-Add-menu-option-to-toggle-global-Javascript-preference.patch
-Add-global-menu-entry-to-toggle-AdBlocker.patch
-Bromite-AdBlock-engine-for-SystemWebView.patch
-User-Agent-anonymize.patch
-AudioBuffer-AnalyserNode-fingerprinting-mitigations-via-IDL.patch
-getClientRects-getBoundingClientRect-measureText-add-fingerprinting-mitigation.patch
-Canvas-fingerprinting-mitigations-for-image-data-and-webGL.patch
-Add-flags-to-disable-device-motion-and-orientation-APIs.patch
-Punt-the-Widevine-version-string.patch
-Disable-metrics-on-all-I-O-threads.patch
-Add-a-flag-for-DNS-over-HTTPS.patch
-Always-respect-async-dns-flag-regardless-of-SDK-version.patch
-Add-flag-to-configure-maximum-connections-per-host.patch
-Add-site-settings-option-for-session-only-cookies.patch
-Add-bookmark-import-export-actions.patch
-Disable-promos-displayed-in-bookmarks-manager.patch
-Add-an-always-incognito-mode.patch
-Add-custom-tab-intents-privacy-option.patch
-Add-option-to-not-persist-tabs-across-sessions.patch
-Disable-fetching-of-all-field-trials.patch
-Disable-seed-based-field-trials.patch
-Disable-plugins-enumeration.patch
-net-cert-increase-default-key-length-for-newly-generated-RSA-keys.patch
-dns-send-IPv6-connectivity-probes-to-RIPE-DNS.patch
-profile-resetter-do-not-tick-send-settings-by-default.patch
-browser-ui-disable-warning-about-missing-API-keys.patch
-autofill-disable-autofill-download-manager.patch
-first_run-deactivate-autoupdate-globally.patch
-translate-disable-fetching-of-translate-languages-from-server.patch
-kill-TOS-and-metrics-opt-out.patch
-kill-Translate.patch
-kill-Vision.patch
-kill-Location-fall-back-to-system.patch
-kill-Auth.patch
-kill-GCM.patch
-Allow-website-sign-in-without-account-sign-in.patch
-Offer-builtin-autocomplete-for-chrome-flags.patch
-Do-not-grant-notifications-to-default-search-engine.patch
-Add-flag-to-disable-IPv6-probes.patch
-Add-a-proxy-configuration-page.patch
-Do-not-ignore-download-location-prompt-setting.patch
-Disable-previews-by-default.patch
-e-set-search-engines.patch
-Use-4-tile-rows-never-show-logo.patch
-Disable-metrics-collection-for-NTP-tiles.patch
-e-set-package-name.patch
-e-set-icon.patch
-e-set-app-name.patch
-e-set-popular-sites.patch
-e-enable-donottrack.patch
-e-set-informations.patch
-e-enable-search-suggestion.patch
-e-disable-autofill.patch
-e-rebrand-translations.patch
-e-fix-settings-crash-issue.patch
-e-share-search-engine.patch
-e-enable-custom-tabs-by-default.patch
-e_async_dns_disable.patch
-Enable-site-per-process-isolation-for-devices-with-enough-memory.patch
-Use-64-bit-WebView-processes.patch
-Add-option-to-use-home-page-as-NTP.patch
-Enable-night-mode-menu-entry-by-default.patch
-Disable-dynamic-module-loading.patch
-prefs-disable-signinallowed-by-default.patch
-prefs-always-prompt-for-download-directory-by-default.patch
-Disable-offline-pages-in-the-downloads-home-to-be-opened-in-CCT-by-default.patch
-Enable-changing-default-downloads-storage-location-by-default.patch
-Enable-download-rename-option-by-default.patch
-disable-payment-support-by-default.patch
-disable-background-sync-by-default.patch
-disable-sensors-access-site-setting-by-default.patch
-Disable-media-router-and-remoting-by-default.patch
-Do-not-record-UMA-for-network-errors.patch
-Fix-About-Chrome-regression.patch
-Disable-unified-consent-on-Android.patch
-Disable-search-ready-omnibox-by-default.patch
-disable-AdsBlockedInfoBar.patch
-Bromite-AdBlockUpdaterService.patch
diff --git a/build/patches_list.txt b/build/patches_list.txt
new file mode 120000
index 0000000000000000000000000000000000000000..8a9ff3cb280b9c9bad002d6d858c12e13a2ddb27
--- /dev/null
+++ b/build/patches_list.txt
@@ -0,0 +1 @@
+bromite_patches_list.txt
\ No newline at end of file