diff options
author | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-10 01:32:14 +0000 |
---|---|---|
committer | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-10 01:32:14 +0000 |
commit | 796931a919d669357b86b5989004d2099447b928 (patch) | |
tree | 5cb552694041500e4de7f99b82e767ce05c5871c /chrome/browser/prerender | |
parent | 04dd0d690d0992bba0cc656da4e49d024b1700d6 (diff) | |
download | chromium_src-796931a919d669357b86b5989004d2099447b928.zip chromium_src-796931a919d669357b86b5989004d2099447b928.tar.gz chromium_src-796931a919d669357b86b5989004d2099447b928.tar.bz2 |
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
Diffstat (limited to 'chrome/browser/prerender')
-rw-r--r-- | chrome/browser/prerender/prerender_browsertest.cc | 57 |
1 files changed, 57 insertions, 0 deletions
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 |