Chromium Code Reviews| Index: chrome/browser/prefetch/prefetch_browsertest.cc |
| diff --git a/chrome/browser/prefetch/prefetch_browsertest.cc b/chrome/browser/prefetch/prefetch_browsertest.cc |
| index a870be6ffe72a269d4fb5bddb755f2206f67826c..4015169e19c0414f4a3fe4c971813d627c28c8ad 100644 |
| --- a/chrome/browser/prefetch/prefetch_browsertest.cc |
| +++ b/chrome/browser/prefetch/prefetch_browsertest.cc |
| @@ -4,15 +4,23 @@ |
| #include "base/command_line.h" |
| #include "base/prefs/pref_service.h" |
| +#include "base/run_loop.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/common/pref_names.h" |
| +#include "chrome/common/prefetch_messages.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| +#include "content/public/browser/render_frame_host.h" |
| +#include "content/public/browser/web_contents.h" |
| #include "content/public/test/browser_test_utils.h" |
| +#include "net/url_request/url_request_filter.h" |
| +#include "net/url_request/url_request_job.h" |
| + |
| +using content::BrowserThread; |
| namespace { |
| @@ -84,6 +92,50 @@ class PrefetchBrowserTestPredictionOffExpOff : public PrefetchBrowserTestBase { |
| : PrefetchBrowserTestBase(false, false) {} |
| }; |
| +// URLRequestJob (and associated handler) which hangs. |
| +class HangingURLRequestJob : public net::URLRequestJob { |
| + public: |
| + HangingURLRequestJob(net::URLRequest* request, |
| + net::NetworkDelegate* network_delegate) |
| + : net::URLRequestJob(request, network_delegate) { |
| + } |
| + |
| + virtual void Start() OVERRIDE {} |
| + |
| + private: |
| + virtual ~HangingURLRequestJob() {} |
| +}; |
| + |
| +class HangingRequestInterceptor : public net::URLRequestInterceptor { |
| + public: |
| + explicit HangingRequestInterceptor(base::Closure callback) |
| + : callback_(callback) { |
| + } |
| + |
| + virtual ~HangingRequestInterceptor() {} |
| + |
| + virtual net::URLRequestJob* MaybeInterceptRequest( |
| + net::URLRequest* request, |
| + net::NetworkDelegate* network_delegate) const OVERRIDE { |
| + if (!callback_.is_null()) { |
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback_); |
| + } |
| + return new HangingURLRequestJob(request, network_delegate); |
| + } |
| + |
| + private: |
| + base::Closure callback_; |
| +}; |
| + |
| +void CreateHangingRequestInterceptorOnIO(const GURL& url, |
| + base::Closure callback) { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + scoped_ptr<net::URLRequestInterceptor> never_respond_handler( |
| + new HangingRequestInterceptor(callback)); |
| + net::URLRequestFilter::GetInstance()->AddUrlInterceptor( |
| + url, never_respond_handler.Pass()); |
| +} |
| + |
| // Privacy option is on, experiment is on. Prefetch should succeed. |
| IN_PROC_BROWSER_TEST_F(PrefetchBrowserTestPredictionOnExpOn, PredOnExpOn) { |
| EXPECT_TRUE(RunPrefetchExperiment(true, browser())); |
| @@ -118,5 +170,20 @@ IN_PROC_BROWSER_TEST_F(PrefetchBrowserTestPredictionOnExpOn, IncognitoTest) { |
| EXPECT_TRUE(RunPrefetchExperiment(true, incognito_browser)); |
| } |
| -} // namespace |
| +IN_PROC_BROWSER_TEST_F(PrefetchBrowserTestPredictionOnExpOn, |
| + PrefetchFromBrowser) { |
| + const GURL kHangingUrl("http://hanging-url.com"); |
| + base::RunLoop loop_; |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&CreateHangingRequestInterceptorOnIO, |
| + kHangingUrl, |
| + loop_.QuitClosure())); |
| + ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); |
| + content::RenderFrameHost* rfh = |
| + browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame(); |
| + rfh->Send(new PrefetchMsg_Prefetch(rfh->GetRoutingID(), kHangingUrl)); |
| + loop_.Run(); |
|
jkarlin
2014/06/16 14:48:29
What is this test testing exactly?
tburkard
2014/06/16 15:02:57
Done.
added a comment explaining
|
| +} |
| +} // namespace |