diff options
author | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-26 17:12:18 +0000 |
---|---|---|
committer | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-26 17:12:18 +0000 |
commit | 829c2b8eac0145e88c6bb4645750b67f8ab520d0 (patch) | |
tree | 4e7e17cf5d11c79262e15d993d052a4b80779829 /chrome/browser/prerender/prerender_browsertest.cc | |
parent | 953ecc5b50d077a2a8d54a57b2decde96195e32b (diff) | |
download | chromium_src-829c2b8eac0145e88c6bb4645750b67f8ab520d0.zip chromium_src-829c2b8eac0145e88c6bb4645750b67f8ab520d0.tar.gz chromium_src-829c2b8eac0145e88c6bb4645750b67f8ab520d0.tar.bz2 |
Deflake PrerenderInfiniteLoopMultiple. Issue is that link tags
are not necessarily handled before DidStopLoading() is called.
Also move pending prerender tracking from the PrerenderManager
to the PrerenderContents in the process.
BUG=77323
TEST=PrerenderBrowserTest.PrerenderInfiniteLoopMultiple
Review URL: http://codereview.chromium.org/7978031
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@102745 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/prerender/prerender_browsertest.cc')
-rw-r--r-- | chrome/browser/prerender/prerender_browsertest.cc | 48 |
1 files changed, 33 insertions, 15 deletions
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc index c888cc3..dc17d15e 100644 --- a/chrome/browser/prerender/prerender_browsertest.cc +++ b/chrome/browser/prerender/prerender_browsertest.cc @@ -115,7 +115,7 @@ class TestPrerenderContents : public PrerenderContents { was_hidden_(false), was_shown_(false), should_be_shown_(expected_final_status == FINAL_STATUS_USED), - quit_message_loop_on_destruction_(true) { + expected_pending_prerenders_(0) { if (expected_number_of_loads == 0) MessageLoopForUI::current()->Quit(); } @@ -143,8 +143,7 @@ class TestPrerenderContents : public PrerenderContents { // When the PrerenderContents is destroyed, quit the UI message loop. // This happens on navigation to used prerendered pages, and soon // after cancellation of unused prerendered pages. - if (quit_message_loop_on_destruction_) - MessageLoopForUI::current()->Quit(); + MessageLoopForUI::current()->Quit(); } virtual void RenderViewGone() OVERRIDE { @@ -181,18 +180,33 @@ class TestPrerenderContents : public PrerenderContents { } } + virtual void AddPendingPrerender(Origin origin, + const GURL& url, + const GURL& referrer) { + PrerenderContents::AddPendingPrerender(origin, url, referrer); + if (expected_pending_prerenders_ > 0 && + pending_prerender_list()->size() == expected_pending_prerenders_) { + MessageLoop::current()->Quit(); + } + } + + // Waits until the prerender has |expected_pending_prerenders| pending + // prerenders. + void WaitForPendingPrerenders(size_t expected_pending_prerenders) { + if (pending_prerender_list()->size() < expected_pending_prerenders) { + expected_pending_prerenders_ = expected_pending_prerenders; + ui_test_utils::RunMessageLoop(); + expected_pending_prerenders_ = 0; + } + + EXPECT_EQ(expected_pending_prerenders, pending_prerender_list()->size()); + } + // For tests that open the prerender in a new background tab, the RenderView // will not have been made visible when the PrerenderContents is destroyed // even though it is used. void set_should_be_shown(bool value) { should_be_shown_ = value; } - // Some of the ui_test_utils calls that we use assume that no one will quit - // the message loop that they run internally. So we dont quit the message - // loop in the destructor so as not to interfere. - void set_quit_message_loop_on_destruction(bool value) { - quit_message_loop_on_destruction_ = value; - } - int number_of_loads() const { return number_of_loads_; } private: @@ -246,7 +260,9 @@ class TestPrerenderContents : public PrerenderContents { // FINAL_STATUS_USED, and false otherwise. bool should_be_shown_; - bool quit_message_loop_on_destruction_; + // Total number of pending prerenders we're currently waiting for. Zero + // indicates we currently aren't waiting for any. + size_t expected_pending_prerenders_; }; // PrerenderManager that uses TestPrerenderContents. @@ -530,7 +546,7 @@ class PrerenderBrowserTest : public InProcessBrowserTest { bool UrlIsPendingInPrerenderManager(const std::string& html_file) { GURL dest_url = test_server()->GetURL(html_file); - return (prerender_manager()->FindPendingEntry(dest_url) != NULL); + return prerender_manager()->IsPendingEntry(dest_url); } void set_use_https_src(bool use_https_src_server) { @@ -1077,6 +1093,8 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderInfiniteLoop) { expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); + ASSERT_TRUE(GetPrerenderContents()); + GetPrerenderContents()->WaitForPendingPrerenders(1u); // Next url should be in pending list but not an active entry. EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); @@ -1092,9 +1110,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderInfiniteLoop) { // Checks that we don't prerender in an infinite loop and multiple links are // handled correctly. -// Flaky, http://crbug.com/77323, but failing in a CHECK so disabled. -IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, - DISABLED_PrerenderInfiniteLoopMultiple) { +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderInfiniteLoopMultiple) { const char* const kHtmlFileA = "files/prerender/prerender_infinite_a_multiple.html"; const char* const kHtmlFileB = @@ -1111,6 +1127,8 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); + ASSERT_TRUE(GetPrerenderContents()); + GetPrerenderContents()->WaitForPendingPrerenders(2u); // Next url should be in pending list but not an active entry. EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); |