diff options
author | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-19 01:49:49 +0000 |
---|---|---|
committer | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-19 01:49:49 +0000 |
commit | 9492576871b293e428cd60ae737b8ba7a09639c5 (patch) | |
tree | a46904bca80b1ccbf58328419bb778835cdde0c1 | |
parent | 60b4551c0d77622607c72bec670a6e9c748a4e84 (diff) | |
download | chromium_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
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> |