Add-user-setting-for-DNS-over-HTTPS-DoH-custom-URL.patch 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  1. From: csagan5 <32685696+csagan5@users.noreply.github.com>
  2. Date: Sat, 23 Nov 2019 10:55:16 +0100
  3. Subject: Add user setting for DNS-over-HTTPS (DoH) custom URL
  4. ---
  5. chrome/android/chrome_java_resources.gni | 2 +
  6. chrome/android/chrome_java_sources.gni | 2 +
  7. chrome/android/java/res/layout/doh_editor.xml | 65 +++++++++++++
  8. chrome/android/java/res/values/values.xml | 2 +
  9. .../android/java/res/xml/doh_preferences.xml | 25 +++++
  10. .../java/res/xml/privacy_preferences.xml | 5 +
  11. .../chrome/browser/settings/DoHEditor.java | 92 +++++++++++++++++++
  12. .../browser/settings/DoHPreferences.java | 54 +++++++++++
  13. chrome/app/generated_resources.grd | 6 ++
  14. .../flags/android/cached_feature_flags.cc | 25 +++++
  15. .../browser/flags/CachedFeatureFlags.java | 24 +++++
  16. .../net/stub_resolver_config_reader.cc | 36 ++------
  17. .../strings/android_chrome_strings.grd | 11 +++
  18. chrome/common/chrome_features.cc | 4 +-
  19. 14 files changed, 322 insertions(+), 31 deletions(-)
  20. create mode 100644 chrome/android/java/res/layout/doh_editor.xml
  21. create mode 100644 chrome/android/java/res/xml/doh_preferences.xml
  22. create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/settings/DoHEditor.java
  23. create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/settings/DoHPreferences.java
  24. diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni
  25. --- a/chrome/android/chrome_java_resources.gni
  26. +++ b/chrome/android/chrome_java_resources.gni
  27. @@ -954,6 +954,7 @@ chrome_java_resources = [
  28. "java/res/layout/device_item_list.xml",
  29. "java/res/layout/distilled_page_font_family_spinner.xml",
  30. "java/res/layout/distilled_page_prefs_view.xml",
  31. + "java/res/layout/doh_editor.xml",
  32. "java/res/layout/edit_url_suggestion_layout.xml",
  33. "java/res/layout/editable_option_editor_footer.xml",
  34. "java/res/layout/editable_option_editor_icons.xml",
  35. @@ -1185,6 +1186,7 @@ chrome_java_resources = [
  36. "java/res/xml/data_reduction_preferences.xml",
  37. "java/res/xml/data_reduction_preferences_off_lite_mode.xml",
  38. "java/res/xml/developer_preferences.xml",
  39. + "java/res/xml/doh_preferences.xml",
  40. "java/res/xml/do_not_track_preferences.xml",
  41. "java/res/xml/google_services_preferences.xml",
  42. "java/res/xml/homepage_preferences.xml",
  43. diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
  44. --- a/chrome/android/chrome_java_sources.gni
  45. +++ b/chrome/android/chrome_java_sources.gni
  46. @@ -1374,6 +1374,8 @@ chrome_java_sources = [
  47. "java/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProvider.java",
  48. "java/src/org/chromium/chrome/browser/send_tab_to_self/DevicePickerBottomSheetAdapter.java",
  49. "java/src/org/chromium/chrome/browser/send_tab_to_self/DevicePickerBottomSheetContent.java",
  50. + "java/src/org/chromium/chrome/browser/settings/DoHEditor.java",
  51. + "java/src/org/chromium/chrome/browser/settings/DoHPreferences.java",
  52. "java/src/org/chromium/chrome/browser/send_tab_to_self/NotificationManager.java",
  53. "java/src/org/chromium/chrome/browser/send_tab_to_self/NotificationSharedPrefManager.java",
  54. "java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfAndroidBridge.java",
  55. diff --git a/chrome/android/java/res/layout/doh_editor.xml b/chrome/android/java/res/layout/doh_editor.xml
  56. new file mode 100644
  57. --- /dev/null
  58. +++ b/chrome/android/java/res/layout/doh_editor.xml
  59. @@ -0,0 +1,65 @@
  60. +<?xml version="1.0" encoding="utf-8"?>
  61. +<!-- Copyright 2015 The Chromium Authors. All rights reserved.
  62. + Use of this source code is governed by a BSD-style license that can be
  63. + found in the LICENSE file. -->
  64. +
  65. +<FrameLayout
  66. + xmlns:android="http://schemas.android.com/apk/res/android"
  67. + xmlns:app="http://schemas.android.com/apk/res-auto"
  68. + xmlns:tools="http://schemas.android.com/tools"
  69. + android:layout_width="match_parent"
  70. + android:layout_height="match_parent" >
  71. +
  72. + <ScrollView
  73. + android:layout_width="match_parent"
  74. + android:layout_height="match_parent"
  75. + android:id="@+id/scroll_view"
  76. + android:fillViewport="true" >
  77. +
  78. + <LinearLayout
  79. + android:layout_width="match_parent"
  80. + android:layout_height="wrap_content"
  81. + android:orientation="vertical"
  82. + android:focusableInTouchMode="true" >
  83. +
  84. + <com.google.android.material.textfield.TextInputLayout
  85. + android:id="@+id/doh_url"
  86. + style="@style/PreferenceScreenLayout"
  87. + android:layout_width="match_parent"
  88. + android:layout_height="wrap_content" >
  89. + <!-- TODO(crbug.com/900912): Fix and remove lint ignore -->
  90. + <EditText
  91. + tools:ignore="Autofill"
  92. + android:id="@+id/doh_url_edit"
  93. + android:layout_width="match_parent"
  94. + android:layout_height="wrap_content"
  95. + android:inputType="textUri"
  96. + android:singleLine="true"
  97. + android:hint="@string/options_doh_edit_label" />
  98. + </com.google.android.material.textfield.TextInputLayout>
  99. +
  100. + <Space style="@style/ButtonBarTopSpacer" />
  101. + <View style="@style/ButtonBarTopDivider" />
  102. +
  103. + <LinearLayout style="@style/ButtonBar" >
  104. + <org.chromium.ui.widget.ButtonCompat
  105. + android:id="@+id/doh_reset"
  106. + style="@style/ButtonBarButton"
  107. + android:text="@string/reset" />
  108. +
  109. + <org.chromium.ui.widget.ButtonCompat
  110. + android:id="@+id/doh_cancel"
  111. + style="@style/ButtonBarButton"
  112. + android:text="@string/cancel" />
  113. +
  114. + <org.chromium.ui.widget.ButtonCompat
  115. + android:id="@+id/doh_save"
  116. + style="@style/ButtonBarButton"
  117. + android:text="@string/save" />
  118. + </LinearLayout>
  119. + </LinearLayout>
  120. + </ScrollView>
  121. +
  122. + <include layout="@layout/settings_action_bar_shadow"/>
  123. +
  124. +</FrameLayout>
  125. diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
  126. --- a/chrome/android/java/res/values/values.xml
  127. +++ b/chrome/android/java/res/values/values.xml
  128. @@ -80,6 +80,8 @@
  129. <integer name="download_infobar_bar_fill_in_delay">400</integer>
  130. <integer name="download_infobar_bar_fill_out_delay">200</integer>
  131. + <string name="doh_help_url">https://www.bromite.org/doh</string>
  132. +
  133. <!-- Bottom navigation bar styling. -->
  134. <bool name="window_light_navigation_bar">true</bool>
  135. diff --git a/chrome/android/java/res/xml/doh_preferences.xml b/chrome/android/java/res/xml/doh_preferences.xml
  136. new file mode 100644
  137. --- /dev/null
  138. +++ b/chrome/android/java/res/xml/doh_preferences.xml
  139. @@ -0,0 +1,25 @@
  140. +<?xml version="1.0" encoding="utf-8"?>
  141. +<!-- Copyright 2015 The Chromium Authors. All rights reserved.
  142. + Use of this source code is governed by a BSD-style license that can be
  143. + found in the LICENSE file. -->
  144. +
  145. +<PreferenceScreen
  146. + xmlns:android="http://schemas.android.com/apk/res/android"
  147. + xmlns:app="http://schemas.android.com/apk/res-auto">
  148. +
  149. + <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
  150. + android:key="doh_switch"
  151. + android:summaryOn="@string/text_on"
  152. + android:summaryOff="@string/text_off" />
  153. +
  154. + <org.chromium.chrome.browser.settings.HyperlinkPreference
  155. + android:key="doh_help"
  156. + android:title="@string/doh_help"
  157. + app:url="@string/doh_help_url" />
  158. +
  159. + <Preference
  160. + android:key="doh_edit"
  161. + android:title="@string/options_doh_edit_label"
  162. + android:fragment="org.chromium.chrome.browser.settings.DoHEditor" />
  163. +
  164. +</PreferenceScreen>
  165. diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
  166. --- a/chrome/android/java/res/xml/privacy_preferences.xml
  167. +++ b/chrome/android/java/res/xml/privacy_preferences.xml
  168. @@ -19,6 +19,11 @@
  169. android:key="can_make_payment"
  170. android:title="@string/can_make_payment_title"
  171. android:summary="@string/settings_can_make_payment_toggle_label" />
  172. + <Preference
  173. + android:fragment="org.chromium.chrome.browser.settings.DoHPreferences"
  174. + android:key="doh"
  175. + android:title="@string/options_doh_title"
  176. + android:summary="@string/options_doh_summary" />
  177. <org.chromium.components.browser_ui.settings.ChromeBaseCheckBoxPreference
  178. android:key="preload_pages"
  179. android:title="@string/preload_pages_title"
  180. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/DoHEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/DoHEditor.java
  181. new file mode 100644
  182. --- /dev/null
  183. +++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/DoHEditor.java
  184. @@ -0,0 +1,92 @@
  185. +// Copyright 2015 The Chromium Authors. All rights reserved.
  186. +// Use of this source code is governed by a BSD-style license that can be
  187. +// found in the LICENSE file.
  188. +
  189. +package org.chromium.chrome.browser.settings;
  190. +
  191. +import android.os.Bundle;
  192. +import androidx.fragment.app.Fragment;
  193. +import android.text.Editable;
  194. +import android.text.TextWatcher;
  195. +import android.view.LayoutInflater;
  196. +import android.view.View;
  197. +import android.view.ViewGroup;
  198. +import android.widget.Button;
  199. +import android.widget.EditText;
  200. +
  201. +import org.chromium.components.browser_ui.settings.SettingsUtils;
  202. +import org.chromium.chrome.browser.flags.CachedFeatureFlags;
  203. +import org.chromium.chrome.R;
  204. +import org.chromium.components.url_formatter.UrlFormatter;
  205. +
  206. +/**
  207. + * Provides the Java-UI for editing the DNS-over-HTTPS (DoH) preference.
  208. + */
  209. +public class DoHEditor extends Fragment implements TextWatcher {
  210. + private EditText mDoHUrlEdit;
  211. + private Button mSaveButton;
  212. + private Button mResetButton;
  213. +
  214. + @Override
  215. + public View onCreateView(LayoutInflater inflater, ViewGroup container,
  216. + Bundle savedInstanceState) {
  217. + super.onCreate(savedInstanceState);
  218. + getActivity().setTitle(R.string.options_doh_edit_title);
  219. +
  220. + View v = inflater.inflate(R.layout.doh_editor, container, false);
  221. + View scrollView = v.findViewById(R.id.scroll_view);
  222. + scrollView.getViewTreeObserver().addOnScrollChangedListener(
  223. + SettingsUtils.getShowShadowOnScrollListener(v, v.findViewById(R.id.shadow)));
  224. + mDoHUrlEdit = (EditText) v.findViewById(R.id.doh_url_edit);
  225. + mDoHUrlEdit.setText(CachedFeatureFlags.getDoHTemplates());
  226. + mDoHUrlEdit.addTextChangedListener(this);
  227. + mDoHUrlEdit.requestFocus();
  228. +
  229. + initializeSaveCancelResetButtons(v);
  230. + return v;
  231. + }
  232. +
  233. + @Override
  234. + public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  235. + }
  236. +
  237. + @Override
  238. + public void onTextChanged(CharSequence s, int start, int before, int count) {
  239. + mSaveButton.setEnabled(s.length() != 0);
  240. + mResetButton.setEnabled(true);
  241. + }
  242. +
  243. + @Override
  244. + public void afterTextChanged(Editable s) {
  245. + }
  246. +
  247. + private void initializeSaveCancelResetButtons(View v) {
  248. + mResetButton = (Button) v.findViewById(R.id.doh_reset);
  249. + mResetButton.setOnClickListener(new View.OnClickListener() {
  250. + @Override
  251. + public void onClick(View v) {
  252. + mDoHUrlEdit.setText(CachedFeatureFlags.getDoHTemplates());
  253. + getActivity().finish();
  254. + }
  255. + });
  256. +
  257. + mSaveButton = (Button) v.findViewById(R.id.doh_save);
  258. + mSaveButton.setEnabled(false);
  259. + mSaveButton.setOnClickListener(new View.OnClickListener() {
  260. + @Override
  261. + public void onClick(View v) {
  262. + CachedFeatureFlags.setDoHTemplates(
  263. + mDoHUrlEdit.getText().toString());
  264. + getActivity().finish();
  265. + }
  266. + });
  267. +
  268. + Button button = (Button) v.findViewById(R.id.doh_cancel);
  269. + button.setOnClickListener(new View.OnClickListener() {
  270. + @Override
  271. + public void onClick(View v) {
  272. + getActivity().finish();
  273. + }
  274. + });
  275. + }
  276. +}
  277. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/DoHPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/DoHPreferences.java
  278. new file mode 100644
  279. --- /dev/null
  280. +++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/DoHPreferences.java
  281. @@ -0,0 +1,54 @@
  282. +// Copyright 2015 The Chromium Authors. All rights reserved.
  283. +// Use of this source code is governed by a BSD-style license that can be
  284. +// found in the LICENSE file.
  285. +
  286. +package org.chromium.chrome.browser.settings;
  287. +
  288. +import android.os.Bundle;
  289. +import androidx.preference.Preference;
  290. +import androidx.preference.PreferenceFragmentCompat;
  291. +import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
  292. +
  293. +import org.chromium.components.browser_ui.settings.SettingsUtils;
  294. +import org.chromium.chrome.browser.flags.CachedFeatureFlags;
  295. +import androidx.annotation.VisibleForTesting;
  296. +import org.chromium.chrome.R;
  297. +
  298. +/**
  299. + * Fragment that allows the user to configure DoH related preferences.
  300. + */
  301. +public class DoHPreferences extends PreferenceFragmentCompat {
  302. + @VisibleForTesting
  303. + public static final String PREF_DOH_SWITCH = "doh_switch";
  304. + private static final String PREF_DOH_EDIT = "doh_edit";
  305. +
  306. + private Preference mDoHEdit;
  307. +
  308. + @Override
  309. + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
  310. + getActivity().setTitle(R.string.options_doh_title);
  311. + SettingsUtils.addPreferencesFromResource(this, R.xml.doh_preferences);
  312. +
  313. + ChromeSwitchPreference mDoHSwitch =
  314. + (ChromeSwitchPreference) findPreference(PREF_DOH_SWITCH);
  315. + boolean isDoHEnabled = CachedFeatureFlags.getDoHEnabled();
  316. + mDoHSwitch.setChecked(isDoHEnabled);
  317. + mDoHSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
  318. + CachedFeatureFlags.setDoHEnabled((boolean) newValue);
  319. + return true;
  320. + });
  321. +
  322. + mDoHEdit = findPreference(PREF_DOH_EDIT);
  323. + updateCurrentDoHUrl();
  324. + }
  325. +
  326. + private void updateCurrentDoHUrl() {
  327. + mDoHEdit.setSummary(CachedFeatureFlags.getDoHTemplates());
  328. + }
  329. +
  330. + @Override
  331. + public void onResume() {
  332. + super.onResume();
  333. + updateCurrentDoHUrl();
  334. + }
  335. +}
  336. diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
  337. --- a/chrome/app/generated_resources.grd
  338. +++ b/chrome/app/generated_resources.grd
  339. @@ -6912,6 +6912,12 @@ the Bookmarks menu.">
  340. </if>
  341. <if expr="is_android">
  342. + <message name="IDS_OPTIONS_DOH_TITLE" desc="The title of the DNS-over-HTTPS option on Android" formatter_data="android_java">
  343. + Secure DNS
  344. + </message>
  345. + <message name="IDS_OPTIONS_DOH_SUMMARY" desc="The title of the DNS-over-HTTPS summary on Android" formatter_data="android_java">
  346. + Configure DNS-over-HTTPS (DoH) secure DNS
  347. + </message>
  348. <message name="IDS_OPTIONS_HOMEPAGE_TITLE" desc="The title of Chrome's homepage setting screen on Android. " formatter_data="android_java">
  349. Homepage
  350. </message>
  351. diff --git a/chrome/browser/flags/android/cached_feature_flags.cc b/chrome/browser/flags/android/cached_feature_flags.cc
  352. --- a/chrome/browser/flags/android/cached_feature_flags.cc
  353. +++ b/chrome/browser/flags/android/cached_feature_flags.cc
  354. @@ -11,6 +11,10 @@
  355. #include "content/public/common/content_features.h"
  356. #include "content/public/common/network_service_util.h"
  357. +#include "chrome/browser/browser_process.h"
  358. +#include "components/prefs/pref_service.h"
  359. +#include "chrome/common/pref_names.h"
  360. +
  361. using base::android::ConvertJavaStringToUTF8;
  362. using base::android::ConvertUTF8ToJavaString;
  363. using base::android::JavaParamRef;
  364. @@ -49,3 +53,24 @@ static jboolean JNI_CachedFeatureFlags_IsNetworkServiceWarmUpEnabled(
  365. return content::IsOutOfProcessNetworkService() &&
  366. base::FeatureList::IsEnabled(features::kWarmUpNetworkProcess);
  367. }
  368. +
  369. +static jboolean JNI_CachedFeatureFlags_GetDoHEnabled(JNIEnv* env) {
  370. + std::string doh_mode = g_browser_process->local_state()->GetString(prefs::kDnsOverHttpsMode);
  371. + return ((doh_mode == "secure") || (doh_mode == "auto"))
  372. + && !g_browser_process->local_state()->GetString(prefs::kDnsOverHttpsTemplates).empty();
  373. +}
  374. +
  375. +static void JNI_CachedFeatureFlags_SetDoHEnabled(JNIEnv* env, jboolean enabled) {
  376. + if (enabled)
  377. + g_browser_process->local_state()->SetString(prefs::kDnsOverHttpsMode, "secure");
  378. + else
  379. + g_browser_process->local_state()->SetString(prefs::kDnsOverHttpsMode, "off");
  380. +}
  381. +
  382. +static ScopedJavaLocalRef<jstring> JNI_CachedFeatureFlags_GetDoHTemplates(JNIEnv* env) {
  383. + return base::android::ConvertUTF8ToJavaString(env, g_browser_process->local_state()->GetString(prefs::kDnsOverHttpsTemplates));
  384. +}
  385. +
  386. +static void JNI_CachedFeatureFlags_SetDoHTemplates(JNIEnv* env, const JavaParamRef<jstring>& templates) {
  387. + g_browser_process->local_state()->SetString(prefs::kDnsOverHttpsTemplates, base::android::ConvertJavaStringToUTF8(env, templates));
  388. +}
  389. diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
  390. --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
  391. +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
  392. @@ -127,6 +127,26 @@ public class CachedFeatureFlags {
  393. private static Map<String, String> sOverridesTestFeatures;
  394. private static String sReachedCodeProfilerTrialGroup;
  395. + /**
  396. + * Records whether custom URL for DoH is enabled with native-side feature utilities.
  397. + * @param url Whether custom URL is enabled or not.
  398. + */
  399. + public static void setDoHEnabled(boolean enabled) {
  400. + CachedFeatureFlagsJni.get().setDoHEnabled(enabled);
  401. + }
  402. +
  403. + public static boolean getDoHEnabled() {
  404. + return CachedFeatureFlagsJni.get().getDoHEnabled();
  405. + }
  406. +
  407. + public static void setDoHTemplates(String t) {
  408. + CachedFeatureFlagsJni.get().setDoHTemplates(t);
  409. + }
  410. +
  411. + public static String getDoHTemplates() {
  412. + return CachedFeatureFlagsJni.get().getDoHTemplates();
  413. + }
  414. +
  415. /**
  416. * Checks if a cached feature flag is enabled.
  417. *
  418. @@ -409,6 +429,10 @@ public class CachedFeatureFlags {
  419. @NativeMethods
  420. interface Natives {
  421. + void setDoHEnabled(boolean enabled);
  422. + boolean getDoHEnabled();
  423. + void setDoHTemplates(String templates);
  424. + String getDoHTemplates();
  425. boolean isNetworkServiceWarmUpEnabled();
  426. void setAdBlockFiltersURL(String url);
  427. String getAdBlockFiltersURL();
  428. diff --git a/chrome/browser/net/stub_resolver_config_reader.cc b/chrome/browser/net/stub_resolver_config_reader.cc
  429. --- a/chrome/browser/net/stub_resolver_config_reader.cc
  430. +++ b/chrome/browser/net/stub_resolver_config_reader.cc
  431. @@ -140,28 +140,6 @@ StubResolverConfigReader::StubResolverConfigReader(PrefService* local_state,
  432. base::Value(SecureDnsConfig::ModeToString(default_secure_dns_mode)));
  433. local_state_->SetDefaultPrefValue(prefs::kDnsOverHttpsTemplates,
  434. base::Value(default_doh_templates));
  435. -
  436. - // If the user has explicitly enabled or disabled the DoH experiment in
  437. - // chrome://flags and the DoH UI setting is not visible, store that choice
  438. - // in the user prefs so that it can be persisted after the experiment ends.
  439. - // Also make sure to remove the stored prefs value if the user has changed
  440. - // their chrome://flags selection to the default.
  441. - if (!features::kDnsOverHttpsShowUiParam.Get()) {
  442. - flags_ui::PrefServiceFlagsStorage flags_storage(local_state_);
  443. - std::set<std::string> entries = flags_storage.GetFlags();
  444. - if (entries.count("dns-over-https@1")) {
  445. - // The user has "Enabled" selected.
  446. - local_state_->SetString(prefs::kDnsOverHttpsMode,
  447. - SecureDnsConfig::kModeAutomatic);
  448. - } else if (entries.count("dns-over-https@2")) {
  449. - // The user has "Disabled" selected.
  450. - local_state_->SetString(prefs::kDnsOverHttpsMode,
  451. - SecureDnsConfig::kModeOff);
  452. - } else {
  453. - // The user has "Default" selected.
  454. - local_state_->ClearPref(prefs::kDnsOverHttpsMode);
  455. - }
  456. - }
  457. }
  458. pref_change_registrar_.Add(prefs::kBuiltInDnsClientEnabled, pref_callback);
  459. @@ -323,21 +301,21 @@ SecureDnsConfig StubResolverConfigReader::GetAndUpdateConfiguration(
  460. parental_controls_checked_ = true;
  461. }
  462. - if (record_metrics) {
  463. - UMA_HISTOGRAM_ENUMERATION("Net.DNS.DnsConfig.SecureDnsMode", mode_details);
  464. - }
  465. -
  466. std::string doh_templates =
  467. local_state_->GetString(prefs::kDnsOverHttpsTemplates);
  468. - std::string server_method;
  469. + if (doh_templates.empty()) {
  470. + secure_dns_mode = net::DnsConfig::SecureDnsMode::OFF;
  471. + }
  472. + LOG(INFO) << "DoH templates: '" << doh_templates << "' with mode " << SecureDnsConfig::ModeToString(secure_dns_mode);
  473. std::vector<net::DnsOverHttpsServerConfig> dns_over_https_servers;
  474. base::Optional<std::vector<network::mojom::DnsOverHttpsServerPtr>>
  475. servers_mojo;
  476. - if (!doh_templates.empty() &&
  477. - secure_dns_mode != net::DnsConfig::SecureDnsMode::OFF) {
  478. + if (secure_dns_mode != net::DnsConfig::SecureDnsMode::OFF) {
  479. + std::string server_method;
  480. for (base::StringPiece server_template :
  481. chrome_browser_net::secure_dns::SplitGroup(doh_templates)) {
  482. if (!net::dns_util::IsValidDohTemplate(server_template, &server_method)) {
  483. + LOG(WARNING) << "DoH templates: skipping invalid: '" << server_template << "'";
  484. continue;
  485. }
  486. diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
  487. --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
  488. +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
  489. @@ -580,6 +580,17 @@ CHAR-LIMIT guidelines:
  490. Chrome Passwords
  491. </message>
  492. + <!-- DoH preferences -->
  493. + <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.">
  494. + Edit DoH template URLs
  495. + </message>
  496. + <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.">
  497. + DoH template URLs
  498. + </message>
  499. + <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.">
  500. + Visit help page
  501. + </message>
  502. +
  503. <!-- Homepage preferences -->
  504. <message name="IDS_OPTIONS_HOMEPAGE_EDIT_HINT" desc="Hint for the text edit on Homepage Preference setting, guiding user to enter their customized homepage setting">
  505. Enter custom web address
  506. diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
  507. --- a/chrome/common/chrome_features.cc
  508. +++ b/chrome/common/chrome_features.cc
  509. @@ -281,12 +281,12 @@ const base::Feature kDefaultWebAppInstallation{
  510. // Enable DNS over HTTPS (DoH).
  511. const base::Feature kDnsOverHttps{"DnsOverHttps",
  512. - base::FEATURE_DISABLED_BY_DEFAULT};
  513. + base::FEATURE_ENABLED_BY_DEFAULT};
  514. // Set whether fallback to insecure DNS is allowed by default. This setting may
  515. // be overridden for individual transactions.
  516. const base::FeatureParam<bool> kDnsOverHttpsFallbackParam{&kDnsOverHttps,
  517. - "Fallback", true};
  518. + "Fallback", false};
  519. // Supply one or more space-separated DoH server URI templates to use when this
  520. // feature is enabled. If no templates are specified, then a hardcoded mapping
  521. --
  522. 2.17.1