15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/command_line.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/prefs/pref_service.h"
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/run_loop.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/net/prediction_options.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/pref_names.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/common/prefetch_messages.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/public/browser/render_frame_host.h"
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/public/browser/web_contents.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "net/base/network_change_notifier.h"
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/url_request/url_request_filter.h"
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/url_request/url_request_job.h"
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using chrome_browser_net::NetworkPredictionOptions;
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using content::BrowserThread;
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using net::NetworkChangeNotifier;
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kPrefetchPage[] = "files/prerender/simple_prefetch.html";
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class MockNetworkChangeNotifierWIFI : public NetworkChangeNotifier {
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public:
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual ConnectionType GetCurrentConnectionType() const OVERRIDE {
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return NetworkChangeNotifier::CONNECTION_WIFI;
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class MockNetworkChangeNotifier4G : public NetworkChangeNotifier {
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public:
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual ConnectionType GetCurrentConnectionType() const OVERRIDE {
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return NetworkChangeNotifier::CONNECTION_4G;
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PrefetchBrowserTestBase : public InProcessBrowserTest {
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  explicit PrefetchBrowserTestBase(bool disabled_via_field_trial)
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      : disabled_via_field_trial_(disabled_via_field_trial) {}
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (disabled_via_field_trial_) {
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      command_line->AppendSwitchASCII(switches::kForceFieldTrials,
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                      "Prefetch/ExperimentDisabled/");
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void SetPreference(NetworkPredictionOptions value) {
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    browser()->profile()->GetPrefs()->SetInteger(
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        prefs::kNetworkPredictionOptions, value);
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool RunPrefetchExperiment(bool expect_success, Browser* browser) {
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GURL url = test_server()->GetURL(kPrefetchPage);
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::string16 expected_title =
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expect_success ? base::ASCIIToUTF16("link onload")
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       : base::ASCIIToUTF16("link onerror");
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content::TitleWatcher title_watcher(
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        browser->tab_strip_model()->GetActiveWebContents(), expected_title);
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser, url);
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return expected_title == title_watcher.WaitAndGetTitle();
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool disabled_via_field_trial_;
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class PrefetchBrowserTestPrediction : public PrefetchBrowserTestBase {
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  PrefetchBrowserTestPrediction() : PrefetchBrowserTestBase(false) {}
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class PrefetchBrowserTestPredictionDisabled : public PrefetchBrowserTestBase {
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  PrefetchBrowserTestPredictionDisabled() : PrefetchBrowserTestBase(true) {}
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// URLRequestJob (and associated handler) which hangs.
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class HangingURLRequestJob : public net::URLRequestJob {
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  HangingURLRequestJob(net::URLRequest* request,
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       net::NetworkDelegate* network_delegate)
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      : net::URLRequestJob(request, network_delegate) {}
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // net::URLRequestJob implementation
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void Start() OVERRIDE {}
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual ~HangingURLRequestJob() {}
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HangingURLRequestJob);
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class HangingRequestInterceptor : public net::URLRequestInterceptor {
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  explicit HangingRequestInterceptor(const base::Closure& callback)
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      : callback_(callback) {}
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual ~HangingRequestInterceptor() {}
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual net::URLRequestJob* MaybeInterceptRequest(
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      net::URLRequest* request,
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      net::NetworkDelegate* network_delegate) const OVERRIDE {
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!callback_.is_null())
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback_);
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return new HangingURLRequestJob(request, network_delegate);
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::Closure callback_;
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CreateHangingRequestInterceptorOnIO(const GURL& url,
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                         base::Closure callback) {
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<net::URLRequestInterceptor> never_respond_handler(
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new HangingRequestInterceptor(callback));
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  net::URLRequestFilter::GetInstance()->AddUrlInterceptor(
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      url, never_respond_handler.Pass());
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Prefetch is disabled via field experiment.  Prefetch should be dropped.
13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrefetchBrowserTestPredictionDisabled,
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                       ExperimentDisabled) {
13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CHECK(test_server()->Start());
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(RunPrefetchExperiment(false, browser()));
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Should not prefetch even if preference is ALWAYS.
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SetPreference(NetworkPredictionOptions::NETWORK_PREDICTION_ALWAYS);
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(RunPrefetchExperiment(false, browser()));
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Prefetch should be allowed depending on preference and network type.
14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrefetchBrowserTestPrediction, PreferenceWorks) {
14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CHECK(test_server()->Start());
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Set real NetworkChangeNotifier singleton aside.
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<NetworkChangeNotifier::DisableForTest> disable_for_test(
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new NetworkChangeNotifier::DisableForTest);
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Preference defaults to WIFI_ONLY: prefetch when not on cellular.
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifierWIFI);
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_TRUE(RunPrefetchExperiment(true, browser()));
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifier4G);
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_TRUE(RunPrefetchExperiment(false, browser()));
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Set preference to ALWAYS: always prefetch.
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SetPreference(NetworkPredictionOptions::NETWORK_PREDICTION_ALWAYS);
16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifierWIFI);
16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_TRUE(RunPrefetchExperiment(true, browser()));
16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifier4G);
16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_TRUE(RunPrefetchExperiment(true, browser()));
17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
17203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Set preference to NEVER: never prefetch.
17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SetPreference(NetworkPredictionOptions::NETWORK_PREDICTION_NEVER);
17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifierWIFI);
17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_TRUE(RunPrefetchExperiment(false, browser()));
17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
17803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifier4G);
18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_TRUE(RunPrefetchExperiment(false, browser()));
18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Bug 339909: When in incognito mode the browser crashed due to an
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// uninitialized preference member. Verify that it no longer does.
18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrefetchBrowserTestPrediction, IncognitoTest) {
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Profile* incognito_profile = browser()->profile()->GetOffTheRecordProfile();
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Browser* incognito_browser = new Browser(
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Browser::CreateParams(incognito_profile, browser()->host_desktop_type()));
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Navigate just to have a tab in this window, otherwise there is no
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // WebContents for the incognito browser.
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui_test_utils::OpenURLOffTheRecord(browser()->profile(), GURL("about:blank"));
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CHECK(test_server()->Start());
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(RunPrefetchExperiment(true, incognito_browser));
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// This test will verify the following:
200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// - that prefetches from the browser are actually launched
201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// - if a prefetch is in progress, but the originating renderer is destroyed,
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//   that the pending prefetch request is cleaned up cleanly and does not
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//   result in a crash.
20403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrefetchBrowserTestPrediction, PrefetchFromBrowser) {
205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const GURL kHangingUrl("http://hanging-url.com");
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::RunLoop loop_;
207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::IO,
208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          FROM_HERE,
209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          base::Bind(&CreateHangingRequestInterceptorOnIO,
210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                     kHangingUrl,
211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                     loop_.QuitClosure()));
212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  content::RenderFrameHost* rfh =
214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame();
215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  rfh->Send(new PrefetchMsg_Prefetch(rfh->GetRoutingID(), kHangingUrl));
216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  loop_.Run();
217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace
220