summaryrefslogtreecommitdiffstats
path: root/chrome/browser/prerender/prerender_browsertest.cc
diff options
context:
space:
mode:
authormmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-26 17:12:18 +0000
committermmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-26 17:12:18 +0000
commit829c2b8eac0145e88c6bb4645750b67f8ab520d0 (patch)
tree4e7e17cf5d11c79262e15d993d052a4b80779829 /chrome/browser/prerender/prerender_browsertest.cc
parent953ecc5b50d077a2a8d54a57b2decde96195e32b (diff)
downloadchromium_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.cc48
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));