summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authormmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-07 19:15:35 +0000
committermmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-07 19:15:35 +0000
commit375e8bd5221052ac14da317fb67de78deb33b93d (patch)
tree13c89b8a5e3fdd15063ac1ec747ce442b8e85b3d /chrome
parent97096b165dccb3dbbbdb388a99b93c04a17ad98d (diff)
downloadchromium_src-375e8bd5221052ac14da317fb67de78deb33b93d.zip
chromium_src-375e8bd5221052ac14da317fb67de78deb33b93d.tar.gz
chromium_src-375e8bd5221052ac14da317fb67de78deb33b93d.tar.bz2
Renderer process keeps track of prerendering state across redirects.
BUG=71943 TEST=PrerenderBrowserTest.PrerenderRedirect Review URL: http://codereview.chromium.org/6410085 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@74013 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/prerender/prerender_browsertest.cc45
-rw-r--r--chrome/renderer/render_view.cc12
-rw-r--r--chrome/test/data/prerender/prerender_redirect.html10
3 files changed, 56 insertions, 11 deletions
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index 2d7c758..22a2770 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -55,6 +55,9 @@ class TestPrerenderContents : public PrerenderContents {
}
bool did_finish_loading() const { return did_finish_loading_; }
+ void set_did_finish_loading(bool did_finish_loading) {
+ did_finish_loading_ = did_finish_loading;
+ }
private:
bool did_finish_loading_;
@@ -102,7 +105,8 @@ class PrerenderBrowserTest : public InProcessBrowserTest {
}
void PrerenderTestURL(const std::string& html_file,
- PrerenderContents::FinalStatus expected_final_status) {
+ PrerenderContents::FinalStatus expected_final_status,
+ int total_navigations) {
ASSERT_TRUE(test_server()->Start());
std::string src_path = "files/prerender/prerender_loader.html?";
@@ -128,11 +132,23 @@ class PrerenderBrowserTest : public InProcessBrowserTest {
// handle browser navigation directly.
browser()->OpenURL(src_url, GURL(), CURRENT_TAB, PageTransition::TYPED);
- ui_test_utils::RunMessageLoop();
-
- TestPrerenderContents* prerender_contents =
- static_cast<TestPrerenderContents*>(
- prerender_manager->FindEntry(dest_url_));
+ TestPrerenderContents* prerender_contents = NULL;
+ int navigations = 0;
+ while (true) {
+ ui_test_utils::RunMessageLoop();
+ ++navigations;
+
+ prerender_contents =
+ static_cast<TestPrerenderContents*>(
+ prerender_manager->FindEntry(dest_url_));
+ if (prerender_contents == NULL ||
+ !prerender_contents->did_finish_loading() ||
+ navigations >= total_navigations) {
+ EXPECT_EQ(navigations, total_navigations);
+ break;
+ }
+ prerender_contents->set_did_finish_loading(false);
+ }
switch (expected_final_status) {
case PrerenderContents::FINAL_STATUS_USED: {
@@ -184,7 +200,7 @@ class PrerenderBrowserTest : public InProcessBrowserTest {
// navigation.
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) {
PrerenderTestURL("prerender_page.html",
- PrerenderContents::FINAL_STATUS_USED);
+ PrerenderContents::FINAL_STATUS_USED, 1);
NavigateToDestURL();
}
@@ -193,7 +209,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) {
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertBeforeOnload) {
PrerenderTestURL(
"prerender_alert_before_onload.html",
- PrerenderContents::FINAL_STATUS_JAVASCRIPT_ALERT);
+ PrerenderContents::FINAL_STATUS_JAVASCRIPT_ALERT, 1);
}
// Checks that the prerendering of a page is canceled correctly when a
@@ -201,14 +217,14 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertBeforeOnload) {
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertAfterOnload) {
PrerenderTestURL(
"prerender_alert_after_onload.html",
- PrerenderContents::FINAL_STATUS_JAVASCRIPT_ALERT);
+ PrerenderContents::FINAL_STATUS_JAVASCRIPT_ALERT, 1);
}
// Checks that plugins are not loaded while a page is being preloaded, but
// are loaded when the page is displayed.
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDelayLoadPlugin) {
PrerenderTestURL("plugin_delay_load.html",
- PrerenderContents::FINAL_STATUS_USED);
+ PrerenderContents::FINAL_STATUS_USED, 1);
NavigateToDestURL();
}
@@ -217,5 +233,12 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDelayLoadPlugin) {
// prerender successfully.
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttpAuthentication) {
PrerenderTestURL("prerender_http_auth_container.html",
- PrerenderContents::FINAL_STATUS_AUTH_NEEDED);
+ PrerenderContents::FINAL_STATUS_AUTH_NEEDED, 1);
+}
+
+// Checks that redirects work with prerendering.
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderRedirect) {
+ PrerenderTestURL("prerender_redirect.html",
+ PrerenderContents::FINAL_STATUS_USED, 2);
+ NavigateToDestURL();
}
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 964e292..34c5b90 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -3262,6 +3262,18 @@ void RenderView::didCreateDataSource(WebFrame* frame, WebDataSource* ds) {
state->set_user_script_idle_scheduler(
new UserScriptIdleScheduler(this, frame));
}
+
+ // If the RenderView was prerendering before, it is still prerendering.
+ if (!frame->parent() && content_initiated) {
+ WebDataSource* ds_old = webview()->mainFrame()->dataSource();
+ if (ds_old) {
+ NavigationState* navigation_state =
+ NavigationState::FromDataSource(ds_old);
+ if (navigation_state)
+ state->set_is_prerendering(navigation_state->is_prerendering());
+ }
+ }
+
ds->setExtraData(state);
}
diff --git a/chrome/test/data/prerender/prerender_redirect.html b/chrome/test/data/prerender/prerender_redirect.html
new file mode 100644
index 0000000..ac913b1
--- /dev/null
+++ b/chrome/test/data/prerender/prerender_redirect.html
@@ -0,0 +1,10 @@
+<html>
+<!--
+This test checks to make sure that a prerendered page is loaded.
+-->
+<head>
+<title>Prerender Redirect</title>
+<meta http-equiv="REFRESH" content="0;prerender_page.html"></HEAD>
+</head>
+<body></body>
+</html>