summaryrefslogtreecommitdiffstats
path: root/chrome/browser/prerender
diff options
context:
space:
mode:
authordominich@google.com <dominich@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-16 20:06:09 +0000
committerdominich@google.com <dominich@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-16 20:06:09 +0000
commitec17231bb10d63d515ceb0617123ce317eae36ce (patch)
treec0c279480d8501ed3dcf742dde368d62a79a14c7 /chrome/browser/prerender
parent745155ed102385431c57dcdb85e26afef417debd (diff)
downloadchromium_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.cc23
-rw-r--r--chrome/browser/prerender/prerender_contents.cc25
-rw-r--r--chrome/browser/prerender/prerender_final_status.h1
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,
};