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 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/path_service.h" | 8 #include "base/path_service.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
(...skipping 845 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
856 L"window.domAutomationController.send(Boolean(" | 856 L"window.domAutomationController.send(Boolean(" |
857 L"receivedPrerenderStartEvents[%d]))", index); | 857 L"receivedPrerenderStartEvents[%d]))", index); |
858 | 858 |
859 CHECK(content::ExecuteJavaScriptAndExtractBool( | 859 CHECK(content::ExecuteJavaScriptAndExtractBool( |
860 chrome::GetActiveWebContents(current_browser())->GetRenderViewHost(), | 860 chrome::GetActiveWebContents(current_browser())->GetRenderViewHost(), |
861 L"", expression, | 861 L"", expression, |
862 &received_prerender_started)); | 862 &received_prerender_started)); |
863 return received_prerender_started; | 863 return received_prerender_started; |
864 } | 864 } |
865 | 865 |
866 bool DidReceivePrerenderLoadEventForLinkNumber(int index) const { | |
867 bool received_prerender_loaded; | |
868 std::wstring expression = base::StringPrintf( | |
869 L"window.domAutomationController.send(Boolean(" | |
870 L"receivedPrerenderLoadEvents[%d]))", index); | |
871 | |
872 CHECK(content::ExecuteJavaScriptAndExtractBool( | |
873 chrome::GetActiveWebContents(current_browser())->GetRenderViewHost(), | |
874 L"", expression, | |
875 &received_prerender_loaded)); | |
876 return received_prerender_loaded; | |
877 } | |
878 | |
866 bool DidReceivePrerenderStopEventForLinkNumber(int index) const { | 879 bool DidReceivePrerenderStopEventForLinkNumber(int index) const { |
867 bool received_prerender_stopped; | 880 bool received_prerender_stopped; |
868 std::wstring expression = base::StringPrintf( | 881 std::wstring expression = base::StringPrintf( |
869 L"window.domAutomationController.send(Boolean(" | 882 L"window.domAutomationController.send(Boolean(" |
870 L"receivedPrerenderStopEvents[%d]))", index); | 883 L"receivedPrerenderStopEvents[%d]))", index); |
871 | 884 |
872 CHECK(content::ExecuteJavaScriptAndExtractBool( | 885 CHECK(content::ExecuteJavaScriptAndExtractBool( |
873 chrome::GetActiveWebContents(current_browser())->GetRenderViewHost(), | 886 chrome::GetActiveWebContents(current_browser())->GetRenderViewHost(), |
874 L"", expression, | 887 L"", expression, |
875 &received_prerender_stopped)); | 888 &received_prerender_stopped)); |
876 return received_prerender_stopped; | 889 return received_prerender_stopped; |
877 } | 890 } |
878 | 891 |
892 bool HadPrerenderEventErrors() const { | |
893 bool had_prerender_event_errors; | |
894 CHECK(content::ExecuteJavaScriptAndExtractBool( | |
895 chrome::GetActiveWebContents(current_browser())->GetRenderViewHost(), | |
896 L"", L"window.domAutomationController.send(Boolean(" | |
897 L"hadPrerenderEventErrors))", &had_prerender_event_errors)); | |
898 return had_prerender_event_errors; | |
899 } | |
900 | |
879 // Asserting on this can result in flaky tests. PrerenderHandles are | 901 // Asserting on this can result in flaky tests. PrerenderHandles are |
880 // removed from the PrerenderLinkManager when the prerender is canceled from | 902 // removed from the PrerenderLinkManager when the prerender is canceled from |
881 // the browser, when the prerenders are cancelled from the renderer process, | 903 // the browser, when the prerenders are cancelled from the renderer process, |
882 // or the channel for the renderer process is closed on the IO thread. In the | 904 // or the channel for the renderer process is closed on the IO thread. In the |
883 // last case, the code must be careful to wait for the channel to close, as it | 905 // last case, the code must be careful to wait for the channel to close, as it |
884 // is done asynchronously after swapping out the old process. See | 906 // is done asynchronously after swapping out the old process. See |
885 // ChannelDestructionWatcher. | 907 // ChannelDestructionWatcher. |
886 bool IsEmptyPrerenderLinkManager() const { | 908 bool IsEmptyPrerenderLinkManager() const { |
887 return GetPrerenderLinkManager()->IsEmpty(); | 909 return GetPrerenderLinkManager()->IsEmpty(); |
888 } | 910 } |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1224 FINAL_STATUS_CANCELLED, 1); | 1246 FINAL_STATUS_CANCELLED, 1); |
1225 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1247 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
1226 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1248 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
1227 | 1249 |
1228 // No ChannelDestructionWatcher is needed here, since prerenders in the | 1250 // No ChannelDestructionWatcher is needed here, since prerenders in the |
1229 // PrerenderLinkManager should be deleted by removing the links, rather than | 1251 // PrerenderLinkManager should be deleted by removing the links, rather than |
1230 // shutting down the renderer process. | 1252 // shutting down the renderer process. |
1231 RemoveLinkElement(0); | 1253 RemoveLinkElement(0); |
1232 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1254 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
1233 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1255 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
1256 EXPECT_FALSE(HadPrerenderEventErrors()); | |
1234 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* | 1257 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* |
1235 // calls did a thread/process hop to the renderer which insured pending | 1258 // calls did a thread/process hop to the renderer which insured pending |
1236 // renderer events have arrived. | 1259 // renderer events have arrived. |
1237 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); | 1260 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); |
1238 } | 1261 } |
1239 | 1262 |
1240 IN_PROC_BROWSER_TEST_F( | 1263 IN_PROC_BROWSER_TEST_F( |
1241 PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinks) { | 1264 PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinks) { |
1242 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; | 1265 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; |
1243 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; | 1266 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; |
1244 | 1267 |
1245 set_loader_path("files/prerender/prerender_loader_removing_links.html"); | 1268 set_loader_path("files/prerender/prerender_loader_removing_links.html"); |
1246 set_loader_query_and_fragment("?links_to_insert=2"); | 1269 set_loader_query_and_fragment("?links_to_insert=2"); |
1247 PrerenderTestURL("files/prerender/prerender_page.html", | 1270 PrerenderTestURL("files/prerender/prerender_page.html", |
1248 FINAL_STATUS_CANCELLED, 1); | 1271 FINAL_STATUS_CANCELLED, 1); |
1249 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1272 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
1250 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1273 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
1251 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | 1274 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
1252 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1275 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
1253 | 1276 |
1254 RemoveLinkElement(0); | 1277 RemoveLinkElement(0); |
1255 RemoveLinkElement(1); | 1278 RemoveLinkElement(1); |
1256 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1279 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
1257 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1280 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
1258 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | 1281 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
1259 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1282 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
1283 EXPECT_FALSE(HadPrerenderEventErrors()); | |
1260 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* | 1284 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* |
1261 // calls did a thread/process hop to the renderer which insured pending | 1285 // calls did a thread/process hop to the renderer which insured pending |
1262 // renderer events have arrived. | 1286 // renderer events have arrived. |
1263 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); | 1287 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); |
1264 } | 1288 } |
1265 | 1289 |
1266 #if defined(OS_WIN) | 1290 #if defined(OS_WIN) |
1267 // TODO(gavinp): Fails on XP Rel - http://crbug.com/128841 | 1291 // TODO(gavinp): Fails on XP Rel - http://crbug.com/128841 |
1268 #define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ | 1292 #define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ |
1269 DISABLED_PrerenderPageRemovingLinkWithTwoLinksRemovingOne | 1293 DISABLED_PrerenderPageRemovingLinkWithTwoLinksRemovingOne |
(...skipping 13 matching lines...) Expand all Loading... | |
1283 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1307 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
1284 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1308 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
1285 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | 1309 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
1286 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1310 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
1287 | 1311 |
1288 RemoveLinkElement(0); | 1312 RemoveLinkElement(0); |
1289 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 1313 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
1290 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 1314 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
1291 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); | 1315 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); |
1292 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); | 1316 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); |
1317 EXPECT_FALSE(HadPrerenderEventErrors()); | |
1293 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* | 1318 // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* |
1294 // calls did a thread/process hop to the renderer which insured pending | 1319 // calls did a thread/process hop to the renderer which insured pending |
1295 // renderer events have arrived. | 1320 // renderer events have arrived. |
1296 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); | 1321 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); |
1297 | 1322 |
1298 ChannelDestructionWatcher channel_close_watcher; | 1323 ChannelDestructionWatcher channel_close_watcher; |
1299 channel_close_watcher.WatchChannel( | 1324 channel_close_watcher.WatchChannel( |
1300 chrome::GetActiveWebContents(browser())->GetRenderProcessHost()); | 1325 chrome::GetActiveWebContents(browser())->GetRenderProcessHost()); |
1301 NavigateToDestURL(); | 1326 NavigateToDestURL(); |
1302 channel_close_watcher.WaitForChannelClose(); | 1327 channel_close_watcher.WaitForChannelClose(); |
(...skipping 1089 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2392 MessageLoop::current()->PostTask( | 2417 MessageLoop::current()->PostTask( |
2393 FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); | 2418 FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); |
2394 content::RunMessageLoop(); | 2419 content::RunMessageLoop(); |
2395 EXPECT_TRUE(GetPrerenderContents() == NULL); | 2420 EXPECT_TRUE(GetPrerenderContents() == NULL); |
2396 } | 2421 } |
2397 | 2422 |
2398 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderEvents) { | 2423 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderEvents) { |
2399 PrerenderTestURL("files/prerender/prerender_page.html", | 2424 PrerenderTestURL("files/prerender/prerender_page.html", |
2400 FINAL_STATUS_CANCELLED, 1); | 2425 FINAL_STATUS_CANCELLED, 1); |
2401 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 2426 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
2427 EXPECT_TRUE(DidReceivePrerenderLoadEventForLinkNumber(0)); | |
2402 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | 2428 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); |
2403 | 2429 |
2404 MessageLoop::current()->PostTask( | 2430 MessageLoop::current()->PostTask( |
2405 FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); | 2431 FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); |
2406 content::RunMessageLoop(); | 2432 content::RunMessageLoop(); |
2407 | 2433 |
2408 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | 2434 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); |
2409 EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); | 2435 EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); |
2436 EXPECT_FALSE(HadPrerenderEventErrors()); | |
2437 } | |
2438 | |
2439 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderEventsNoLoad) { | |
mmenke
2012/12/27 19:11:08
Think it's worth mentioning that this test may pas
gavinp
2012/12/28 13:23:15
Done.
| |
2440 // This should be canceled. | |
2441 PrerenderTestURL("files/prerender/prerender_http_auth_container.html", | |
2442 FINAL_STATUS_AUTH_NEEDED, | |
2443 1); | |
2444 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); | |
2445 EXPECT_FALSE(DidReceivePrerenderLoadEventForLinkNumber(0)); | |
2446 EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); | |
2447 EXPECT_FALSE(HadPrerenderEventErrors()); | |
2410 } | 2448 } |
2411 | 2449 |
2412 // Prerendering and history tests. | 2450 // Prerendering and history tests. |
2413 // The prerendered page is navigated to in several ways [navigate via | 2451 // The prerendered page is navigated to in several ways [navigate via |
2414 // omnibox, click on link, key-modified click to open in background tab, etc], | 2452 // omnibox, click on link, key-modified click to open in background tab, etc], |
2415 // followed by a navigation to another page from the prerendered page, followed | 2453 // followed by a navigation to another page from the prerendered page, followed |
2416 // by a back navigation. | 2454 // by a back navigation. |
2417 | 2455 |
2418 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNavigateClickGoBack) { | 2456 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNavigateClickGoBack) { |
2419 PrerenderTestURL("files/prerender/prerender_page_with_link.html", | 2457 PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2638 channel_close_watcher.WatchChannel( | 2676 channel_close_watcher.WatchChannel( |
2639 chrome::GetActiveWebContents(browser())->GetRenderProcessHost()); | 2677 chrome::GetActiveWebContents(browser())->GetRenderProcessHost()); |
2640 NavigateToDestURL(); | 2678 NavigateToDestURL(); |
2641 channel_close_watcher.WaitForChannelClose(); | 2679 channel_close_watcher.WaitForChannelClose(); |
2642 | 2680 |
2643 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); | 2681 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); |
2644 ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); | 2682 ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); |
2645 } | 2683 } |
2646 | 2684 |
2647 } // namespace prerender | 2685 } // namespace prerender |
OLD | NEW |