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 |