Chromium Code Reviews| 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 1265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1276 return prerender_manager; | 1276 return prerender_manager; |
| 1277 } | 1277 } |
| 1278 | 1278 |
| 1279 const PrerenderLinkManager* GetPrerenderLinkManager() const { | 1279 const PrerenderLinkManager* GetPrerenderLinkManager() const { |
| 1280 PrerenderLinkManager* prerender_link_manager = | 1280 PrerenderLinkManager* prerender_link_manager = |
| 1281 PrerenderLinkManagerFactory::GetForProfile( | 1281 PrerenderLinkManagerFactory::GetForProfile( |
| 1282 current_browser()->profile()); | 1282 current_browser()->profile()); |
| 1283 return prerender_link_manager; | 1283 return prerender_link_manager; |
| 1284 } | 1284 } |
| 1285 | 1285 |
| 1286 int GetPrerenderEventCount(int index, const std::string& type) const { | |
| 1287 int event_count; | |
| 1288 std::string expression = base::StringPrintf( | |
| 1289 "window.domAutomationController.send(" | |
| 1290 " GetPrerenderEventCount(%d, '%s'))", index, type.c_str()); | |
| 1291 | |
| 1292 CHECK(content::ExecuteScriptAndExtractInt( | |
| 1293 GetActiveWebContents(), expression, &event_count)); | |
| 1294 return event_count; | |
| 1295 } | |
| 1296 | |
| 1286 bool DidReceivePrerenderStartEventForLinkNumber(int index) const { | 1297 bool DidReceivePrerenderStartEventForLinkNumber(int index) const { |
| 1287 bool received_prerender_started; | 1298 return GetPrerenderEventCount(index, "webkitprerenderstart") > 0; |
| 1288 std::string expression = base::StringPrintf( | |
| 1289 "window.domAutomationController.send(Boolean(" | |
| 1290 "receivedPrerenderStartEvents[%d]))", index); | |
| 1291 | |
| 1292 CHECK(content::ExecuteScriptAndExtractBool( | |
| 1293 GetActiveWebContents(), | |
| 1294 expression, | |
| 1295 &received_prerender_started)); | |
| 1296 return received_prerender_started; | |
| 1297 } | 1299 } |
| 1298 | 1300 |
| 1299 int GetPrerenderLoadEventCountForLinkNumber(int index) const { | 1301 int GetPrerenderLoadEventCountForLinkNumber(int index) const { |
| 1300 int load_event_count; | 1302 return GetPrerenderEventCount(index, "webkitprerenderload"); |
| 1301 std::string expression = base::StringPrintf( | |
| 1302 "window.domAutomationController.send(" | |
| 1303 "receivedPrerenderLoadEvents[%d] || 0)", index); | |
| 1304 | |
| 1305 CHECK(content::ExecuteScriptAndExtractInt( | |
| 1306 GetActiveWebContents(), | |
| 1307 expression, | |
| 1308 &load_event_count)); | |
| 1309 return load_event_count; | |
| 1310 } | 1303 } |
| 1311 | 1304 |
| 1312 bool DidReceivePrerenderStopEventForLinkNumber(int index) const { | 1305 bool DidReceivePrerenderStopEventForLinkNumber(int index) const { |
| 1313 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; | |
| 1314 std::string expression = base::StringPrintf( | 1313 std::string expression = base::StringPrintf( |
| 1315 "window.domAutomationController.send(Boolean(" | 1314 "WaitForPrerenderEventCount(%d, '%s', %d," |
| 1316 "receivedPrerenderStopEvents[%d]))", index); | 1315 " window.domAutomationController.send.bind(" |
| 1316 " window.domAutomationController, 0))", | |
| 1317 index, type.c_str(), count); | |
| 1317 | 1318 |
| 1318 CHECK(content::ExecuteScriptAndExtractBool( | 1319 CHECK(content::ExecuteScriptAndExtractInt( |
| 1319 GetActiveWebContents(), | 1320 GetActiveWebContents(), expression, &dummy)); |
| 1320 expression, | 1321 CHECK_EQ(0, dummy); |
| 1321 &received_prerender_stopped)); | |
| 1322 return received_prerender_stopped; | |
| 1323 } | 1322 } |
| 1324 | 1323 |
| 1325 bool HadPrerenderEventErrors() const { | 1324 bool HadPrerenderEventErrors() const { |
| 1326 bool had_prerender_event_errors; | 1325 bool had_prerender_event_errors; |
| 1327 CHECK(content::ExecuteScriptAndExtractBool( | 1326 CHECK(content::ExecuteScriptAndExtractBool( |
| 1328 GetActiveWebContents(), | 1327 GetActiveWebContents(), |
| 1329 "window.domAutomationController.send(Boolean(" | 1328 "window.domAutomationController.send(Boolean(" |
| 1330 " hadPrerenderEventErrors))", | 1329 " hadPrerenderEventErrors))", |
| 1331 &had_prerender_event_errors)); | 1330 &had_prerender_event_errors)); |
| 1332 return had_prerender_event_errors; | 1331 return had_prerender_event_errors; |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1706 | 1705 |
| 1707 EXPECT_FALSE(DidReceivePrerenderStartEventForLinkNumber(1)); | 1706 EXPECT_FALSE(DidReceivePrerenderStartEventForLinkNumber(1)); |
| 1708 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1707 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
| 1709 EXPECT_FALSE(HadPrerenderEventErrors()); | 1708 EXPECT_FALSE(HadPrerenderEventErrors()); |
| 1710 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* | 1709 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* |
| 1711 // calls did a thread/process hop to the renderer which insured pending | 1710 // calls did a thread/process hop to the renderer which insured pending |
| 1712 // renderer events have arrived. | 1711 // renderer events have arrived. |
| 1713 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); | 1712 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); |
| 1714 } | 1713 } |
| 1715 | 1714 |
| 1716 // Flaky, http://crbug.com/167340. | 1715 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovingLink) { |
| 1717 IN_PROC_BROWSER_TEST_F( | |
| 1718 PrerenderBrowserTest, DISABLED_PrerenderPageRemovingLink) { | |
| 1719 set_loader_path("files/prerender/prerender_loader_removing_links.html"); | |
| 1720 set_loader_query_and_fragment("?links_to_insert=1"); | 1716 set_loader_query_and_fragment("?links_to_insert=1"); |
|
mmenke
2014/02/13 16:34:33
Since there's only one link, we can get rid of thi
davidben
2014/02/14 01:01:13
Done.
| |
| 1721 PrerenderTestURL("files/prerender/prerender_page.html", | 1717 scoped_ptr<TestPrerender> prerender = |
| 1722 FINAL_STATUS_CANCELLED, 1); | 1718 PrerenderTestURL("files/prerender/prerender_page.html", |
| 1719 FINAL_STATUS_CANCELLED, 1); | |
| 1723 | 1720 |
| 1724 // No ChannelDestructionWatcher is needed here, since prerenders in the | 1721 // No ChannelDestructionWatcher is needed here, since prerenders in the |
| 1725 // PrerenderLinkManager should be deleted by removing the links, rather than | 1722 // PrerenderLinkManager should be deleted by removing the links, rather than |
| 1726 // shutting down the renderer process. | 1723 // shutting down the renderer process. |
| 1727 RemoveLinkElement(0); | 1724 RemoveLinkElement(0); |
| 1725 prerender->WaitForStop(); | |
| 1726 | |
| 1728 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1727 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
| 1729 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1728 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
| 1730 EXPECT_FALSE(HadPrerenderEventErrors()); | 1729 EXPECT_FALSE(HadPrerenderEventErrors()); |
| 1731 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* | 1730 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* |
| 1732 // 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 |
| 1733 // renderer events have arrived. | 1732 // renderer events have arrived. |
| 1734 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); | 1733 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); |
| 1735 } | 1734 } |
| 1736 | 1735 |
| 1737 // Flaky, http://crbug.com/167340. | |
| 1738 IN_PROC_BROWSER_TEST_F( | 1736 IN_PROC_BROWSER_TEST_F( |
| 1739 PrerenderBrowserTest, DISABLED_PrerenderPageRemovingLinkWithTwoLinks) { | 1737 PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinks) { |
| 1740 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; | 1738 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; |
| 1741 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; | 1739 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; |
| 1742 | 1740 |
| 1743 set_loader_path("files/prerender/prerender_loader_removing_links.html"); | |
| 1744 set_loader_query_and_fragment("?links_to_insert=2"); | 1741 set_loader_query_and_fragment("?links_to_insert=2"); |
| 1745 PrerenderTestURL("files/prerender/prerender_page.html", | 1742 scoped_ptr<TestPrerender> prerender = |
| 1746 FINAL_STATUS_CANCELLED, 1); | 1743 PrerenderTestURL("files/prerender/prerender_page.html", |
| 1744 FINAL_STATUS_CANCELLED, 1); | |
| 1747 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1745 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
| 1748 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1746 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
| 1749 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | 1747 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
| 1750 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1748 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
| 1751 | 1749 |
| 1752 RemoveLinkElement(0); | 1750 RemoveLinkElement(0); |
| 1753 RemoveLinkElement(1); | 1751 RemoveLinkElement(1); |
| 1752 prerender->WaitForStop(); | |
| 1753 | |
| 1754 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1754 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
| 1755 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1755 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
| 1756 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)); | |
| 1757 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1789 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
| 1758 EXPECT_FALSE(HadPrerenderEventErrors()); | 1790 EXPECT_FALSE(HadPrerenderEventErrors()); |
| 1759 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* | 1791 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* |
| 1760 // 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 |
| 1761 // renderer events have arrived. | 1793 // renderer events have arrived. |
| 1762 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); | 1794 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); |
| 1763 } | 1795 } |
| 1764 | 1796 |
| 1765 #if defined(OS_WIN) | |
| 1766 // TODO(gavinp): Fails on XP Rel - http://crbug.com/128841 | |
| 1767 #define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ | |
| 1768 DISABLED_PrerenderPageRemovingLinkWithTwoLinksRemovingOne | |
| 1769 #else | |
| 1770 #define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ | |
| 1771 PrerenderPageRemovingLinkWithTwoLinksRemovingOne | |
| 1772 #endif // defined(OS_WIN) | |
| 1773 IN_PROC_BROWSER_TEST_F( | 1797 IN_PROC_BROWSER_TEST_F( |
| 1774 PrerenderBrowserTest, | 1798 PrerenderBrowserTest, |
| 1775 MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { | 1799 PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { |
| 1776 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; | 1800 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; |
| 1777 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; | 1801 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; |
| 1778 set_loader_path("files/prerender/prerender_loader_removing_links.html"); | |
| 1779 set_loader_query_and_fragment("?links_to_insert=2"); | 1802 set_loader_query_and_fragment("?links_to_insert=2"); |
| 1780 PrerenderTestURL("files/prerender/prerender_page.html", | 1803 PrerenderTestURL("files/prerender/prerender_page.html", |
| 1781 FINAL_STATUS_USED, 1); | 1804 FINAL_STATUS_USED, 1); |
| 1782 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1805 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
| 1783 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1806 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
| 1784 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | 1807 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
| 1785 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1808 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
| 1786 | 1809 |
| 1787 RemoveLinkElement(0); | 1810 RemoveLinkElement(0); |
| 1788 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1811 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
| (...skipping 2258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4047 } | 4070 } |
| 4048 }; | 4071 }; |
| 4049 | 4072 |
| 4050 // Checks that prerendering works in incognito mode. | 4073 // Checks that prerendering works in incognito mode. |
| 4051 IN_PROC_BROWSER_TEST_F(PrerenderIncognitoBrowserTest, PrerenderIncognito) { | 4074 IN_PROC_BROWSER_TEST_F(PrerenderIncognitoBrowserTest, PrerenderIncognito) { |
| 4052 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); | 4075 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
| 4053 NavigateToDestURL(); | 4076 NavigateToDestURL(); |
| 4054 } | 4077 } |
| 4055 | 4078 |
| 4056 } // namespace prerender | 4079 } // namespace prerender |
| OLD | NEW |