Procházet zdrojové kódy

Release 78.0.3904.119

csagan5 před 5 roky
rodič
revize
c941fcf137

+ 4 - 0
CHANGELOG.md

@@ -1,3 +1,7 @@
+# 78.0.3904.119
+* replace fixed DNS-over-HTTPS feature flag with user-customizable option
+* fix background playback issue (fixes https://github.com/bromite/bromite/issues/424)
+
 # 78.0.3904.105
 # 78.0.3904.105
 * add flag to disable WebGL (fixes https://github.com/bromite/bromite/issues/411)
 * add flag to disable WebGL (fixes https://github.com/bromite/bromite/issues/411)
 * more selective AMP sanitization (fixes https://github.com/bromite/bromite/issues/410)
 * more selective AMP sanitization (fixes https://github.com/bromite/bromite/issues/410)

+ 1 - 1
build/bromite_patches_list.txt

@@ -69,7 +69,6 @@ Multiple-fingerprinting-mitigations-for-canvas-text-and-client-rectangles.patch
 Add-flags-to-disable-device-motion-and-orientation-APIs.patch
 Add-flags-to-disable-device-motion-and-orientation-APIs.patch
 Punt-the-Widevine-version-string.patch
 Punt-the-Widevine-version-string.patch
 Disable-metrics-on-all-I-O-threads.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
 Always-respect-async-dns-flag-regardless-of-SDK-version.patch
 Add-flag-to-configure-maximum-connections-per-host.patch
 Add-flag-to-configure-maximum-connections-per-host.patch
 Add-site-settings-option-for-session-only-cookies.patch
 Add-site-settings-option-for-session-only-cookies.patch
@@ -141,3 +140,4 @@ Disable-HEAD-requests-for-single-word-Omnibar-searches.patch
 Block-all-connection-requests-with-qjz9zk-in-the-domain-name-or-with-a-trk-scheme.patch
 Block-all-connection-requests-with-qjz9zk-in-the-domain-name-or-with-a-trk-scheme.patch
 Disable-some-signed-exchange-features.patch
 Disable-some-signed-exchange-features.patch
 Add-flag-to-disable-WebGL.patch
 Add-flag-to-disable-WebGL.patch
+Add-user-setting-for-DNS-over-HTTPS-custom-URL.patch

+ 0 - 258
build/patches/Add-a-flag-for-DNS-over-HTTPS.patch

@@ -1,258 +0,0 @@
-From: csagan5 <32685696+csagan5@users.noreply.github.com>
-Date: Sat, 28 Apr 2018 08:30:26 +0200
-Subject: Add a flag for DNS-over-HTTPS
-
-Allow selection between Google and Cloudflare endpoints.
-Serve DoH requests with maximum priority, remove traffic annotation.
-Reduce HTTP headers in DoH requests to bare minimum.
-Add AdGuard (default) endpoint
-Do not fallback to UDP when using DoH
-
-See also: https://tools.ietf.org/id/draft-ietf-doh-dns-over-https-14.txt
----
- chrome/browser/about_flags.cc                          | 10 +++++++++-
- chrome/browser/net/system_network_context_manager.cc   | 18 +++++++++++-------
- chrome/common/chrome_features.cc                       |  9 ---------
- chrome/common/chrome_features.h                        |  2 --
- .../common/network_features.cc                         |  6 ++++++
- .../common/network_features.h                          |  6 ++++++
- .../common/network_switch_list.h                       |  4 ++++
- net/base/load_flags_list.h                             |  6 ++++++
- net/dns/dns_transaction.cc                             |  4 ++--
- net/url_request/url_request_http_job.cc                | 16 +++++++++++-----
- 10 files changed, 55 insertions(+), 26 deletions(-)
-
-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
-@@ -418,6 +418,14 @@ const FeatureEntry::FeatureVariation kCCTModuleCacheVariations[] = {
-      base::size(kCCTModuleCache_ThirtyMinutes), nullptr},
- };
- 
-+const FeatureEntry::Choice kDnsOverHttpsChoices[] = {
-+    {features::kDnsOverHttpsChoiceDefault, "", ""},
-+    {features::kDnsOverHttpsChoiceGoogle, switches::kDnsOverHttpsServer, "https://dns.google/dns-query"},
-+    {features::kDnsOverHttpsChoiceCloudflare, switches::kDnsOverHttpsServer, "https://1.1.1.1/dns-query"},
-+    {features::kDnsOverHttpsChoiceQuad9, switches::kDnsOverHttpsServer, "https://9.9.9.9/dns-query"},
-+    {features::kDnsOverHttpsChoiceAdGuard, switches::kDnsOverHttpsServer, "https://dns.adguard.com/dns-query"}
-+};
-+
- #endif  // OS_ANDROID
- 
- const FeatureEntry::FeatureParam kForceDark_SimpleHsl[] = {
-@@ -4491,7 +4499,7 @@ const FeatureEntry kFeatureEntries[] = {
-     {"dns-over-https", flag_descriptions::kDnsOverHttpsName,
-      flag_descriptions::kDnsOverHttpsDescription,
-      kOsMac | kOsWin | kOsCrOS | kOsAndroid,
--     FEATURE_VALUE_TYPE(features::kDnsOverHttps)},
-+     MULTI_VALUE_TYPE(kDnsOverHttpsChoices)},
- 
- #if defined(OS_ANDROID)
-     {"tab-switcher-longpress-menu",
-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
-@@ -25,6 +25,7 @@
- #include "chrome/browser/chrome_content_browser_client.h"
- #include "chrome/browser/component_updater/crl_set_component_installer.h"
- #include "chrome/browser/net/chrome_mojo_proxy_resolver_factory.h"
-+#include "components/network_session_configurator/common/network_switches.h"
- #include "chrome/browser/net/dns_util.h"
- #include "chrome/browser/safe_browsing/safe_browsing_service.h"
- #include "chrome/browser/ssl/ssl_config_service_manager.h"
-@@ -142,6 +143,7 @@ void GetStubResolverConfig(
-                      base::SPLIT_WANT_NONEMPTY)) {
-       if (!chrome_browser_net::IsValidDohTemplate(server_template,
-                                                   &server_method)) {
-+        LOG(ERROR) << "Invalid DoH template: " << server_template << " with method " << server_method;
-         continue;
-       }
- 
-@@ -406,14 +408,16 @@ SystemNetworkContextManager::SystemNetworkContextManager(
-                                     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();
-+
-+  std::string server =
-+      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-+      switches::kDnsOverHttpsServer);
-+  if (!server.empty()) {
-+    default_doh_mode = chrome_browser_net::kDnsOverHttpsModeSecure;
-+    // will use POST when URLs do not contain a 'dns' query parameter
-+    default_doh_templates = server;
-   }
-+
-   local_state_->SetDefaultPrefValue(prefs::kDnsOverHttpsMode,
-                                     base::Value(default_doh_mode));
-   local_state_->SetDefaultPrefValue(prefs::kDnsOverHttpsTemplates,
-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
-@@ -269,15 +269,6 @@ const base::Feature kDisallowUnsafeHttpDownloads{
-     "DisallowUnsafeHttpDownloads", base::FEATURE_DISABLED_BY_DEFAULT};
- const char kDisallowUnsafeHttpDownloadsParamName[] = "MimeTypeList";
- 
--// Enable DNS over HTTPS (DoH).
--const base::Feature kDnsOverHttps{"DnsOverHttps",
--                                  base::FEATURE_DISABLED_BY_DEFAULT};
--
--// Set whether fallback to insecure DNS is allowed by default. This setting may
--// be overridden for individual transactions.
--const base::FeatureParam<bool> kDnsOverHttpsFallbackParam{&kDnsOverHttps,
--                                                          "Fallback", true};
--
- // 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
- // will be used to construct a list of DoH templates associated with the IP
-diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
---- a/chrome/common/chrome_features.h
-+++ b/chrome/common/chrome_features.h
-@@ -166,8 +166,6 @@ extern const char kDisallowUnsafeHttpDownloadsParamName[];
- COMPONENT_EXPORT(CHROME_FEATURES)
- extern const base::Feature kDnsOverHttps;
- COMPONENT_EXPORT(CHROME_FEATURES)
--extern const base::FeatureParam<bool> kDnsOverHttpsFallbackParam;
--COMPONENT_EXPORT(CHROME_FEATURES)
- extern const base::FeatureParam<std::string> kDnsOverHttpsTemplatesParam;
- 
- #if defined(OS_ANDROID)
-diff --git a/components/network_session_configurator/common/network_features.cc b/components/network_session_configurator/common/network_features.cc
---- a/components/network_session_configurator/common/network_features.cc
-+++ b/components/network_session_configurator/common/network_features.cc
-@@ -8,4 +8,10 @@
- 
- namespace features {
- 
-+const char kDnsOverHttpsChoiceDefault[] = "Disabled",
-+                 kDnsOverHttpsChoiceGoogle[] = "Google",
-+                 kDnsOverHttpsChoiceCloudflare[] = "Cloudflare",
-+                 kDnsOverHttpsChoiceQuad9[] = "Quad9",
-+                 kDnsOverHttpsChoiceAdGuard[] = "AdGuard";
-+
- }  // namespace features
-diff --git a/components/network_session_configurator/common/network_features.h b/components/network_session_configurator/common/network_features.h
---- a/components/network_session_configurator/common/network_features.h
-+++ b/components/network_session_configurator/common/network_features.h
-@@ -10,6 +10,12 @@
- 
- namespace features {
- 
-+// DNS over HTTPS server endpoint choices
-+ // (https://tools.ietf.org/id/draft-ietf-doh-dns-over-https-12.txt).
-+NETWORK_SESSION_CONFIGURATOR_EXPORT extern const char kDnsOverHttpsChoiceDefault[],
-+   kDnsOverHttpsChoiceGoogle[], kDnsOverHttpsChoiceCloudflare[], kDnsOverHttpsChoiceQuad9[],
-+   kDnsOverHttpsChoiceAdGuard[];
-+
- }  // namespace features
- 
- #endif  // COMPONENTS_NETWORK_SESSION_CONFIGURATOR_COMMON_NETWORK_FEATURES_H_
-diff --git a/components/network_session_configurator/common/network_switch_list.h b/components/network_session_configurator/common/network_switch_list.h
---- a/components/network_session_configurator/common/network_switch_list.h
-+++ b/components/network_session_configurator/common/network_switch_list.h
-@@ -32,6 +32,10 @@ NETWORK_SWITCH(kOriginToForceQuicOn, "origin-to-force-quic-on")
- // the server.
- NETWORK_SWITCH(kQuicConnectionOptions, "quic-connection-options")
- 
-+// Specifies an IETF DNS-over-HTTPS server endpoint
-+// (https://tools.ietf.org/id/draft-ietf-doh-dns-over-https-02.txt).
-+NETWORK_SWITCH(kDnsOverHttpsServer, "dns-over-https-server")
-+
- // Specifies the maximum length for a QUIC packet.
- NETWORK_SWITCH(kQuicMaxPacketLength, "quic-max-packet-length")
- 
-diff --git a/net/base/load_flags_list.h b/net/base/load_flags_list.h
---- a/net/base/load_flags_list.h
-+++ b/net/base/load_flags_list.h
-@@ -117,3 +117,9 @@ LOAD_FLAG(RESTRICTED_PREFETCH, 1 << 18)
- // is considered privileged, and therefore this flag must only be set from a
- // trusted process.
- LOAD_FLAG(CAN_USE_RESTRICTED_PREFETCH, 1 << 19)
-+
-+// This load will not send Accept-Language or User-Agent headers, and not
-+// advertise brotli encoding.
-+// Used to comply with IETF (draft) DNS-over-HTTPS:
-+// "Implementors SHOULD NOT set non-essential HTTP headers in DoH client requests."
-+LOAD_FLAG(MINIMAL_HEADERS, 1 << 20)
-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
-@@ -403,7 +403,7 @@ class DnsHTTPAttempt : public DnsAttempt, public URLRequest::Delegate {
-     // perspective to prevent the client from sending AIA requests).
-     request_->SetLoadFlags(request_->load_flags() | LOAD_DISABLE_CACHE |
-                            LOAD_BYPASS_PROXY |
--                           LOAD_DISABLE_CERT_NETWORK_FETCHES);
-+                           LOAD_DISABLE_CERT_NETWORK_FETCHES | LOAD_MINIMAL_HEADERS);
-     request_->set_allow_credentials(false);
-   }
- 
-@@ -997,7 +997,7 @@ class DnsTransactionImpl : public DnsTransaction,
-         had_tcp_attempt_(false),
-         first_server_index_(0),
-         url_request_context_(url_request_context),
--        request_priority_(DEFAULT_PRIORITY) {
-+        request_priority_(MAXIMUM_PRIORITY) {
-     DCHECK(session_.get());
-     DCHECK(!hostname_.empty());
-     DCHECK(!callback_.is_null());
-diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
---- a/net/url_request/url_request_http_job.cc
-+++ b/net/url_request/url_request_http_job.cc
-@@ -339,6 +339,7 @@ void URLRequestHttpJob::Start() {
-   // plugin could set a referrer although sending the referrer is inhibited.
-   request_info_.extra_headers.RemoveHeader(HttpRequestHeaders::kReferer);
- 
-+  if (!(request_info_.load_flags & LOAD_MINIMAL_HEADERS)) {
-   // Our consumer should have made sure that this is a safe referrer. See for
-   // instance WebCore::FrameLoader::HideReferrer.
-   if (referrer.is_valid()) {
-@@ -354,11 +355,14 @@ void URLRequestHttpJob::Start() {
-     request_info_.extra_headers.SetHeader(HttpRequestHeaders::kReferer,
-                                           referer_value);
-   }
-+  }
- 
-+  if (!(request_info_.load_flags & LOAD_MINIMAL_HEADERS)) {
-   request_info_.extra_headers.SetHeaderIfMissing(
-       HttpRequestHeaders::kUserAgent,
-       http_user_agent_settings_ ?
-           http_user_agent_settings_->GetUserAgent() : std::string());
-+  }
- 
-   AddExtraHeaders();
-   AddCookieHeaderAndStart();
-@@ -582,10 +586,12 @@ void URLRequestHttpJob::AddExtraHeaders() {
-     } else {
-       // Advertise "br" encoding only if transferred data is opaque to proxy.
-       bool advertise_brotli = false;
--      if (request()->context()->enable_brotli()) {
--        if (request()->url().SchemeIsCryptographic() ||
--            IsLocalhost(request()->url())) {
--          advertise_brotli = true;
-+      if (!(request_info_.load_flags & LOAD_MINIMAL_HEADERS)) {
-+        if (request()->context()->enable_brotli()) {
-+          if (request()->url().SchemeIsCryptographic() ||
-+              IsLocalhost(request()->url())) {
-+            advertise_brotli = true;
-+          }
-         }
-       }
- 
-@@ -603,7 +609,7 @@ void URLRequestHttpJob::AddExtraHeaders() {
-     }
-   }
- 
--  if (http_user_agent_settings_) {
-+  if (!(request_info_.load_flags & LOAD_MINIMAL_HEADERS) && http_user_agent_settings_) {
-     // Only add default Accept-Language if the request didn't have it
-     // specified.
-     std::string accept_language =
--- 
-2.11.0
-

+ 7 - 9
build/patches/Add-flag-to-configure-maximum-connections-per-host.patch

@@ -19,7 +19,7 @@ with limited CPU/memory resources and it is disabled by default.
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -677,6 +677,11 @@ const FeatureEntry::Choice kForceEffectiveConnectionTypeChoices[] = {
+@@ -669,6 +669,11 @@ const FeatureEntry::Choice kForceEffectiveConnectionTypeChoices[] = {
       net::kEffectiveConnectionType4G},
       net::kEffectiveConnectionType4G},
  };
  };
  
  
@@ -31,7 +31,7 @@ diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
  // Ensure that all effective connection types returned by Network Quality
  // Ensure that all effective connection types returned by Network Quality
  // Estimator (NQE) are also exposed via flags.
  // Estimator (NQE) are also exposed via flags.
  static_assert(net::EFFECTIVE_CONNECTION_TYPE_LAST + 2 ==
  static_assert(net::EFFECTIVE_CONNECTION_TYPE_LAST + 2 ==
-@@ -2546,6 +2551,9 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -2538,6 +2543,9 @@ const FeatureEntry kFeatureEntries[] = {
       flag_descriptions::kPassiveDocumentEventListenersName,
       flag_descriptions::kPassiveDocumentEventListenersName,
       flag_descriptions::kPassiveDocumentEventListenersDescription, kOsAll,
       flag_descriptions::kPassiveDocumentEventListenersDescription, kOsAll,
       FEATURE_VALUE_TYPE(features::kPassiveDocumentEventListeners)},
       FEATURE_VALUE_TYPE(features::kPassiveDocumentEventListeners)},
@@ -71,16 +71,14 @@ diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptio
 diff --git a/components/network_session_configurator/common/network_features.cc b/components/network_session_configurator/common/network_features.cc
 diff --git a/components/network_session_configurator/common/network_features.cc b/components/network_session_configurator/common/network_features.cc
 --- a/components/network_session_configurator/common/network_features.cc
 --- a/components/network_session_configurator/common/network_features.cc
 +++ b/components/network_session_configurator/common/network_features.cc
 +++ b/components/network_session_configurator/common/network_features.cc
-@@ -8,6 +8,9 @@
+@@ -8,4 +8,7 @@
  
  
  namespace features {
  namespace features {
  
  
 +const char kMaxConnectionsPerHostChoiceDefault[] = "6",
 +const char kMaxConnectionsPerHostChoiceDefault[] = "6",
 +                 kMaxConnectionsPerHostChoice15[] = "15";
 +                 kMaxConnectionsPerHostChoice15[] = "15";
 +
 +
- const char kDnsOverHttpsChoiceDefault[] = "Disabled",
-                  kDnsOverHttpsChoiceGoogle[] = "Google",
-                  kDnsOverHttpsChoiceCloudflare[] = "Cloudflare",
+ }  // namespace features
 diff --git a/components/network_session_configurator/common/network_features.h b/components/network_session_configurator/common/network_features.h
 diff --git a/components/network_session_configurator/common/network_features.h b/components/network_session_configurator/common/network_features.h
 --- a/components/network_session_configurator/common/network_features.h
 --- a/components/network_session_configurator/common/network_features.h
 +++ b/components/network_session_configurator/common/network_features.h
 +++ b/components/network_session_configurator/common/network_features.h
@@ -92,9 +90,9 @@ diff --git a/components/network_session_configurator/common/network_features.h b
 +                 kMaxConnectionsPerHostChoice6[],
 +                 kMaxConnectionsPerHostChoice6[],
 +                 kMaxConnectionsPerHostChoice15[];
 +                 kMaxConnectionsPerHostChoice15[];
 +
 +
- // DNS over HTTPS server endpoint choices
-  // (https://tools.ietf.org/id/draft-ietf-doh-dns-over-https-12.txt).
- NETWORK_SESSION_CONFIGURATOR_EXPORT extern const char kDnsOverHttpsChoiceDefault[],
+ }  // namespace features
+ 
+ #endif  // COMPONENTS_NETWORK_SESSION_CONFIGURATOR_COMMON_NETWORK_FEATURES_H_
 diff --git a/components/network_session_configurator/common/network_switch_list.h b/components/network_session_configurator/common/network_switch_list.h
 diff --git a/components/network_session_configurator/common/network_switch_list.h b/components/network_session_configurator/common/network_switch_list.h
 --- a/components/network_session_configurator/common/network_switch_list.h
 --- a/components/network_session_configurator/common/network_switch_list.h
 +++ b/components/network_session_configurator/common/network_switch_list.h
 +++ b/components/network_session_configurator/common/network_switch_list.h

+ 2 - 13
build/patches/Add-flag-to-control-video-playback-resume-feature.patch

@@ -4,11 +4,11 @@ Subject: Add flag to control video playback resume feature
 
 
 Disable it by default on Android as it is everywhere else
 Disable it by default on Android as it is everywhere else
 ---
 ---
- chrome/browser/about_flags.cc       | 8 ++++----
+ chrome/browser/about_flags.cc       | 4 ++++
  chrome/browser/flag_descriptions.cc | 5 +++++
  chrome/browser/flag_descriptions.cc | 5 +++++
  chrome/browser/flag_descriptions.h  | 3 +++
  chrome/browser/flag_descriptions.h  | 3 +++
  media/base/media_switches.cc        | 6 +-----
  media/base/media_switches.cc        | 6 +-----
- 4 files changed, 13 insertions(+), 9 deletions(-)
+ 4 files changed, 13 insertions(+), 5 deletions(-)
 
 
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
@@ -24,17 +24,6 @@ diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
      {"shared-array-buffer", flag_descriptions::kEnableSharedArrayBufferName,
      {"shared-array-buffer", flag_descriptions::kEnableSharedArrayBufferName,
       flag_descriptions::kEnableSharedArrayBufferDescription, kOsAll,
       flag_descriptions::kEnableSharedArrayBufferDescription, kOsAll,
       FEATURE_VALUE_TYPE(features::kSharedArrayBuffer)},
       FEATURE_VALUE_TYPE(features::kSharedArrayBuffer)},
-@@ -1603,10 +1607,6 @@ const FeatureEntry kFeatureEntries[] = {
-      FEATURE_VALUE_TYPE(features::kAppNotificationStatusMessaging)},
- #endif  // OS_ANDROID
-     {"enable-devtools-experiments", flag_descriptions::kDevtoolsExperimentsName,
--    {"resume-background-video",
--     flag_descriptions::kResumeBackgroundVideoName,
--     flag_descriptions::kResumeBackgroundVideoDescription, kOsAll,
--     FEATURE_VALUE_TYPE(media::kResumeBackgroundVideo)},
-      flag_descriptions::kDevtoolsExperimentsDescription, kOsDesktop,
-      SINGLE_VALUE_TYPE(switches::kEnableDevToolsExperiments)},
-     {"silent-debugger-extension-api",
 diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
 diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
 --- a/chrome/browser/flag_descriptions.cc
 --- a/chrome/browser/flag_descriptions.cc
 +++ b/chrome/browser/flag_descriptions.cc
 +++ b/chrome/browser/flag_descriptions.cc

+ 1 - 1
build/patches/Add-flag-to-disable-IPv6-probes.patch

@@ -16,7 +16,7 @@ Subject: Add flag to disable IPv6 probes
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -3206,6 +3206,11 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -3198,6 +3198,11 @@ const FeatureEntry kFeatureEntries[] = {
           kMarkHttpAsFeatureVariations,
           kMarkHttpAsFeatureVariations,
           "HTTPReallyBadFinal")},
           "HTTPReallyBadFinal")},
  
  

+ 1 - 1
build/patches/Add-flag-to-disable-WebGL.patch

@@ -11,7 +11,7 @@ Subject: Add flag to disable WebGL
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -1372,6 +1372,9 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -1364,6 +1364,9 @@ const FeatureEntry kFeatureEntries[] = {
       flag_descriptions::kAccelerated2dCanvasName,
       flag_descriptions::kAccelerated2dCanvasName,
       flag_descriptions::kAccelerated2dCanvasDescription, kOsAll,
       flag_descriptions::kAccelerated2dCanvasDescription, kOsAll,
       SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAccelerated2dCanvas)},
       SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAccelerated2dCanvas)},

+ 509 - 0
build/patches/Add-user-setting-for-DNS-over-HTTPS-custom-URL.patch

@@ -0,0 +1,509 @@
+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 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  | 36 +--------
+ chrome/common/chrome_features.cc                   |  4 +-
+ 13 files changed, 313 insertions(+), 34 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 @@
++<?xml version="1.0" encoding="utf-8"?>
++<!-- Copyright 2015 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. -->
++
++<FrameLayout
++    xmlns:android="http://schemas.android.com/apk/res/android"
++    xmlns:app="http://schemas.android.com/apk/res-auto"
++    xmlns:tools="http://schemas.android.com/tools"
++    android:layout_width="match_parent"
++    android:layout_height="match_parent" >
++
++    <ScrollView
++        android:layout_width="match_parent"
++        android:layout_height="match_parent"
++        android:id="@+id/scroll_view"
++        android:fillViewport="true" >
++
++        <LinearLayout
++            android:layout_width="match_parent"
++            android:layout_height="wrap_content"
++            android:orientation="vertical"
++            android:focusableInTouchMode="true" >
++
++            <org.chromium.chrome.browser.widget.ChromeTextInputLayout
++                android:id="@+id/doh_url"
++                style="@style/PreferenceScreenLayout"
++                android:layout_width="match_parent"
++                android:layout_height="wrap_content" >
++                <!-- TODO(crbug.com/900912): Fix and remove lint ignore -->
++                <EditText
++                    tools:ignore="Autofill"
++                    android:id="@+id/doh_url_edit"
++                    android:layout_width="match_parent"
++                    android:layout_height="wrap_content"
++                    android:inputType="textUri"
++                    android:singleLine="true"
++                    android:hint="@string/options_doh_edit_label" />
++            </org.chromium.chrome.browser.widget.ChromeTextInputLayout>
++
++            <Space style="@style/ButtonBarTopSpacer" />
++            <View style="@style/ButtonBarTopDivider" />
++
++            <LinearLayout style="@style/ButtonBar" >
++                <org.chromium.ui.widget.ButtonCompat
++                    android:id="@+id/doh_reset"
++                    style="@style/ButtonBarButton"
++                    android:text="@string/reset" />
++
++                <org.chromium.ui.widget.ButtonCompat
++                    android:id="@+id/doh_cancel"
++                    style="@style/ButtonBarButton"
++                    android:text="@string/cancel" />
++
++                <org.chromium.ui.widget.ButtonCompat
++                    android:id="@+id/doh_save"
++                    style="@style/ButtonBarButton"
++                    android:text="@string/save" />
++            </LinearLayout>
++        </LinearLayout>
++    </ScrollView>
++
++    <include layout="@layout/preferences_action_bar_shadow"/>
++
++</FrameLayout>
+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 @@
+     <integer name="download_infobar_bar_fill_in_delay">400</integer>
+     <integer name="download_infobar_bar_fill_out_delay">200</integer>
+ 
++    <string name="doh_help_url">https://www.bromite.org/doh</string>
++
+     <!-- Bottom navigation bar styling. -->
+     <bool name="window_light_navigation_bar">true</bool>
+ 
+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 @@
++<?xml version="1.0" encoding="utf-8"?>
++<!-- Copyright 2015 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. -->
++
++<PreferenceScreen
++    xmlns:android="http://schemas.android.com/apk/res/android"
++    xmlns:app="http://schemas.android.com/apk/res-auto">
++
++    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
++        android:key="doh_switch"
++        android:summaryOn="@string/text_on"
++        android:summaryOff="@string/text_off" />
++
++    <org.chromium.chrome.browser.preferences.HyperlinkPreference
++        android:key="doh_help"
++        android:title="@string/doh_help"
++        app:url="@string/doh_help_url" />
++
++    <Preference
++        android:key="doh_edit"
++        android:title="@string/options_doh_edit_label"
++        android:fragment="org.chromium.chrome.browser.preferences.DoHEditor" />
++
++</PreferenceScreen>
+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" />
++    <Preference
++        android:fragment="org.chromium.chrome.browser.preferences.DoHPreferences"
++        android:key="doh"
++        android:title="@string/options_doh_title"
++        android:summary="@string/options_doh_summary" />
+     <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
+         android:key="preload_pages"
+         android:title="@string/preload_pages_title"
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/DoHEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/DoHEditor.java
+new file mode 100644
+--- /dev/null
++++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/DoHEditor.java
+@@ -0,0 +1,91 @@
++// Copyright 2015 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.chrome.browser.preferences;
++
++import android.os.Bundle;
++import android.support.v4.app.Fragment;
++import android.text.Editable;
++import android.text.TextWatcher;
++import android.view.LayoutInflater;
++import android.view.View;
++import android.view.ViewGroup;
++import android.widget.Button;
++import android.widget.EditText;
++
++import org.chromium.chrome.browser.util.FeatureUtilities;
++import org.chromium.chrome.R;
++import org.chromium.components.url_formatter.UrlFormatter;
++
++/**
++ * Provides the Java-UI for editing the DNS-over-HTTPS (DoH) preference.
++ */
++public class DoHEditor extends Fragment implements TextWatcher {
++    private EditText mDoHUrlEdit;
++    private Button mSaveButton;
++    private Button mResetButton;
++
++    @Override
++    public View onCreateView(LayoutInflater inflater, ViewGroup container,
++            Bundle savedInstanceState) {
++        super.onCreate(savedInstanceState);
++        getActivity().setTitle(R.string.options_doh_edit_title);
++
++        View v = inflater.inflate(R.layout.doh_editor, container, false);
++        View scrollView = v.findViewById(R.id.scroll_view);
++        scrollView.getViewTreeObserver().addOnScrollChangedListener(
++                PreferenceUtils.getShowShadowOnScrollListener(v, v.findViewById(R.id.shadow)));
++        mDoHUrlEdit = (EditText) v.findViewById(R.id.doh_url_edit);
++        mDoHUrlEdit.setText(FeatureUtilities.getDoHTemplates());
++        mDoHUrlEdit.addTextChangedListener(this);
++        mDoHUrlEdit.requestFocus();
++
++        initializeSaveCancelResetButtons(v);
++        return v;
++    }
++
++    @Override
++    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
++    }
++
++    @Override
++    public void onTextChanged(CharSequence s, int start, int before, int count) {
++        mSaveButton.setEnabled(true);
++        mResetButton.setEnabled(true);
++    }
++
++    @Override
++    public void afterTextChanged(Editable s) {
++    }
++
++    private void initializeSaveCancelResetButtons(View v) {
++        mResetButton = (Button) v.findViewById(R.id.doh_reset);
++        mResetButton.setOnClickListener(new View.OnClickListener() {
++            @Override
++            public void onClick(View v) {
++                mDoHUrlEdit.setText(FeatureUtilities.getDoHTemplates());
++                getActivity().finish();
++            }
++        });
++
++        mSaveButton = (Button) v.findViewById(R.id.doh_save);
++        mSaveButton.setEnabled(false);
++        mSaveButton.setOnClickListener(new View.OnClickListener() {
++            @Override
++            public void onClick(View v) {
++                FeatureUtilities.setDoHTemplates(
++                        mDoHUrlEdit.getText().toString());
++                getActivity().finish();
++            }
++        });
++
++        Button button = (Button) v.findViewById(R.id.doh_cancel);
++        button.setOnClickListener(new View.OnClickListener() {
++            @Override
++            public void onClick(View v) {
++                getActivity().finish();
++            }
++        });
++    }
++}
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/DoHPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/DoHPreferences.java
+new file mode 100644
+--- /dev/null
++++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/DoHPreferences.java
+@@ -0,0 +1,52 @@
++// Copyright 2015 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.chrome.browser.preferences;
++
++import android.os.Bundle;
++import android.support.v7.preference.Preference;
++import android.support.v7.preference.PreferenceFragmentCompat;
++
++import org.chromium.chrome.browser.util.FeatureUtilities;
++import org.chromium.base.VisibleForTesting;
++import org.chromium.chrome.R;
++
++/**
++ * Fragment that allows the user to configure DoH related preferences.
++ */
++public class DoHPreferences extends PreferenceFragmentCompat {
++    @VisibleForTesting
++    public static final String PREF_DOH_SWITCH = "doh_switch";
++    private static final String PREF_DOH_EDIT = "doh_edit";
++
++    private Preference mDoHEdit;
++
++    @Override
++    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
++        getActivity().setTitle(R.string.options_doh_title);
++        PreferenceUtils.addPreferencesFromResource(this, R.xml.doh_preferences);
++
++        ChromeSwitchPreference mDoHSwitch =
++                (ChromeSwitchPreference) findPreference(PREF_DOH_SWITCH);
++        boolean isDoHEnabled = FeatureUtilities.getDoHEnabled();
++        mDoHSwitch.setChecked(isDoHEnabled);
++        mDoHSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
++            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
+       </message>
+ 
++      <!-- DoH preferences -->
++      <message name="IDS_OPTIONS_DOH_EDIT_TITLE" desc="The title of the screen that allows users to change the URL that is used for DNS-over-HTTPS queries.">
++        Edit DoH template URLs
++      </message>
++      <message name="IDS_OPTIONS_DOH_EDIT_LABEL" desc="The label for the edit text field that allows the user to change the URL that is used for DNS-over-HTTPS queries.">
++        DoH template URLs
++      </message>
++      <message name="IDS_DOH_HELP" desc="The title of the hyperlink that allows users to visit the wiki page with instructions for DNS-over-HTTPS configuration.">
++        Visit help page
++      </message>
++
+       <!-- Homepage preferences -->
+       <message name="IDS_OPTIONS_HOMEPAGE_EDIT_TITLE" desc="The title of the screen that allows users to change the URL that opens when they tap on the home page button in the omnibox.">
+         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.">
+         <message name="IDS_OPTIONS_HOMEPAGE_TITLE" desc="The title of the home page overlay on Android" formatter_data="android_java">
+           Home page
+         </message>
++        <message name="IDS_OPTIONS_DOH_TITLE" desc="The title of the DNS-over-HTTPS option on Android" formatter_data="android_java">
++          Secure DNS
++        </message>
++        <message name="IDS_OPTIONS_DOH_SUMMARY" desc="The title of the DNS-over-HTTPS summary on Android" formatter_data="android_java">
++          Configure DNS-over-HTTPS (DoH) secure DNS
++        </message>
+       </if>
+ 
+       <!-- Autofill dialog: field labels. -->
+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<jstring> 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<jstring>& 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,6 +134,7 @@ void GetStubResolverConfig(
+ 
+   std::string doh_templates =
+       local_state->GetString(prefs::kDnsOverHttpsTemplates);
++  LOG(INFO) << "DoH templates: '" << doh_templates << "' with mode " << doh_mode;
+   std::string server_method;
+   if (!doh_templates.empty() &&
+       *secure_dns_mode != net::DnsConfig::SecureDnsMode::OFF) {
+@@ -404,40 +405,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<std::string> 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<bool> 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
+

+ 1 - 16
build/patches/Allow-playing-audio-in-background.patch

@@ -3,25 +3,10 @@ Date: Thu, 2 Nov 2017 18:21:16 +0200
 Subject: Allow playing audio in background
 Subject: Allow playing audio in background
 
 
 ---
 ---
- chrome/browser/about_flags.cc      |  4 ++++
  media/blink/webmediaplayer_impl.cc | 12 +++++++++++-
  media/blink/webmediaplayer_impl.cc | 12 +++++++++++-
  media/blink/webmediaplayer_impl.h  |  2 ++
  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[] = {
-      FEATURE_VALUE_TYPE(features::kAppNotificationStatusMessaging)},
- #endif  // OS_ANDROID
-     {"enable-devtools-experiments", flag_descriptions::kDevtoolsExperimentsName,
-+    {"resume-background-video",
-+     flag_descriptions::kResumeBackgroundVideoName,
-+     flag_descriptions::kResumeBackgroundVideoDescription, kOsAll,
-+     FEATURE_VALUE_TYPE(media::kResumeBackgroundVideo)},
-      flag_descriptions::kDevtoolsExperimentsDescription, kOsDesktop,
-      SINGLE_VALUE_TYPE(switches::kEnableDevToolsExperiments)},
-     {"silent-debugger-extension-api",
 diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
 diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
 --- a/media/blink/webmediaplayer_impl.cc
 --- a/media/blink/webmediaplayer_impl.cc
 +++ b/media/blink/webmediaplayer_impl.cc
 +++ b/media/blink/webmediaplayer_impl.cc

+ 1 - 1
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
 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
 --- a/chrome/browser/net/system_network_context_manager.cc
 +++ b/chrome/browser/net/system_network_context_manager.cc
 +++ b/chrome/browser/net/system_network_context_manager.cc
-@@ -244,7 +244,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.
  // Android this includes checking the Android version in the field trial.
  bool ShouldEnableAsyncDns() {
  bool ShouldEnableAsyncDns() {
    bool feature_can_be_enabled = true;
    bool feature_can_be_enabled = true;

+ 1 - 1
build/patches/AudioBuffer-AnalyserNode-fingerprinting-mitigations-via-IDL.patch

@@ -43,7 +43,7 @@ diff --git a/third_party/blink/renderer/modules/webaudio/audio_buffer.idl b/thir
 diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.cc b/third_party/blink/renderer/modules/webaudio/audio_context.cc
 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
 --- a/third_party/blink/renderer/modules/webaudio/audio_context.cc
 +++ b/third_party/blink/renderer/modules/webaudio/audio_context.cc
 +++ b/third_party/blink/renderer/modules/webaudio/audio_context.cc
-@@ -343,6 +343,7 @@ void AudioContext::StopRendering() {
+@@ -358,6 +358,7 @@ void AudioContext::StopRendering() {
  double AudioContext::baseLatency() const {
  double AudioContext::baseLatency() const {
    DCHECK(IsMainThread());
    DCHECK(IsMainThread());
    DCHECK(destination());
    DCHECK(destination());

+ 1 - 1
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
 diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
 --- a/chrome/common/chrome_features.cc
 --- a/chrome/common/chrome_features.cc
 +++ b/chrome/common/chrome_features.cc
 +++ b/chrome/common/chrome_features.cc
-@@ -279,7 +279,7 @@ const base::FeatureParam<std::string> kDnsOverHttpsTemplatesParam{
+@@ -288,7 +288,7 @@ const base::FeatureParam<std::string> kDnsOverHttpsTemplatesParam{
  #if defined(OS_ANDROID)
  #if defined(OS_ANDROID)
  // Enable changing default downloads storage location on Android.
  // Enable changing default downloads storage location on Android.
  const base::Feature kDownloadsLocationChange{"DownloadsLocationChange",
  const base::Feature kDownloadsLocationChange{"DownloadsLocationChange",

+ 1 - 1
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
 diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
 --- a/chrome/common/chrome_features.cc
 --- a/chrome/common/chrome_features.cc
 +++ b/chrome/common/chrome_features.cc
 +++ b/chrome/common/chrome_features.cc
-@@ -279,7 +279,7 @@ const base::FeatureParam<std::string> kDnsOverHttpsTemplatesParam{
+@@ -288,7 +288,7 @@ const base::FeatureParam<std::string> kDnsOverHttpsTemplatesParam{
  #if defined(OS_ANDROID)
  #if defined(OS_ANDROID)
  // Enable changing default downloads storage location on Android.
  // Enable changing default downloads storage location on Android.
  const base::Feature kDownloadsLocationChange{"DownloadsLocationChange",
  const base::Feature kDownloadsLocationChange{"DownloadsLocationChange",

+ 2 - 2
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
 diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
 --- a/chrome/common/chrome_features.cc
 --- a/chrome/common/chrome_features.cc
 +++ b/chrome/common/chrome_features.cc
 +++ b/chrome/common/chrome_features.cc
-@@ -608,11 +608,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.
  // browser_features, as they are only used on the browser side.
  const base::Feature kSitePerProcess {
  const base::Feature kSitePerProcess {
    "site-per-process",
    "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
  // Controls a mode for dynamically process-isolating sites where the user has
-@@ -634,7 +630,7 @@ const base::Feature kSiteIsolationForPasswordSites{
+@@ -643,7 +639,7 @@ const base::Feature kSiteIsolationForPasswordSites{
  // base::SysInfo::AmountOfPhysicalMemoryMB().
  // base::SysInfo::AmountOfPhysicalMemoryMB().
  const base::Feature kSitePerProcessOnlyForHighMemoryClients{
  const base::Feature kSitePerProcessOnlyForHighMemoryClients{
      "site-per-process-only-for-high-memory-clients",
      "site-per-process-only-for-high-memory-clients",

+ 1 - 1
build/patches/Inject-scripts-for-AMP-tracking-ads-and-video-functionality.patch

@@ -146,7 +146,7 @@ new file mode 100644
 +#ifndef video_bg_play_h
 +#ifndef video_bg_play_h
 +#define 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
 +#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/third_party/blink/renderer/core/html/html_script_element.cc b/third_party/blink/renderer/core/html/html_script_element.cc

+ 1 - 1
build/patches/Revert-Cleanup-Search-Ready-Omnibox-flag-since-it-has-launched.patch

@@ -45,7 +45,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggest
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -1974,6 +1974,9 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -1966,6 +1966,9 @@ const FeatureEntry kFeatureEntries[] = {
      {"enable-homepage-tile", flag_descriptions::kHomepageTileName,
      {"enable-homepage-tile", flag_descriptions::kHomepageTileName,
       flag_descriptions::kHomepageTileDescription, kOsAndroid,
       flag_descriptions::kHomepageTileDescription, kOsAndroid,
       FEATURE_VALUE_TYPE(chrome::android::kHomepageTile)},
       FEATURE_VALUE_TYPE(chrome::android::kHomepageTile)},

+ 1 - 1
build/patches/User-Agent-anonymize.patch

@@ -18,7 +18,7 @@ diff --git a/components/version_info/version_info.cc b/components/version_info/v
  std::string GetProductNameAndVersionForUserAgent() {
  std::string GetProductNameAndVersionForUserAgent() {
 -  return "Chrome/" + GetVersionNumber();
 -  return "Chrome/" + GetVersionNumber();
 +  // latest stable version
 +  // latest stable version
-+  return "Chrome/78.0.3904.96";
++  return "Chrome/78.0.3904.108";
  }
  }
  
  
  std::string GetProductName() {
  std::string GetProductName() {