diff options
author | dominich@google.com <dominich@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-16 20:06:09 +0000 |
---|---|---|
committer | dominich@google.com <dominich@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-16 20:06:09 +0000 |
commit | ec17231bb10d63d515ceb0617123ce317eae36ce (patch) | |
tree | c0c279480d8501ed3dcf742dde368d62a79a14c7 /chrome/browser/prerender | |
parent | 745155ed102385431c57dcdb85e26afef417debd (diff) | |
download | chromium_src-ec17231bb10d63d515ceb0617123ce317eae36ce.zip chromium_src-ec17231bb10d63d515ceb0617123ce317eae36ce.tar.gz chromium_src-ec17231bb10d63d515ceb0617123ce317eae36ce.tar.bz2 |
Cancel prerender when we discover a download starting from a page we are prerendering.
BUG=71214
TEST=Search for carbon poker download and wait. The first result, which has a <link rel="prefetch"> will not cause a prerender as the download that the next page starts will cancel it.
Review URL: http://codereview.chromium.org/6459005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@75168 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/prerender')
-rw-r--r-- | chrome/browser/prerender/prerender_browsertest.cc | 23 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_contents.cc | 25 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_final_status.h | 1 |
3 files changed, 47 insertions, 2 deletions
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc index 6088650..18710a0 100644 --- a/chrome/browser/prerender/prerender_browsertest.cc +++ b/chrome/browser/prerender/prerender_browsertest.cc @@ -114,7 +114,6 @@ class PrerenderBrowserTest : public InProcessBrowserTest { FinalStatus expected_final_status, int total_navigations) { ASSERT_TRUE(test_server()->Start()); - std::string src_path = "files/prerender/prerender_loader.html?"; src_path.append(html_file); std::string dest_path = "files/prerender/"; @@ -249,6 +248,28 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderRedirect) { NavigateToDestURL(); } +// Prerenders a page that contains an automatic download triggered through an +// iframe. This should not prerender successfully. +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadIFrame) { + PrerenderTestURL("prerender_download_iframe.html", + FINAL_STATUS_DOWNLOAD, 1); +} + +// Prerenders a page that contains an automatic download triggered through +// Javascript changing the window.location. This should not prerender +// successfully. +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadLocation) { + PrerenderTestURL("prerender_download_location.html", + FINAL_STATUS_DOWNLOAD, 2); +} + +// Prerenders a page that contains an automatic download triggered through a +// <meta http-equiv="refresh"> tag. This should not prerender successfully. +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadRefresh) { + PrerenderTestURL("prerender_download_refresh.html", + FINAL_STATUS_DOWNLOAD, 2); +} + // Checks that the referrer is set when prerendering. IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrer) { PrerenderTestURL("prerender_referrer.html", diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc index a5d7975..7428b0e 100644 --- a/chrome/browser/prerender/prerender_contents.cc +++ b/chrome/browser/prerender/prerender_contents.cc @@ -87,6 +87,10 @@ void PrerenderContents::StartPrerendering() { registrar_.Add(this, NotificationType::AUTH_CANCELLED, NotificationService::AllSources()); + // Register all responses to see if we should cancel. + registrar_.Add(this, NotificationType::DOWNLOAD_INITIATED, + NotificationService::AllSources()); + DCHECK(load_start_time_.is_null()); load_start_time_ = base::TimeTicks::Now(); @@ -101,6 +105,7 @@ void PrerenderContents::StartPrerendering() { void PrerenderContents::set_final_status(FinalStatus final_status) { DCHECK(final_status >= FINAL_STATUS_USED && final_status < FINAL_STATUS_MAX); DCHECK_EQ(FINAL_STATUS_MAX, final_status_); + final_status_ = final_status; } @@ -190,6 +195,7 @@ void PrerenderContents::Observe(NotificationType type, case NotificationType::PROFILE_DESTROYED: Destroy(FINAL_STATUS_PROFILE_DESTROYED); return; + case NotificationType::APP_TERMINATING: Destroy(FINAL_STATUS_APP_TERMINATING); return; @@ -205,8 +211,25 @@ void PrerenderContents::Observe(NotificationType type, LoginHandler* handler = details_ptr->handler(); DCHECK(handler != NULL); RenderViewHostDelegate* delegate = handler->GetRenderViewHostDelegate(); - if (controller == NULL && delegate == this) + if (controller == NULL && delegate == this) { Destroy(FINAL_STATUS_AUTH_NEEDED); + return; + } + break; + } + + case NotificationType::DOWNLOAD_INITIATED: { + // If the download is started from a RenderViewHost that we are + // delegating, kill the prerender. This cancels any pending requests + // though the download never actually started thanks to the + // DownloadRequestLimiter. + DCHECK(NotificationService::NoDetails() == details); + RenderViewHost* rvh = Source<RenderViewHost>(source).ptr(); + CHECK(rvh != NULL); + if (rvh->delegate() == this) { + Destroy(FINAL_STATUS_DOWNLOAD); + return; + } break; } diff --git a/chrome/browser/prerender/prerender_final_status.h b/chrome/browser/prerender/prerender_final_status.h index ab90f03..fba235c 100644 --- a/chrome/browser/prerender/prerender_final_status.h +++ b/chrome/browser/prerender/prerender_final_status.h @@ -21,6 +21,7 @@ enum FinalStatus { FINAL_STATUS_JAVASCRIPT_ALERT, FINAL_STATUS_AUTH_NEEDED, FINAL_STATUS_HTTPS, + FINAL_STATUS_DOWNLOAD, FINAL_STATUS_MAX, }; |