| 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 2886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2897 1); | 2897 1); |
| 2898 OpenDestURLViaClickTarget(); | 2898 OpenDestURLViaClickTarget(); |
| 2899 } | 2899 } |
| 2900 | 2900 |
| 2901 // Checks that prerenders do not get swapped into target pages that have opened | 2901 // Checks that prerenders do not get swapped into target pages that have opened |
| 2902 // a popup, even if the target page itself does not have an opener. | 2902 // a popup, even if the target page itself does not have an opener. |
| 2903 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderTargetHasPopup) { | 2903 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderTargetHasPopup) { |
| 2904 PrerenderTestURL("files/prerender/prerender_page.html", | 2904 PrerenderTestURL("files/prerender/prerender_page.html", |
| 2905 FINAL_STATUS_NON_EMPTY_BROWSING_INSTANCE, | 2905 FINAL_STATUS_NON_EMPTY_BROWSING_INSTANCE, |
| 2906 1); | 2906 1); |
| 2907 OpenURLViaWindowOpen(GURL(content::kAboutBlankURL)); | 2907 OpenURLViaWindowOpen(GURL(url::kAboutBlankURL)); |
| 2908 NavigateToDestURLWithDisposition(CURRENT_TAB, false); | 2908 NavigateToDestURLWithDisposition(CURRENT_TAB, false); |
| 2909 } | 2909 } |
| 2910 | 2910 |
| 2911 class TestClientCertStore : public net::ClientCertStore { | 2911 class TestClientCertStore : public net::ClientCertStore { |
| 2912 public: | 2912 public: |
| 2913 TestClientCertStore() {} | 2913 TestClientCertStore() {} |
| 2914 virtual ~TestClientCertStore() {} | 2914 virtual ~TestClientCertStore() {} |
| 2915 | 2915 |
| 2916 // net::ClientCertStore: | 2916 // net::ClientCertStore: |
| 2917 virtual void GetClientCerts(const net::SSLCertRequestInfo& cert_request_info, | 2917 virtual void GetClientCerts(const net::SSLCertRequestInfo& cert_request_info, |
| (...skipping 1084 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4002 kTestURL, test_file, counter.AsWeakPtr())); | 4002 kTestURL, test_file, counter.AsWeakPtr())); |
| 4003 | 4003 |
| 4004 PrerenderTestURL(kTestURL, FINAL_STATUS_USED, 1); | 4004 PrerenderTestURL(kTestURL, FINAL_STATUS_USED, 1); |
| 4005 | 4005 |
| 4006 // Open a new tab to navigate in. | 4006 // Open a new tab to navigate in. |
| 4007 ui_test_utils::NavigateToURLWithDisposition( | 4007 ui_test_utils::NavigateToURLWithDisposition( |
| 4008 current_browser(), kInitURL, NEW_FOREGROUND_TAB, | 4008 current_browser(), kInitURL, NEW_FOREGROUND_TAB, |
| 4009 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 4009 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 4010 | 4010 |
| 4011 // Navigate to about:blank so the next navigation is cross-process. | 4011 // Navigate to about:blank so the next navigation is cross-process. |
| 4012 ui_test_utils::NavigateToURL(current_browser(), | 4012 ui_test_utils::NavigateToURL(current_browser(), GURL(url::kAboutBlankURL)); |
| 4013 GURL(content::kAboutBlankURL)); | |
| 4014 | 4013 |
| 4015 // Now navigate in the new tab. Set expect_swap_to_succeed to false because | 4014 // Now navigate in the new tab. Set expect_swap_to_succeed to false because |
| 4016 // the swap does not occur synchronously. | 4015 // the swap does not occur synchronously. |
| 4017 // | 4016 // |
| 4018 // TODO(davidben): When all swaps become asynchronous, remove the OpenURL | 4017 // TODO(davidben): When all swaps become asynchronous, remove the OpenURL |
| 4019 // return value assertion and let this go through the usual successful-swap | 4018 // return value assertion and let this go through the usual successful-swap |
| 4020 // codepath. | 4019 // codepath. |
| 4021 NavigateToDestURLWithDisposition(CURRENT_TAB, false); | 4020 NavigateToDestURLWithDisposition(CURRENT_TAB, false); |
| 4022 | 4021 |
| 4023 // Verify DidDisplayPass manually since the previous call skipped it. | 4022 // Verify DidDisplayPass manually since the previous call skipped it. |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4056 content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, | 4055 content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, |
| 4057 content::PAGE_TRANSITION_TYPED, false); | 4056 content::PAGE_TRANSITION_TYPED, false); |
| 4058 params.should_replace_current_entry = true; | 4057 params.should_replace_current_entry = true; |
| 4059 NavigateToURLWithParams(params, false); | 4058 NavigateToURLWithParams(params, false); |
| 4060 | 4059 |
| 4061 const NavigationController& controller = | 4060 const NavigationController& controller = |
| 4062 GetActiveWebContents()->GetController(); | 4061 GetActiveWebContents()->GetController(); |
| 4063 // First entry is about:blank, second is prerender_page.html. | 4062 // First entry is about:blank, second is prerender_page.html. |
| 4064 EXPECT_TRUE(controller.GetPendingEntry() == NULL); | 4063 EXPECT_TRUE(controller.GetPendingEntry() == NULL); |
| 4065 EXPECT_EQ(2, controller.GetEntryCount()); | 4064 EXPECT_EQ(2, controller.GetEntryCount()); |
| 4066 EXPECT_EQ(GURL(content::kAboutBlankURL), | 4065 EXPECT_EQ(GURL(url::kAboutBlankURL), controller.GetEntryAtIndex(0)->GetURL()); |
| 4067 controller.GetEntryAtIndex(0)->GetURL()); | |
| 4068 EXPECT_EQ(dest_url(), controller.GetEntryAtIndex(1)->GetURL()); | 4066 EXPECT_EQ(dest_url(), controller.GetEntryAtIndex(1)->GetURL()); |
| 4069 } | 4067 } |
| 4070 | 4068 |
| 4071 // Checks prerender does not hit DCHECKs and behaves properly if two pending | 4069 // Checks prerender does not hit DCHECKs and behaves properly if two pending |
| 4072 // swaps occur in a row. | 4070 // swaps occur in a row. |
| 4073 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDoublePendingSwap) { | 4071 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDoublePendingSwap) { |
| 4074 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; | 4072 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; |
| 4075 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; | 4073 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; |
| 4076 | 4074 |
| 4077 GURL url1 = test_server()->GetURL("files/prerender/prerender_page.html?1"); | 4075 GURL url1 = test_server()->GetURL("files/prerender/prerender_page.html?1"); |
| 4078 scoped_ptr<TestPrerender> prerender1 = | 4076 scoped_ptr<TestPrerender> prerender1 = |
| 4079 PrerenderTestURL(url1, FINAL_STATUS_APP_TERMINATING, 1); | 4077 PrerenderTestURL(url1, FINAL_STATUS_APP_TERMINATING, 1); |
| 4080 | 4078 |
| 4081 GURL url2 = test_server()->GetURL("files/prerender/prerender_page.html?2"); | 4079 GURL url2 = test_server()->GetURL("files/prerender/prerender_page.html?2"); |
| 4082 scoped_ptr<TestPrerender> prerender2 = ExpectPrerender(FINAL_STATUS_USED); | 4080 scoped_ptr<TestPrerender> prerender2 = ExpectPrerender(FINAL_STATUS_USED); |
| 4083 AddPrerender(url2, 1); | 4081 AddPrerender(url2, 1); |
| 4084 prerender2->WaitForStart(); | 4082 prerender2->WaitForStart(); |
| 4085 prerender2->WaitForLoads(1); | 4083 prerender2->WaitForLoads(1); |
| 4086 | 4084 |
| 4087 // There's no reason the second prerender can't be used, but the swap races | 4085 // There's no reason the second prerender can't be used, but the swap races |
| 4088 // with didStartProvisionalLoad and didFailProvisionalLoad from the previous | 4086 // with didStartProvisionalLoad and didFailProvisionalLoad from the previous |
| 4089 // navigation. The current logic will conservatively fail to swap under such | 4087 // navigation. The current logic will conservatively fail to swap under such |
| 4090 // races. However, if the renderer is slow enough, it's possible for the | 4088 // races. However, if the renderer is slow enough, it's possible for the |
| 4091 // prerender to still be used, so don't program in either expectation. | 4089 // prerender to still be used, so don't program in either expectation. |
| 4092 ASSERT_TRUE(prerender2->contents()); | 4090 ASSERT_TRUE(prerender2->contents()); |
| 4093 prerender2->contents()->set_skip_final_checks(true); | 4091 prerender2->contents()->set_skip_final_checks(true); |
| 4094 | 4092 |
| 4095 // Open a new tab to navigate in. | 4093 // Open a new tab to navigate in. |
| 4096 ui_test_utils::NavigateToURLWithDisposition( | 4094 ui_test_utils::NavigateToURLWithDisposition( |
| 4097 current_browser(), GURL(content::kAboutBlankURL), NEW_FOREGROUND_TAB, | 4095 current_browser(), |
| 4096 GURL(url::kAboutBlankURL), |
| 4097 NEW_FOREGROUND_TAB, |
| 4098 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 4098 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 4099 | 4099 |
| 4100 // Fire off two navigations, without running the event loop between them. | 4100 // Fire off two navigations, without running the event loop between them. |
| 4101 NavigationOrSwapObserver swap_observer( | 4101 NavigationOrSwapObserver swap_observer( |
| 4102 current_browser()->tab_strip_model(), | 4102 current_browser()->tab_strip_model(), |
| 4103 GetActiveWebContents(), 2); | 4103 GetActiveWebContents(), 2); |
| 4104 current_browser()->OpenURL(OpenURLParams( | 4104 current_browser()->OpenURL(OpenURLParams( |
| 4105 url1, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false)); | 4105 url1, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false)); |
| 4106 current_browser()->OpenURL(OpenURLParams( | 4106 current_browser()->OpenURL(OpenURLParams( |
| 4107 url2, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false)); | 4107 url2, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false)); |
| 4108 swap_observer.Wait(); | 4108 swap_observer.Wait(); |
| 4109 | 4109 |
| 4110 // The WebContents should be on url2. There may be 2 or 3 entries, depending | 4110 // The WebContents should be on url2. There may be 2 or 3 entries, depending |
| 4111 // on whether the first one managed to complete. | 4111 // on whether the first one managed to complete. |
| 4112 // | 4112 // |
| 4113 // TODO(davidben): When http://crbug.com/335835 is fixed, the 3 entry case | 4113 // TODO(davidben): When http://crbug.com/335835 is fixed, the 3 entry case |
| 4114 // shouldn't be possible because it's throttled by the pending swap that | 4114 // shouldn't be possible because it's throttled by the pending swap that |
| 4115 // cannot complete. | 4115 // cannot complete. |
| 4116 const NavigationController& controller = | 4116 const NavigationController& controller = |
| 4117 GetActiveWebContents()->GetController(); | 4117 GetActiveWebContents()->GetController(); |
| 4118 EXPECT_TRUE(controller.GetPendingEntry() == NULL); | 4118 EXPECT_TRUE(controller.GetPendingEntry() == NULL); |
| 4119 EXPECT_LE(2, controller.GetEntryCount()); | 4119 EXPECT_LE(2, controller.GetEntryCount()); |
| 4120 EXPECT_GE(3, controller.GetEntryCount()); | 4120 EXPECT_GE(3, controller.GetEntryCount()); |
| 4121 EXPECT_EQ(GURL(content::kAboutBlankURL), | 4121 EXPECT_EQ(GURL(url::kAboutBlankURL), controller.GetEntryAtIndex(0)->GetURL()); |
| 4122 controller.GetEntryAtIndex(0)->GetURL()); | |
| 4123 EXPECT_EQ(url2, controller.GetEntryAtIndex( | 4122 EXPECT_EQ(url2, controller.GetEntryAtIndex( |
| 4124 controller.GetEntryCount() - 1)->GetURL()); | 4123 controller.GetEntryCount() - 1)->GetURL()); |
| 4125 } | 4124 } |
| 4126 | 4125 |
| 4127 // Verify that pending swaps get aborted on new navigations. | 4126 // Verify that pending swaps get aborted on new navigations. |
| 4128 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 4127 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| 4129 PrerenderPendingSwapNewNavigation) { | 4128 PrerenderPendingSwapNewNavigation) { |
| 4130 PrerenderManager::HangSessionStorageMergesForTesting(); | 4129 PrerenderManager::HangSessionStorageMergesForTesting(); |
| 4131 | 4130 |
| 4132 PrerenderTestURL("files/prerender/prerender_page.html", | 4131 PrerenderTestURL("files/prerender/prerender_page.html", |
| 4133 FINAL_STATUS_APP_TERMINATING, 1); | 4132 FINAL_STATUS_APP_TERMINATING, 1); |
| 4134 | 4133 |
| 4135 // Open a new tab to navigate in. | 4134 // Open a new tab to navigate in. |
| 4136 ui_test_utils::NavigateToURLWithDisposition( | 4135 ui_test_utils::NavigateToURLWithDisposition( |
| 4137 current_browser(), GURL(content::kAboutBlankURL), NEW_FOREGROUND_TAB, | 4136 current_browser(), |
| 4137 GURL(url::kAboutBlankURL), |
| 4138 NEW_FOREGROUND_TAB, |
| 4138 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 4139 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 4139 | 4140 |
| 4140 // Navigate to the URL. Wait for DidStartLoading, just so it's definitely | 4141 // Navigate to the URL. Wait for DidStartLoading, just so it's definitely |
| 4141 // progressed somewhere. | 4142 // progressed somewhere. |
| 4142 content::WindowedNotificationObserver page_load_observer( | 4143 content::WindowedNotificationObserver page_load_observer( |
| 4143 content::NOTIFICATION_LOAD_START, | 4144 content::NOTIFICATION_LOAD_START, |
| 4144 content::Source<NavigationController>( | 4145 content::Source<NavigationController>( |
| 4145 &GetActiveWebContents()->GetController())); | 4146 &GetActiveWebContents()->GetController())); |
| 4146 current_browser()->OpenURL(OpenURLParams( | 4147 current_browser()->OpenURL(OpenURLParams( |
| 4147 dest_url(), Referrer(), CURRENT_TAB, | 4148 dest_url(), Referrer(), CURRENT_TAB, |
| 4148 content::PAGE_TRANSITION_TYPED, false)); | 4149 content::PAGE_TRANSITION_TYPED, false)); |
| 4149 page_load_observer.Wait(); | 4150 page_load_observer.Wait(); |
| 4150 | 4151 |
| 4151 // Navigate somewhere else. This should succeed and abort the pending swap. | 4152 // Navigate somewhere else. This should succeed and abort the pending swap. |
| 4152 TestNavigationObserver nav_observer(GetActiveWebContents()); | 4153 TestNavigationObserver nav_observer(GetActiveWebContents()); |
| 4153 current_browser()->OpenURL(OpenURLParams( | 4154 current_browser()->OpenURL(OpenURLParams(GURL(url::kAboutBlankURL), |
| 4154 GURL(content::kAboutBlankURL), Referrer(), CURRENT_TAB, | 4155 Referrer(), |
| 4155 content::PAGE_TRANSITION_TYPED, false)); | 4156 CURRENT_TAB, |
| 4157 content::PAGE_TRANSITION_TYPED, |
| 4158 false)); |
| 4156 nav_observer.Wait(); | 4159 nav_observer.Wait(); |
| 4157 } | 4160 } |
| 4158 | 4161 |
| 4159 // Checks that <a ping> requests are not dropped in prerender. | 4162 // Checks that <a ping> requests are not dropped in prerender. |
| 4160 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPing) { | 4163 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPing) { |
| 4161 // Count hits to a certain URL. | 4164 // Count hits to a certain URL. |
| 4162 const GURL kPingURL("http://prerender.test/ping"); | 4165 const GURL kPingURL("http://prerender.test/ping"); |
| 4163 base::FilePath empty_file = ui_test_utils::GetTestFilePath( | 4166 base::FilePath empty_file = ui_test_utils::GetTestFilePath( |
| 4164 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); | 4167 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); |
| 4165 RequestCounter ping_counter; | 4168 RequestCounter ping_counter; |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4407 | 4410 |
| 4408 // Navigate to the URL entered. | 4411 // Navigate to the URL entered. |
| 4409 omnibox_view->model()->AcceptInput(CURRENT_TAB, false); | 4412 omnibox_view->model()->AcceptInput(CURRENT_TAB, false); |
| 4410 | 4413 |
| 4411 // Prerender should be running, but abandoned. | 4414 // Prerender should be running, but abandoned. |
| 4412 EXPECT_TRUE( | 4415 EXPECT_TRUE( |
| 4413 GetAutocompleteActionPredictor()->IsPrerenderAbandonedForTesting()); | 4416 GetAutocompleteActionPredictor()->IsPrerenderAbandonedForTesting()); |
| 4414 } | 4417 } |
| 4415 | 4418 |
| 4416 } // namespace prerender | 4419 } // namespace prerender |
| OLD | NEW |