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