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 { |
| 1283 int event_count; |
| 1284 std::string expression = base::StringPrintf( |
| 1285 "window.domAutomationController.send(" |
| 1286 " GetPrerenderEventCount(%d, '%s'))", index, type.c_str()); |
| 1287 |
| 1288 CHECK(content::ExecuteScriptAndExtractInt( |
| 1289 GetActiveWebContents(), expression, &event_count)); |
| 1290 return event_count; |
| 1291 } |
| 1292 |
1282 bool DidReceivePrerenderStartEventForLinkNumber(int index) const { | 1293 bool DidReceivePrerenderStartEventForLinkNumber(int index) const { |
1283 bool received_prerender_started; | 1294 return GetPrerenderEventCount(index, "webkitprerenderstart") > 0; |
1284 std::string expression = base::StringPrintf( | |
1285 "window.domAutomationController.send(Boolean(" | |
1286 "receivedPrerenderStartEvents[%d]))", index); | |
1287 | |
1288 CHECK(content::ExecuteScriptAndExtractBool( | |
1289 GetActiveWebContents(), | |
1290 expression, | |
1291 &received_prerender_started)); | |
1292 return received_prerender_started; | |
1293 } | 1295 } |
1294 | 1296 |
1295 int GetPrerenderLoadEventCountForLinkNumber(int index) const { | 1297 int GetPrerenderLoadEventCountForLinkNumber(int index) const { |
1296 int load_event_count; | 1298 return GetPrerenderEventCount(index, "webkitprerenderload"); |
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; | |
1306 } | 1299 } |
1307 | 1300 |
1308 int GetPrerenderDomContentLoadedEventCountForLinkNumber(int index) const { | 1301 int GetPrerenderDomContentLoadedEventCountForLinkNumber(int index) const { |
1309 int dom_content_loaded_event_count; | 1302 return GetPrerenderEventCount(index, "webkitprerenderdomcontentloaded"); |
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; | |
1319 } | 1303 } |
1320 | 1304 |
1321 bool DidReceivePrerenderStopEventForLinkNumber(int index) const { | 1305 bool DidReceivePrerenderStopEventForLinkNumber(int index) const { |
1322 bool received_prerender_stopped; | 1306 return GetPrerenderEventCount(index, "webkitprerenderstop") > 0; |
| 1307 } |
| 1308 |
| 1309 void WaitForPrerenderEventCount(int index, |
| 1310 const std::string& type, |
| 1311 int count) const { |
| 1312 int dummy; |
1323 std::string expression = base::StringPrintf( | 1313 std::string expression = base::StringPrintf( |
1324 "window.domAutomationController.send(Boolean(" | 1314 "WaitForPrerenderEventCount(%d, '%s', %d," |
1325 "receivedPrerenderStopEvents[%d]))", index); | 1315 " window.domAutomationController.send.bind(" |
| 1316 " window.domAutomationController, 0))", |
| 1317 index, type.c_str(), count); |
1326 | 1318 |
1327 CHECK(content::ExecuteScriptAndExtractBool( | 1319 CHECK(content::ExecuteScriptAndExtractInt( |
1328 GetActiveWebContents(), | 1320 GetActiveWebContents(), expression, &dummy)); |
1329 expression, | 1321 CHECK_EQ(0, dummy); |
1330 &received_prerender_stopped)); | |
1331 return received_prerender_stopped; | |
1332 } | 1322 } |
1333 | 1323 |
1334 bool HadPrerenderEventErrors() const { | 1324 bool HadPrerenderEventErrors() const { |
1335 bool had_prerender_event_errors; | 1325 bool had_prerender_event_errors; |
1336 CHECK(content::ExecuteScriptAndExtractBool( | 1326 CHECK(content::ExecuteScriptAndExtractBool( |
1337 GetActiveWebContents(), | 1327 GetActiveWebContents(), |
1338 "window.domAutomationController.send(Boolean(" | 1328 "window.domAutomationController.send(Boolean(" |
1339 " hadPrerenderEventErrors))", | 1329 " hadPrerenderEventErrors))", |
1340 &had_prerender_event_errors)); | 1330 &had_prerender_event_errors)); |
1341 return had_prerender_event_errors; | 1331 return had_prerender_event_errors; |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1716 | 1706 |
1717 EXPECT_FALSE(DidReceivePrerenderStartEventForLinkNumber(1)); | 1707 EXPECT_FALSE(DidReceivePrerenderStartEventForLinkNumber(1)); |
1718 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1708 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
1719 EXPECT_FALSE(HadPrerenderEventErrors()); | 1709 EXPECT_FALSE(HadPrerenderEventErrors()); |
1720 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* | 1710 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* |
1721 // calls did a thread/process hop to the renderer which insured pending | 1711 // calls did a thread/process hop to the renderer which insured pending |
1722 // renderer events have arrived. | 1712 // renderer events have arrived. |
1723 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); | 1713 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); |
1724 } | 1714 } |
1725 | 1715 |
1726 // Flaky, http://crbug.com/167340. | 1716 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovingLink) { |
1727 IN_PROC_BROWSER_TEST_F( | 1717 scoped_ptr<TestPrerender> prerender = |
1728 PrerenderBrowserTest, DISABLED_PrerenderPageRemovingLink) { | 1718 PrerenderTestURL("files/prerender/prerender_page.html", |
1729 set_loader_path("files/prerender/prerender_loader_removing_links.html"); | 1719 FINAL_STATUS_CANCELLED, 1); |
1730 set_loader_query_and_fragment("?links_to_insert=1"); | |
1731 PrerenderTestURL("files/prerender/prerender_page.html", | |
1732 FINAL_STATUS_CANCELLED, 1); | |
1733 | 1720 |
1734 // No ChannelDestructionWatcher is needed here, since prerenders in the | 1721 // No ChannelDestructionWatcher is needed here, since prerenders in the |
1735 // PrerenderLinkManager should be deleted by removing the links, rather than | 1722 // PrerenderLinkManager should be deleted by removing the links, rather than |
1736 // shutting down the renderer process. | 1723 // shutting down the renderer process. |
1737 RemoveLinkElement(0); | 1724 RemoveLinkElement(0); |
| 1725 prerender->WaitForStop(); |
| 1726 |
1738 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1727 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
1739 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1728 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
1740 EXPECT_FALSE(HadPrerenderEventErrors()); | 1729 EXPECT_FALSE(HadPrerenderEventErrors()); |
1741 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* | 1730 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* |
1742 // calls did a thread/process hop to the renderer which insured pending | 1731 // calls did a thread/process hop to the renderer which insured pending |
1743 // renderer events have arrived. | 1732 // renderer events have arrived. |
1744 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); | 1733 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); |
1745 } | 1734 } |
1746 | 1735 |
1747 // Flaky, http://crbug.com/167340. | |
1748 IN_PROC_BROWSER_TEST_F( | 1736 IN_PROC_BROWSER_TEST_F( |
1749 PrerenderBrowserTest, DISABLED_PrerenderPageRemovingLinkWithTwoLinks) { | 1737 PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinks) { |
1750 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; | 1738 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; |
1751 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; | 1739 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; |
1752 | 1740 |
1753 set_loader_path("files/prerender/prerender_loader_removing_links.html"); | |
1754 set_loader_query_and_fragment("?links_to_insert=2"); | 1741 set_loader_query_and_fragment("?links_to_insert=2"); |
1755 PrerenderTestURL("files/prerender/prerender_page.html", | 1742 scoped_ptr<TestPrerender> prerender = |
1756 FINAL_STATUS_CANCELLED, 1); | 1743 PrerenderTestURL("files/prerender/prerender_page.html", |
| 1744 FINAL_STATUS_CANCELLED, 1); |
1757 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1745 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
1758 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1746 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
1759 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | 1747 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
1760 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1748 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
1761 | 1749 |
1762 RemoveLinkElement(0); | 1750 RemoveLinkElement(0); |
1763 RemoveLinkElement(1); | 1751 RemoveLinkElement(1); |
| 1752 prerender->WaitForStop(); |
| 1753 |
1764 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1754 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
1765 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1755 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
1766 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | 1756 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
| 1757 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
| 1758 EXPECT_FALSE(HadPrerenderEventErrors()); |
| 1759 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* |
| 1760 // calls did a thread/process hop to the renderer which insured pending |
| 1761 // renderer events have arrived. |
| 1762 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); |
| 1763 } |
| 1764 |
| 1765 IN_PROC_BROWSER_TEST_F( |
| 1766 PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinksOneLate) { |
| 1767 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; |
| 1768 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; |
| 1769 |
| 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)); |
1767 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1789 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
1768 EXPECT_FALSE(HadPrerenderEventErrors()); | 1790 EXPECT_FALSE(HadPrerenderEventErrors()); |
1769 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* | 1791 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* |
1770 // calls did a thread/process hop to the renderer which insured pending | 1792 // calls did a thread/process hop to the renderer which insured pending |
1771 // renderer events have arrived. | 1793 // renderer events have arrived. |
1772 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); | 1794 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); |
1773 } | 1795 } |
1774 | 1796 |
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) | |
1783 IN_PROC_BROWSER_TEST_F( | 1797 IN_PROC_BROWSER_TEST_F( |
1784 PrerenderBrowserTest, | 1798 PrerenderBrowserTest, |
1785 MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { | 1799 PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { |
1786 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; | 1800 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; |
1787 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; | 1801 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; |
1788 set_loader_path("files/prerender/prerender_loader_removing_links.html"); | |
1789 set_loader_query_and_fragment("?links_to_insert=2"); | 1802 set_loader_query_and_fragment("?links_to_insert=2"); |
1790 PrerenderTestURL("files/prerender/prerender_page.html", | 1803 PrerenderTestURL("files/prerender/prerender_page.html", |
1791 FINAL_STATUS_USED, 1); | 1804 FINAL_STATUS_USED, 1); |
1792 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1805 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
1793 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1806 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
1794 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | 1807 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
1795 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1808 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
1796 | 1809 |
1797 RemoveLinkElement(0); | 1810 RemoveLinkElement(0); |
1798 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1811 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
(...skipping 2247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4046 } | 4059 } |
4047 }; | 4060 }; |
4048 | 4061 |
4049 // Checks that prerendering works in incognito mode. | 4062 // Checks that prerendering works in incognito mode. |
4050 IN_PROC_BROWSER_TEST_F(PrerenderIncognitoBrowserTest, PrerenderIncognito) { | 4063 IN_PROC_BROWSER_TEST_F(PrerenderIncognitoBrowserTest, PrerenderIncognito) { |
4051 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); | 4064 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
4052 NavigateToDestURL(); | 4065 NavigateToDestURL(); |
4053 } | 4066 } |
4054 | 4067 |
4055 } // namespace prerender | 4068 } // namespace prerender |
OLD | NEW |