| 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 <stddef.h> | 5 #include <stddef.h> |
| 6 #include <deque> | 6 #include <deque> |
| 7 #include <utility> | 7 #include <utility> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 void OnPrerenderStop(PrerenderContents* contents) override { | 659 void OnPrerenderStop(PrerenderContents* contents) override { |
| 660 DCHECK(contents_); | 660 DCHECK(contents_); |
| 661 contents_ = NULL; | 661 contents_ = NULL; |
| 662 stop_loop_.Quit(); | 662 stop_loop_.Quit(); |
| 663 // If there is a WaitForLoads call and it has yet to see the expected number | 663 // If there is a WaitForLoads call and it has yet to see the expected number |
| 664 // of loads, stop the loop so the test fails instead of timing out. | 664 // of loads, stop the loop so the test fails instead of timing out. |
| 665 if (load_waiter_) | 665 if (load_waiter_) |
| 666 load_waiter_->Quit(); | 666 load_waiter_->Quit(); |
| 667 } | 667 } |
| 668 | 668 |
| 669 void OnPrerenderCreatedMatchCompleteReplacement( | |
| 670 PrerenderContents* contents, | |
| 671 PrerenderContents* replacement) override {} | |
| 672 | |
| 673 private: | 669 private: |
| 674 TestPrerenderContents* contents_; | 670 TestPrerenderContents* contents_; |
| 675 int number_of_loads_; | 671 int number_of_loads_; |
| 676 | 672 |
| 677 int expected_number_of_loads_; | 673 int expected_number_of_loads_; |
| 678 std::unique_ptr<base::RunLoop> load_waiter_; | 674 std::unique_ptr<base::RunLoop> load_waiter_; |
| 679 | 675 |
| 680 base::RunLoop create_loop_; | 676 base::RunLoop create_loop_; |
| 681 base::RunLoop start_loop_; | 677 base::RunLoop start_loop_; |
| 682 base::RunLoop stop_loop_; | 678 base::RunLoop stop_loop_; |
| (...skipping 2597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3280 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ControlGroupRendererInitiated) { | 3276 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ControlGroupRendererInitiated) { |
| 3281 RestorePrerenderMode restore_prerender_mode; | 3277 RestorePrerenderMode restore_prerender_mode; |
| 3282 PrerenderManager::SetMode( | 3278 PrerenderManager::SetMode( |
| 3283 PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); | 3279 PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); |
| 3284 DisableJavascriptCalls(); | 3280 DisableJavascriptCalls(); |
| 3285 PrerenderTestURL("/prerender/prerender_xhr_put.html", | 3281 PrerenderTestURL("/prerender/prerender_xhr_put.html", |
| 3286 FINAL_STATUS_WOULD_HAVE_BEEN_USED, 0); | 3282 FINAL_STATUS_WOULD_HAVE_BEEN_USED, 0); |
| 3287 OpenDestURLViaClick(); | 3283 OpenDestURLViaClick(); |
| 3288 } | 3284 } |
| 3289 | 3285 |
| 3290 // Make sure that the MatchComplete dummy works in the normal case. Once | |
| 3291 // a prerender is cancelled because of a script, a dummy must be created to | |
| 3292 // account for the MatchComplete case, and it must have a final status of | |
| 3293 // FINAL_STATUS_WOULD_HAVE_BEEN_USED. | |
| 3294 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MatchCompleteDummy) { | |
| 3295 RestorePrerenderMode restore_prerender_mode; | |
| 3296 PrerenderManager::SetMode( | |
| 3297 PrerenderManager::PRERENDER_MODE_EXPERIMENT_MATCH_COMPLETE_GROUP); | |
| 3298 | |
| 3299 std::vector<FinalStatus> expected_final_status_queue; | |
| 3300 expected_final_status_queue.push_back(FINAL_STATUS_INVALID_HTTP_METHOD); | |
| 3301 expected_final_status_queue.push_back(FINAL_STATUS_WOULD_HAVE_BEEN_USED); | |
| 3302 PrerenderTestURL("/prerender/prerender_xhr_put.html", | |
| 3303 expected_final_status_queue, 1); | |
| 3304 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); | |
| 3305 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); | |
| 3306 histogram_tester().ExpectTotalCount( | |
| 3307 "Prerender.none_PerceivedPLTMatchedComplete", 0); | |
| 3308 histogram_tester().ExpectTotalCount( | |
| 3309 "Prerender.websame_PrerenderNotSwappedInPLT", 1); | |
| 3310 | |
| 3311 NavigateToDestURL(); | |
| 3312 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); | |
| 3313 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", | |
| 3314 0); | |
| 3315 histogram_tester().ExpectTotalCount( | |
| 3316 "Prerender.websame_PerceivedPLTMatchedComplete", 1); | |
| 3317 } | |
| 3318 | |
| 3319 // Checks that the referrer policy is used when prerendering. | 3286 // Checks that the referrer policy is used when prerendering. |
| 3320 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrerPolicy) { | 3287 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrerPolicy) { |
| 3321 set_loader_path("/prerender/prerender_loader_with_referrer_policy.html"); | 3288 set_loader_path("/prerender/prerender_loader_with_referrer_policy.html"); |
| 3322 PrerenderTestURL("/prerender/prerender_referrer_policy.html", | 3289 PrerenderTestURL("/prerender/prerender_referrer_policy.html", |
| 3323 FINAL_STATUS_USED, 1); | 3290 FINAL_STATUS_USED, 1); |
| 3324 NavigateToDestURL(); | 3291 NavigateToDestURL(); |
| 3325 } | 3292 } |
| 3326 | 3293 |
| 3327 // Checks that the referrer policy is used when prerendering on HTTPS. | 3294 // Checks that the referrer policy is used when prerendering on HTTPS. |
| 3328 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 3295 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3433 NavigateToDestURL(); | 3400 NavigateToDestURL(); |
| 3434 channel_close_watcher.WaitForChannelClose(); | 3401 channel_close_watcher.WaitForChannelClose(); |
| 3435 | 3402 |
| 3436 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); | 3403 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); |
| 3437 ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); | 3404 ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); |
| 3438 } | 3405 } |
| 3439 | 3406 |
| 3440 // Test that prerenders abort when navigating to a stream. | 3407 // Test that prerenders abort when navigating to a stream. |
| 3441 // See chrome/browser/extensions/api/streams_private/streams_private_apitest.cc | 3408 // See chrome/browser/extensions/api/streams_private/streams_private_apitest.cc |
| 3442 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, StreamsTest) { | 3409 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, StreamsTest) { |
| 3443 RestorePrerenderMode restore_prerender_mode; | |
| 3444 PrerenderManager::SetMode( | |
| 3445 PrerenderManager::PRERENDER_MODE_EXPERIMENT_MATCH_COMPLETE_GROUP); | |
| 3446 | |
| 3447 ASSERT_TRUE(StartEmbeddedTestServer()); | 3410 ASSERT_TRUE(StartEmbeddedTestServer()); |
| 3448 | 3411 |
| 3449 const extensions::Extension* extension = LoadExtension( | 3412 const extensions::Extension* extension = LoadExtension( |
| 3450 test_data_dir_.AppendASCII("streams_private/handle_mime_type")); | 3413 test_data_dir_.AppendASCII("streams_private/handle_mime_type")); |
| 3451 ASSERT_TRUE(extension); | 3414 ASSERT_TRUE(extension); |
| 3452 EXPECT_EQ(std::string(extension_misc::kMimeHandlerPrivateTestExtensionId), | 3415 EXPECT_EQ(std::string(extension_misc::kMimeHandlerPrivateTestExtensionId), |
| 3453 extension->id()); | 3416 extension->id()); |
| 3454 MimeTypesHandler* handler = MimeTypesHandler::GetHandler(extension); | 3417 MimeTypesHandler* handler = MimeTypesHandler::GetHandler(extension); |
| 3455 ASSERT_TRUE(handler); | 3418 ASSERT_TRUE(handler); |
| 3456 EXPECT_TRUE(handler->CanHandleMIMEType("application/msword")); | 3419 EXPECT_TRUE(handler->CanHandleMIMEType("application/msword")); |
| 3457 | 3420 |
| 3458 PrerenderTestURL("/prerender/document.doc", FINAL_STATUS_DOWNLOAD, 0); | 3421 PrerenderTestURL("/prerender/document.doc", FINAL_STATUS_DOWNLOAD, 0); |
| 3459 | 3422 |
| 3460 // Sanity-check that the extension would have picked up the stream in a normal | 3423 // Sanity-check that the extension would have picked up the stream in a normal |
| 3461 // navigation had prerender not intercepted it. | 3424 // navigation had prerender not intercepted it. |
| 3462 // streams_private/handle_mime_type reports success if it has handled the | 3425 // The extension streams_private/handle_mime_type reports success if it has |
| 3463 // application/msword type. | 3426 // handled the application/msword type. |
| 3427 // Note: NavigateToDestURL() cannot be used because of the assertion shecking |
| 3428 // for non-null PrerenderContents. |
| 3464 extensions::ResultCatcher catcher; | 3429 extensions::ResultCatcher catcher; |
| 3465 NavigateToDestURL(); | 3430 ui_test_utils::NavigateToURL(current_browser(), dest_url()); |
| 3466 EXPECT_TRUE(catcher.GetNextResult()); | 3431 EXPECT_TRUE(catcher.GetNextResult()); |
| 3467 } | 3432 } |
| 3468 | 3433 |
| 3469 // Checks that non-http/https/chrome-extension subresource cancels the | 3434 // Checks that non-http/https/chrome-extension subresource cancels the |
| 3470 // prerender. | 3435 // prerender. |
| 3471 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 3436 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| 3472 PrerenderCancelSubresourceUnsupportedScheme) { | 3437 PrerenderCancelSubresourceUnsupportedScheme) { |
| 3473 GURL image_url = GURL("invalidscheme://www.google.com/test.jpg"); | 3438 GURL image_url = GURL("invalidscheme://www.google.com/test.jpg"); |
| 3474 base::StringPairs replacement_text; | 3439 base::StringPairs replacement_text; |
| 3475 replacement_text.push_back( | 3440 replacement_text.push_back( |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3626 // Mock out requests to the Web Store. | 3591 // Mock out requests to the Web Store. |
| 3627 base::FilePath file(GetTestPath("prerender_page.html")); | 3592 base::FilePath file(GetTestPath("prerender_page.html")); |
| 3628 BrowserThread::PostTask( | 3593 BrowserThread::PostTask( |
| 3629 BrowserThread::IO, FROM_HERE, | 3594 BrowserThread::IO, FROM_HERE, |
| 3630 base::Bind(&CreateMockInterceptorOnIO, GURL(webstore_url), file)); | 3595 base::Bind(&CreateMockInterceptorOnIO, GURL(webstore_url), file)); |
| 3631 | 3596 |
| 3632 PrerenderTestURL(CreateClientRedirect(webstore_url), | 3597 PrerenderTestURL(CreateClientRedirect(webstore_url), |
| 3633 FINAL_STATUS_OPEN_URL, 1); | 3598 FINAL_STATUS_OPEN_URL, 1); |
| 3634 } | 3599 } |
| 3635 | 3600 |
| 3636 // Checks that canceling a MatchComplete dummy doesn't result in two | |
| 3637 // stop events. | |
| 3638 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, CancelMatchCompleteDummy) { | |
| 3639 RestorePrerenderMode restore_prerender_mode; | |
| 3640 PrerenderManager::SetMode( | |
| 3641 PrerenderManager::PRERENDER_MODE_EXPERIMENT_MATCH_COMPLETE_GROUP); | |
| 3642 | |
| 3643 std::vector<FinalStatus> expected_final_status_queue; | |
| 3644 expected_final_status_queue.push_back(FINAL_STATUS_JAVASCRIPT_ALERT); | |
| 3645 expected_final_status_queue.push_back(FINAL_STATUS_CANCELLED); | |
| 3646 ScopedVector<TestPrerender> prerenders = | |
| 3647 PrerenderTestURL("/prerender/prerender_alert_before_onload.html", | |
| 3648 expected_final_status_queue, 0); | |
| 3649 | |
| 3650 // Cancel the MatchComplete dummy. | |
| 3651 GetPrerenderManager()->CancelAllPrerenders(); | |
| 3652 prerenders[1]->WaitForStop(); | |
| 3653 | |
| 3654 // Check the referring page only got one copy of the event. | |
| 3655 EXPECT_FALSE(HadPrerenderEventErrors()); | |
| 3656 } | |
| 3657 | |
| 3658 // Checks that a deferred redirect to an image is not loaded until the page is | 3601 // Checks that a deferred redirect to an image is not loaded until the page is |
| 3659 // visible. Also test the right histogram events are emitted in this case. | 3602 // visible. Also test the right histogram events are emitted in this case. |
| 3660 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredImage) { | 3603 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredImage) { |
| 3661 DisableJavascriptCalls(); | 3604 DisableJavascriptCalls(); |
| 3662 | 3605 |
| 3663 // The prerender will not completely load until after the swap, so wait for a | 3606 // The prerender will not completely load until after the swap, so wait for a |
| 3664 // title change before calling DidPrerenderPass. | 3607 // title change before calling DidPrerenderPass. |
| 3665 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL( | 3608 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL( |
| 3666 "/prerender/prerender_deferred_image.html", FINAL_STATUS_USED, 0); | 3609 "/prerender/prerender_deferred_image.html", FINAL_STATUS_USED, 0); |
| 3667 WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); | 3610 WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3737 // Checks that deferred redirects in the main frame are followed, even | 3680 // Checks that deferred redirects in the main frame are followed, even |
| 3738 // with a double-redirect. | 3681 // with a double-redirect. |
| 3739 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 3682 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| 3740 PrerenderDeferredMainFrameAfterRedirect) { | 3683 PrerenderDeferredMainFrameAfterRedirect) { |
| 3741 DisableJavascriptCalls(); | 3684 DisableJavascriptCalls(); |
| 3742 PrerenderTestURL(CreateServerRedirect("/prerender/image-deferred.png"), | 3685 PrerenderTestURL(CreateServerRedirect("/prerender/image-deferred.png"), |
| 3743 FINAL_STATUS_USED, 1); | 3686 FINAL_STATUS_USED, 1); |
| 3744 NavigateToDestURL(); | 3687 NavigateToDestURL(); |
| 3745 } | 3688 } |
| 3746 | 3689 |
| 3747 // Checks that deferred redirects in a synchronous XHR abort the | 3690 // Checks that deferred redirects in a synchronous XHR abort the prerender. |
| 3748 // prerender. | |
| 3749 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredSynchronousXHR) { | 3691 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredSynchronousXHR) { |
| 3750 RestorePrerenderMode restore_prerender_mode; | |
| 3751 PrerenderManager::SetMode( | |
| 3752 PrerenderManager::PRERENDER_MODE_EXPERIMENT_MATCH_COMPLETE_GROUP); | |
| 3753 PrerenderTestURL("/prerender/prerender_deferred_sync_xhr.html", | 3692 PrerenderTestURL("/prerender/prerender_deferred_sync_xhr.html", |
| 3754 FINAL_STATUS_BAD_DEFERRED_REDIRECT, 0); | 3693 FINAL_STATUS_BAD_DEFERRED_REDIRECT, 0); |
| 3755 NavigateToDestURL(); | 3694 ui_test_utils::NavigateToURL(current_browser(), dest_url()); |
| 3756 } | 3695 } |
| 3757 | 3696 |
| 3758 // Checks that prerenders are not swapped for navigations with extra headers. | 3697 // Checks that prerenders are not swapped for navigations with extra headers. |
| 3759 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderExtraHeadersNoSwap) { | 3698 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderExtraHeadersNoSwap) { |
| 3760 PrerenderTestURL("/prerender/prerender_page.html", | 3699 PrerenderTestURL("/prerender/prerender_page.html", |
| 3761 FINAL_STATUS_APP_TERMINATING, 1); | 3700 FINAL_STATUS_APP_TERMINATING, 1); |
| 3762 | 3701 |
| 3763 content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, | 3702 content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, |
| 3764 ui::PAGE_TRANSITION_TYPED, false); | 3703 ui::PAGE_TRANSITION_TYPED, false); |
| 3765 params.extra_headers = "X-Custom-Header: 42\r\n"; | 3704 params.extra_headers = "X-Custom-Header: 42\r\n"; |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4004 browser()->tab_strip_model()->GetActiveWebContents(); | 3943 browser()->tab_strip_model()->GetActiveWebContents(); |
| 4005 bool display_test_result = false; | 3944 bool display_test_result = false; |
| 4006 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, | 3945 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, |
| 4007 "DidDisplayReallyPass()", | 3946 "DidDisplayReallyPass()", |
| 4008 &display_test_result)); | 3947 &display_test_result)); |
| 4009 ASSERT_TRUE(display_test_result); | 3948 ASSERT_TRUE(display_test_result); |
| 4010 } | 3949 } |
| 4011 #endif // !defined(DISABLE_NACL) | 3950 #endif // !defined(DISABLE_NACL) |
| 4012 | 3951 |
| 4013 } // namespace prerender | 3952 } // namespace prerender |
| OLD | NEW |