Index: chrome/browser/prerender/prerender_browsertest.cc |
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc |
index 127eda231cb36fef2c9ef2069efd6f52ab446945..0af32c7d1af7ac3f908f1c7a97a8c70d5d3423cc 100644 |
--- a/chrome/browser/prerender/prerender_browsertest.cc |
+++ b/chrome/browser/prerender/prerender_browsertest.cc |
@@ -1280,56 +1280,46 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
return prerender_link_manager; |
} |
- bool DidReceivePrerenderStartEventForLinkNumber(int index) const { |
- bool received_prerender_started; |
+ int GetPrerenderEventCount(int index, const std::string& type) const { |
+ int event_count; |
std::string expression = base::StringPrintf( |
- "window.domAutomationController.send(Boolean(" |
- "receivedPrerenderStartEvents[%d]))", index); |
+ "window.domAutomationController.send(" |
+ " GetPrerenderEventCount(%d, '%s'))", index, type.c_str()); |
- CHECK(content::ExecuteScriptAndExtractBool( |
- GetActiveWebContents(), |
- expression, |
- &received_prerender_started)); |
- return received_prerender_started; |
+ CHECK(content::ExecuteScriptAndExtractInt( |
+ GetActiveWebContents(), expression, &event_count)); |
+ return event_count; |
} |
- int GetPrerenderLoadEventCountForLinkNumber(int index) const { |
- int load_event_count; |
- std::string expression = base::StringPrintf( |
- "window.domAutomationController.send(" |
- "receivedPrerenderLoadEvents[%d] || 0)", index); |
+ bool DidReceivePrerenderStartEventForLinkNumber(int index) const { |
+ return GetPrerenderEventCount(index, "webkitprerenderstart") > 0; |
+ } |
- CHECK(content::ExecuteScriptAndExtractInt( |
- GetActiveWebContents(), |
- expression, |
- &load_event_count)); |
- return load_event_count; |
+ int GetPrerenderLoadEventCountForLinkNumber(int index) const { |
+ return GetPrerenderEventCount(index, "webkitprerenderload"); |
} |
int GetPrerenderDomContentLoadedEventCountForLinkNumber(int index) const { |
- int dom_content_loaded_event_count; |
- std::string expression = base::StringPrintf( |
- "window.domAutomationController.send(" |
- "receivedPrerenderDomContentLoadedEvents[%d] || 0)", index); |
- |
- CHECK(content::ExecuteScriptAndExtractInt( |
- GetActiveWebContents(), |
- expression, |
- &dom_content_loaded_event_count)); |
- return dom_content_loaded_event_count; |
+ return GetPrerenderEventCount(index, "webkitprerenderdomcontentloaded"); |
} |
bool DidReceivePrerenderStopEventForLinkNumber(int index) const { |
- bool received_prerender_stopped; |
+ return GetPrerenderEventCount(index, "webkitprerenderstop") > 0; |
+ } |
+ |
+ void WaitForPrerenderEventCount(int index, |
+ const std::string& type, |
+ int count) const { |
+ int dummy; |
std::string expression = base::StringPrintf( |
- "window.domAutomationController.send(Boolean(" |
- "receivedPrerenderStopEvents[%d]))", index); |
+ "WaitForPrerenderEventCount(%d, '%s', %d," |
+ " window.domAutomationController.send.bind(" |
+ " window.domAutomationController, 0))", |
+ index, type.c_str(), count); |
- CHECK(content::ExecuteScriptAndExtractBool( |
- GetActiveWebContents(), |
- expression, |
- &received_prerender_stopped)); |
- return received_prerender_stopped; |
+ CHECK(content::ExecuteScriptAndExtractInt( |
+ GetActiveWebContents(), expression, &dummy)); |
+ CHECK_EQ(0, dummy); |
} |
bool HadPrerenderEventErrors() const { |
@@ -1397,8 +1387,8 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
loader_path_ = path; |
} |
- void set_loader_query_and_fragment(const std::string& query_and_fragment) { |
- loader_query_and_fragment_ = query_and_fragment; |
+ void set_loader_query(const std::string& query) { |
+ loader_query_ = query; |
} |
GURL GetCrossDomainTestUrl(const std::string& path) { |
@@ -1494,8 +1484,8 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
const net::SpawnedTestServer* src_server = test_server(); |
if (https_src_server_) |
src_server = https_src_server_.get(); |
- GURL loader_url = src_server->GetURL(replacement_path + |
- loader_query_and_fragment_); |
+ GURL loader_url = src_server->GetURL( |
+ replacement_path + "&" + loader_query_); |
GURL::Replacements loader_replacements; |
if (!loader_host_override_.empty()) |
@@ -1617,7 +1607,7 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
bool check_load_events_; |
std::string loader_host_override_; |
std::string loader_path_; |
- std::string loader_query_and_fragment_; |
+ std::string loader_query_; |
Browser* explicitly_set_browser_; |
}; |
@@ -1724,18 +1714,17 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovesPending) { |
ASSERT_TRUE(IsEmptyPrerenderLinkManager()); |
} |
-// Flaky, http://crbug.com/167340. |
-IN_PROC_BROWSER_TEST_F( |
- PrerenderBrowserTest, DISABLED_PrerenderPageRemovingLink) { |
- set_loader_path("files/prerender/prerender_loader_removing_links.html"); |
- set_loader_query_and_fragment("?links_to_insert=1"); |
- PrerenderTestURL("files/prerender/prerender_page.html", |
- FINAL_STATUS_CANCELLED, 1); |
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovingLink) { |
+ scoped_ptr<TestPrerender> prerender = |
+ PrerenderTestURL("files/prerender/prerender_page.html", |
+ FINAL_STATUS_CANCELLED, 1); |
// No ChannelDestructionWatcher is needed here, since prerenders in the |
// PrerenderLinkManager should be deleted by removing the links, rather than |
// shutting down the renderer process. |
RemoveLinkElement(0); |
+ prerender->WaitForStop(); |
+ |
EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
EXPECT_FALSE(HadPrerenderEventErrors()); |
@@ -1745,16 +1734,15 @@ IN_PROC_BROWSER_TEST_F( |
EXPECT_TRUE(IsEmptyPrerenderLinkManager()); |
} |
-// Flaky, http://crbug.com/167340. |
IN_PROC_BROWSER_TEST_F( |
- PrerenderBrowserTest, DISABLED_PrerenderPageRemovingLinkWithTwoLinks) { |
+ PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinks) { |
GetPrerenderManager()->mutable_config().max_link_concurrency = 2; |
GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; |
- set_loader_path("files/prerender/prerender_loader_removing_links.html"); |
- set_loader_query_and_fragment("?links_to_insert=2"); |
- PrerenderTestURL("files/prerender/prerender_page.html", |
- FINAL_STATUS_CANCELLED, 1); |
+ set_loader_query("links_to_insert=2"); |
+ scoped_ptr<TestPrerender> prerender = |
+ PrerenderTestURL("files/prerender/prerender_page.html", |
+ FINAL_STATUS_CANCELLED, 1); |
EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
@@ -1762,6 +1750,40 @@ IN_PROC_BROWSER_TEST_F( |
RemoveLinkElement(0); |
RemoveLinkElement(1); |
+ prerender->WaitForStop(); |
+ |
+ EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
+ EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
+ EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
+ EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
+ EXPECT_FALSE(HadPrerenderEventErrors()); |
+ // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* |
+ // calls did a thread/process hop to the renderer which insured pending |
+ // renderer events have arrived. |
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F( |
+ PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinksOneLate) { |
+ GetPrerenderManager()->mutable_config().max_link_concurrency = 2; |
+ GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; |
+ |
+ GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); |
+ scoped_ptr<TestPrerender> prerender = |
+ PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 1); |
+ |
+ // Add a second prerender for the same link. It reuses the prerender, so only |
+ // the start event fires here. |
+ AddPrerender(url, 1); |
+ WaitForPrerenderEventCount(1, "webkitprerenderstart", 1); |
+ EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
+ EXPECT_EQ(0, GetPrerenderLoadEventCountForLinkNumber(1)); |
+ EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
+ |
+ RemoveLinkElement(0); |
+ RemoveLinkElement(1); |
+ prerender->WaitForStop(); |
+ |
EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
@@ -1773,21 +1795,12 @@ IN_PROC_BROWSER_TEST_F( |
EXPECT_TRUE(IsEmptyPrerenderLinkManager()); |
} |
-#if defined(OS_WIN) |
-// TODO(gavinp): Fails on XP Rel - http://crbug.com/128841 |
-#define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ |
- DISABLED_PrerenderPageRemovingLinkWithTwoLinksRemovingOne |
-#else |
-#define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ |
- PrerenderPageRemovingLinkWithTwoLinksRemovingOne |
-#endif // defined(OS_WIN) |
IN_PROC_BROWSER_TEST_F( |
PrerenderBrowserTest, |
- MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { |
+ PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { |
GetPrerenderManager()->mutable_config().max_link_concurrency = 2; |
GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; |
- set_loader_path("files/prerender/prerender_loader_removing_links.html"); |
- set_loader_query_and_fragment("?links_to_insert=2"); |
+ set_loader_query("links_to_insert=2"); |
PrerenderTestURL("files/prerender/prerender_page.html", |
FINAL_STATUS_USED, 1); |
EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |