Index: chrome/browser/prerender/prerender_browsertest.cc |
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc |
index bc98deb8c1d8069549c85ce9b64af6f20547d304..ef3e2023dab6031120b89e97989c406f0addfe52 100644 |
--- a/chrome/browser/prerender/prerender_browsertest.cc |
+++ b/chrome/browser/prerender/prerender_browsertest.cc |
@@ -342,8 +342,7 @@ class TestPrerenderContents : public PrerenderContents { |
was_hidden_(false), |
was_shown_(false), |
should_be_shown_(expected_final_status == FINAL_STATUS_USED), |
- skip_final_checks_(false), |
- expected_pending_prerenders_(0) { |
+ skip_final_checks_(false) { |
} |
virtual ~TestPrerenderContents() { |
@@ -351,7 +350,7 @@ class TestPrerenderContents : public PrerenderContents { |
return; |
if (expected_final_status_ == FINAL_STATUS_MAX) { |
- EXPECT_EQ(match_complete_status(), MATCH_COMPLETE_REPLACEMENT); |
+ EXPECT_EQ(MATCH_COMPLETE_REPLACEMENT, match_complete_status()); |
} else { |
EXPECT_EQ(expected_final_status_, final_status()) << |
" when testing URL " << prerender_url().path() << |
@@ -399,27 +398,6 @@ class TestPrerenderContents : public PrerenderContents { |
return true; |
} |
- virtual void AddPendingPrerender( |
- scoped_ptr<PendingPrerenderInfo> pending_prerender_info) OVERRIDE { |
- PrerenderContents::AddPendingPrerender(pending_prerender_info.Pass()); |
- if (expected_pending_prerenders_ > 0 && |
- pending_prerender_count() == expected_pending_prerenders_) { |
- base::MessageLoop::current()->Quit(); |
- } |
- } |
- |
- // Waits until the prerender has |expected_pending_prerenders| pending |
- // prerenders. |
- void WaitForPendingPrerenders(size_t expected_pending_prerenders) { |
- if (pending_prerender_count() < expected_pending_prerenders) { |
- expected_pending_prerenders_ = expected_pending_prerenders; |
- content::RunMessageLoop(); |
- expected_pending_prerenders_ = 0; |
- } |
- |
- EXPECT_EQ(expected_pending_prerenders, pending_prerender_count()); |
- } |
- |
// 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. |
@@ -481,10 +459,6 @@ class TestPrerenderContents : public PrerenderContents { |
bool should_be_shown_; |
// If true, |expected_final_status_| and other shutdown checks are skipped. |
bool skip_final_checks_; |
- |
- // Total number of pending prerenders we're currently waiting for. Zero |
- // indicates we currently aren't waiting for any. |
- size_t expected_pending_prerenders_; |
}; |
// A handle to a TestPrerenderContents whose lifetime is under the caller's |
@@ -1323,6 +1297,14 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
return GetPrerenderLinkManager()->IsEmpty(); |
} |
+ size_t GetLinkPrerenderCount() const { |
+ return GetPrerenderLinkManager()->prerenders_.size(); |
+ } |
+ |
+ size_t GetRunningLinkPrerenderCount() const { |
+ return GetPrerenderLinkManager()->CountRunningPrerenders(); |
+ } |
+ |
// Returns length of |prerender_manager_|'s history, or -1 on failure. |
int GetHistoryLength() const { |
scoped_ptr<base::DictionaryValue> prerender_dict( |
@@ -1585,23 +1567,20 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { |
} |
// Checks that pending prerenders launch and receive proper event treatment. |
-// Disabled due to http://crbug.com/167792 |
-IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderPagePending) { |
- std::vector<FinalStatus> expected_final_status_queue; |
- expected_final_status_queue.push_back(FINAL_STATUS_USED); |
- expected_final_status_queue.push_back(FINAL_STATUS_USED); |
- PrerenderTestURL("files/prerender/prerender_page_pending.html", |
- expected_final_status_queue, 1); |
- |
- ChannelDestructionWatcher first_channel_close_watcher; |
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) { |
+ scoped_ptr<TestPrerender> prerender = |
+ PrerenderTestURL("files/prerender/prerender_page_pending.html", |
+ FINAL_STATUS_USED, 1); |
- first_channel_close_watcher.WatchChannel( |
- GetActiveWebContents()->GetRenderProcessHost()); |
+ // Navigate to the prerender. |
+ scoped_ptr<TestPrerender> prerender2 = ExpectPrerender(FINAL_STATUS_USED); |
NavigateToDestURL(); |
- // NavigateToDestURL doesn't run a message loop. Normally that's fine, but in |
- // this case, we need the pending prerenders to start. |
- content::RunMessageLoop(); |
- first_channel_close_watcher.WaitForChannelClose(); |
+ // Abort early if the original prerender didn't swap, so as not to hang. |
+ ASSERT_FALSE(prerender->contents()); |
+ |
+ // Wait for the new prerender to be ready. |
+ prerender2->WaitForStart(); |
+ prerender2->WaitForLoads(1); |
const GURL prerender_page_url = |
test_server()->GetURL("files/prerender/prerender_page.html"); |
@@ -1610,13 +1589,12 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderPagePending) { |
GetPrerenderContentsFor(prerender_page_url)); |
// Now navigate to our target page. |
- ChannelDestructionWatcher second_channel_close_watcher; |
- second_channel_close_watcher.WatchChannel( |
- GetActiveWebContents()->GetRenderProcessHost()); |
+ NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), |
+ GetActiveWebContents()); |
ui_test_utils::NavigateToURLWithDisposition( |
current_browser(), prerender_page_url, CURRENT_TAB, |
ui_test_utils::BROWSER_TEST_NONE); |
- second_channel_close_watcher.WaitForChannelClose(); |
+ swap_observer.Wait(); |
EXPECT_TRUE(IsEmptyPrerenderLinkManager()); |
} |
@@ -2210,9 +2188,8 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderQuickQuit) { |
0); |
} |
-// TODO(gavinp,sreeram): Fix http://crbug.com/145248 and deflake this test. |
// Checks that we don't prerender in an infinite loop. |
-IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderInfiniteLoop) { |
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderInfiniteLoop) { |
const char* const kHtmlFileA = "files/prerender/prerender_infinite_a.html"; |
const char* const kHtmlFileB = "files/prerender/prerender_infinite_b.html"; |
@@ -2223,23 +2200,29 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderInfiniteLoop) { |
ScopedVector<TestPrerender> prerenders = |
PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); |
ASSERT_TRUE(prerenders[0]->contents()); |
- prerenders[0]->contents()->WaitForPendingPrerenders(1u); |
+ // Assert that the pending prerender is in there already. This relies on the |
+ // fact that the renderer sends out the AddLinkRelPrerender IPC before sending |
+ // the page load one. |
+ EXPECT_EQ(2U, GetLinkPrerenderCount()); |
+ EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); |
// Next url should be in pending list but not an active entry. |
EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); |
NavigateToDestURL(); |
- // Make sure the PrerenderContents for the next url is now in the manager |
- // and not pending. |
+ // Make sure the PrerenderContents for the next url is now in the manager and |
+ // not pending. This relies on pending prerenders being resolved in the same |
+ // event loop iteration as OnPrerenderStop. |
EXPECT_TRUE(UrlIsInPrerenderManager(kHtmlFileB)); |
+ EXPECT_EQ(1U, GetLinkPrerenderCount()); |
+ EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); |
} |
-// TODO(gavinp,sreeram): Fix http://crbug.com/145248 and deflake this test. |
// Checks that we don't prerender in an infinite loop and multiple links are |
// handled correctly. |
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
- DISABLED_PrerenderInfiniteLoopMultiple) { |
+ PrerenderInfiniteLoopMultiple) { |
const char* const kHtmlFileA = |
"files/prerender/prerender_infinite_a_multiple.html"; |
const char* const kHtmlFileB = |
@@ -2260,9 +2243,12 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
ScopedVector<TestPrerender> prerenders = |
PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); |
ASSERT_TRUE(prerenders[0]->contents()); |
- prerenders[0]->contents()->WaitForPendingPrerenders(2u); |
- // Next url should be in pending list but not an active entry. |
+ // Next url should be in pending list but not an active entry. This relies on |
+ // the fact that the renderer sends out the AddLinkRelPrerender IPC before |
+ // sending the page load one. |
+ EXPECT_EQ(3U, GetLinkPrerenderCount()); |
+ EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); |
EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); |
EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileC)); |
@@ -2270,10 +2256,39 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
// Make sure the PrerenderContents for the next urls are now in the manager |
// and not pending. One and only one of the URLs (the last seen) should be the |
- // active entry. |
+ // active entry. This relies on pending prerenders being resolved in the same |
+ // event loop iteration as OnPrerenderStop. |
bool url_b_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileB); |
bool url_c_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileC); |
EXPECT_TRUE(url_b_is_active_prerender && url_c_is_active_prerender); |
+ EXPECT_EQ(2U, GetLinkPrerenderCount()); |
+ EXPECT_EQ(2U, GetRunningLinkPrerenderCount()); |
+} |
+ |
+// Checks that pending prerenders are aborted (and never launched) when launched |
+// by a prerender that itself gets aborted. |
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAbortPendingOnCancel) { |
+ const char* const kHtmlFileA = "files/prerender/prerender_infinite_a.html"; |
+ const char* const kHtmlFileB = "files/prerender/prerender_infinite_b.html"; |
+ |
+ scoped_ptr<TestPrerender> prerender = |
+ PrerenderTestURL(kHtmlFileA, FINAL_STATUS_CANCELLED, 1); |
+ ASSERT_TRUE(prerender->contents()); |
+ // Assert that the pending prerender is in there already. This relies on the |
+ // fact that the renderer sends out the AddLinkRelPrerender IPC before sending |
+ // the page load one. |
+ EXPECT_EQ(2U, GetLinkPrerenderCount()); |
+ EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); |
+ |
+ // Next url should be in pending list but not an active entry. |
+ EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); |
+ |
+ // Cancel the prerender. |
+ GetPrerenderManager()->CancelAllPrerenders(); |
+ prerender->WaitForStop(); |
+ |
+ // All prerenders are now gone. |
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager()); |
} |
// See crbug.com/131836. |