| 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..3d5c933d2a5b85cfb2b0c5e4077a0c58fb849874 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)
|
| + : net::URLRequestJob(request, network_delegate) {
|
| + }
|
| +
|
| + virtual void Start() OVERRIDE {}
|
| +
|
| + private:
|
| + virtual ~NeverStartURLRequestJob() {}
|
| +};
|
| +
|
| +class NeverStartProtocolHandler
|
| + : 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) {
|
| + CHECK(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 kNoCommitUrl("http://never-respond.example.com");
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&CreateNeverStartProtocolHandlerOnIO, kNoCommitUrl));
|
| + PrerenderTestURL(kNoCommitUrl,
|
| + 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(kNoCommitUrl));
|
| +
|
| + // 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
|
|
|