| 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));
|
|
|