Skip to content

Commit

Permalink
Connect android Preload Pages UI with prefs.
Browse files Browse the repository at this point in the history
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 <ericorth@chromium.org>
Reviewed-by: David Trainor <dtrainor@chromium.org>
Reviewed-by: Robert Ogden <robertogden@chromium.org>
Reviewed-by: Max Curran <curranmax@chromium.org>
Commit-Queue: Simon Pelchat <spelchat@chromium.org>
Cr-Commit-Position: refs/heads/main@{#948236}
  • Loading branch information
Simon Pelchat authored and Chromium LUCI CQ committed Dec 3, 2021
1 parent fd74c22 commit e74bbb6
Show file tree
Hide file tree
Showing 53 changed files with 375 additions and 468 deletions.
Expand Up @@ -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;
Expand Down Expand Up @@ -137,7 +138,7 @@ boolean isTapSupported() {
*/
boolean shouldPrefetchSearchResult() {
if (isMandatoryPromoAvailable()
|| !PrivacyPreferencesManagerImpl.getInstance().getNetworkPredictionEnabled()) {
|| PreloadPagesSettingsBridge.getState() == PreloadPagesState.NO_PRELOADING) {
return false;
}

Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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()
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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();
Expand All @@ -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();
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -600,22 +601,20 @@ 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 {
Assert.assertTrue(
mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, null));
TestThreadUtils.runOnUiThreadBlocking(this::assertSpareWebContentsNotNullAndDestroy);
} finally {
TestThreadUtils.runOnUiThreadBlocking(
()
-> PrivacyPreferencesManagerImpl.getInstance()
.setNetworkPredictionEnabled(enabled));
TestThreadUtils.runOnUiThreadBlocking(() -> PreloadPagesSettingsBridge.setState(state));
}
}

Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}
};
}
Expand All @@ -220,8 +224,8 @@ public void testInfoBarExpirationNoPrerender() throws Exception {
TestThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() {
@Override
public Boolean call() {
return PrivacyPreferencesManagerImpl.getInstance()
.getNetworkPredictionEnabled();
return PreloadPagesSettingsBridge.getState()
!= PreloadPagesState.NO_PRELOADING;
}
});
try {
Expand Down
2 changes: 0 additions & 2 deletions chrome/browser/BUILD.gn
Expand Up @@ -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",
Expand Down
Expand Up @@ -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"
Expand All @@ -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();
Expand All @@ -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);
}
19 changes: 11 additions & 8 deletions chrome/browser/extensions/api/preference/preference_api.cc
Expand Up @@ -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"
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -240,21 +241,23 @@ class NetworkPredictionTransformer : public PrefTransformerInterface {
DCHECK(false) << "Preference not found.";
} else if (extension_pref->GetBool()) {
return std::make_unique<base::Value>(
chrome_browser_net::NETWORK_PREDICTION_DEFAULT);
static_cast<int>(prefetch::NetworkPredictionOptions::kDefault));
}
return std::make_unique<base::Value>(
chrome_browser_net::NETWORK_PREDICTION_NEVER);
static_cast<int>(prefetch::NetworkPredictionOptions::kDisabled));
}

std::unique_ptr<base::Value> 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<prefetch::NetworkPredictionOptions>(
browser_pref->GetInt());
}
return std::make_unique<base::Value>(
int_value != chrome_browser_net::NETWORK_PREDICTION_NEVER);
value != prefetch::NetworkPredictionOptions::kDisabled);
}
};

Expand Down Expand Up @@ -342,7 +345,7 @@ class PrefMapping {
std::make_unique<ProxyPrefTransformer>());
RegisterPrefTransformer(prefs::kCookieControlsMode,
std::make_unique<CookieControlsModeTransformer>());
RegisterPrefTransformer(prefs::kNetworkPredictionOptions,
RegisterPrefTransformer(prefetch::prefs::kNetworkPredictionOptions,
std::make_unique<NetworkPredictionTransformer>());
RegisterPrefTransformer(
prefs::kProtectedContentDefault,
Expand Down
16 changes: 9 additions & 7 deletions chrome/browser/extensions/api/preference/preference_apitest.cc
Expand Up @@ -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"
Expand Down Expand Up @@ -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<int>(prefetch::NetworkPredictionOptions::kDefault),
prefs->GetInteger(prefetch::prefs::kNetworkPredictionOptions));
EXPECT_TRUE(
prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService));
EXPECT_TRUE(prefs->GetBoolean(prefs::kSafeBrowsingEnabled));
Expand All @@ -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<int>(prefetch::NetworkPredictionOptions::kDisabled),
prefs->GetInteger(prefetch::prefs::kNetworkPredictionOptions));
EXPECT_FALSE(
prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService));
EXPECT_FALSE(prefs->GetBoolean(prefs::kSafeBrowsingEnabled));
Expand Down Expand Up @@ -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<int>(prefetch::NetworkPredictionOptions::kDisabled));
prefs->SetBoolean(password_manager::prefs::kCredentialsEnableService, false);
prefs->SetBoolean(prefs::kSafeBrowsingEnabled, false);
prefs->SetBoolean(prefs::kSearchSuggestEnabled, false);
Expand Down
Expand Up @@ -37,10 +37,6 @@ public boolean isMetricsReportingEnabled() {

// Boilerplate.
@Override
public boolean shouldPrerender() {
return false;
}
@Override
public void setUsageAndCrashReporting(boolean enabled) {}
@Override
public void syncUsageAndCrashReportingPrefs() {}
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit e74bbb6

Please sign in to comment.