diff options
author | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-07 19:15:35 +0000 |
---|---|---|
committer | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-07 19:15:35 +0000 |
commit | 375e8bd5221052ac14da317fb67de78deb33b93d (patch) | |
tree | 13c89b8a5e3fdd15063ac1ec747ce442b8e85b3d /chrome | |
parent | 97096b165dccb3dbbbdb388a99b93c04a17ad98d (diff) | |
download | chromium_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.cc | 45 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 12 | ||||
-rw-r--r-- | chrome/test/data/prerender/prerender_redirect.html | 10 |
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> |