| Index: chrome/browser/prerender/prerender_browsertest.cc
|
| diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
|
| index 7b11d463c530c7a2d9911639a4666cb8b2baf45f..8890d47e11f379fd63568ac8b7e66bb348d8ef3e 100644
|
| --- a/chrome/browser/prerender/prerender_browsertest.cc
|
| +++ b/chrome/browser/prerender/prerender_browsertest.cc
|
| @@ -30,9 +30,11 @@
|
| #include "chrome/browser/extensions/extension_apitest.h"
|
| #include "chrome/browser/external_protocol/external_protocol_handler.h"
|
| #include "chrome/browser/favicon/favicon_tab_helper.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/prerender/prerender_contents.h"
|
| +#include "chrome/browser/prerender/prerender_field_trial.h"
|
| #include "chrome/browser/prerender/prerender_handle.h"
|
| #include "chrome/browser/prerender/prerender_link_manager.h"
|
| #include "chrome/browser/prerender/prerender_link_manager_factory.h"
|
| @@ -66,6 +68,8 @@
|
| #include "chrome/test/base/in_process_browser_test.h"
|
| #include "chrome/test/base/test_switches.h"
|
| #include "chrome/test/base/ui_test_utils.h"
|
| +#include "components/variations/entropy_provider.h"
|
| +#include "components/variations/variations_associated_data.h"
|
| #include "content/public/browser/browser_message_filter.h"
|
| #include "content/public/browser/devtools_agent_host.h"
|
| #include "content/public/browser/navigation_controller.h"
|
| @@ -98,6 +102,7 @@
|
| #include "ui/base/l10n/l10n_util.h"
|
| #include "url/gurl.h"
|
|
|
| +using chrome_browser_net::NetworkPredictionOptions;
|
| using content::BrowserThread;
|
| using content::DevToolsAgentHost;
|
| using content::NavigationController;
|
| @@ -109,6 +114,7 @@ using content::RenderWidgetHost;
|
| using content::TestNavigationObserver;
|
| using content::WebContents;
|
| using content::WebContentsObserver;
|
| +using net::NetworkChangeNotifier;
|
| using task_manager::browsertest_util::WaitForTaskManagerRows;
|
|
|
| // Prerender tests work as follows:
|
| @@ -125,6 +131,20 @@ namespace prerender {
|
|
|
| namespace {
|
|
|
| +class MockNetworkChangeNotifierWIFI : public NetworkChangeNotifier {
|
| + public:
|
| + virtual ConnectionType GetCurrentConnectionType() const OVERRIDE {
|
| + return NetworkChangeNotifier::CONNECTION_WIFI;
|
| + }
|
| +};
|
| +
|
| +class MockNetworkChangeNotifier4G : public NetworkChangeNotifier {
|
| + public:
|
| + virtual ConnectionType GetCurrentConnectionType() const OVERRIDE {
|
| + return NetworkChangeNotifier::CONNECTION_4G;
|
| + }
|
| +};
|
| +
|
| // Constants used in the test HTML files.
|
| const char* kReadyTitle = "READY";
|
| const char* kPassTitle = "PASS";
|
| @@ -1070,6 +1090,80 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest {
|
| command_line->AppendSwitch(switches::kAlwaysAuthorizePlugins);
|
| }
|
|
|
| + void SetPreference(NetworkPredictionOptions value) {
|
| + browser()->profile()->GetPrefs()->SetInteger(
|
| + prefs::kNetworkPredictionOptions, value);
|
| + }
|
| +
|
| + void CreateTestFieldTrial(const std::string& name,
|
| + const std::string& group_name) {
|
| + base::FieldTrial* trial = base::FieldTrialList::CreateFieldTrial(
|
| + name, group_name);
|
| + trial->group();
|
| + }
|
| +
|
| + // Verifies, for the current field trial, whether
|
| + // ShouldDisableLocalPredictorDueToPreferencesAndNetwork produces the desired
|
| + // output.
|
| + void TestShouldDisableLocalPredictorPreferenceNetworkMatrix(
|
| + bool preference_wifi_network_wifi,
|
| + bool preference_wifi_network_4g,
|
| + bool preference_always_network_wifi,
|
| + bool preference_always_network_4g,
|
| + bool preference_never_network_wifi,
|
| + bool preference_never_network_4g) {
|
| + Profile* profile = browser()->profile();
|
| +
|
| + // Set real NetworkChangeNotifier singleton aside.
|
| + scoped_ptr<NetworkChangeNotifier::DisableForTest> disable_for_test(
|
| + new NetworkChangeNotifier::DisableForTest);
|
| +
|
| + // Set preference to WIFI_ONLY: prefetch when not on cellular.
|
| + SetPreference(NetworkPredictionOptions::NETWORK_PREDICTION_WIFI_ONLY);
|
| + {
|
| + scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifierWIFI);
|
| + EXPECT_EQ(
|
| + ShouldDisableLocalPredictorDueToPreferencesAndNetwork(profile),
|
| + preference_wifi_network_wifi);
|
| + }
|
| + {
|
| + scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifier4G);
|
| + EXPECT_EQ(
|
| + ShouldDisableLocalPredictorDueToPreferencesAndNetwork(profile),
|
| + preference_wifi_network_4g);
|
| + }
|
| +
|
| + // Set preference to ALWAYS: always prefetch.
|
| + SetPreference(NetworkPredictionOptions::NETWORK_PREDICTION_ALWAYS);
|
| + {
|
| + scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifierWIFI);
|
| + EXPECT_EQ(
|
| + ShouldDisableLocalPredictorDueToPreferencesAndNetwork(profile),
|
| + preference_always_network_wifi);
|
| + }
|
| + {
|
| + scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifier4G);
|
| + EXPECT_EQ(
|
| + ShouldDisableLocalPredictorDueToPreferencesAndNetwork(profile),
|
| + preference_always_network_4g);
|
| + }
|
| +
|
| + // Set preference to NEVER: never prefetch.
|
| + SetPreference(NetworkPredictionOptions::NETWORK_PREDICTION_NEVER);
|
| + {
|
| + scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifierWIFI);
|
| + EXPECT_EQ(
|
| + ShouldDisableLocalPredictorDueToPreferencesAndNetwork(profile),
|
| + preference_never_network_wifi);
|
| + }
|
| + {
|
| + scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifier4G);
|
| + EXPECT_EQ(
|
| + ShouldDisableLocalPredictorDueToPreferencesAndNetwork(profile),
|
| + preference_never_network_4g);
|
| + }
|
| + }
|
| +
|
| virtual void SetUpOnMainThread() OVERRIDE {
|
| current_browser()->profile()->GetPrefs()->SetBoolean(
|
| prefs::kPromptForDownload, false);
|
| @@ -1669,6 +1763,7 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest {
|
| std::string loader_query_;
|
| Browser* explicitly_set_browser_;
|
| base::HistogramTester histogram_tester_;
|
| + scoped_ptr<base::FieldTrialList> field_trial_list_;
|
| };
|
|
|
| // Checks that a page is correctly prerendered in the case of a
|
| @@ -4453,4 +4548,66 @@ IN_PROC_BROWSER_TEST_F(PrerenderOmniboxBrowserTest,
|
| GetAutocompleteActionPredictor()->IsPrerenderAbandonedForTesting());
|
| }
|
|
|
| +// Prefetch should be allowed depending on preference and network type.
|
| +// This test is for the bsae case: no Finch overrides should never disable.
|
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
|
| + LocalPredictorDisableWorksBaseCase) {
|
| + TestShouldDisableLocalPredictorPreferenceNetworkMatrix(
|
| + false /*preference_wifi_network_wifi*/,
|
| + false /*preference_wifi_network_4g*/,
|
| + false /*preference_always_network_wifi*/,
|
| + false /*preference_always_network_4g*/,
|
| + false /*preference_never_network_wifi*/,
|
| + false /*preference_never_network_4g*/);
|
| +}
|
| +
|
| +// Prefetch should be allowed depending on preference and network type.
|
| +// LocalPredictorOnCellularOnly should disable all wifi cases.
|
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
|
| + LocalPredictorDisableWorksCellularOnly) {
|
| + CreateTestFieldTrial("PrerenderLocalPredictorSpec",
|
| + "LocalPredictorOnCellularOnly=Enabled");
|
| + TestShouldDisableLocalPredictorPreferenceNetworkMatrix(
|
| + true /*preference_wifi_network_wifi*/,
|
| + false /*preference_wifi_network_4g*/,
|
| + true /*preference_always_network_wifi*/,
|
| + false /*preference_always_network_4g*/,
|
| + true /*preference_never_network_wifi*/,
|
| + false /*preference_never_network_4g*/);
|
| +}
|
| +
|
| +// Prefetch should be allowed depending on preference and network type.
|
| +// LocalPredictorNetworkPredictionEnabledOnly should disable whenever
|
| +// network predictions will not be exercised.
|
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
|
| + LocalPredictorDisableWorksNetworkPredictionEnableOnly) {
|
| + CreateTestFieldTrial("PrerenderLocalPredictorSpec",
|
| + "LocalPredictorNetworkPredictionEnabledOnly=Enabled");
|
| + TestShouldDisableLocalPredictorPreferenceNetworkMatrix(
|
| + false /*preference_wifi_network_wifi*/,
|
| + true /*preference_wifi_network_4g*/,
|
| + false /*preference_always_network_wifi*/,
|
| + false /*preference_always_network_4g*/,
|
| + true /*preference_never_network_wifi*/,
|
| + true /*preference_never_network_4g*/);
|
| +}
|
| +
|
| +// Prefetch should be allowed depending on preference and network type.
|
| +// If LocalPredictorNetworkPredictionEnabledOnly and
|
| +// LocalPredictorOnCellularOnly are both selected, we must disable whenever
|
| +// network predictions are not exercised, or when we are on wifi.
|
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
|
| + LocalPredictorDisableWorksBothOptions) {
|
| + CreateTestFieldTrial("PrerenderLocalPredictorSpec",
|
| + "LocalPredictorOnCellularOnly=Enabled:"
|
| + "LocalPredictorNetworkPredictionEnabledOnly=Enabled");
|
| + TestShouldDisableLocalPredictorPreferenceNetworkMatrix(
|
| + true /*preference_wifi_network_wifi*/,
|
| + true /*preference_wifi_network_4g*/,
|
| + true /*preference_always_network_wifi*/,
|
| + false /*preference_always_network_4g*/,
|
| + true /*preference_never_network_wifi*/,
|
| + true /*preference_never_network_4g*/);
|
| +}
|
| +
|
| } // namespace prerender
|
|
|