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