OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <deque> | 5 #include <deque> |
6 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
(...skipping 1261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1272 return prerender_manager; | 1272 return prerender_manager; |
1273 } | 1273 } |
1274 | 1274 |
1275 const PrerenderLinkManager* GetPrerenderLinkManager() const { | 1275 const PrerenderLinkManager* GetPrerenderLinkManager() const { |
1276 PrerenderLinkManager* prerender_link_manager = | 1276 PrerenderLinkManager* prerender_link_manager = |
1277 PrerenderLinkManagerFactory::GetForProfile( | 1277 PrerenderLinkManagerFactory::GetForProfile( |
1278 current_browser()->profile()); | 1278 current_browser()->profile()); |
1279 return prerender_link_manager; | 1279 return prerender_link_manager; |
1280 } | 1280 } |
1281 | 1281 |
1282 int GetPrerenderEventCount(int index, const std::string& type) const { | 1282 bool DidReceivePrerenderStartEventForLinkNumber(int index) const { |
1283 int event_count; | 1283 bool received_prerender_started; |
1284 std::string expression = base::StringPrintf( | 1284 std::string expression = base::StringPrintf( |
1285 "window.domAutomationController.send(" | 1285 "window.domAutomationController.send(Boolean(" |
1286 " GetPrerenderEventCount(%d, '%s'))", index, type.c_str()); | 1286 "receivedPrerenderStartEvents[%d]))", index); |
1287 | 1287 |
1288 CHECK(content::ExecuteScriptAndExtractInt( | 1288 CHECK(content::ExecuteScriptAndExtractBool( |
1289 GetActiveWebContents(), expression, &event_count)); | 1289 GetActiveWebContents(), |
1290 return event_count; | 1290 expression, |
1291 } | 1291 &received_prerender_started)); |
1292 | 1292 return received_prerender_started; |
1293 bool DidReceivePrerenderStartEventForLinkNumber(int index) const { | |
1294 return GetPrerenderEventCount(index, "webkitprerenderstart") > 0; | |
1295 } | 1293 } |
1296 | 1294 |
1297 int GetPrerenderLoadEventCountForLinkNumber(int index) const { | 1295 int GetPrerenderLoadEventCountForLinkNumber(int index) const { |
1298 return GetPrerenderEventCount(index, "webkitprerenderload"); | 1296 int load_event_count; |
| 1297 std::string expression = base::StringPrintf( |
| 1298 "window.domAutomationController.send(" |
| 1299 "receivedPrerenderLoadEvents[%d] || 0)", index); |
| 1300 |
| 1301 CHECK(content::ExecuteScriptAndExtractInt( |
| 1302 GetActiveWebContents(), |
| 1303 expression, |
| 1304 &load_event_count)); |
| 1305 return load_event_count; |
1299 } | 1306 } |
1300 | 1307 |
1301 int GetPrerenderDomContentLoadedEventCountForLinkNumber(int index) const { | 1308 int GetPrerenderDomContentLoadedEventCountForLinkNumber(int index) const { |
1302 return GetPrerenderEventCount(index, "webkitprerenderdomcontentloaded"); | 1309 int dom_content_loaded_event_count; |
| 1310 std::string expression = base::StringPrintf( |
| 1311 "window.domAutomationController.send(" |
| 1312 "receivedPrerenderDomContentLoadedEvents[%d] || 0)", index); |
| 1313 |
| 1314 CHECK(content::ExecuteScriptAndExtractInt( |
| 1315 GetActiveWebContents(), |
| 1316 expression, |
| 1317 &dom_content_loaded_event_count)); |
| 1318 return dom_content_loaded_event_count; |
1303 } | 1319 } |
1304 | 1320 |
1305 bool DidReceivePrerenderStopEventForLinkNumber(int index) const { | 1321 bool DidReceivePrerenderStopEventForLinkNumber(int index) const { |
1306 return GetPrerenderEventCount(index, "webkitprerenderstop") > 0; | 1322 bool received_prerender_stopped; |
1307 } | 1323 std::string expression = base::StringPrintf( |
| 1324 "window.domAutomationController.send(Boolean(" |
| 1325 "receivedPrerenderStopEvents[%d]))", index); |
1308 | 1326 |
1309 void WaitForPrerenderEventCount(int index, | 1327 CHECK(content::ExecuteScriptAndExtractBool( |
1310 const std::string& type, | 1328 GetActiveWebContents(), |
1311 int count) const { | 1329 expression, |
1312 int dummy; | 1330 &received_prerender_stopped)); |
1313 std::string expression = base::StringPrintf( | 1331 return received_prerender_stopped; |
1314 "WaitForPrerenderEventCount(%d, '%s', %d," | |
1315 " window.domAutomationController.send.bind(" | |
1316 " window.domAutomationController, 0))", | |
1317 index, type.c_str(), count); | |
1318 | |
1319 CHECK(content::ExecuteScriptAndExtractInt( | |
1320 GetActiveWebContents(), expression, &dummy)); | |
1321 CHECK_EQ(0, dummy); | |
1322 } | 1332 } |
1323 | 1333 |
1324 bool HadPrerenderEventErrors() const { | 1334 bool HadPrerenderEventErrors() const { |
1325 bool had_prerender_event_errors; | 1335 bool had_prerender_event_errors; |
1326 CHECK(content::ExecuteScriptAndExtractBool( | 1336 CHECK(content::ExecuteScriptAndExtractBool( |
1327 GetActiveWebContents(), | 1337 GetActiveWebContents(), |
1328 "window.domAutomationController.send(Boolean(" | 1338 "window.domAutomationController.send(Boolean(" |
1329 " hadPrerenderEventErrors))", | 1339 " hadPrerenderEventErrors))", |
1330 &had_prerender_event_errors)); | 1340 &had_prerender_event_errors)); |
1331 return had_prerender_event_errors; | 1341 return had_prerender_event_errors; |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1706 | 1716 |
1707 EXPECT_FALSE(DidReceivePrerenderStartEventForLinkNumber(1)); | 1717 EXPECT_FALSE(DidReceivePrerenderStartEventForLinkNumber(1)); |
1708 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1718 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
1709 EXPECT_FALSE(HadPrerenderEventErrors()); | 1719 EXPECT_FALSE(HadPrerenderEventErrors()); |
1710 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* | 1720 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* |
1711 // calls did a thread/process hop to the renderer which insured pending | 1721 // calls did a thread/process hop to the renderer which insured pending |
1712 // renderer events have arrived. | 1722 // renderer events have arrived. |
1713 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); | 1723 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); |
1714 } | 1724 } |
1715 | 1725 |
1716 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovingLink) { | 1726 // Flaky, http://crbug.com/167340. |
1717 scoped_ptr<TestPrerender> prerender = | 1727 IN_PROC_BROWSER_TEST_F( |
1718 PrerenderTestURL("files/prerender/prerender_page.html", | 1728 PrerenderBrowserTest, DISABLED_PrerenderPageRemovingLink) { |
1719 FINAL_STATUS_CANCELLED, 1); | 1729 set_loader_path("files/prerender/prerender_loader_removing_links.html"); |
| 1730 set_loader_query_and_fragment("?links_to_insert=1"); |
| 1731 PrerenderTestURL("files/prerender/prerender_page.html", |
| 1732 FINAL_STATUS_CANCELLED, 1); |
1720 | 1733 |
1721 // No ChannelDestructionWatcher is needed here, since prerenders in the | 1734 // No ChannelDestructionWatcher is needed here, since prerenders in the |
1722 // PrerenderLinkManager should be deleted by removing the links, rather than | 1735 // PrerenderLinkManager should be deleted by removing the links, rather than |
1723 // shutting down the renderer process. | 1736 // shutting down the renderer process. |
1724 RemoveLinkElement(0); | 1737 RemoveLinkElement(0); |
1725 prerender->WaitForStop(); | |
1726 | |
1727 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1738 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
1728 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1739 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
1729 EXPECT_FALSE(HadPrerenderEventErrors()); | 1740 EXPECT_FALSE(HadPrerenderEventErrors()); |
1730 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* | 1741 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* |
1731 // calls did a thread/process hop to the renderer which insured pending | 1742 // calls did a thread/process hop to the renderer which insured pending |
1732 // renderer events have arrived. | 1743 // renderer events have arrived. |
1733 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); | 1744 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); |
1734 } | 1745 } |
1735 | 1746 |
| 1747 // Flaky, http://crbug.com/167340. |
1736 IN_PROC_BROWSER_TEST_F( | 1748 IN_PROC_BROWSER_TEST_F( |
1737 PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinks) { | 1749 PrerenderBrowserTest, DISABLED_PrerenderPageRemovingLinkWithTwoLinks) { |
1738 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; | 1750 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; |
1739 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; | 1751 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; |
1740 | 1752 |
| 1753 set_loader_path("files/prerender/prerender_loader_removing_links.html"); |
1741 set_loader_query_and_fragment("?links_to_insert=2"); | 1754 set_loader_query_and_fragment("?links_to_insert=2"); |
1742 scoped_ptr<TestPrerender> prerender = | 1755 PrerenderTestURL("files/prerender/prerender_page.html", |
1743 PrerenderTestURL("files/prerender/prerender_page.html", | 1756 FINAL_STATUS_CANCELLED, 1); |
1744 FINAL_STATUS_CANCELLED, 1); | |
1745 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1757 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
1746 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1758 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
1747 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | 1759 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
1748 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1760 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
1749 | 1761 |
1750 RemoveLinkElement(0); | 1762 RemoveLinkElement(0); |
1751 RemoveLinkElement(1); | 1763 RemoveLinkElement(1); |
1752 prerender->WaitForStop(); | |
1753 | |
1754 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1764 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
1755 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1765 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
1756 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | 1766 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
1757 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1767 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
1758 EXPECT_FALSE(HadPrerenderEventErrors()); | 1768 EXPECT_FALSE(HadPrerenderEventErrors()); |
1759 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* | 1769 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* |
1760 // calls did a thread/process hop to the renderer which insured pending | 1770 // calls did a thread/process hop to the renderer which insured pending |
1761 // renderer events have arrived. | 1771 // renderer events have arrived. |
1762 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); | 1772 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); |
1763 } | 1773 } |
1764 | 1774 |
| 1775 #if defined(OS_WIN) |
| 1776 // TODO(gavinp): Fails on XP Rel - http://crbug.com/128841 |
| 1777 #define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ |
| 1778 DISABLED_PrerenderPageRemovingLinkWithTwoLinksRemovingOne |
| 1779 #else |
| 1780 #define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ |
| 1781 PrerenderPageRemovingLinkWithTwoLinksRemovingOne |
| 1782 #endif // defined(OS_WIN) |
1765 IN_PROC_BROWSER_TEST_F( | 1783 IN_PROC_BROWSER_TEST_F( |
1766 PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinksOneLate) { | 1784 PrerenderBrowserTest, |
| 1785 MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { |
1767 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; | 1786 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; |
1768 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; | 1787 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; |
1769 | 1788 set_loader_path("files/prerender/prerender_loader_removing_links.html"); |
1770 GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); | |
1771 scoped_ptr<TestPrerender> prerender = | |
1772 PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 1); | |
1773 | |
1774 // Add a second prerender for the same link. It reuses the prerender, so only | |
1775 // the start event fires here. | |
1776 AddPrerender(url, 1); | |
1777 WaitForPrerenderEventCount(1, "webkitprerenderstart", 1); | |
1778 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | |
1779 EXPECT_EQ(0, GetPrerenderLoadEventCountForLinkNumber(1)); | |
1780 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | |
1781 | |
1782 RemoveLinkElement(0); | |
1783 RemoveLinkElement(1); | |
1784 prerender->WaitForStop(); | |
1785 | |
1786 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | |
1787 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | |
1788 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | |
1789 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | |
1790 EXPECT_FALSE(HadPrerenderEventErrors()); | |
1791 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* | |
1792 // calls did a thread/process hop to the renderer which insured pending | |
1793 // renderer events have arrived. | |
1794 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); | |
1795 } | |
1796 | |
1797 IN_PROC_BROWSER_TEST_F( | |
1798 PrerenderBrowserTest, | |
1799 PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { | |
1800 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; | |
1801 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; | |
1802 set_loader_query_and_fragment("?links_to_insert=2"); | 1789 set_loader_query_and_fragment("?links_to_insert=2"); |
1803 PrerenderTestURL("files/prerender/prerender_page.html", | 1790 PrerenderTestURL("files/prerender/prerender_page.html", |
1804 FINAL_STATUS_USED, 1); | 1791 FINAL_STATUS_USED, 1); |
1805 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1792 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
1806 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1793 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
1807 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | 1794 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
1808 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1795 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
1809 | 1796 |
1810 RemoveLinkElement(0); | 1797 RemoveLinkElement(0); |
1811 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1798 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
(...skipping 2247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4059 } | 4046 } |
4060 }; | 4047 }; |
4061 | 4048 |
4062 // Checks that prerendering works in incognito mode. | 4049 // Checks that prerendering works in incognito mode. |
4063 IN_PROC_BROWSER_TEST_F(PrerenderIncognitoBrowserTest, PrerenderIncognito) { | 4050 IN_PROC_BROWSER_TEST_F(PrerenderIncognitoBrowserTest, PrerenderIncognito) { |
4064 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); | 4051 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
4065 NavigateToDestURL(); | 4052 NavigateToDestURL(); |
4066 } | 4053 } |
4067 | 4054 |
4068 } // namespace prerender | 4055 } // namespace prerender |
OLD | NEW |