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 2950 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2961 } | 2961 } |
2962 | 2962 |
2963 // Checks that we cancel correctly when window.print() is called. | 2963 // Checks that we cancel correctly when window.print() is called. |
2964 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPrint) { | 2964 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPrint) { |
2965 DisableLoadEventCheck(); | 2965 DisableLoadEventCheck(); |
2966 PrerenderTestURL("files/prerender/prerender_print.html", | 2966 PrerenderTestURL("files/prerender/prerender_print.html", |
2967 FINAL_STATUS_WINDOW_PRINT, | 2967 FINAL_STATUS_WINDOW_PRINT, |
2968 0); | 2968 0); |
2969 } | 2969 } |
2970 | 2970 |
2971 // Checks that if a page is opened in a new window by javascript and both the | |
2972 // pages are in the same domain, the prerendered page is not used, due to | |
2973 // there being other tabs in the same browsing instance. | |
2974 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
2975 PrerenderSameDomainWindowOpenerWindowOpen) { | |
2976 PrerenderTestURL("files/prerender/prerender_page.html", | |
2977 FINAL_STATUS_NON_EMPTY_BROWSING_INSTANCE, | |
2978 1); | |
2979 OpenDestURLViaWindowOpen(); | |
2980 } | |
2981 | |
2982 // Checks that if a page is opened due to click on a href with target="_blank" | |
2983 // and both pages are in the same domain the prerendered page is not used, due | |
2984 // there being other tabs in the same browsing instance. | |
2985 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
2986 PrerenderSameDomainWindowOpenerClickTarget) { | |
2987 PrerenderTestURL("files/prerender/prerender_page.html", | |
2988 FINAL_STATUS_NON_EMPTY_BROWSING_INSTANCE, | |
2989 1); | |
2990 OpenDestURLViaClickTarget(); | |
2991 } | |
2992 | |
2993 // Checks that prerenders do not get swapped into target pages that have opened | 2971 // Checks that prerenders do not get swapped into target pages that have opened |
2994 // a popup, even if the target page itself does not have an opener. | 2972 // popups; the BrowsingInstance is not empty. |
2995 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderTargetHasPopup) { | 2973 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderTargetHasPopup) { |
2996 PrerenderTestURL("files/prerender/prerender_page.html", | 2974 PrerenderTestURL("files/prerender/prerender_page.html", |
2997 FINAL_STATUS_NON_EMPTY_BROWSING_INSTANCE, | 2975 FINAL_STATUS_NON_EMPTY_BROWSING_INSTANCE, |
2998 1); | 2976 1); |
2999 OpenURLViaWindowOpen(GURL(url::kAboutBlankURL)); | 2977 OpenURLViaWindowOpen(GURL(url::kAboutBlankURL)); |
| 2978 |
| 2979 // Switch back to the current tab and attempt to swap it in. |
| 2980 current_browser()->tab_strip_model()->ActivateTabAt(0, true); |
3000 NavigateToDestURLWithDisposition(CURRENT_TAB, false); | 2981 NavigateToDestURLWithDisposition(CURRENT_TAB, false); |
3001 } | 2982 } |
3002 | 2983 |
3003 class TestClientCertStore : public net::ClientCertStore { | 2984 class TestClientCertStore : public net::ClientCertStore { |
3004 public: | 2985 public: |
3005 TestClientCertStore() {} | 2986 TestClientCertStore() {} |
3006 ~TestClientCertStore() override {} | 2987 ~TestClientCertStore() override {} |
3007 | 2988 |
3008 // net::ClientCertStore: | 2989 // net::ClientCertStore: |
3009 void GetClientCerts(const net::SSLCertRequestInfo& cert_request_info, | 2990 void GetClientCerts(const net::SSLCertRequestInfo& cert_request_info, |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3347 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNavigateGoBack) { | 3328 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNavigateGoBack) { |
3348 PrerenderTestURL("files/prerender/prerender_page_with_link.html", | 3329 PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
3349 FINAL_STATUS_USED, | 3330 FINAL_STATUS_USED, |
3350 1); | 3331 1); |
3351 OpenDestURLViaClick(); | 3332 OpenDestURLViaClick(); |
3352 NavigateToNextPageAfterPrerender(); | 3333 NavigateToNextPageAfterPrerender(); |
3353 GoBackToPrerender(); | 3334 GoBackToPrerender(); |
3354 } | 3335 } |
3355 | 3336 |
3356 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewWindow) { | 3337 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewWindow) { |
3357 // Prerender currently doesn't interpose on this navigation. | |
3358 // http://crbug.com/345474. | |
3359 PrerenderTestURL("files/prerender/prerender_page_with_link.html", | 3338 PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
3360 FINAL_STATUS_USED, | 3339 FINAL_STATUS_APP_TERMINATING, 1); |
3361 1); | |
3362 OpenDestURLViaClickNewWindow(); | 3340 OpenDestURLViaClickNewWindow(); |
3363 } | 3341 } |
3364 | 3342 |
3365 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewForegroundTab) { | 3343 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewForegroundTab) { |
3366 // Prerender currently doesn't interpose on this navigation. | |
3367 // http://crbug.com/345474. | |
3368 PrerenderTestURL("files/prerender/prerender_page_with_link.html", | 3344 PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
3369 FINAL_STATUS_USED, | 3345 FINAL_STATUS_APP_TERMINATING, 1); |
3370 1); | |
3371 OpenDestURLViaClickNewForegroundTab(); | 3346 OpenDestURLViaClickNewForegroundTab(); |
3372 } | 3347 } |
3373 | 3348 |
3374 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 3349 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
3375 NavigateToPrerenderedPageWhenDevToolsAttached) { | 3350 NavigateToPrerenderedPageWhenDevToolsAttached) { |
3376 DisableJavascriptCalls(); | 3351 DisableJavascriptCalls(); |
3377 WebContents* web_contents = | 3352 WebContents* web_contents = |
3378 current_browser()->tab_strip_model()->GetActiveWebContents(); | 3353 current_browser()->tab_strip_model()->GetActiveWebContents(); |
3379 scoped_refptr<DevToolsAgentHost> agent( | 3354 scoped_refptr<DevToolsAgentHost> agent( |
3380 DevToolsAgentHost::GetOrCreateFor(web_contents)); | 3355 DevToolsAgentHost::GetOrCreateFor(web_contents)); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3444 "Prerender.websame_PrerenderNotSwappedInPLT", 1); | 3419 "Prerender.websame_PrerenderNotSwappedInPLT", 1); |
3445 | 3420 |
3446 NavigateToDestURL(); | 3421 NavigateToDestURL(); |
3447 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); | 3422 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); |
3448 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", | 3423 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", |
3449 0); | 3424 0); |
3450 histogram_tester().ExpectTotalCount( | 3425 histogram_tester().ExpectTotalCount( |
3451 "Prerender.websame_PerceivedPLTMatchedComplete", 1); | 3426 "Prerender.websame_PerceivedPLTMatchedComplete", 1); |
3452 } | 3427 } |
3453 | 3428 |
3454 // Verify that a navigation that hits a MatchComplete dummy while another is in | |
3455 // progress does not also classify the previous navigation as a MatchComplete. | |
3456 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
3457 MatchCompleteDummyCancelNavigation) { | |
3458 RestorePrerenderMode restore_prerender_mode; | |
3459 PrerenderManager::SetMode( | |
3460 PrerenderManager::PRERENDER_MODE_EXPERIMENT_MATCH_COMPLETE_GROUP); | |
3461 | |
3462 // Arrange for a URL to hang. | |
3463 const GURL kNoCommitUrl("http://never-respond.example.com"); | |
3464 base::FilePath file(FILE_PATH_LITERAL( | |
3465 "chrome/test/data/prerender/prerender_page.html")); | |
3466 base::RunLoop hang_loop; | |
3467 BrowserThread::PostTask( | |
3468 BrowserThread::IO, FROM_HERE, | |
3469 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, kNoCommitUrl, | |
3470 file, hang_loop.QuitClosure())); | |
3471 | |
3472 // First, fire a prerender that aborts after it completes its load. | |
3473 std::vector<FinalStatus> expected_final_status_queue; | |
3474 expected_final_status_queue.push_back(FINAL_STATUS_INVALID_HTTP_METHOD); | |
3475 expected_final_status_queue.push_back(FINAL_STATUS_WOULD_HAVE_BEEN_USED); | |
3476 PrerenderTestURL("files/prerender/prerender_xhr_put.html", | |
3477 expected_final_status_queue, 1); | |
3478 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); | |
3479 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); | |
3480 histogram_tester().ExpectTotalCount( | |
3481 "Prerender.none_PerceivedPLTMatchedComplete", 0); | |
3482 histogram_tester().ExpectTotalCount( | |
3483 "Prerender.websame_PrerenderNotSwappedInPLT", 1); | |
3484 | |
3485 // Open the hanging URL in a new tab. Wait for both the new tab to open and | |
3486 // the hanging request to be scheduled. | |
3487 ui_test_utils::NavigateToURLWithDisposition( | |
3488 current_browser(), kNoCommitUrl, NEW_FOREGROUND_TAB, | |
3489 ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); | |
3490 hang_loop.Run(); | |
3491 | |
3492 // Now interrupt that navigation and navigate to the destination URL. This | |
3493 // should forcibly complete the previous navigation and also complete a | |
3494 // WOULD_HAVE_BEEN_PRERENDERED navigation. | |
3495 NavigateToDestURL(); | |
3496 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 2); | |
3497 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); | |
3498 histogram_tester().ExpectTotalCount( | |
3499 "Prerender.none_PerceivedPLTMatchedComplete", 0); | |
3500 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); | |
3501 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", | |
3502 0); | |
3503 histogram_tester().ExpectTotalCount( | |
3504 "Prerender.websame_PerceivedPLTMatchedComplete", 1); | |
3505 } | |
3506 | |
3507 class PrerenderBrowserTestWithNaCl : public PrerenderBrowserTest { | 3429 class PrerenderBrowserTestWithNaCl : public PrerenderBrowserTest { |
3508 public: | 3430 public: |
3509 PrerenderBrowserTestWithNaCl() {} | 3431 PrerenderBrowserTestWithNaCl() {} |
3510 ~PrerenderBrowserTestWithNaCl() override {} | 3432 ~PrerenderBrowserTestWithNaCl() override {} |
3511 | 3433 |
3512 void SetUpCommandLine(CommandLine* command_line) override { | 3434 void SetUpCommandLine(CommandLine* command_line) override { |
3513 PrerenderBrowserTest::SetUpCommandLine(command_line); | 3435 PrerenderBrowserTest::SetUpCommandLine(command_line); |
3514 command_line->AppendSwitch(switches::kEnableNaCl); | 3436 command_line->AppendSwitch(switches::kEnableNaCl); |
3515 } | 3437 } |
3516 }; | 3438 }; |
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4020 } | 3942 } |
4021 | 3943 |
4022 // Checks that the prerendering of a page is canceled correctly when the | 3944 // Checks that the prerendering of a page is canceled correctly when the |
4023 // prerendered page tries to make a second navigation entry. | 3945 // prerendered page tries to make a second navigation entry. |
4024 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNewNavigationEntry) { | 3946 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNewNavigationEntry) { |
4025 PrerenderTestURL("files/prerender/prerender_new_entry.html", | 3947 PrerenderTestURL("files/prerender/prerender_new_entry.html", |
4026 FINAL_STATUS_NEW_NAVIGATION_ENTRY, | 3948 FINAL_STATUS_NEW_NAVIGATION_ENTRY, |
4027 1); | 3949 1); |
4028 } | 3950 } |
4029 | 3951 |
4030 // Attempt a swap-in in a new tab, verifying that session storage namespace | 3952 // Attempt a swap-in in a new tab. The session storage doesn't match, so it |
4031 // merging works. | 3953 // should not swap. |
4032 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageNewTab) { | 3954 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageNewTab) { |
4033 // Mock out some URLs and count the number of requests to one of them. Both | 3955 PrerenderTestURL("files/prerender/prerender_page.html", |
4034 // prerender_session_storage.html and init_session_storage.html need to be | |
4035 // mocked so they are same-origin. | |
4036 const GURL kInitURL("http://prerender.test/init_session_storage.html"); | |
4037 base::FilePath init_file = GetTestPath("init_session_storage.html"); | |
4038 BrowserThread::PostTask( | |
4039 BrowserThread::IO, FROM_HERE, | |
4040 base::Bind(&CreateMockInterceptorOnIO, kInitURL, init_file)); | |
4041 | |
4042 const GURL kTestURL("http://prerender.test/prerender_session_storage.html"); | |
4043 base::FilePath test_file = GetTestPath("prerender_session_storage.html"); | |
4044 RequestCounter counter; | |
4045 BrowserThread::PostTask( | |
4046 BrowserThread::IO, FROM_HERE, | |
4047 base::Bind(&CreateCountingInterceptorOnIO, | |
4048 kTestURL, test_file, counter.AsWeakPtr())); | |
4049 | |
4050 PrerenderTestURL(kTestURL, FINAL_STATUS_USED, 1); | |
4051 | |
4052 // Open a new tab to navigate in. | |
4053 ui_test_utils::NavigateToURLWithDisposition( | |
4054 current_browser(), kInitURL, NEW_FOREGROUND_TAB, | |
4055 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | |
4056 | |
4057 // Now navigate in the new tab. Set expect_swap_to_succeed to false because | |
4058 // the swap does not occur synchronously. | |
4059 // | |
4060 // TODO(davidben): When all swaps become asynchronous, remove the OpenURL | |
4061 // return value assertion and let this go through the usual successful-swap | |
4062 // codepath. | |
4063 NavigateToDestURLWithDisposition(CURRENT_TAB, false); | |
4064 | |
4065 // Verify DidDisplayPass manually since the previous call skipped it. | |
4066 EXPECT_TRUE(DidDisplayPass( | |
4067 current_browser()->tab_strip_model()->GetActiveWebContents())); | |
4068 | |
4069 // Only one request to the test URL started. | |
4070 // | |
4071 // TODO(davidben): Re-enable this check when the races in attaching the | |
4072 // throttle are resolved. http://crbug.com/335835 | |
4073 // EXPECT_EQ(1, counter.count()); | |
4074 } | |
4075 | |
4076 // Attempt a swap-in in a new tab, verifying that session storage namespace | |
4077 // merging works. Unlike the above test, the swap is for a navigation that would | |
4078 // normally be cross-process. | |
4079 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageNewTabCrossProcess) { | |
4080 base::FilePath test_data_dir; | |
4081 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)); | |
4082 | |
4083 // Mock out some URLs and count the number of requests to one of them. Both | |
4084 // prerender_session_storage.html and init_session_storage.html need to be | |
4085 // mocked so they are same-origin. | |
4086 const GURL kInitURL("http://prerender.test/init_session_storage.html"); | |
4087 base::FilePath init_file = GetTestPath("init_session_storage.html"); | |
4088 BrowserThread::PostTask( | |
4089 BrowserThread::IO, FROM_HERE, | |
4090 base::Bind(&CreateMockInterceptorOnIO, kInitURL, init_file)); | |
4091 | |
4092 const GURL kTestURL("http://prerender.test/prerender_session_storage.html"); | |
4093 base::FilePath test_file = GetTestPath("prerender_session_storage.html"); | |
4094 RequestCounter counter; | |
4095 BrowserThread::PostTask( | |
4096 BrowserThread::IO, FROM_HERE, | |
4097 base::Bind(&CreateCountingInterceptorOnIO, | |
4098 kTestURL, test_file, counter.AsWeakPtr())); | |
4099 | |
4100 PrerenderTestURL(kTestURL, FINAL_STATUS_USED, 1); | |
4101 | |
4102 // Open a new tab to navigate in. | |
4103 ui_test_utils::NavigateToURLWithDisposition( | |
4104 current_browser(), kInitURL, NEW_FOREGROUND_TAB, | |
4105 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | |
4106 | |
4107 // Navigate to about:blank so the next navigation is cross-process. | |
4108 ui_test_utils::NavigateToURL(current_browser(), GURL(url::kAboutBlankURL)); | |
4109 | |
4110 // Now navigate in the new tab. Set expect_swap_to_succeed to false because | |
4111 // the swap does not occur synchronously. | |
4112 // | |
4113 // TODO(davidben): When all swaps become asynchronous, remove the OpenURL | |
4114 // return value assertion and let this go through the usual successful-swap | |
4115 // codepath. | |
4116 NavigateToDestURLWithDisposition(CURRENT_TAB, false); | |
4117 | |
4118 // Verify DidDisplayPass manually since the previous call skipped it. | |
4119 EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); | |
4120 | |
4121 // Only one request to the test URL started. | |
4122 // | |
4123 // TODO(davidben): Re-enable this check when the races in attaching the | |
4124 // throttle are resolved. http://crbug.com/335835 | |
4125 // EXPECT_EQ(1, counter.count()); | |
4126 } | |
4127 | |
4128 // Verify that session storage conflicts don't merge. | |
4129 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSessionStorageConflict) { | |
4130 PrerenderTestURL("files/prerender/prerender_session_storage_conflict.html", | |
4131 FINAL_STATUS_APP_TERMINATING, 1); | 3956 FINAL_STATUS_APP_TERMINATING, 1); |
4132 | 3957 |
4133 // Open a new tab to navigate in. | 3958 // Open a new tab to navigate in. |
4134 ui_test_utils::NavigateToURLWithDisposition( | 3959 ui_test_utils::NavigateToURLWithDisposition( |
4135 current_browser(), | 3960 current_browser(), GURL(url::kAboutBlankURL), NEW_FOREGROUND_TAB, |
4136 test_server()->GetURL("files/prerender/init_session_storage.html"), | |
4137 NEW_FOREGROUND_TAB, | |
4138 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 3961 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
4139 | 3962 |
4140 // Now navigate in the new tab. | 3963 // Now navigate in the new tab. |
4141 NavigateToDestURLWithDisposition(CURRENT_TAB, false); | 3964 NavigateToDestURLWithDisposition(CURRENT_TAB, false); |
4142 | |
4143 // Verify DidDisplayPass in the new tab. | |
4144 EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); | |
4145 } | 3965 } |
4146 | 3966 |
4147 // Checks that prerenders honor |should_replace_current_entry|. | 3967 // Checks that prerenders honor |should_replace_current_entry|. |
4148 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReplaceCurrentEntry) { | 3968 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReplaceCurrentEntry) { |
4149 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); | 3969 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
4150 | 3970 |
4151 content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, | 3971 content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, |
4152 ui::PAGE_TRANSITION_TYPED, false); | 3972 ui::PAGE_TRANSITION_TYPED, false); |
4153 params.should_replace_current_entry = true; | 3973 params.should_replace_current_entry = true; |
4154 NavigateToURLWithParams(params, false); | 3974 NavigateToURLWithParams(params, false); |
4155 | 3975 |
4156 const NavigationController& controller = | 3976 const NavigationController& controller = |
4157 GetActiveWebContents()->GetController(); | 3977 GetActiveWebContents()->GetController(); |
4158 // First entry is about:blank, second is prerender_page.html. | 3978 // First entry is about:blank, second is prerender_page.html. |
4159 EXPECT_TRUE(controller.GetPendingEntry() == NULL); | 3979 EXPECT_TRUE(controller.GetPendingEntry() == NULL); |
4160 EXPECT_EQ(2, controller.GetEntryCount()); | 3980 EXPECT_EQ(2, controller.GetEntryCount()); |
4161 EXPECT_EQ(GURL(url::kAboutBlankURL), controller.GetEntryAtIndex(0)->GetURL()); | 3981 EXPECT_EQ(GURL(url::kAboutBlankURL), controller.GetEntryAtIndex(0)->GetURL()); |
4162 EXPECT_EQ(dest_url(), controller.GetEntryAtIndex(1)->GetURL()); | 3982 EXPECT_EQ(dest_url(), controller.GetEntryAtIndex(1)->GetURL()); |
4163 } | 3983 } |
4164 | 3984 |
4165 // Checks prerender does not hit DCHECKs and behaves properly if two pending | |
4166 // swaps occur in a row. | |
4167 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDoublePendingSwap) { | |
4168 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; | |
4169 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; | |
4170 | |
4171 GURL url1 = test_server()->GetURL("files/prerender/prerender_page.html?1"); | |
4172 scoped_ptr<TestPrerender> prerender1 = | |
4173 PrerenderTestURL(url1, FINAL_STATUS_APP_TERMINATING, 1); | |
4174 | |
4175 GURL url2 = test_server()->GetURL("files/prerender/prerender_page.html?2"); | |
4176 scoped_ptr<TestPrerender> prerender2 = ExpectPrerender(FINAL_STATUS_USED); | |
4177 AddPrerender(url2, 1); | |
4178 prerender2->WaitForStart(); | |
4179 prerender2->WaitForLoads(1); | |
4180 | |
4181 // There's no reason the second prerender can't be used, but the swap races | |
4182 // with didStartProvisionalLoad and didFailProvisionalLoad from the previous | |
4183 // navigation. The current logic will conservatively fail to swap under such | |
4184 // races. However, if the renderer is slow enough, it's possible for the | |
4185 // prerender to still be used, so don't program in either expectation. | |
4186 ASSERT_TRUE(prerender2->contents()); | |
4187 prerender2->contents()->set_skip_final_checks(true); | |
4188 | |
4189 // Open a new tab to navigate in. | |
4190 ui_test_utils::NavigateToURLWithDisposition( | |
4191 current_browser(), | |
4192 GURL(url::kAboutBlankURL), | |
4193 NEW_FOREGROUND_TAB, | |
4194 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | |
4195 | |
4196 // Fire off two navigations, without running the event loop between them. | |
4197 NavigationOrSwapObserver swap_observer( | |
4198 current_browser()->tab_strip_model(), | |
4199 GetActiveWebContents(), 2); | |
4200 current_browser()->OpenURL(OpenURLParams( | |
4201 url1, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false)); | |
4202 current_browser()->OpenURL(OpenURLParams( | |
4203 url2, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false)); | |
4204 swap_observer.Wait(); | |
4205 | |
4206 // The WebContents should be on url2. There may be 2 or 3 entries, depending | |
4207 // on whether the first one managed to complete. | |
4208 // | |
4209 // TODO(davidben): When http://crbug.com/335835 is fixed, the 3 entry case | |
4210 // shouldn't be possible because it's throttled by the pending swap that | |
4211 // cannot complete. | |
4212 const NavigationController& controller = | |
4213 GetActiveWebContents()->GetController(); | |
4214 EXPECT_TRUE(controller.GetPendingEntry() == NULL); | |
4215 EXPECT_LE(2, controller.GetEntryCount()); | |
4216 EXPECT_GE(3, controller.GetEntryCount()); | |
4217 EXPECT_EQ(GURL(url::kAboutBlankURL), controller.GetEntryAtIndex(0)->GetURL()); | |
4218 EXPECT_EQ(url2, controller.GetEntryAtIndex( | |
4219 controller.GetEntryCount() - 1)->GetURL()); | |
4220 } | |
4221 | |
4222 // Verify that pending swaps get aborted on new navigations. | |
4223 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
4224 PrerenderPendingSwapNewNavigation) { | |
4225 PrerenderManager::HangSessionStorageMergesForTesting(); | |
4226 | |
4227 PrerenderTestURL("files/prerender/prerender_page.html", | |
4228 FINAL_STATUS_APP_TERMINATING, 1); | |
4229 | |
4230 // Open a new tab to navigate in. | |
4231 ui_test_utils::NavigateToURLWithDisposition( | |
4232 current_browser(), | |
4233 GURL(url::kAboutBlankURL), | |
4234 NEW_FOREGROUND_TAB, | |
4235 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | |
4236 | |
4237 // Navigate to the URL. Wait for DidStartLoading, just so it's definitely | |
4238 // progressed somewhere. | |
4239 content::WindowedNotificationObserver page_load_observer( | |
4240 content::NOTIFICATION_LOAD_START, | |
4241 content::Source<NavigationController>( | |
4242 &GetActiveWebContents()->GetController())); | |
4243 current_browser()->OpenURL(OpenURLParams( | |
4244 dest_url(), Referrer(), CURRENT_TAB, | |
4245 ui::PAGE_TRANSITION_TYPED, false)); | |
4246 page_load_observer.Wait(); | |
4247 | |
4248 // Navigate somewhere else. This should succeed and abort the pending swap. | |
4249 TestNavigationObserver nav_observer(GetActiveWebContents()); | |
4250 current_browser()->OpenURL(OpenURLParams(GURL(url::kAboutBlankURL), | |
4251 Referrer(), | |
4252 CURRENT_TAB, | |
4253 ui::PAGE_TRANSITION_TYPED, | |
4254 false)); | |
4255 nav_observer.Wait(); | |
4256 } | |
4257 | |
4258 // Checks that <a ping> requests are not dropped in prerender. | 3985 // Checks that <a ping> requests are not dropped in prerender. |
4259 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPing) { | 3986 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPing) { |
4260 // Count hits to a certain URL. | 3987 // Count hits to a certain URL. |
4261 const GURL kPingURL("http://prerender.test/ping"); | 3988 const GURL kPingURL("http://prerender.test/ping"); |
4262 base::FilePath empty_file = ui_test_utils::GetTestFilePath( | 3989 base::FilePath empty_file = ui_test_utils::GetTestFilePath( |
4263 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); | 3990 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); |
4264 RequestCounter ping_counter; | 3991 RequestCounter ping_counter; |
4265 BrowserThread::PostTask( | 3992 BrowserThread::PostTask( |
4266 BrowserThread::IO, FROM_HERE, | 3993 BrowserThread::IO, FROM_HERE, |
4267 base::Bind(&CreateCountingInterceptorOnIO, | 3994 base::Bind(&CreateCountingInterceptorOnIO, |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4576 TestShouldDisableLocalPredictorPreferenceNetworkMatrix( | 4303 TestShouldDisableLocalPredictorPreferenceNetworkMatrix( |
4577 true /*preference_wifi_network_wifi*/, | 4304 true /*preference_wifi_network_wifi*/, |
4578 true /*preference_wifi_network_4g*/, | 4305 true /*preference_wifi_network_4g*/, |
4579 true /*preference_always_network_wifi*/, | 4306 true /*preference_always_network_wifi*/, |
4580 false /*preference_always_network_4g*/, | 4307 false /*preference_always_network_4g*/, |
4581 true /*preference_never_network_wifi*/, | 4308 true /*preference_never_network_wifi*/, |
4582 true /*preference_never_network_4g*/); | 4309 true /*preference_never_network_4g*/); |
4583 } | 4310 } |
4584 | 4311 |
4585 } // namespace prerender | 4312 } // namespace prerender |
OLD | NEW |