Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Unified Diff: chrome/browser/prerender/prerender_browsertest.cc

Issue 146983002: Move pending prerender logic into PrerenderLinkManager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/prerender/prerender_contents.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.
« no previous file with comments | « no previous file | chrome/browser/prerender/prerender_contents.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698