Chromium Code Reviews| Index: chrome/browser/prerender/prerender_browsertest.cc |
| diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc |
| index 80199b50107ce2c2abdd60a37d4125ab72b3adec..44c3ed7b4ceb90d3926fc45518a84be1af6c45d1 100644 |
| --- a/chrome/browser/prerender/prerender_browsertest.cc |
| +++ b/chrome/browser/prerender/prerender_browsertest.cc |
| @@ -59,6 +59,8 @@ |
| #include "net/dns/mock_host_resolver.h" |
| #include "net/url_request/url_request_context.h" |
| #include "net/url_request/url_request_context_getter.h" |
| +#include "net/url_request/url_request_filter.h" |
| +#include "net/url_request/url_request_job.h" |
| #include "ui/base/l10n/l10n_util.h" |
| using content::BrowserThread; |
| @@ -579,6 +581,41 @@ class RestorePrerenderMode { |
| PrerenderManager::PrerenderManagerMode prev_mode_; |
| }; |
| +// URLRequestJob (and associated handler) which never starts. |
| +class NeverStartURLRequestJob : public net::URLRequestJob { |
| + public: |
| + NeverStartURLRequestJob(net::URLRequest* request, |
| + net::NetworkDelegate* network_delegate) : |
|
mmenke
2013/05/31 18:20:19
nit: Colon should go on next line.
Charlie Reis
2013/05/31 18:27:54
Done.
|
| + net::URLRequestJob(request, network_delegate) { |
| + } |
| + |
| + virtual void Start() OVERRIDE {} |
| + |
| + private: |
| + virtual ~NeverStartURLRequestJob() {} |
| +}; |
| + |
| +class NeverStartProtocolHandler : |
|
mmenke
2013/05/31 18:20:19
Per the style guide, colon should go on next line,
Charlie Reis
2013/05/31 18:27:54
Done.
|
| + public net::URLRequestJobFactory::ProtocolHandler { |
| + public: |
| + NeverStartProtocolHandler() {} |
| + virtual ~NeverStartProtocolHandler() {} |
| + |
| + virtual net::URLRequestJob* MaybeCreateJob( |
| + net::URLRequest* request, |
| + net::NetworkDelegate* network_delegate) const OVERRIDE { |
| + return new NeverStartURLRequestJob(request, network_delegate); |
| + } |
| +}; |
| + |
| +void CreateNeverStartProtocolHandlerOnIO(const GURL& url) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + scoped_ptr<net::URLRequestJobFactory::ProtocolHandler> never_respond_handler( |
| + new NeverStartProtocolHandler()); |
| + net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( |
| + url, never_respond_handler.Pass()); |
| +} |
| + |
| } // namespace |
| class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
| @@ -701,13 +738,14 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
| } |
| void NavigateToDestURL() const { |
| - NavigateToDestURLWithDisposition(CURRENT_TAB); |
| + NavigateToDestURLWithDisposition(CURRENT_TAB, true); |
| } |
| // Opens the url in a new tab, with no opener. |
| void NavigateToDestURLWithDisposition( |
| - WindowOpenDisposition disposition) const { |
| - NavigateToURLImpl(dest_url_, disposition); |
| + WindowOpenDisposition disposition, |
| + bool expect_swap_to_succeed) const { |
| + NavigateToURLImpl(dest_url_, disposition, expect_swap_to_succeed); |
| } |
| void OpenDestURLViaClick() const { |
| @@ -818,7 +856,7 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
| void NavigateToURL(const std::string& dest_html_file) const { |
| GURL dest_url = test_server()->GetURL(dest_html_file); |
| - NavigateToURLImpl(dest_url, CURRENT_TAB); |
| + NavigateToURLImpl(dest_url, CURRENT_TAB, true); |
| } |
| bool UrlIsInPrerenderManager(const std::string& html_file) const { |
| @@ -1085,7 +1123,8 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
| } |
| void NavigateToURLImpl(const GURL& dest_url, |
| - WindowOpenDisposition disposition) const { |
| + WindowOpenDisposition disposition, |
| + bool expect_swap_to_succeed) const { |
| ASSERT_NE(static_cast<PrerenderManager*>(NULL), GetPrerenderManager()); |
| // Make sure in navigating we have a URL to use in the PrerenderManager. |
| ASSERT_NE(static_cast<PrerenderContents*>(NULL), GetPrerenderContents()); |
| @@ -1118,10 +1157,11 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
| current_browser(), dest_url, disposition, |
| ui_test_utils::BROWSER_TEST_NONE); |
| - // Make sure the PrerenderContents found earlier was used or removed. |
| - EXPECT_EQ(static_cast<PrerenderContents*>(NULL), GetPrerenderContents()); |
| + // Make sure the PrerenderContents found earlier was used or removed, |
| + // unless we expect the swap in to fail. |
| + EXPECT_EQ(expect_swap_to_succeed, !GetPrerenderContents()); |
| - if (call_javascript_ && web_contents) { |
| + if (call_javascript_ && web_contents && expect_swap_to_succeed) { |
| if (page_load_observer.get()) |
| page_load_observer->Wait(); |
| @@ -1365,12 +1405,29 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibility) { |
| NavigateToDestURL(); |
| } |
| -// Checks that the visibility API works when the prerender is quickly opened |
| -// in a new tab before it stops loading. |
| -IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibilityQuickSwitch) { |
| - PrerenderTestURL("files/prerender/prerender_visibility_quick.html", |
| - FINAL_STATUS_USED, 0); |
| - NavigateToDestURL(); |
| +// Checks that the prerendering of a page is canceled correctly if we try to |
| +// swap it in before it commits. |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNoCommitNoSwap) { |
| + // Navigate to a page that triggers a prerender for a URL that never commits. |
| + const GURL no_commit_url("http://never-respond.example.com"); |
|
mmenke
2013/05/31 18:20:19
nit: Should this be kNoCommitUrl?
Charlie Reis
2013/05/31 18:27:54
Done.
|
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&CreateNeverStartProtocolHandlerOnIO, no_commit_url)); |
| + PrerenderTestURL(no_commit_url, |
| + FINAL_STATUS_CANCELLED, |
| + 0); |
| + |
| + // Navigate to the URL, but assume the contents won't be swapped in. |
| + NavigateToDestURLWithDisposition(CURRENT_TAB, false); |
| + |
| + // Confirm that the prerendered version of the URL is not swapped in, |
| + // since it never committed. |
| + EXPECT_TRUE(UrlIsInPrerenderManager(no_commit_url)); |
| + |
| + // Post a task to cancel all the prerenders, so that we don't wait further. |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); |
| + content::RunMessageLoop(); |
| } |
| // Checks that the prerendering of a page is canceled correctly when a |