summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-19 01:49:49 +0000
committercbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-19 01:49:49 +0000
commit9492576871b293e428cd60ae737b8ba7a09639c5 (patch)
treea46904bca80b1ccbf58328419bb778835cdde0c1
parent60b4551c0d77622607c72bec670a6e9c748a4e84 (diff)
downloadchromium_src-9492576871b293e428cd60ae737b8ba7a09639c5.zip
chromium_src-9492576871b293e428cd60ae737b8ba7a09639c5.tar.gz
chromium_src-9492576871b293e428cd60ae737b8ba7a09639c5.tar.bz2
Cancel prefetches within a prerender'ed page.
This prevents infinite loops of prerenders, but also prevents chains of prerendered pages from being an option. A separate CL will address that case. BUG=72519 TEST=browser_tests --gtest_filter="PrerenderBrowserTest.PrerenderInfiniteLoop" Review URL: http://codereview.chromium.org/6714020 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@78798 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/prerender/prerender_browsertest.cc6
-rw-r--r--chrome/browser/prerender/prerender_final_status.h1
-rw-r--r--chrome/browser/prerender/prerender_resource_handler.cc4
-rw-r--r--chrome/test/data/prerender/prerender_infinite_a.html20
-rw-r--r--chrome/test/data/prerender/prerender_infinite_b.html20
5 files changed, 51 insertions, 0 deletions
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index 5ea44d6..261827a 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -353,4 +353,10 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderExcessiveMemory) {
FINAL_STATUS_MEMORY_LIMIT_EXCEEDED, 1);
}
+// Checks that we don't prerender in an infinite loop.
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderInfiniteLoop) {
+ PrerenderTestURL("prerender_infinite_a.html", FINAL_STATUS_USED, 1);
+ NavigateToDestURL();
+}
+
} // namespace prerender
diff --git a/chrome/browser/prerender/prerender_final_status.h b/chrome/browser/prerender/prerender_final_status.h
index bf2072c..d91c31a 100644
--- a/chrome/browser/prerender/prerender_final_status.h
+++ b/chrome/browser/prerender/prerender_final_status.h
@@ -26,6 +26,7 @@ enum FinalStatus {
FINAL_STATUS_JS_OUT_OF_MEMORY,
FINAL_STATUS_RENDERER_UNRESPONSIVE,
FINAL_STATUS_TOO_MANY_PROCESSES,
+ FINAL_STATUS_NESTED,
FINAL_STATUS_MAX,
};
diff --git a/chrome/browser/prerender/prerender_resource_handler.cc b/chrome/browser/prerender/prerender_resource_handler.cc
index 3e47e4a..3d0bb96 100644
--- a/chrome/browser/prerender/prerender_resource_handler.cc
+++ b/chrome/browser/prerender/prerender_resource_handler.cc
@@ -55,6 +55,10 @@ PrerenderResourceHandler* PrerenderResourceHandler::MaybeCreate(
ResourceHandler* next_handler) {
if (!context || !context->prerender_manager())
return NULL;
+ if (request.load_flags() & net::LOAD_PRERENDER) {
+ RecordFinalStatus(FINAL_STATUS_NESTED);
+ return NULL;
+ }
if (!(request.load_flags() & net::LOAD_PREFETCH))
return NULL;
if (!ShouldPrerenderURL(request.url()))
diff --git a/chrome/test/data/prerender/prerender_infinite_a.html b/chrome/test/data/prerender/prerender_infinite_a.html
new file mode 100644
index 0000000..d40dbf5
--- /dev/null
+++ b/chrome/test/data/prerender/prerender_infinite_a.html
@@ -0,0 +1,20 @@
+<html>
+ <head>
+ <script>
+ var pageWasPrerendered = false;
+
+ function DidPrerenderPass() {
+ pageWasPrerendered = true;
+ return true;
+ }
+
+ function DidDisplayPass() {
+ return pageWasPrerendered;
+ }
+ </script>
+ </head>
+ <body>
+ <link rel="prefetch" href="prerender_infinite_b.html">
+ <a href="prerender_infinite_b.html">B</a>
+ </body>
+</html>
diff --git a/chrome/test/data/prerender/prerender_infinite_b.html b/chrome/test/data/prerender/prerender_infinite_b.html
new file mode 100644
index 0000000..a3ac7ca
--- /dev/null
+++ b/chrome/test/data/prerender/prerender_infinite_b.html
@@ -0,0 +1,20 @@
+<html>
+ <head>
+ <script>
+ var pageWasPrerendered = false;
+
+ function DidPrerenderPass() {
+ pageWasPrerendered = true;
+ return true;
+ }
+
+ function DidDisplayPass() {
+ return pageWasPrerendered;
+ }
+ </script>
+ </head>
+ <body>
+ <link rel="prefetch" href="prerender_infinite_a.html">
+ <a href="prerender_infinite_a.html">A</a>
+ </body>
+</html>