Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1373)

Side by Side Diff: chrome/browser/prerender/prerender_browsertest.cc

Issue 11571037: Pass load events from prerenders to launching elements. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ready for review Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/prerender/prerender_contents.h » ('j') | chrome/renderer/prerender/prerender_dispatcher.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698