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