From e74bbb61bf7cc3c23f690fc0a93f839c8ce38f35 Mon Sep 17 00:00:00 2001 From: Simon Pelchat Date: Fri, 3 Dec 2021 23:57:55 +0000 Subject: [PATCH] Connect android Preload Pages UI with prefs. The new UI adds a new option to let users opt-in to extended preloading. Also migrate where preloading prefs are controlled from PrivacyPreferencesManager (in privacy/settings) to chrome/browser/prefetch, which is where the UI code is also now located (along with most features using this setting, like the prefetch proxy, no state prefetch, omnibox search prefetching). The migrated pref enum names have been clarified to indicate that wifi-only preloading is deprecated. This has been unsupported for a while now, but it was not clear from most of the call sites. Obsolete comments have also been removed. Bug: 1263586 Change-Id: I3fc6c36ef3af07d550c9bb302ad861d782dcaae9 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3296854 Reviewed-by: Eric Orth Reviewed-by: David Trainor Reviewed-by: Robert Ogden Reviewed-by: Max Curran Commit-Queue: Simon Pelchat Cr-Commit-Position: refs/heads/main@{#948236} --- .../ContextualSearchPolicy.java | 5 +- .../customtabs/CustomTabsConnection.java | 8 +- .../PrivacyPreferencesManagerImpl.java | 35 ------- .../customtabs/CustomTabsConnectionTest.java | 19 ++-- .../browser/infobar/InfoBarContainerTest.java | 14 ++- chrome/browser/BUILD.gn | 2 - .../privacy_preferences_manager_impl.cc | 29 +----- .../api/preference/preference_api.cc | 19 ++-- .../api/preference/preference_apitest.cc | 16 +-- ...eedProcessScopeDependencyProviderTest.java | 14 --- chrome/browser/net/prediction_options.cc | 69 ------------- chrome/browser/net/prediction_options.h | 47 --------- .../background_loader_offliner_unittest.cc | 7 +- .../browser/offline_pages/offliner_helper.cc | 9 +- .../network_prediction_policy_handler.cc | 26 ++--- .../network_prediction_policy_handler.h | 4 +- .../network_prediction_policy_browsertest.cc | 19 ++-- ...n_restrict_parameter_policy_browsertest.cc | 1 - .../autocomplete_action_predictor.cc | 9 +- .../predictors/loading_predictor_config.cc | 4 +- .../loading_predictor_config_unittest.cc | 16 +-- .../predictors/loading_predictor_unittest.cc | 12 +-- .../settings/PreloadPagesSettingsBridge.java | 2 +- .../PreloadPagesSettingsFragmentTest.java | 29 +++--- .../android/preload_pages_settings_bridge.cc | 5 +- ...rome_no_state_prefetch_manager_delegate.cc | 36 +------ ...hrome_no_state_prefetch_manager_delegate.h | 3 - .../no_state_prefetch/prerender_unittest.cc | 12 +-- chrome/browser/prefetch/pref_names.cc | 9 +- chrome/browser/prefetch/pref_names.h | 4 +- .../browser/prefetch/prefetch_browsertest.cc | 13 ++- chrome/browser/prefetch/prefetch_prefs.cc | 50 +++++++++- chrome/browser/prefetch/prefetch_prefs.h | 43 ++++++-- .../prefetch/prefetch_prefs_unittest.cc | 98 +++++++++++++++++++ .../prefetch_proxy_browsertest.cc | 6 +- .../prefetch_proxy_tab_helper.cc | 6 +- .../prefetch_proxy_tab_helper_unittest.cc | 7 +- .../full_body_search_prefetch_request.cc | 1 - .../search_prefetch_service.cc | 4 +- .../search_prefetch_service_browsertest.cc | 7 +- chrome/browser/prefs/browser_prefs.cc | 4 +- .../prefs/pref_functional_browsertest.cc | 18 ++-- .../omnibox_prerender_browsertest.cc | 19 ++-- .../privacy/privacy_metrics_service.cc | 10 +- .../settings/PrivacyPreferencesManager.java | 21 ---- .../settings/privacy_page/cookies_page.ts | 11 ++- chrome/browser/ui/android/omnibox/BUILD.gn | 4 + .../browser/omnibox/LocationBarMediator.java | 6 +- .../omnibox/LocationBarMediatorTest.java | 10 +- chrome/test/BUILD.gn | 1 + chrome/test/android/BUILD.gn | 1 + .../chrome/test/ChromeActivityTestRule.java | 9 +- .../browser/no_state_prefetch_manager.cc | 10 +- 53 files changed, 375 insertions(+), 468 deletions(-) delete mode 100644 chrome/browser/net/prediction_options.cc delete mode 100644 chrome/browser/net/prediction_options.h create mode 100644 chrome/browser/prefetch/prefetch_prefs_unittest.cc diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java index ddb9ab33437e0..34484fc6c8fd3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java @@ -26,7 +26,8 @@ import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.Pref; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; -import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesSettingsBridge; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesState; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.signin.services.UnifiedConsentServiceBridge; @@ -137,7 +138,7 @@ boolean isTapSupported() { */ boolean shouldPrefetchSearchResult() { if (isMandatoryPromoAvailable() - || !PrivacyPreferencesManagerImpl.getInstance().getNetworkPredictionEnabled()) { + || PreloadPagesSettingsBridge.getState() == PreloadPagesState.NO_PRELOADING) { return false; } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java index 45b4f1b269123..0ff6a7c1415e6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java @@ -63,7 +63,8 @@ import org.chromium.chrome.browser.metrics.PageLoadMetrics; import org.chromium.chrome.browser.metrics.UmaSessionStats; import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings; -import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesSettingsBridge; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesState; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; import org.chromium.components.content_settings.CookieControlsMode; @@ -1451,10 +1452,7 @@ int maySpeculateWithResult(CustomTabsSessionToken session) { == CookieControlsMode.BLOCK_THIRD_PARTY) { return SPECULATION_STATUS_ON_START_NOT_ALLOWED_BLOCK_3RD_PARTY_COOKIES; } - // TODO(yusufo): The check for prerender in PrivacyPreferencesManagerImpl now checks for the - // network connection type as well, we should either change that or add another check for - // custom tabs. Then that method should be used to make the below check. - if (!PrivacyPreferencesManagerImpl.getInstance().getNetworkPredictionEnabled()) { + if (PreloadPagesSettingsBridge.getState() == PreloadPagesState.NO_PRELOADING) { return SPECULATION_STATUS_ON_START_NOT_ALLOWED_NETWORK_PREDICTION_DISABLED; } if (DataReductionProxySettings.getInstance().isDataReductionProxyEnabled() diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl.java index 607912e495762..6fd4d81800534 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl.java @@ -14,7 +14,6 @@ import org.chromium.base.CommandLine; import org.chromium.base.ContextUtils; import org.chromium.base.annotations.NativeMethods; -import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; @@ -63,12 +62,6 @@ protected boolean isMobileNetworkCapable() { return networkInfo != null; } - @Override - public boolean shouldPrerender() { - if (!DeviceClassManager.enablePrerendering()) return false; - return canPrefetchAndPrerender(); - } - @Override public void setUsageAndCrashReporting(boolean enabled) { mPrefs.writeBoolean(ChromePreferenceKeys.PRIVACY_METRICS_REPORTING, enabled); @@ -119,15 +112,6 @@ public boolean isMetricsUploadPermitted() { && (isUsageAndCrashReportingPermittedByUser() || isUploadEnabledForTests()); } - /** - * Checks whether network predictions are allowed given preferences and current network - * connection type. - * @return Whether network predictions are allowed. - */ - private boolean canPrefetchAndPrerender() { - return PrivacyPreferencesManagerImplJni.get().canPrefetchAndPrerender(); - } - @Override public boolean isMetricsReportingEnabled() { return PrivacyPreferencesManagerImplJni.get().isMetricsReportingEnabled(); @@ -143,27 +127,8 @@ public boolean isMetricsReportingManaged() { return PrivacyPreferencesManagerImplJni.get().isMetricsReportingManaged(); } - @Override - public boolean getNetworkPredictionEnabled() { - return PrivacyPreferencesManagerImplJni.get().getNetworkPredictionEnabled(); - } - - @Override - public void setNetworkPredictionEnabled(boolean enabled) { - PrivacyPreferencesManagerImplJni.get().setNetworkPredictionEnabled(enabled); - } - - @Override - public boolean isNetworkPredictionManaged() { - return PrivacyPreferencesManagerImplJni.get().getNetworkPredictionManaged(); - } - @NativeMethods public interface Natives { - boolean canPrefetchAndPrerender(); - boolean getNetworkPredictionManaged(); - boolean getNetworkPredictionEnabled(); - void setNetworkPredictionEnabled(boolean enabled); boolean isMetricsReportingEnabled(); void setMetricsReportingEnabled(boolean enabled); boolean isMetricsReportingManaged(); diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java index 48c7f075a6e2a..ff1ce19d0bcf3 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java @@ -37,7 +37,8 @@ import org.chromium.base.test.util.Restriction; import org.chromium.chrome.browser.WarmupManager; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesSettingsBridge; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesState; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -600,11 +601,12 @@ public void testCellularPrerenderingDoesntOverrideSettings() throws Exception { CustomTabsTestUtils.warmUpAndWait(); // Needs the browser process to be initialized. - boolean enabled = TestThreadUtils.runOnUiThreadBlocking(() -> { - boolean oldEnabled = - PrivacyPreferencesManagerImpl.getInstance().getNetworkPredictionEnabled(); - PrivacyPreferencesManagerImpl.getInstance().setNetworkPredictionEnabled(false); - return oldEnabled; + @PreloadPagesState + int state = TestThreadUtils.runOnUiThreadBlocking(() -> { + @PreloadPagesState + int oldState = PreloadPagesSettingsBridge.getState(); + PreloadPagesSettingsBridge.setState(PreloadPagesState.NO_PRELOADING); + return oldState; }); try { @@ -612,10 +614,7 @@ public void testCellularPrerenderingDoesntOverrideSettings() throws Exception { mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, null)); TestThreadUtils.runOnUiThreadBlocking(this::assertSpareWebContentsNotNullAndDestroy); } finally { - TestThreadUtils.runOnUiThreadBlocking( - () - -> PrivacyPreferencesManagerImpl.getInstance() - .setNetworkPredictionEnabled(enabled)); + TestThreadUtils.runOnUiThreadBlocking(() -> PreloadPagesSettingsBridge.setState(state)); } } diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java index 16ead5a5b16c4..a5baa34cda833 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java @@ -32,7 +32,8 @@ import org.chromium.base.test.util.RequiresRestart; import org.chromium.chrome.R; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesSettingsBridge; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesState; import org.chromium.chrome.browser.ui.messages.infobar.SimpleConfirmInfoBarBuilder; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; @@ -200,8 +201,11 @@ private Runnable setNetworkPredictionOptions(final boolean networkPredictionEnab return new Runnable() { @Override public void run() { - PrivacyPreferencesManagerImpl.getInstance().setNetworkPredictionEnabled( - networkPredictionEnabled); + if (networkPredictionEnabled) { + PreloadPagesSettingsBridge.setState(PreloadPagesState.STANDARD_PRELOADING); + } else { + PreloadPagesSettingsBridge.setState(PreloadPagesState.NO_PRELOADING); + } } }; } @@ -220,8 +224,8 @@ public void testInfoBarExpirationNoPrerender() throws Exception { TestThreadUtils.runOnUiThreadBlocking(new Callable() { @Override public Boolean call() { - return PrivacyPreferencesManagerImpl.getInstance() - .getNetworkPredictionEnabled(); + return PreloadPagesSettingsBridge.getState() + != PreloadPagesState.NO_PRELOADING; } }); try { diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 73ad79e1f8f78..e44f4d7d9a20c 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn @@ -865,8 +865,6 @@ static_library("browser") { "net/net_error_tab_helper.h", "net/net_export_helper.cc", "net/net_export_helper.h", - "net/prediction_options.cc", - "net/prediction_options.h", "net/probe_message.cc", "net/probe_message.h", "net/profile_network_context_service.cc", diff --git a/chrome/browser/android/preferences/privacy_preferences_manager_impl.cc b/chrome/browser/android/preferences/privacy_preferences_manager_impl.cc index 3744f0da4caa6..eb3de20c34166 100644 --- a/chrome/browser/android/preferences/privacy_preferences_manager_impl.cc +++ b/chrome/browser/android/preferences/privacy_preferences_manager_impl.cc @@ -6,7 +6,7 @@ #include "chrome/android/chrome_jni_headers/PrivacyPreferencesManagerImpl_jni.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/net/prediction_options.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/common/pref_names.h" #include "components/metrics/metrics_pref_names.h" @@ -22,18 +22,6 @@ PrefService* GetPrefService() { } // namespace -static jboolean JNI_PrivacyPreferencesManagerImpl_GetNetworkPredictionEnabled( - JNIEnv* env) { - return GetPrefService()->GetInteger(prefs::kNetworkPredictionOptions) != - chrome_browser_net::NETWORK_PREDICTION_NEVER; -} - -static jboolean JNI_PrivacyPreferencesManagerImpl_GetNetworkPredictionManaged( - JNIEnv* env) { - return GetPrefService()->IsManagedPreference( - prefs::kNetworkPredictionOptions); -} - static jboolean JNI_PrivacyPreferencesManagerImpl_IsMetricsReportingEnabled( JNIEnv* env) { PrefService* local_state = g_browser_process->local_state(); @@ -52,18 +40,3 @@ static jboolean JNI_PrivacyPreferencesManagerImpl_IsMetricsReportingManaged( return GetPrefService()->IsManagedPreference( metrics::prefs::kMetricsReportingEnabled); } - -static jboolean JNI_PrivacyPreferencesManagerImpl_CanPrefetchAndPrerender( - JNIEnv* env) { - return chrome_browser_net::CanPrefetchAndPrerenderUI(GetPrefService()) == - chrome_browser_net::NetworkPredictionStatus::ENABLED; -} - -static void JNI_PrivacyPreferencesManagerImpl_SetNetworkPredictionEnabled( - JNIEnv* env, - jboolean enabled) { - GetPrefService()->SetInteger( - prefs::kNetworkPredictionOptions, - enabled ? chrome_browser_net::NETWORK_PREDICTION_WIFI_ONLY - : chrome_browser_net::NETWORK_PREDICTION_NEVER); -} diff --git a/chrome/browser/extensions/api/preference/preference_api.cc b/chrome/browser/extensions/api/preference/preference_api.cc index a3b156b90ca29..aa29c4434d533 100644 --- a/chrome/browser/extensions/api/preference/preference_api.cc +++ b/chrome/browser/extensions/api/preference/preference_api.cc @@ -24,7 +24,8 @@ #include "chrome/browser/extensions/api/proxy/proxy_api.h" #include "chrome/browser/extensions/api/system_indicator/system_indicator_api.h" #include "chrome/browser/extensions/extension_service.h" -#include "chrome/browser/net/prediction_options.h" +#include "chrome/browser/prefetch/pref_names.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/common/pref_names.h" #include "components/autofill/core/common/autofill_prefs.h" #include "components/content_settings/core/browser/cookie_settings.h" @@ -96,7 +97,7 @@ const PrefMappingEntry kPrefMapping[] = { APIPermissionID::kPrivacy, APIPermissionID::kPrivacy}, {"hyperlinkAuditingEnabled", prefs::kEnableHyperlinkAuditing, APIPermissionID::kPrivacy, APIPermissionID::kPrivacy}, - {"networkPredictionEnabled", prefs::kNetworkPredictionOptions, + {"networkPredictionEnabled", prefetch::prefs::kNetworkPredictionOptions, APIPermissionID::kPrivacy, APIPermissionID::kPrivacy}, {"passwordSavingEnabled", password_manager::prefs::kCredentialsEnableService, @@ -240,21 +241,23 @@ class NetworkPredictionTransformer : public PrefTransformerInterface { DCHECK(false) << "Preference not found."; } else if (extension_pref->GetBool()) { return std::make_unique( - chrome_browser_net::NETWORK_PREDICTION_DEFAULT); + static_cast(prefetch::NetworkPredictionOptions::kDefault)); } return std::make_unique( - chrome_browser_net::NETWORK_PREDICTION_NEVER); + static_cast(prefetch::NetworkPredictionOptions::kDisabled)); } std::unique_ptr BrowserToExtensionPref( const base::Value* browser_pref, bool is_incognito_profile) override { - int int_value = chrome_browser_net::NETWORK_PREDICTION_DEFAULT; + prefetch::NetworkPredictionOptions value = + prefetch::NetworkPredictionOptions::kDefault; if (browser_pref->is_int()) { - int_value = browser_pref->GetInt(); + value = static_cast( + browser_pref->GetInt()); } return std::make_unique( - int_value != chrome_browser_net::NETWORK_PREDICTION_NEVER); + value != prefetch::NetworkPredictionOptions::kDisabled); } }; @@ -342,7 +345,7 @@ class PrefMapping { std::make_unique()); RegisterPrefTransformer(prefs::kCookieControlsMode, std::make_unique()); - RegisterPrefTransformer(prefs::kNetworkPredictionOptions, + RegisterPrefTransformer(prefetch::prefs::kNetworkPredictionOptions, std::make_unique()); RegisterPrefTransformer( prefs::kProtectedContentDefault, diff --git a/chrome/browser/extensions/api/preference/preference_apitest.cc b/chrome/browser/extensions/api/preference/preference_apitest.cc index b16d15e773db9..198d79fdc7c31 100644 --- a/chrome/browser/extensions/api/preference/preference_apitest.cc +++ b/chrome/browser/extensions/api/preference/preference_apitest.cc @@ -15,7 +15,8 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/extensions/extension_apitest.h" -#include "chrome/browser/net/prediction_options.h" +#include "chrome/browser/prefetch/pref_names.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/chrome_switches.h" @@ -70,8 +71,8 @@ class ExtensionPreferenceApiTest : public extensions::ExtensionApiTest { EXPECT_TRUE(prefs->GetBoolean(prefs::kEnableHyperlinkAuditing)); EXPECT_TRUE(prefs->GetBoolean(prefs::kEnableReferrers)); EXPECT_TRUE(prefs->GetBoolean(translate::prefs::kOfferTranslateEnabled)); - EXPECT_EQ(chrome_browser_net::NETWORK_PREDICTION_DEFAULT, - prefs->GetInteger(prefs::kNetworkPredictionOptions)); + EXPECT_EQ(static_cast(prefetch::NetworkPredictionOptions::kDefault), + prefs->GetInteger(prefetch::prefs::kNetworkPredictionOptions)); EXPECT_TRUE( prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService)); EXPECT_TRUE(prefs->GetBoolean(prefs::kSafeBrowsingEnabled)); @@ -96,8 +97,8 @@ class ExtensionPreferenceApiTest : public extensions::ExtensionApiTest { EXPECT_FALSE(prefs->GetBoolean(prefs::kEnableHyperlinkAuditing)); EXPECT_FALSE(prefs->GetBoolean(prefs::kEnableReferrers)); EXPECT_FALSE(prefs->GetBoolean(translate::prefs::kOfferTranslateEnabled)); - EXPECT_EQ(chrome_browser_net::NETWORK_PREDICTION_NEVER, - prefs->GetInteger(prefs::kNetworkPredictionOptions)); + EXPECT_EQ(static_cast(prefetch::NetworkPredictionOptions::kDisabled), + prefs->GetInteger(prefetch::prefs::kNetworkPredictionOptions)); EXPECT_FALSE( prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService)); EXPECT_FALSE(prefs->GetBoolean(prefs::kSafeBrowsingEnabled)); @@ -161,8 +162,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionPreferenceApiTest, Standard) { prefs->SetBoolean(prefs::kEnableHyperlinkAuditing, false); prefs->SetBoolean(prefs::kEnableReferrers, false); prefs->SetBoolean(translate::prefs::kOfferTranslateEnabled, false); - prefs->SetInteger(prefs::kNetworkPredictionOptions, - chrome_browser_net::NETWORK_PREDICTION_NEVER); + prefs->SetInteger( + prefetch::prefs::kNetworkPredictionOptions, + static_cast(prefetch::NetworkPredictionOptions::kDisabled)); prefs->SetBoolean(password_manager::prefs::kCredentialsEnableService, false); prefs->SetBoolean(prefs::kSafeBrowsingEnabled, false); prefs->SetBoolean(prefs::kSearchSuggestEnabled, false); diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeDependencyProviderTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeDependencyProviderTest.java index 3f5821ad6582d..3ec6f317f3093 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeDependencyProviderTest.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeDependencyProviderTest.java @@ -37,10 +37,6 @@ public boolean isMetricsReportingEnabled() { // Boilerplate. @Override - public boolean shouldPrerender() { - return false; - } - @Override public void setUsageAndCrashReporting(boolean enabled) {} @Override public void syncUsageAndCrashReportingPrefs() {} @@ -72,16 +68,6 @@ public void setMetricsReportingEnabled(boolean enabled) {} public boolean isMetricsReportingManaged() { return false; } - @Override - public boolean getNetworkPredictionEnabled() { - return false; - } - @Override - public void setNetworkPredictionEnabled(boolean enabled) {} - @Override - public boolean isNetworkPredictionManaged() { - return false; - } }; @Before diff --git a/chrome/browser/net/prediction_options.cc b/chrome/browser/net/prediction_options.cc deleted file mode 100644 index 7e1f710f7282e..0000000000000 --- a/chrome/browser/net/prediction_options.cc +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2014 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. - -#include "chrome/browser/net/prediction_options.h" - -#include "base/check_op.h" -#include "chrome/common/chrome_features.h" -#include "chrome/common/pref_names.h" -#include "components/pref_registry/pref_registry_syncable.h" -#include "components/prefs/pref_service.h" -#include "content/public/browser/browser_thread.h" -#include "net/base/network_change_notifier.h" - -namespace chrome_browser_net { - -namespace { - -// Since looking up preferences and current network connection are presumably -// both cheap, we do not cache them here. -NetworkPredictionStatus CanPrefetchAndPrerender( - int network_prediction_options) { - switch (network_prediction_options) { - case NETWORK_PREDICTION_ALWAYS: - case NETWORK_PREDICTION_WIFI_ONLY: - if (base::FeatureList::IsEnabled( - features::kPredictivePrefetchingAllowedOnAllConnectionTypes) || - (net::NetworkChangeNotifier::GetConnectionCost() != - net::NetworkChangeNotifier::CONNECTION_COST_METERED)) { - return NetworkPredictionStatus::ENABLED; - } - return NetworkPredictionStatus::DISABLED_DUE_TO_NETWORK; - default: - DCHECK_EQ(NETWORK_PREDICTION_NEVER, network_prediction_options); - return NetworkPredictionStatus::DISABLED_ALWAYS; - } -} - -bool CanPreresolveAndPreconnect(int network_prediction_options) { - // DNS preresolution and TCP preconnect are performed even on cellular - // networks if the user setting is WIFI_ONLY. - return network_prediction_options != NETWORK_PREDICTION_NEVER; -} - -} // namespace - -void RegisterPredictionOptionsProfilePrefs( - user_prefs::PrefRegistrySyncable* registry) { - registry->RegisterIntegerPref( - prefs::kNetworkPredictionOptions, - NETWORK_PREDICTION_DEFAULT, - user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); -} - -NetworkPredictionStatus CanPrefetchAndPrerenderUI(PrefService* prefs) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - DCHECK(prefs); - return CanPrefetchAndPrerender( - prefs->GetInteger(prefs::kNetworkPredictionOptions)); -} - -bool CanPreresolveAndPreconnectUI(PrefService* prefs) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - DCHECK(prefs); - return CanPreresolveAndPreconnect( - prefs->GetInteger(prefs::kNetworkPredictionOptions)); -} - -} // namespace chrome_browser_net diff --git a/chrome/browser/net/prediction_options.h b/chrome/browser/net/prediction_options.h deleted file mode 100644 index 2ae6a1093090d..0000000000000 --- a/chrome/browser/net/prediction_options.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2014 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. - -#ifndef CHROME_BROWSER_NET_PREDICTION_OPTIONS_H_ -#define CHROME_BROWSER_NET_PREDICTION_OPTIONS_H_ - -namespace user_prefs { -class PrefRegistrySyncable; -} - -class PrefService; - -namespace chrome_browser_net { - -// Enum describing when to allow network predictions based on connection type. -// The numerical value is stored in the prefs file, therefore the same enum -// with the same order must be used by the platform-dependent components. -enum NetworkPredictionOptions { - // TODO(newt): collapse ALWAYS and WIFI_ONLY into a single value. See - // crbug.com/585297 - NETWORK_PREDICTION_ALWAYS, - NETWORK_PREDICTION_WIFI_ONLY, - NETWORK_PREDICTION_NEVER, - NETWORK_PREDICTION_DEFAULT = NETWORK_PREDICTION_WIFI_ONLY, -}; - -enum class NetworkPredictionStatus { - ENABLED, - DISABLED_ALWAYS, - DISABLED_DUE_TO_NETWORK, -}; - -void RegisterPredictionOptionsProfilePrefs( - user_prefs::PrefRegistrySyncable* registry); - -// Determines whether prefetching and prerendering are enabled, based on -// preferences and network type. -NetworkPredictionStatus CanPrefetchAndPrerenderUI(PrefService* prefs); - -// Determines whether TCP preconnect and DNS preresolution are enabled, based on -// preferences. -bool CanPreresolveAndPreconnectUI(PrefService* prefs); - -} // namespace chrome_browser_net - -#endif // CHROME_BROWSER_NET_PREDICTION_OPTIONS_H_ diff --git a/chrome/browser/offline_pages/background_loader_offliner_unittest.cc b/chrome/browser/offline_pages/background_loader_offliner_unittest.cc index f03b44b4256ca..eda2a16077aa6 100644 --- a/chrome/browser/offline_pages/background_loader_offliner_unittest.cc +++ b/chrome/browser/offline_pages/background_loader_offliner_unittest.cc @@ -16,8 +16,8 @@ #include "base/test/scoped_feature_list.h" #include "base/test/scoped_mock_time_message_loop_task_runner.h" #include "base/threading/thread_task_runner_handle.h" -#include "chrome/browser/net/prediction_options.h" #include "chrome/browser/offline_pages/offliner_helper.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/testing_profile.h" #include "components/content_settings/core/browser/cookie_settings.h" @@ -384,9 +384,8 @@ TEST_F(BackgroundLoaderOfflinerTest, SavePageRequest request(kRequestId, GURL(kHttpUrl), custom_tabs_client_id, creation_time, kUserRequested); - profile()->GetPrefs()->SetInteger( - prefs::kNetworkPredictionOptions, - chrome_browser_net::NETWORK_PREDICTION_NEVER); + prefetch::SetPreloadPagesState(profile()->GetPrefs(), + prefetch::PreloadPagesState::kNoPreloading); EXPECT_FALSE(offliner()->LoadAndSave(request, completion_callback(), progress_callback())); } diff --git a/chrome/browser/offline_pages/offliner_helper.cc b/chrome/browser/offline_pages/offliner_helper.cc index e48298a113cd2..61f0b1033bba3 100644 --- a/chrome/browser/offline_pages/offliner_helper.cc +++ b/chrome/browser/offline_pages/offliner_helper.cc @@ -5,7 +5,7 @@ #include "chrome/browser/offline_pages/offliner_helper.h" #include "chrome/browser/content_settings/cookie_settings_factory.h" -#include "chrome/browser/net/prediction_options.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/pref_names.h" #include "components/content_settings/core/browser/cookie_settings.h" @@ -21,10 +21,9 @@ bool AreThirdPartyCookiesBlocked(content::BrowserContext* browser_context) { } bool IsNetworkPredictionDisabled(content::BrowserContext* browser_context) { - return Profile::FromBrowserContext(browser_context) - ->GetPrefs() - ->GetInteger(prefs::kNetworkPredictionOptions) == - chrome_browser_net::NETWORK_PREDICTION_NEVER; + DCHECK(Profile::FromBrowserContext(browser_context)->GetPrefs()); + return !prefetch::IsSomePreloadingEnabled( + *Profile::FromBrowserContext(browser_context)->GetPrefs()); } } // namespace offline_pages diff --git a/chrome/browser/policy/network_prediction_policy_handler.cc b/chrome/browser/policy/network_prediction_policy_handler.cc index e79e8c8116573..d1304276b2281 100644 --- a/chrome/browser/policy/network_prediction_policy_handler.cc +++ b/chrome/browser/policy/network_prediction_policy_handler.cc @@ -5,7 +5,8 @@ #include "chrome/browser/policy/network_prediction_policy_handler.h" #include "base/values.h" -#include "chrome/browser/net/prediction_options.h" +#include "chrome/browser/prefetch/pref_names.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/common/pref_names.h" #include "components/policy/core/browser/policy_error_map.h" #include "components/policy/core/common/policy_map.h" @@ -15,12 +16,6 @@ namespace policy { -NetworkPredictionPolicyHandler::NetworkPredictionPolicyHandler() { -} - -NetworkPredictionPolicyHandler::~NetworkPredictionPolicyHandler() { -} - bool NetworkPredictionPolicyHandler::CheckPolicySettings( const PolicyMap& policies, PolicyErrorMap* errors) { @@ -56,7 +51,7 @@ void NetworkPredictionPolicyHandler::ApplyPolicySettings( const base::Value* network_prediction_options = policies.GetValue(key::kNetworkPredictionOptions); if (network_prediction_options && network_prediction_options->is_int()) { - prefs->SetInteger(prefs::kNetworkPredictionOptions, + prefs->SetInteger(prefetch::prefs::kNetworkPredictionOptions, network_prediction_options->GetInt()); return; } @@ -65,15 +60,12 @@ void NetworkPredictionPolicyHandler::ApplyPolicySettings( const base::Value* network_prediction_enabled = policies.GetValue(key::kDnsPrefetchingEnabled); if (network_prediction_enabled && network_prediction_enabled->is_bool()) { - // Some predictive network actions, most notably prefetch, used to be - // hardwired never to run on cellular network. In order to retain this - // behavior (unless explicitly overriden by kNetworkPredictionOptions), - // kNetworkPredictionEnabled = true is translated to - // kNetworkPredictionOptions = WIFI_ONLY. - prefs->SetInteger(prefs::kNetworkPredictionOptions, - network_prediction_enabled->GetBool() - ? chrome_browser_net::NETWORK_PREDICTION_WIFI_ONLY - : chrome_browser_net::NETWORK_PREDICTION_NEVER); + prefetch::NetworkPredictionOptions setting = + network_prediction_enabled->GetBool() + ? prefetch::NetworkPredictionOptions::kWifiOnlyDeprecated + : prefetch::NetworkPredictionOptions::kDisabled; + prefs->SetInteger(prefetch::prefs::kNetworkPredictionOptions, + static_cast(setting)); } } diff --git a/chrome/browser/policy/network_prediction_policy_handler.h b/chrome/browser/policy/network_prediction_policy_handler.h index 53671e2e48c19..e81fe587649af 100644 --- a/chrome/browser/policy/network_prediction_policy_handler.h +++ b/chrome/browser/policy/network_prediction_policy_handler.h @@ -17,12 +17,12 @@ class PolicyMap; // Handles NetworkPrediction policies. class NetworkPredictionPolicyHandler : public ConfigurationPolicyHandler { public: - NetworkPredictionPolicyHandler(); + NetworkPredictionPolicyHandler() = default; NetworkPredictionPolicyHandler(const NetworkPredictionPolicyHandler&) = delete; NetworkPredictionPolicyHandler& operator=( const NetworkPredictionPolicyHandler&) = delete; - ~NetworkPredictionPolicyHandler() override; + ~NetworkPredictionPolicyHandler() override = default; // ConfigurationPolicyHandler methods: bool CheckPolicySettings(const PolicyMap& policies, diff --git a/chrome/browser/policy/test/network_prediction_policy_browsertest.cc b/chrome/browser/policy/test/network_prediction_policy_browsertest.cc index 7b62a4b3fb5c5..edb7644a72fbc 100644 --- a/chrome/browser/policy/test/network_prediction_policy_browsertest.cc +++ b/chrome/browser/policy/test/network_prediction_policy_browsertest.cc @@ -3,8 +3,8 @@ // found in the LICENSE file. #include "base/values.h" -#include "chrome/browser/net/prediction_options.h" #include "chrome/browser/policy/policy_test_utils.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/test/base/in_process_browser_test.h" @@ -14,20 +14,12 @@ #include "content/public/test/browser_test.h" namespace policy { -namespace { - -bool IsNetworkPredictionEnabled(PrefService* prefs) { - return chrome_browser_net::CanPrefetchAndPrerenderUI(prefs) == - chrome_browser_net::NetworkPredictionStatus::ENABLED; -} - -} // namespace IN_PROC_BROWSER_TEST_F(PolicyTest, NetworkPrediction) { PrefService* prefs = browser()->profile()->GetPrefs(); // Enabled by default. - EXPECT_TRUE(IsNetworkPredictionEnabled(prefs)); + EXPECT_TRUE(prefetch::IsSomePreloadingEnabled(*prefs)); // Disable by old, deprecated policy. PolicyMap policies; @@ -36,16 +28,17 @@ IN_PROC_BROWSER_TEST_F(PolicyTest, NetworkPrediction) { nullptr); UpdateProviderPolicy(policies); - EXPECT_FALSE(IsNetworkPredictionEnabled(prefs)); + EXPECT_FALSE(prefetch::IsSomePreloadingEnabled(*prefs)); // Enabled by new policy, this should override old one. policies.Set(key::kNetworkPredictionOptions, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - base::Value(chrome_browser_net::NETWORK_PREDICTION_ALWAYS), + base::Value(static_cast( + prefetch::NetworkPredictionOptions::kStandard)), nullptr); UpdateProviderPolicy(policies); - EXPECT_TRUE(IsNetworkPredictionEnabled(prefs)); + EXPECT_TRUE(prefetch::IsSomePreloadingEnabled(*prefs)); } } // namespace policy diff --git a/chrome/browser/policy/test/variation_restrict_parameter_policy_browsertest.cc b/chrome/browser/policy/test/variation_restrict_parameter_policy_browsertest.cc index e4e58eef79481..e939c3cc873da 100644 --- a/chrome/browser/policy/test/variation_restrict_parameter_policy_browsertest.cc +++ b/chrome/browser/policy/test/variation_restrict_parameter_policy_browsertest.cc @@ -7,7 +7,6 @@ #include "base/strings/string_util.h" #include "base/values.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/net/prediction_options.h" #include "chrome/browser/policy/policy_test_utils.h" #include "chrome/test/base/in_process_browser_test.h" #include "components/policy/core/common/mock_configuration_policy_provider.h" diff --git a/chrome/browser/predictors/autocomplete_action_predictor.cc b/chrome/browser/predictors/autocomplete_action_predictor.cc index 420c211218009..71d6e4eca8853 100644 --- a/chrome/browser/predictors/autocomplete_action_predictor.cc +++ b/chrome/browser/predictors/autocomplete_action_predictor.cc @@ -16,11 +16,11 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/history/history_service_factory.h" -#include "chrome/browser/net/prediction_options.h" #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h" #include "chrome/browser/predictors/predictor_database.h" #include "chrome/browser/predictors/predictor_database_factory.h" #include "chrome/browser/prefetch/no_state_prefetch/no_state_prefetch_manager_factory.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_features.h" #include "components/history/core/browser/in_memory_database.h" @@ -194,15 +194,12 @@ void AutocompleteActionPredictor::StartPrerendering( DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (blink::features::IsPrerender2Enabled() && base::FeatureList::IsEnabled(features::kOmniboxTriggerForPrerender2)) { - // Check whether NetworkPredictionStatus is enabled. If users disable this + // Check whether preloading is enabled. If users disable this // setting, it means users do not want to preload pages. // TODO(https://crbug.com/1269204): Move this check into // WebContentsDelegate::IsPrerender2Supported after exposing TriggerType to // embedders. - chrome_browser_net::NetworkPredictionStatus prediction_status = - chrome_browser_net::CanPrefetchAndPrerenderUI(profile_->GetPrefs()); - if (prediction_status != - chrome_browser_net::NetworkPredictionStatus::ENABLED) { + if (!prefetch::IsSomePreloadingEnabled(*profile_->GetPrefs())) { return; } diff --git a/chrome/browser/predictors/loading_predictor_config.cc b/chrome/browser/predictors/loading_predictor_config.cc index 5d5855bf342e9..ddfeb049e923e 100644 --- a/chrome/browser/predictors/loading_predictor_config.cc +++ b/chrome/browser/predictors/loading_predictor_config.cc @@ -5,8 +5,8 @@ #include "chrome/browser/predictors/loading_predictor_config.h" #include "base/metrics/field_trial_params.h" -#include "chrome/browser/net/prediction_options.h" #include "chrome/browser/predictors/predictors_features.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/profiles/profile.h" namespace predictors { @@ -36,7 +36,7 @@ bool IsPreconnectAllowed(Profile* profile) { // Checks that the preconnect is allowed by user settings. return profile && profile->GetPrefs() && - chrome_browser_net::CanPreresolveAndPreconnectUI(profile->GetPrefs()); + prefetch::IsSomePreloadingEnabled(*profile->GetPrefs()); } std::string GetStringNameForHintOrigin(HintOrigin hint_origin) { diff --git a/chrome/browser/predictors/loading_predictor_config_unittest.cc b/chrome/browser/predictors/loading_predictor_config_unittest.cc index 80af24af4eeef..54d37db21f613 100644 --- a/chrome/browser/predictors/loading_predictor_config_unittest.cc +++ b/chrome/browser/predictors/loading_predictor_config_unittest.cc @@ -5,7 +5,7 @@ #include "chrome/browser/predictors/loading_predictor_config.h" #include "base/test/scoped_feature_list.h" -#include "chrome/browser/net/prediction_options.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/testing_profile.h" #include "components/prefs/pref_service.h" @@ -16,8 +16,8 @@ namespace predictors { class LoadingPredictorConfigTest : public testing::Test { public: - void SetPreference(chrome_browser_net::NetworkPredictionOptions value) { - profile_.GetPrefs()->SetInteger(prefs::kNetworkPredictionOptions, value); + void SetPreference(prefetch::PreloadPagesState value) { + prefetch::SetPreloadPagesState(profile_.GetPrefs(), value); } Profile* profile() { return &profile_; } @@ -30,7 +30,7 @@ class LoadingPredictorConfigTest : public testing::Test { TEST_F(LoadingPredictorConfigTest, FeatureAndPrefEnabled) { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature(predictors::kSpeculativePreconnectFeature); - SetPreference(chrome_browser_net::NETWORK_PREDICTION_ALWAYS); + SetPreference(prefetch::PreloadPagesState::kStandardPreloading); EXPECT_TRUE(IsPreconnectFeatureEnabled()); EXPECT_TRUE(IsLoadingPredictorEnabled(profile())); @@ -40,7 +40,7 @@ TEST_F(LoadingPredictorConfigTest, FeatureAndPrefEnabled) { TEST_F(LoadingPredictorConfigTest, FeatureDisabled) { base::test::ScopedFeatureList feature_list; feature_list.InitAndDisableFeature(predictors::kSpeculativePreconnectFeature); - SetPreference(chrome_browser_net::NETWORK_PREDICTION_ALWAYS); + SetPreference(prefetch::PreloadPagesState::kStandardPreloading); EXPECT_FALSE(IsPreconnectFeatureEnabled()); EXPECT_FALSE(IsLoadingPredictorEnabled(profile())); @@ -50,7 +50,7 @@ TEST_F(LoadingPredictorConfigTest, FeatureDisabled) { TEST_F(LoadingPredictorConfigTest, FeatureEnabledAndPrefDisabled) { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature(predictors::kSpeculativePreconnectFeature); - SetPreference(chrome_browser_net::NETWORK_PREDICTION_NEVER); + SetPreference(prefetch::PreloadPagesState::kNoPreloading); EXPECT_TRUE(IsPreconnectFeatureEnabled()); EXPECT_TRUE(IsLoadingPredictorEnabled(profile())); @@ -60,7 +60,7 @@ TEST_F(LoadingPredictorConfigTest, FeatureEnabledAndPrefDisabled) { TEST_F(LoadingPredictorConfigTest, IncognitoProfile) { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature(predictors::kSpeculativePreconnectFeature); - SetPreference(chrome_browser_net::NETWORK_PREDICTION_ALWAYS); + SetPreference(prefetch::PreloadPagesState::kStandardPreloading); Profile* incognito = profile()->GetPrimaryOTRProfile(/*create_if_needed=*/true); @@ -72,7 +72,7 @@ TEST_F(LoadingPredictorConfigTest, IncognitoProfile) { TEST_F(LoadingPredictorConfigTest, NonPrimaryOffTheRecordProfile) { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature(predictors::kSpeculativePreconnectFeature); - SetPreference(chrome_browser_net::NETWORK_PREDICTION_ALWAYS); + SetPreference(prefetch::PreloadPagesState::kStandardPreloading); Profile* otr_profile = profile()->GetOffTheRecordProfile( Profile::OTRProfileID::CreateUniqueForTesting(), /*create_if_needed=*/true); diff --git a/chrome/browser/predictors/loading_predictor_unittest.cc b/chrome/browser/predictors/loading_predictor_unittest.cc index a313fca137ebb..f2e0b7f17dc4c 100644 --- a/chrome/browser/predictors/loading_predictor_unittest.cc +++ b/chrome/browser/predictors/loading_predictor_unittest.cc @@ -12,8 +12,8 @@ #include "base/memory/raw_ptr.h" #include "base/test/metrics/histogram_tester.h" -#include "chrome/browser/net/prediction_options.h" #include "chrome/browser/predictors/loading_test_util.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/testing_profile.h" #include "components/prefs/pref_service.h" @@ -133,9 +133,8 @@ void LoadingPredictorTest::TearDown() { } void LoadingPredictorTest::SetPreference() { - profile_->GetPrefs()->SetInteger( - prefs::kNetworkPredictionOptions, - chrome_browser_net::NETWORK_PREDICTION_NEVER); + prefetch::SetPreloadPagesState(profile_->GetPrefs(), + prefetch::PreloadPagesState::kNoPreloading); } class LoadingPredictorPreconnectTest : public LoadingPredictorTest { @@ -158,9 +157,8 @@ void LoadingPredictorPreconnectTest::SetUp() { } void LoadingPredictorPreconnectTest::SetPreference() { - profile_->GetPrefs()->SetInteger( - prefs::kNetworkPredictionOptions, - chrome_browser_net::NETWORK_PREDICTION_ALWAYS); + prefetch::SetPreloadPagesState( + profile_->GetPrefs(), prefetch::PreloadPagesState::kStandardPreloading); } TEST_F(LoadingPredictorTest, TestOnNavigationStarted) { diff --git a/chrome/browser/prefetch/android/java/src/org/chromium/chrome/browser/prefetch/settings/PreloadPagesSettingsBridge.java b/chrome/browser/prefetch/android/java/src/org/chromium/chrome/browser/prefetch/settings/PreloadPagesSettingsBridge.java index 3845d58294290..bbed62b02e097 100644 --- a/chrome/browser/prefetch/android/java/src/org/chromium/chrome/browser/prefetch/settings/PreloadPagesSettingsBridge.java +++ b/chrome/browser/prefetch/android/java/src/org/chromium/chrome/browser/prefetch/settings/PreloadPagesSettingsBridge.java @@ -39,7 +39,7 @@ public static boolean isNetworkPredictionManaged() { } @NativeMethods - interface Natives { + public interface Natives { @PreloadPagesState int getState(); void setState(@PreloadPagesState int mode); diff --git a/chrome/browser/prefetch/android/java/src/org/chromium/chrome/browser/prefetch/settings/PreloadPagesSettingsFragmentTest.java b/chrome/browser/prefetch/android/java/src/org/chromium/chrome/browser/prefetch/settings/PreloadPagesSettingsFragmentTest.java index 3044e19608b33..77d4cbb731638 100644 --- a/chrome/browser/prefetch/android/java/src/org/chromium/chrome/browser/prefetch/settings/PreloadPagesSettingsFragmentTest.java +++ b/chrome/browser/prefetch/android/java/src/org/chromium/chrome/browser/prefetch/settings/PreloadPagesSettingsFragmentTest.java @@ -114,10 +114,8 @@ public void testCheckRadioButtons() { Assert.assertFalse( ASSERT_RADIO_BUTTON_CHECKED, getStandardPreloadingButton().isChecked()); Assert.assertFalse(ASSERT_RADIO_BUTTON_CHECKED, getNoPreloadingButton().isChecked()); - // TODO(crbug.com/1263586): Enable this once prefs are implemented. - // Assert.assertEquals(ASSERT_PRELOAD_PAGES_STATE_NATIVE, - // PreloadPagesState.EXTENDED_PRELOADING, - // PreloadPagesSettingsBridge.getState()); + Assert.assertEquals(ASSERT_PRELOAD_PAGES_STATE_NATIVE, + PreloadPagesState.EXTENDED_PRELOADING, PreloadPagesSettingsBridge.getState()); // Click the Standard Preloading button. getStandardPreloadingButton().onClick(null); @@ -128,10 +126,8 @@ public void testCheckRadioButtons() { Assert.assertTrue( ASSERT_RADIO_BUTTON_CHECKED, getStandardPreloadingButton().isChecked()); Assert.assertFalse(ASSERT_RADIO_BUTTON_CHECKED, getNoPreloadingButton().isChecked()); - // TODO(crbug.com/1263586): Enable this once prefs are implemented. - // Assert.assertEquals(ASSERT_PRELOAD_PAGES_STATE_NATIVE, - // PreloadPagesState.STANDARD_PRELOADING, - // PreloadPagesSettingsBridge.getState()); + Assert.assertEquals(ASSERT_PRELOAD_PAGES_STATE_NATIVE, + PreloadPagesState.STANDARD_PRELOADING, PreloadPagesSettingsBridge.getState()); // Click the No Preloading button. getNoPreloadingButton().onClick(null); @@ -142,10 +138,8 @@ public void testCheckRadioButtons() { Assert.assertFalse( ASSERT_RADIO_BUTTON_CHECKED, getStandardPreloadingButton().isChecked()); Assert.assertTrue(ASSERT_RADIO_BUTTON_CHECKED, getNoPreloadingButton().isChecked()); - // TODO(crbug.com/1263586): Enable this once prefs are implemented. - // Assert.assertEquals(ASSERT_PRELOAD_PAGES_STATE_NATIVE, - // PreloadPagesState.NO_PRELOADING, - // PreloadPagesSettingsBridge.getState()); + Assert.assertEquals(ASSERT_PRELOAD_PAGES_STATE_NATIVE, PreloadPagesState.NO_PRELOADING, + PreloadPagesSettingsBridge.getState()); }); } @@ -180,8 +174,12 @@ public void testStandardPreloadingAuxButtonClicked() { @Test @SmallTest @Feature({"PreloadPages"}) - @Policies.Add({ @Policies.Item(key = "NetworkPredictionOptions", string = "0") }) - public void testPreloadingManaged() { + @Policies.Add({ + @Policies.Item(key = "NetworkPredictionOptions", + string = "2" /* NetworkPredictionOptions::kDisabled */) + }) + public void + testPreloadingManaged() { TestThreadUtils.runOnUiThreadBlocking( () -> { ChromeBrowserInitializer.getInstance().handleSynchronousStartup(); }); launchSettingsActivity(); @@ -191,8 +189,7 @@ public void testPreloadingManaged() { Assert.assertFalse(getExtendedPreloadingButton().isEnabled()); Assert.assertFalse(getStandardPreloadingButton().isEnabled()); Assert.assertFalse(getNoPreloadingButton().isEnabled()); - // TODO(crbug.com/1263586): This should be NO_PRELOADING once prefs are implemented. - Assert.assertEquals(PreloadPagesState.STANDARD_PRELOADING, getPreloadPagesState()); + Assert.assertEquals(PreloadPagesState.NO_PRELOADING, getPreloadPagesState()); // To disclose information, aux buttons should be enabled under managed mode. Assert.assertTrue(getExtendedPreloadingButton().getAuxButtonForTests().isEnabled()); Assert.assertTrue(getStandardPreloadingButton().getAuxButtonForTests().isEnabled()); diff --git a/chrome/browser/prefetch/android/preload_pages_settings_bridge.cc b/chrome/browser/prefetch/android/preload_pages_settings_bridge.cc index cb22e9aa779da..23673810c8402 100644 --- a/chrome/browser/prefetch/android/preload_pages_settings_bridge.cc +++ b/chrome/browser/prefetch/android/preload_pages_settings_bridge.cc @@ -4,11 +4,10 @@ #include -#include "chrome/browser/net/prediction_options.h" #include "chrome/browser/prefetch/android/jni_headers/PreloadPagesSettingsBridge_jni.h" +#include "chrome/browser/prefetch/pref_names.h" #include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/profiles/profile_manager.h" -#include "chrome/common/pref_names.h" #include "components/metrics/metrics_pref_names.h" #include "components/prefs/pref_service.h" @@ -31,7 +30,7 @@ static jint JNI_PreloadPagesSettingsBridge_GetState(JNIEnv* env) { static jboolean JNI_PreloadPagesSettingsBridge_IsNetworkPredictionManaged( JNIEnv* env) { return GetPrefService()->IsManagedPreference( - prefs::kNetworkPredictionOptions); + prefetch::prefs::kNetworkPredictionOptions); } static void JNI_PreloadPagesSettingsBridge_SetState(JNIEnv* env, jint state) { diff --git a/chrome/browser/prefetch/no_state_prefetch/chrome_no_state_prefetch_manager_delegate.cc b/chrome/browser/prefetch/no_state_prefetch/chrome_no_state_prefetch_manager_delegate.cc index 60ddc454cf73e..0d1fab6c25ddd 100644 --- a/chrome/browser/prefetch/no_state_prefetch/chrome_no_state_prefetch_manager_delegate.cc +++ b/chrome/browser/prefetch/no_state_prefetch/chrome_no_state_prefetch_manager_delegate.cc @@ -8,6 +8,7 @@ #include "chrome/browser/predictors/loading_predictor.h" #include "chrome/browser/predictors/loading_predictor_factory.h" #include "chrome/browser/prefetch/no_state_prefetch/chrome_no_state_prefetch_contents_delegate.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/tab_contents/tab_util.h" #include "chrome/browser/ui/browser_navigator_params.h" @@ -56,46 +57,15 @@ ChromeNoStatePrefetchManagerDelegate::GetNoStatePrefetchContentsDelegate() { bool ChromeNoStatePrefetchManagerDelegate:: IsNetworkPredictionPreferenceEnabled() { - return GetPredictionStatus() == - chrome_browser_net::NetworkPredictionStatus::ENABLED; -} - -bool ChromeNoStatePrefetchManagerDelegate::IsPredictionDisabledDueToNetwork( - Origin origin) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - - // Prerendering forced for cellular networks still prevents navigation with - // the DISABLED_ALWAYS selected via privacy settings. - chrome_browser_net::NetworkPredictionStatus prediction_status = - chrome_browser_net::CanPrefetchAndPrerenderUI(profile_->GetPrefs()); - if (origin == ORIGIN_EXTERNAL_REQUEST_FORCED_PRERENDER && - prediction_status == chrome_browser_net::NetworkPredictionStatus:: - DISABLED_DUE_TO_NETWORK) { - return false; - } - - return prediction_status == - chrome_browser_net::NetworkPredictionStatus::DISABLED_DUE_TO_NETWORK; + return prefetch::IsSomePreloadingEnabled(*profile_->GetPrefs()); } std::string ChromeNoStatePrefetchManagerDelegate::GetReasonForDisablingPrediction() { - auto prediction_status = GetPredictionStatus(); - if (prediction_status == - chrome_browser_net::NetworkPredictionStatus::DISABLED_ALWAYS) { + if (!IsNetworkPredictionPreferenceEnabled()) { return "Disabled by user setting"; } - if (prediction_status == - chrome_browser_net::NetworkPredictionStatus::DISABLED_DUE_TO_NETWORK) { - return "Disabled on cellular connection by default"; - } return ""; } -chrome_browser_net::NetworkPredictionStatus -ChromeNoStatePrefetchManagerDelegate::GetPredictionStatus() const { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - return chrome_browser_net::CanPrefetchAndPrerenderUI(profile_->GetPrefs()); -} - } // namespace prerender diff --git a/chrome/browser/prefetch/no_state_prefetch/chrome_no_state_prefetch_manager_delegate.h b/chrome/browser/prefetch/no_state_prefetch/chrome_no_state_prefetch_manager_delegate.h index 0add5ff680dea..f17d125de7d57 100644 --- a/chrome/browser/prefetch/no_state_prefetch/chrome_no_state_prefetch_manager_delegate.h +++ b/chrome/browser/prefetch/no_state_prefetch/chrome_no_state_prefetch_manager_delegate.h @@ -6,7 +6,6 @@ #define CHROME_BROWSER_PREFETCH_NO_STATE_PREFETCH_CHROME_NO_STATE_PREFETCH_MANAGER_DELEGATE_H_ #include "base/memory/raw_ptr.h" -#include "chrome/browser/net/prediction_options.h" #include "components/no_state_prefetch/browser/no_state_prefetch_manager_delegate.h" #include "components/no_state_prefetch/common/prerender_origin.h" @@ -30,11 +29,9 @@ class ChromeNoStatePrefetchManagerDelegate std::unique_ptr GetNoStatePrefetchContentsDelegate() override; bool IsNetworkPredictionPreferenceEnabled() override; - bool IsPredictionDisabledDueToNetwork(Origin origin) override; std::string GetReasonForDisablingPrediction() override; private: - chrome_browser_net::NetworkPredictionStatus GetPredictionStatus() const; raw_ptr profile_; }; diff --git a/chrome/browser/prefetch/no_state_prefetch/prerender_unittest.cc b/chrome/browser/prefetch/no_state_prefetch/prerender_unittest.cc index 10ab473272b19..f5cbfe2df85fc 100644 --- a/chrome/browser/prefetch/no_state_prefetch/prerender_unittest.cc +++ b/chrome/browser/prefetch/no_state_prefetch/prerender_unittest.cc @@ -23,12 +23,12 @@ #include "base/test/simple_test_tick_clock.h" #include "base/time/time.h" #include "build/build_config.h" -#include "chrome/browser/net/prediction_options.h" #include "chrome/browser/predictors/loading_predictor.h" #include "chrome/browser/predictors/loading_predictor_factory.h" #include "chrome/browser/predictors/loading_test_util.h" #include "chrome/browser/prefetch/no_state_prefetch/chrome_no_state_prefetch_contents_delegate.h" #include "chrome/browser/prefetch/no_state_prefetch/chrome_no_state_prefetch_manager_delegate.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" @@ -474,15 +474,13 @@ class PrerenderTest : public testing::Test { } void DisablePrerender() { - profile_.GetPrefs()->SetInteger( - prefs::kNetworkPredictionOptions, - chrome_browser_net::NETWORK_PREDICTION_NEVER); + prefetch::SetPreloadPagesState(profile_.GetPrefs(), + prefetch::PreloadPagesState::kNoPreloading); } void EnablePrerender() { - profile_.GetPrefs()->SetInteger( - prefs::kNetworkPredictionOptions, - chrome_browser_net::NETWORK_PREDICTION_ALWAYS); + prefetch::SetPreloadPagesState( + profile_.GetPrefs(), prefetch::PreloadPagesState::kStandardPreloading); } const base::HistogramTester& histogram_tester() { return histogram_tester_; } diff --git a/chrome/browser/prefetch/pref_names.cc b/chrome/browser/prefetch/pref_names.cc index 252e357c18557..abeb21b540221 100644 --- a/chrome/browser/prefetch/pref_names.cc +++ b/chrome/browser/prefetch/pref_names.cc @@ -22,10 +22,11 @@ const char kCachePrefPath[] = "prefetch.search_prefetch.cache"; const char kRetryAfterPrefPath[] = "chrome.prefetch_proxy.origin_decider.retry_after"; -// This pref contains an integer (enum of type PreloadPagesState), determining -// which preload pages mode (specifying whether or how much we are allowed to -// preload pages) has been selected by the user. -const char kPrefetchPagesState[] = "chrome.prefetch.preload_pages_state"; +// This pref contains an integer (enum of type NetworkPredictionOptions), +// determining which preload pages mode (specifying whether or how much we are +// allowed to preload pages) has been selected by the user. Note that the name +// of this pref does not match the others in this file for legacy reasons. +const char kNetworkPredictionOptions[] = "net.network_prediction_options"; } // namespace prefs } // namespace prefetch diff --git a/chrome/browser/prefetch/pref_names.h b/chrome/browser/prefetch/pref_names.h index e730891efe36e..2f4305ac47394 100644 --- a/chrome/browser/prefetch/pref_names.h +++ b/chrome/browser/prefetch/pref_names.h @@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_PREFETCH_PREF_NAMES_H_ #define CHROME_BROWSER_PREFETCH_PREF_NAMES_H_ +#include "chrome/common/pref_names.h" + namespace prefetch { namespace prefs { @@ -12,7 +14,7 @@ extern const char kCachePrefPath[]; extern const char kRetryAfterPrefPath[]; -extern const char kPrefetchPagesState[]; +extern const char kNetworkPredictionOptions[]; } // namespace prefs } // namespace prefetch diff --git a/chrome/browser/prefetch/prefetch_browsertest.cc b/chrome/browser/prefetch/prefetch_browsertest.cc index 63cb091e95a40..6662daec2e416 100644 --- a/chrome/browser/prefetch/prefetch_browsertest.cc +++ b/chrome/browser/prefetch/prefetch_browsertest.cc @@ -6,7 +6,7 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h" -#include "chrome/browser/net/prediction_options.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" @@ -25,8 +25,8 @@ #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" -using chrome_browser_net::NetworkPredictionOptions; using net::NetworkChangeNotifier; +using prefetch::PreloadPagesState; namespace { @@ -73,9 +73,8 @@ class PrefetchBrowserTest : public InProcessBrowserTest { command_line->AppendSwitch(switches::kIgnoreCertificateErrors); } - void SetPreference(NetworkPredictionOptions value) { - browser()->profile()->GetPrefs()->SetInteger( - prefs::kNetworkPredictionOptions, value); + void SetPreference(prefetch::PreloadPagesState value) { + prefetch::SetPreloadPagesState(browser()->profile()->GetPrefs(), value); } bool RunPrefetchExperiment(bool expect_success, Browser* browser) { @@ -109,8 +108,8 @@ IN_PROC_BROWSER_TEST_F(PrefetchBrowserTest, PreferenceWorks) { EXPECT_TRUE(RunPrefetchExperiment(true, browser())); } - // Set preference to NEVER: prefetch should be unaffected. - SetPreference(NetworkPredictionOptions::NETWORK_PREDICTION_NEVER); + // Set preference to no preloading: prefetch should be unaffected. + SetPreference(PreloadPagesState::kNoPreloading); { std::unique_ptr mock( new MockNetworkChangeNotifierWIFI); diff --git a/chrome/browser/prefetch/prefetch_prefs.cc b/chrome/browser/prefetch/prefetch_prefs.cc index 61f7894052714..7a04a63fa766c 100644 --- a/chrome/browser/prefetch/prefetch_prefs.cc +++ b/chrome/browser/prefetch/prefetch_prefs.cc @@ -3,16 +3,60 @@ // found in the LICENSE file. #include "chrome/browser/prefetch/prefetch_prefs.h" +#include "chrome/browser/prefetch/pref_names.h" +#include "components/pref_registry/pref_registry_syncable.h" +#include "components/prefs/pref_service.h" namespace prefetch { +void RegisterPredictionOptionsProfilePrefs( + user_prefs::PrefRegistrySyncable* registry) { + registry->RegisterIntegerPref( + prefs::kNetworkPredictionOptions, + static_cast(NetworkPredictionOptions::kDefault), + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); +} + PreloadPagesState GetPreloadPagesState(const PrefService& prefs) { - // TODO(crbug.com/1263586): implement. - return PreloadPagesState::STANDARD_PRELOADING; + NetworkPredictionOptions network_prediction_options = + static_cast( + prefs.GetInteger(prefs::kNetworkPredictionOptions)); + switch (network_prediction_options) { + case NetworkPredictionOptions::kExtended: + return PreloadPagesState::kExtendedPreloading; + case NetworkPredictionOptions::kStandard: + case NetworkPredictionOptions::kWifiOnlyDeprecated: + return PreloadPagesState::kStandardPreloading; + default: + // This is what will be used if the enterprise policy sets an invalid + // value. Also, if a new value is added in the future and the enterprise + // policy sets this value, old versions of Chrome will use this path. + return PreloadPagesState::kNoPreloading; + } } void SetPreloadPagesState(PrefService* prefs, PreloadPagesState state) { - // TODO(crbug.com/1263586): implement. + DCHECK(prefs); + NetworkPredictionOptions value; + switch (state) { + case PreloadPagesState::kExtendedPreloading: + value = NetworkPredictionOptions::kExtended; + break; + case PreloadPagesState::kStandardPreloading: + value = NetworkPredictionOptions::kStandard; + break; + case PreloadPagesState::kNoPreloading: + value = NetworkPredictionOptions::kDisabled; + break; + default: + NOTREACHED() << "invalid PreloadPageState: " << static_cast(state); + return; + } + prefs->SetInteger(prefs::kNetworkPredictionOptions, static_cast(value)); +} + +bool IsSomePreloadingEnabled(const PrefService& prefs) { + return GetPreloadPagesState(prefs) != PreloadPagesState::kNoPreloading; } } // namespace prefetch diff --git a/chrome/browser/prefetch/prefetch_prefs.h b/chrome/browser/prefetch/prefetch_prefs.h index 4e4e9c994bc3b..77e3601c57cf2 100644 --- a/chrome/browser/prefetch/prefetch_prefs.h +++ b/chrome/browser/prefetch/prefetch_prefs.h @@ -5,30 +5,59 @@ #ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PREFS_H_ #define CHROME_BROWSER_PREFETCH_PREFETCH_PREFS_H_ +namespace user_prefs { +class PrefRegistrySyncable; +} + class PrefService; namespace prefetch { -// Enum representing possible values of the Preload Pages opt-in state. -// These values are persisted to prefs. Entries should not be renumbered and -// numeric values should never be reused. +// Enum describing when to allow network predictions. The numerical value is +// stored in the prefs file, therefore the same enum with the same order must be +// used by the platform-dependent components. +enum class NetworkPredictionOptions { + kStandard = 0, + // This option is deprecated. It is now equivalent to kStandard. + kWifiOnlyDeprecated = 1, + kDisabled = 2, + kExtended = 3, + kDefault = kWifiOnlyDeprecated, +}; + +// Enum representing possible values of the Preload Pages opt-in state. Since +// this enum is not persisted in prefs, old values can be removed and new values +// can be added without worry. This is the the sanitized counterpart to +// NetworkPredictionOptions, which is persisted in prefs and cannot be modified +// arbitrarily. Prefer using PreloadPagesState over NetworkPredictionOptions to +// avoid having to deal with deprecated values. // A Java counterpart will be generated for this enum. // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.prefetch.settings enum class PreloadPagesState { // The user is not opted into preloading. - NO_PRELOADING = 0, + kNoPreloading = 0, // The user selected standard preloading. - STANDARD_PRELOADING = 1, + kStandardPreloading = 1, // The user selected extended preloading. - EXTENDED_PRELOADING = 2, + kExtendedPreloading = 2, - kMaxValue = EXTENDED_PRELOADING, + kMaxValue = kExtendedPreloading, }; +// Returns the PreloadPagesState corresponding to the NetworkPredictionOptions +// setting persisted in prefs. PreloadPagesState GetPreloadPagesState(const PrefService& prefs); +// Converts the given PreloadPagesState to a NetworkPredictionOptions and +// persist it in prefs. void SetPreloadPagesState(PrefService* prefs, PreloadPagesState state); +// Returns true if preloading is not entirely disabled. +bool IsSomePreloadingEnabled(const PrefService& prefs); + +void RegisterPredictionOptionsProfilePrefs( + user_prefs::PrefRegistrySyncable* registry); + } // namespace prefetch #endif // CHROME_BROWSER_PREFETCH_PREFETCH_PREFS_H_ diff --git a/chrome/browser/prefetch/prefetch_prefs_unittest.cc b/chrome/browser/prefetch/prefetch_prefs_unittest.cc new file mode 100644 index 0000000000000..bc893295a1955 --- /dev/null +++ b/chrome/browser/prefetch/prefetch_prefs_unittest.cc @@ -0,0 +1,98 @@ +// Copyright 2021 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. + +#include "chrome/browser/prefetch/prefetch_prefs.h" + +#include "chrome/browser/prefetch/pref_names.h" +#include "chrome/common/pref_names.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/testing_pref_service.h" +#include "testing/gtest/include/gtest/gtest.h" + +TEST(PrefetchPrefsTest, GetPreloadPagesState) { + TestingPrefServiceSimple prefs; + prefs.registry()->RegisterIntegerPref( + prefs::kNetworkPredictionOptions, + static_cast(prefetch::NetworkPredictionOptions::kDefault)); + + prefs.SetInteger( + prefs::kNetworkPredictionOptions, + static_cast(prefetch::NetworkPredictionOptions::kStandard)); + EXPECT_EQ(prefetch::GetPreloadPagesState(prefs), + prefetch::PreloadPagesState::kStandardPreloading); + + prefs.SetInteger( + prefs::kNetworkPredictionOptions, + static_cast(prefetch::NetworkPredictionOptions::kExtended)); + EXPECT_EQ(prefetch::GetPreloadPagesState(prefs), + prefetch::PreloadPagesState::kExtendedPreloading); + + prefs.SetInteger( + prefs::kNetworkPredictionOptions, + static_cast( + prefetch::NetworkPredictionOptions::kWifiOnlyDeprecated)); + EXPECT_EQ(prefetch::GetPreloadPagesState(prefs), + prefetch::PreloadPagesState::kStandardPreloading); + + prefs.SetInteger( + prefs::kNetworkPredictionOptions, + static_cast(prefetch::NetworkPredictionOptions::kDisabled)); + EXPECT_EQ(prefetch::GetPreloadPagesState(prefs), + prefetch::PreloadPagesState::kNoPreloading); + + // Invalid value should result in disabled preloading. + prefs.SetInteger(prefs::kNetworkPredictionOptions, 12345); + EXPECT_EQ(prefetch::GetPreloadPagesState(prefs), + prefetch::PreloadPagesState::kNoPreloading); +} + +TEST(PrefetchPrefsTest, SetPreloadPagesState) { + TestingPrefServiceSimple prefs; + prefs.registry()->RegisterIntegerPref( + prefs::kNetworkPredictionOptions, + static_cast(prefetch::NetworkPredictionOptions::kDefault)); + + prefetch::SetPreloadPagesState(&prefs, + prefetch::PreloadPagesState::kNoPreloading); + EXPECT_EQ(prefs.GetInteger(prefs::kNetworkPredictionOptions), + static_cast(prefetch::NetworkPredictionOptions::kDisabled)); + + prefetch::SetPreloadPagesState( + &prefs, prefetch::PreloadPagesState::kStandardPreloading); + EXPECT_EQ(prefs.GetInteger(prefs::kNetworkPredictionOptions), + static_cast(prefetch::NetworkPredictionOptions::kStandard)); + + prefetch::SetPreloadPagesState( + &prefs, prefetch::PreloadPagesState::kExtendedPreloading); + EXPECT_EQ(prefs.GetInteger(prefs::kNetworkPredictionOptions), + static_cast(prefetch::NetworkPredictionOptions::kExtended)); +} + +TEST(PrefetchPrefsTest, IsSomePreloadingEnabled) { + TestingPrefServiceSimple prefs; + prefs.registry()->RegisterIntegerPref( + prefs::kNetworkPredictionOptions, + static_cast(prefetch::NetworkPredictionOptions::kDefault)); + + prefs.SetInteger( + prefs::kNetworkPredictionOptions, + static_cast(prefetch::NetworkPredictionOptions::kDisabled)); + EXPECT_FALSE(prefetch::IsSomePreloadingEnabled(prefs)); + + prefs.SetInteger( + prefs::kNetworkPredictionOptions, + static_cast(prefetch::NetworkPredictionOptions::kStandard)); + EXPECT_TRUE(prefetch::IsSomePreloadingEnabled(prefs)); + + prefs.SetInteger( + prefs::kNetworkPredictionOptions, + static_cast( + prefetch::NetworkPredictionOptions::kWifiOnlyDeprecated)); + EXPECT_TRUE(prefetch::IsSomePreloadingEnabled(prefs)); + + prefs.SetInteger( + prefs::kNetworkPredictionOptions, + static_cast(prefetch::NetworkPredictionOptions::kExtended)); + EXPECT_TRUE(prefetch::IsSomePreloadingEnabled(prefs)); +} diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc index 1f861c2006782..370a9ca8112fa 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc @@ -30,11 +30,11 @@ #include "chrome/browser/history/history_test_utils.h" #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service.h" #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service_factory.h" -#include "chrome/browser/net/prediction_options.h" #include "chrome/browser/net/profile_network_context_service.h" #include "chrome/browser/net/profile_network_context_service_factory.h" #include "chrome/browser/policy/policy_test_utils.h" #include "chrome/browser/prefetch/no_state_prefetch/no_state_prefetch_manager_factory.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h" @@ -2361,7 +2361,9 @@ IN_PROC_BROWSER_TEST_F(PolicyTestPrefetchProxyBrowserTest, policies.Set( policy::key::kNetworkPredictionOptions, policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, - base::Value(chrome_browser_net::NETWORK_PREDICTION_NEVER), nullptr); + base::Value( + static_cast(prefetch::NetworkPredictionOptions::kDisabled)), + nullptr); UpdateProviderPolicy(policies); PrefetchProxyTabHelper* tab_helper = diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc index b3b98a95c85de..0adeba29163c2 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc @@ -18,8 +18,8 @@ #include "base/time/time.h" #include "chrome/browser/chrome_content_browser_client.h" #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service_factory.h" -#include "chrome/browser/net/prediction_options.h" #include "chrome/browser/prefetch/no_state_prefetch/no_state_prefetch_manager_factory.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_network_context_client.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_decider.h" @@ -1293,8 +1293,8 @@ void PrefetchProxyTabHelper::PrefetchUrls( return; } - // This checks whether the user has enabled pre* actions in the settings UI. - if (!chrome_browser_net::CanPreresolveAndPreconnectUI(profile_->GetPrefs())) { + // This checks whether the user has disabled pre* actions in the settings UI. + if (!prefetch::IsSomePreloadingEnabled(*profile_->GetPrefs())) { return; } diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc index 1d6a6e5318928..6a29aa9bb1af1 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc @@ -18,7 +18,7 @@ #include "build/build_config.h" #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service.h" #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service_factory.h" -#include "chrome/browser/net/prediction_options.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service_factory.h" @@ -935,9 +935,8 @@ TEST_F(PrefetchProxyTabHelperTest, NonHTML) { TEST_F(PrefetchProxyTabHelperTest, UserSettingDisabled) { base::HistogramTester histogram_tester; - profile()->GetPrefs()->SetInteger( - prefs::kNetworkPredictionOptions, - chrome_browser_net::NETWORK_PREDICTION_NEVER); + prefetch::SetPreloadPagesState(profile()->GetPrefs(), + prefetch::PreloadPagesState::kNoPreloading); NavigateSomewhere(); GURL doc_url("https://www.google.com/search?q=cats"); diff --git a/chrome/browser/prefetch/search_prefetch/full_body_search_prefetch_request.cc b/chrome/browser/prefetch/search_prefetch/full_body_search_prefetch_request.cc index ca9147672b3b3..d9e6a05bfa450 100644 --- a/chrome/browser/prefetch/search_prefetch/full_body_search_prefetch_request.cc +++ b/chrome/browser/prefetch/search_prefetch/full_body_search_prefetch_request.cc @@ -7,7 +7,6 @@ #include "base/bind.h" #include "base/callback.h" #include "base/location.h" -#include "chrome/browser/net/prediction_options.h" #include "chrome/browser/prefetch/search_prefetch/field_trial_settings.h" #include "chrome/browser/prefetch/search_prefetch/prefetched_response_container.h" #include "chrome/browser/prefetch/search_prefetch/search_prefetch_from_string_url_loader.h" diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_service.cc b/chrome/browser/prefetch/search_prefetch/search_prefetch_service.cc index 4715a7f941af6..054af4449320d 100644 --- a/chrome/browser/prefetch/search_prefetch/search_prefetch_service.cc +++ b/chrome/browser/prefetch/search_prefetch/search_prefetch_service.cc @@ -11,8 +11,8 @@ #include "base/metrics/histogram_macros.h" #include "base/values.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" -#include "chrome/browser/net/prediction_options.h" #include "chrome/browser/prefetch/pref_names.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/prefetch/search_prefetch/back_forward_search_prefetch_url_loader.h" #include "chrome/browser/prefetch/search_prefetch/field_trial_settings.h" #include "chrome/browser/prefetch/search_prefetch/full_body_search_prefetch_request.h" @@ -109,7 +109,7 @@ bool SearchPrefetchService::MaybePrefetchURL(const GURL& url) { SearchPrefetchEligibilityReasonRecorder recorder; - if (!chrome_browser_net::CanPreresolveAndPreconnectUI(profile_->GetPrefs())) { + if (!prefetch::IsSomePreloadingEnabled(*profile_->GetPrefs())) { recorder.reason_ = SearchPrefetchEligibilityReason::kPrefetchDisabled; return false; } diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc b/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc index 68448a79a4fe5..15b810759305e 100644 --- a/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc +++ b/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc @@ -16,7 +16,7 @@ #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/devtools/devtools_window.h" #include "chrome/browser/devtools/devtools_window_testing.h" -#include "chrome/browser/net/prediction_options.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/prefetch/search_prefetch/field_trial_settings.h" #include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h" #include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h" @@ -1109,9 +1109,8 @@ IN_PROC_BROWSER_TEST_P(SearchPrefetchServiceEnabledBrowserTest, BadURL) { IN_PROC_BROWSER_TEST_P(SearchPrefetchServiceEnabledBrowserTest, PreloadDisabled) { base::HistogramTester histogram_tester; - browser()->profile()->GetPrefs()->SetInteger( - prefs::kNetworkPredictionOptions, - chrome_browser_net::NETWORK_PREDICTION_NEVER); + prefetch::SetPreloadPagesState(browser()->profile()->GetPrefs(), + prefetch::PreloadPagesState::kNoPreloading); auto* search_prefetch_service = SearchPrefetchServiceFactory::GetForProfile(browser()->profile()); EXPECT_NE(nullptr, search_prefetch_service); diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 23b2491d128f6..fbe4d0024c48a 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc @@ -42,7 +42,6 @@ #include "chrome/browser/memory/enterprise_memory_limit_pref_observer.h" #include "chrome/browser/metrics/chrome_metrics_service_client.h" #include "chrome/browser/net/net_error_tab_helper.h" -#include "chrome/browser/net/prediction_options.h" #include "chrome/browser/net/profile_network_context_service.h" #include "chrome/browser/net/secure_dns_util.h" #include "chrome/browser/net/system_network_context_manager.h" @@ -52,6 +51,7 @@ #include "chrome/browser/notifications/platform_notification_service_impl.h" #include "chrome/browser/permissions/quiet_notification_permission_ui_state.h" #include "chrome/browser/policy/developer_tools_policy_handler.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_decider.h" #include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h" #include "chrome/browser/prefs/chrome_pref_service_factory.h" @@ -1113,7 +1113,6 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, StatefulSSLHostStateDelegate::RegisterProfilePrefs(registry); ChromeVersionService::RegisterProfilePrefs(registry); chrome_browser_net::NetErrorTabHelper::RegisterProfilePrefs(registry); - chrome_browser_net::RegisterPredictionOptionsProfilePrefs(registry); chrome_prefs::RegisterProfilePrefs(registry); DocumentProvider::RegisterProfilePrefs(registry); dom_distiller::DistilledPagePrefs::RegisterProfilePrefs(registry); @@ -1148,6 +1147,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, policy::DeveloperToolsPolicyHandler::RegisterProfilePrefs(registry); policy::URLBlocklistManager::RegisterProfilePrefs(registry); PrefProxyConfigTrackerImpl::RegisterProfilePrefs(registry); + prefetch::RegisterPredictionOptionsProfilePrefs(registry); PrefetchProxyOriginDecider::RegisterPrefs(registry); PrefsTabHelper::RegisterProfilePrefs(registry, locale); privacy_sandbox::RegisterProfilePrefs(registry); diff --git a/chrome/browser/prefs/pref_functional_browsertest.cc b/chrome/browser/prefs/pref_functional_browsertest.cc index e1facfb6d72ab..24dd3c4031acb 100644 --- a/chrome/browser/prefs/pref_functional_browsertest.cc +++ b/chrome/browser/prefs/pref_functional_browsertest.cc @@ -9,7 +9,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/threading/thread_restrictions.h" #include "chrome/browser/download/download_prefs.h" -#include "chrome/browser/net/prediction_options.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" @@ -211,14 +211,14 @@ IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, TestHomepagePrefs) { IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, PRE_TestPrivacySecurityPrefs) { PrefService* prefs = browser()->profile()->GetPrefs(); - static_assert(chrome_browser_net::NETWORK_PREDICTION_DEFAULT != - chrome_browser_net::NETWORK_PREDICTION_NEVER, + static_assert(prefetch::NetworkPredictionOptions::kDefault != + prefetch::NetworkPredictionOptions::kDisabled, "PrefsFunctionalTest.TestPrivacySecurityPrefs relies on " "predictive network actions being enabled by default."); - EXPECT_EQ(chrome_browser_net::NETWORK_PREDICTION_DEFAULT, - prefs->GetInteger(prefs::kNetworkPredictionOptions)); - prefs->SetInteger(prefs::kNetworkPredictionOptions, - chrome_browser_net::NETWORK_PREDICTION_NEVER); + EXPECT_EQ(prefetch::PreloadPagesState::kStandardPreloading, + prefetch::GetPreloadPagesState(*prefs)); + prefetch::SetPreloadPagesState(prefs, + prefetch::PreloadPagesState::kNoPreloading); EXPECT_TRUE(prefs->GetBoolean(prefs::kSafeBrowsingEnabled)); prefs->SetBoolean(prefs::kSafeBrowsingEnabled, false); @@ -234,8 +234,8 @@ IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, PRE_TestPrivacySecurityPrefs) { IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, TestPrivacySecurityPrefs) { PrefService* prefs = browser()->profile()->GetPrefs(); - EXPECT_EQ(chrome_browser_net::NETWORK_PREDICTION_NEVER, - prefs->GetInteger(prefs::kNetworkPredictionOptions)); + EXPECT_EQ(prefetch::PreloadPagesState::kNoPreloading, + prefetch::GetPreloadPagesState(*prefs)); EXPECT_FALSE(prefs->GetBoolean(prefs::kSafeBrowsingEnabled)); EXPECT_FALSE( prefs->GetBoolean(embedder_support::kAlternateErrorPagesEnabled)); diff --git a/chrome/browser/prerender/omnibox_prerender_browsertest.cc b/chrome/browser/prerender/omnibox_prerender_browsertest.cc index e70b71bc2db25..027875430df54 100644 --- a/chrome/browser/prerender/omnibox_prerender_browsertest.cc +++ b/chrome/browser/prerender/omnibox_prerender_browsertest.cc @@ -8,9 +8,9 @@ #include "base/files/file_path.h" #include "base/path_service.h" #include "build/build_config.h" -#include "chrome/browser/net/prediction_options.h" #include "chrome/browser/predictors/autocomplete_action_predictor.h" #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_paths.h" @@ -88,18 +88,13 @@ class OmniboxPrerenderBrowserTest : public PlatformBrowserTest { base::test::ScopedFeatureList scoped_feature_list_; }; -bool IsNetworkPredictionEnabled(PrefService* prefs) { - return chrome_browser_net::CanPrefetchAndPrerenderUI(prefs) == - chrome_browser_net::NetworkPredictionStatus::ENABLED; -} - // Tests that Prerender2 cannot be triggered when preload setting is disabled. IN_PROC_BROWSER_TEST_F(OmniboxPrerenderBrowserTest, DisableNetworkPrediction) { // Disable network prediction. PrefService* prefs = GetProfile()->GetPrefs(); - prefs->SetInteger(prefs::kNetworkPredictionOptions, - chrome_browser_net::NETWORK_PREDICTION_NEVER); - ASSERT_FALSE(IsNetworkPredictionEnabled(prefs)); + prefetch::SetPreloadPagesState(prefs, + prefetch::PreloadPagesState::kNoPreloading); + ASSERT_FALSE(prefetch::IsSomePreloadingEnabled(*prefs)); // Attempt to prerender a direct URL input. auto* predictor = GetAutocompleteActionPredictor(); @@ -114,9 +109,9 @@ IN_PROC_BROWSER_TEST_F(OmniboxPrerenderBrowserTest, DisableNetworkPrediction) { EXPECT_EQ(host_id, content::RenderFrameHost::kNoFrameTreeNodeId); // Re-enable the setting. - prefs->SetInteger(prefs::kNetworkPredictionOptions, - chrome_browser_net::NETWORK_PREDICTION_ALWAYS); - ASSERT_TRUE(IsNetworkPredictionEnabled(prefs)); + prefetch::SetPreloadPagesState( + prefs, prefetch::PreloadPagesState::kStandardPreloading); + ASSERT_TRUE(prefetch::IsSomePreloadingEnabled(*prefs)); content::test::PrerenderHostRegistryObserver registry_observer(*web_contents); // Attempt to trigger prerendering again. diff --git a/chrome/browser/privacy/privacy_metrics_service.cc b/chrome/browser/privacy/privacy_metrics_service.cc index ecc416fbef2ce..1b83ad3582498 100644 --- a/chrome/browser/privacy/privacy_metrics_service.cc +++ b/chrome/browser/privacy/privacy_metrics_service.cc @@ -5,7 +5,7 @@ #include "chrome/browser/privacy/privacy_metrics_service.h" #include "base/metrics/histogram_functions.h" -#include "chrome/browser/net/prediction_options.h" +#include "chrome/browser/prefetch/prefetch_prefs.h" #include "chrome/common/pref_names.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/prefs/pref_service.h" @@ -149,12 +149,8 @@ void PrivacyMetricsService::RecordStartupMetrics() { "Privacy.DoNotTrackSetting", pref_service_->GetBoolean(prefs::kEnableDoNotTrack)); - auto preload_setting_status = - static_cast( - pref_service_->GetInteger(::prefs::kNetworkPredictionOptions)); - base::UmaHistogramBoolean( - "Settings.PreloadStatus.OnStartup", - (preload_setting_status != chrome_browser_net::NETWORK_PREDICTION_NEVER)); + base::UmaHistogramBoolean("Settings.PreloadStatus.OnStartup", + prefetch::IsSomePreloadingEnabled(*pref_service_)); base::UmaHistogramBoolean( "Settings.AutocompleteSearches.OnStartup", diff --git a/chrome/browser/privacy/settings/java/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManager.java b/chrome/browser/privacy/settings/java/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManager.java index 1dac01b0008a0..b8666ee3fdd3b 100644 --- a/chrome/browser/privacy/settings/java/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManager.java +++ b/chrome/browser/privacy/settings/java/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManager.java @@ -10,12 +10,6 @@ * Manages preferences related to privacy, metrics reporting, prerendering, and network prediction. */ public interface PrivacyPreferencesManager extends CrashReportingPermissionManager { - /** - * Checks whether prerender should be allowed and updates the preference if it is not set yet. - * @return Whether prerendering should be allowed. - */ - boolean shouldPrerender(); - /** * Sets the usage and crash reporting preference ON or OFF. * @@ -93,19 +87,4 @@ public interface PrivacyPreferencesManager extends CrashReportingPermissionManag * @return Whether usage and crash report pref is managed. */ boolean isMetricsReportingManaged(); - - /** - * @return Network predictions preference. - */ - boolean getNetworkPredictionEnabled(); - - /** - * Sets network predictions preference. - */ - void setNetworkPredictionEnabled(boolean enabled); - - /** - * @return Whether Network Predictions is configured by policy. - */ - boolean isNetworkPredictionManaged(); } diff --git a/chrome/browser/resources/settings/privacy_page/cookies_page.ts b/chrome/browser/resources/settings/privacy_page/cookies_page.ts index daeefabc33908..a9fea35ea8850 100644 --- a/chrome/browser/resources/settings/privacy_page/cookies_page.ts +++ b/chrome/browser/resources/settings/privacy_page/cookies_page.ts @@ -40,12 +40,13 @@ import {SettingsCollapseRadioButtonElement} from './collapse_radio_button.js'; /** * Must be kept in sync with the C++ enum of the same name (see - * chrome/browser/net/prediction_options.h). + * chrome/browser/prefetch/prefetch_prefs.h). */ enum NetworkPredictionOptions { - ALWAYS = 0, - WIFI_ONLY = 1, - NEVER = 2, + STANDARD = 0, + WIFI_ONLY_DEPRECATED = 1, + DISABLED = 2, + EXTENDED = 3, DEFAULT = 1, } @@ -114,7 +115,7 @@ export class SettingsCookiesPageElement extends SettingsCookiesPageElementBase { */ networkPredictionUncheckedValue_: { type: Number, - value: NetworkPredictionOptions.NEVER, + value: NetworkPredictionOptions.DISABLED, }, contentSetting_: { diff --git a/chrome/browser/ui/android/omnibox/BUILD.gn b/chrome/browser/ui/android/omnibox/BUILD.gn index 2e36ee330b325..743edd573b692 100644 --- a/chrome/browser/ui/android/omnibox/BUILD.gn +++ b/chrome/browser/ui/android/omnibox/BUILD.gn @@ -130,6 +130,7 @@ android_library("java") { "//base:base_java", "//chrome/browser/android/lifecycle:java", "//chrome/browser/commerce/merchant_viewer/android:java", + "//chrome/browser/device:java", "//chrome/browser/feature_engagement:java", "//chrome/browser/flags:java", "//chrome/browser/gsa:java", @@ -138,6 +139,7 @@ android_library("java") { "//chrome/browser/lens:java", "//chrome/browser/locale:java", "//chrome/browser/preferences:java", + "//chrome/browser/prefetch/android:java", "//chrome/browser/privacy:java", "//chrome/browser/profiles/android:java", "//chrome/browser/search_engines/android:java", @@ -364,11 +366,13 @@ java_library("junit") { "//base:base_java_test_support", "//base:base_junit_test_support", "//chrome/android:base_module_java", + "//chrome/browser/device:java", "//chrome/browser/flags:java", "//chrome/browser/gsa:java", "//chrome/browser/lens:java", "//chrome/browser/locale:java", "//chrome/browser/preferences:java", + "//chrome/browser/prefetch/android:java", "//chrome/browser/privacy:java", "//chrome/browser/profiles/android:java", "//chrome/browser/signin/services/android:java", diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java index 68e06d8572f8f..3c4f67f4b545d 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java @@ -31,6 +31,7 @@ import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.OneshotSupplier; import org.chromium.base.supplier.OneshotSupplierImpl; +import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.gsa.GSAState; import org.chromium.chrome.browser.lens.LensController; @@ -49,6 +50,8 @@ import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesSettingsBridge; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesState; import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManager; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.signin.services.IdentityServicesProvider; @@ -439,7 +442,8 @@ public void set(LocationBarMediator object, Float value) { if (mNativeInitialized && !CommandLine.getInstance().hasSwitch(ChromeSwitches.DISABLE_INSTANT) - && mPrivacyPreferencesManager.shouldPrerender() + && DeviceClassManager.enablePrerendering() + && PreloadPagesSettingsBridge.getState() != PreloadPagesState.NO_PRELOADING && mLocationBarDataProvider.hasTab()) { mOmniboxPrerender.prerenderMaybe(userText, mOriginalUrl, mAutocompleteCoordinator.getCurrentNativeAutocompleteResult(), diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java index 629eff8c585c1..af0ce86face19 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java @@ -73,6 +73,9 @@ import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator; import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesSettingsBridge; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesSettingsBridgeJni; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesState; import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManager; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.ProfileJni; @@ -220,6 +223,8 @@ static void setGSAState(GSAState gsaState) { private IdentityManager mIdentityManager; @Mock private Profile mProfile; + @Mock + private PreloadPagesSettingsBridge.Natives mPreloadPagesSettingsJni; @Captor private ArgumentCaptor mRunnableCaptor; @@ -245,6 +250,7 @@ public void setUp() { doReturn(new WeakReference(null)).when(mWindowAndroid).getActivity(); mJniMocker.mock(ProfileJni.TEST_HOOKS, mProfileNativesJniMock); mJniMocker.mock(OmniboxPrerenderJni.TEST_HOOKS, mPrerenderJni); + mJniMocker.mock(PreloadPagesSettingsBridgeJni.TEST_HOOKS, mPreloadPagesSettingsJni); SearchEngineLogoUtils.setInstanceForTesting(mSearchEngineLogoUtils); Profile.setLastUsedProfileForTesting(mProfile); doReturn(mIdentityManager).when(mIdentityServicesProvider).getIdentityManager(mProfile); @@ -336,14 +342,14 @@ public void testOnSuggestionsChanged() { verify(mPrerenderJni) .initializeForProfile(123L, omniboxPrerenderCaptor.getValue(), profile); - doReturn(false).when(mPrivacyPreferencesManager).shouldPrerender(); + doReturn(PreloadPagesState.NO_PRELOADING).when(mPreloadPagesSettingsJni).getState(); mMediator.onSuggestionsChanged("text", true); verify(mPrerenderJni, never()) .prerenderMaybe( anyLong(), any(), anyString(), anyString(), anyLong(), any(), any()); + doReturn(PreloadPagesState.STANDARD_PRELOADING).when(mPreloadPagesSettingsJni).getState(); mMediator.setUrl("originalUrl", null); - doReturn(true).when(mPrivacyPreferencesManager).shouldPrerender(); doReturn(true).when(mLocationBarDataProvider).hasTab(); doReturn(mTab).when(mLocationBarDataProvider).getTab(); doReturn(456L).when(mAutocompleteCoordinator).getCurrentNativeAutocompleteResult(); diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index dafdb8d272be6..4c27c41cd6744 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn @@ -4722,6 +4722,7 @@ test("unit_tests") { "../browser/predictors/resource_prefetch_predictor_tables_unittest.cc", "../browser/predictors/resource_prefetch_predictor_unittest.cc", "../browser/prefetch/no_state_prefetch/prerender_unittest.cc", + "../browser/prefetch/prefetch_prefs_unittest.cc", "../browser/prefetch/prefetch_proxy/prefetch_container_unittest.cc", "../browser/prefetch/prefetch_proxy/prefetch_proxy_cookie_listener_unittest.cc", "../browser/prefetch/prefetch_proxy/prefetch_proxy_origin_decider_unittest.cc", diff --git a/chrome/test/android/BUILD.gn b/chrome/test/android/BUILD.gn index 53d43840e60d6..88cb00caa9b37 100644 --- a/chrome/test/android/BUILD.gn +++ b/chrome/test/android/BUILD.gn @@ -319,6 +319,7 @@ android_library("chrome_java_test_support") { "//chrome/browser/flags:java", "//chrome/browser/language/android:java", "//chrome/browser/preferences:java", + "//chrome/browser/prefetch/android:java", "//chrome/browser/profiles/android:java", "//chrome/browser/settings:test_support_java", "//chrome/browser/signin/services/android:java", diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java index 4a88eb0ac477d..4a512dacf591c 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java @@ -33,7 +33,8 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.infobar.InfoBarContainer; import org.chromium.chrome.browser.init.ChromeBrowserInitializer; -import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesSettingsBridge; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesState; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.ui.appmenu.AppMenuCoordinator; @@ -241,7 +242,11 @@ public void setNetworkPredictionEnabled(final boolean enabled) { InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { - PrivacyPreferencesManagerImpl.getInstance().setNetworkPredictionEnabled(enabled); + if (enabled) { + PreloadPagesSettingsBridge.setState(PreloadPagesState.STANDARD_PRELOADING); + } else { + PreloadPagesSettingsBridge.setState(PreloadPagesState.NO_PRELOADING); + } } }); } diff --git a/components/no_state_prefetch/browser/no_state_prefetch_manager.cc b/components/no_state_prefetch/browser/no_state_prefetch_manager.cc index de625607918a3..bbacc38c44875 100644 --- a/components/no_state_prefetch/browser/no_state_prefetch_manager.cc +++ b/components/no_state_prefetch/browser/no_state_prefetch_manager.cc @@ -497,11 +497,6 @@ bool NoStatePrefetchManager::IsPredictionEnabled(Origin origin) { return true; } - // TODO(crbug.com/1121970): Remove this check once we're no longer running the - // experiment "PredictivePrefetchingAllowedOnAllConnectionTypes". - if (delegate_->IsPredictionDisabledDueToNetwork(origin)) - return false; - return delegate_->IsNetworkPredictionPreferenceEnabled(); } @@ -557,10 +552,7 @@ NoStatePrefetchManager::StartPrefetchingWithPreconnectFallback( } if (!IsPredictionEnabled(origin)) { - FinalStatus final_status = - delegate_->IsPredictionDisabledDueToNetwork(origin) - ? FINAL_STATUS_CELLULAR_NETWORK - : FINAL_STATUS_PRERENDERING_DISABLED; + FinalStatus final_status = FINAL_STATUS_PRERENDERING_DISABLED; SkipNoStatePrefetchContentsAndMaybePreconnect(url, origin, final_status); return nullptr; }