From 796931a919d669357b86b5989004d2099447b928 Mon Sep 17 00:00:00 2001 From: "cbentzel@chromium.org" Date: Wed, 10 Aug 2011 01:32:14 +0000 Subject: A fairly recent change introduced a history of page_ids for each RenderView, to validate that Navigation's go to legitimate pages. In the prerender and instant cases, the history of page_id's was not accurate, because it was not offset to reflect the point in time when the page was swapped in. For example, if the history for the tab looks like about:blank http://www.launchprerender.com/ http://www.prerendered_page.com/first_page.html http://www.prerendered_page.com/second_page.html The history of page_id's in the prerender-page RenderView should look like [-1, -1, 13, 14] - with the first two entries being -1 since they are not captured in this render view. Before this fix, it would look like [13, 14] - and when the back navigation was attempted, the length was not as long as expected. BUG=89798 TEST=Go to prerender_test.appspot.com, do a prerender on dev.chromium.org, click on a link within dev.chromium.org, press back and see that it works instead of spinning forever. Also, browser_tests --gtest_filter=*BackToPrerenderedPage, which fails without the change. Review URL: http://codereview.chromium.org/7491096 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96109 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/prerender/prerender_browsertest.cc | 57 +++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'chrome/browser/prerender') diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc index 8f1a9ac..a692751 100644 --- a/chrome/browser/prerender/prerender_browsertest.cc +++ b/chrome/browser/prerender/prerender_browsertest.cc @@ -473,6 +473,26 @@ class PrerenderBrowserTest : public InProcessBrowserTest { } } + void OpenDestUrlViaClick() const { + // Make sure in navigating we have a URL to use in the PrerenderManager. + TestPrerenderContents* prerender_contents = GetPrerenderContents(); + ASSERT_TRUE(prerender_contents != NULL); + prerender_contents->set_quit_message_loop_on_destruction(false); + + bool click_prerendered_link_result = false; + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( + browser()->GetSelectedTabContents()->render_view_host(), L"", + L"window.domAutomationController.send(ClickOpenLink())", + &click_prerendered_link_result)); + EXPECT_TRUE(click_prerendered_link_result); + + // If the prerender contents has not been destroyed, run message loop. + if (GetPrerenderContents() != NULL) { + prerender_contents->set_quit_message_loop_on_destruction(true); + ui_test_utils::RunMessageLoop(); + } + } + // Should be const but test_server()->GetURL(...) is not const. void NavigateToURL(const std::string& dest_html_file) { GURL dest_url = test_server()->GetURL(dest_html_file); @@ -1612,4 +1632,41 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelAll) { EXPECT_TRUE(GetPrerenderContents() == NULL); } +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, BackToPrerenderedPage) { + PrerenderTestURL("files/prerender/prerender_page_with_link.html", + FINAL_STATUS_USED, + 1); + + OpenDestUrlViaClick(); + + // Click on the link in the page and wait for it to commit + { + ui_test_utils::WindowedNotificationObserver new_page_observer( + content::NOTIFICATION_NAV_ENTRY_COMMITTED, + NotificationService::AllSources()); + bool click_link_result = false; + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( + browser()->GetSelectedTabContents()->render_view_host(), L"", + L"window.domAutomationController.send(ClickOpenLink())", + &click_link_result)); + EXPECT_TRUE(click_link_result); + new_page_observer.Wait(); + } + + // Now, go back to the prerendered page. + { + ui_test_utils::WindowedNotificationObserver back_nav_observer( + content::NOTIFICATION_NAV_ENTRY_COMMITTED, + NotificationService::AllSources()); + browser()->GoBack(CURRENT_TAB); + back_nav_observer.Wait(); + bool original_prerender_page = false; + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( + browser()->GetSelectedTabContents()->render_view_host(), L"", + L"window.domAutomationController.send(IsOriginalPrerenderPage())", + &original_prerender_page)); + EXPECT_TRUE(original_prerender_page); + } +} + } // namespace prerender -- cgit v1.1