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 1106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1117 std::vector<FinalStatus> expected_final_status_queue( | 1117 std::vector<FinalStatus> expected_final_status_queue( |
1118 1, expected_final_status); | 1118 1, expected_final_status); |
1119 std::vector<TestPrerender*> prerenders; | 1119 std::vector<TestPrerender*> prerenders; |
1120 PrerenderTestURLImpl(url, | 1120 PrerenderTestURLImpl(url, |
1121 expected_final_status_queue, | 1121 expected_final_status_queue, |
1122 expected_number_of_loads).release(&prerenders); | 1122 expected_number_of_loads).release(&prerenders); |
1123 CHECK_EQ(1u, prerenders.size()); | 1123 CHECK_EQ(1u, prerenders.size()); |
1124 return scoped_ptr<TestPrerender>(prerenders[0]); | 1124 return scoped_ptr<TestPrerender>(prerenders[0]); |
1125 } | 1125 } |
1126 | 1126 |
| 1127 // Navigates to a URL, unrelated to prerendering |
| 1128 void NavigateStraightToURL(const std::string dest_html_file) { |
| 1129 ui_test_utils::NavigateToURL(current_browser(), |
| 1130 test_server()->GetURL(dest_html_file)); |
| 1131 } |
| 1132 |
1127 void NavigateToDestURL() const { | 1133 void NavigateToDestURL() const { |
1128 NavigateToDestURLWithDisposition(CURRENT_TAB, true); | 1134 NavigateToDestURLWithDisposition(CURRENT_TAB, true); |
1129 } | 1135 } |
1130 | 1136 |
1131 // Opens the url in a new tab, with no opener. | 1137 // Opens the url in a new tab, with no opener. |
1132 void NavigateToDestURLWithDisposition( | 1138 void NavigateToDestURLWithDisposition( |
1133 WindowOpenDisposition disposition, | 1139 WindowOpenDisposition disposition, |
1134 bool expect_swap_to_succeed) const { | 1140 bool expect_swap_to_succeed) const { |
1135 NavigateToURLWithParams( | 1141 NavigateToURLWithParams( |
1136 content::OpenURLParams(dest_url_, Referrer(), disposition, | 1142 content::OpenURLParams(dest_url_, Referrer(), disposition, |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1477 return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_TAB_PREFIX, | 1483 return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_TAB_PREFIX, |
1478 base::ASCIIToUTF16(page_title)); | 1484 base::ASCIIToUTF16(page_title)); |
1479 } | 1485 } |
1480 | 1486 |
1481 // Returns a string for pattern-matching TaskManager prerender entries. | 1487 // Returns a string for pattern-matching TaskManager prerender entries. |
1482 base::string16 MatchTaskManagerPrerender(const char* page_title) { | 1488 base::string16 MatchTaskManagerPrerender(const char* page_title) { |
1483 return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_PRERENDER_PREFIX, | 1489 return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_PRERENDER_PREFIX, |
1484 base::ASCIIToUTF16(page_title)); | 1490 base::ASCIIToUTF16(page_title)); |
1485 } | 1491 } |
1486 | 1492 |
| 1493 void RunJSReturningString(const char* js, std::string* result) { |
| 1494 ASSERT_TRUE( |
| 1495 content::ExecuteScriptAndExtractString( |
| 1496 GetActiveWebContents(), |
| 1497 base::StringPrintf("window.domAutomationController.send(%s)", |
| 1498 js).c_str(), |
| 1499 result)); |
| 1500 } |
| 1501 |
| 1502 void RunJS(const char* js) { |
| 1503 ASSERT_TRUE(content::ExecuteScript( |
| 1504 GetActiveWebContents(), |
| 1505 base::StringPrintf("window.domAutomationController.send(%s)", |
| 1506 js).c_str())); |
| 1507 } |
| 1508 |
1487 protected: | 1509 protected: |
1488 bool autostart_test_server_; | 1510 bool autostart_test_server_; |
1489 | 1511 |
1490 private: | 1512 private: |
1491 // TODO(davidben): Remove this altogether so the tests don't globally assume | 1513 // TODO(davidben): Remove this altogether so the tests don't globally assume |
1492 // only one prerender. | 1514 // only one prerender. |
1493 TestPrerenderContents* GetPrerenderContents() const { | 1515 TestPrerenderContents* GetPrerenderContents() const { |
1494 return GetPrerenderContentsFor(dest_url_); | 1516 return GetPrerenderContentsFor(dest_url_); |
1495 } | 1517 } |
1496 | 1518 |
(...skipping 2649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4146 UMAHistogramHelper histograms; | 4168 UMAHistogramHelper histograms; |
4147 | 4169 |
4148 GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); | 4170 GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); |
4149 ui_test_utils::NavigateToURL(current_browser(), url); | 4171 ui_test_utils::NavigateToURL(current_browser(), url); |
4150 histograms.Fetch(); | 4172 histograms.Fetch(); |
4151 histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); | 4173 histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); |
4152 histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); | 4174 histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); |
4153 histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); | 4175 histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); |
4154 } | 4176 } |
4155 | 4177 |
| 4178 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| 4179 PrerenderCookieChangeConflictTest) { |
| 4180 NavigateStraightToURL( |
| 4181 "files/prerender/prerender_cookie.html?set=1&key=c&value=1"); |
| 4182 |
| 4183 GURL url = test_server()->GetURL( |
| 4184 "files/prerender/prerender_cookie.html?set=1&key=c&value=2"); |
| 4185 |
| 4186 scoped_ptr<TestPrerender> prerender = |
| 4187 ExpectPrerender(FINAL_STATUS_COOKIE_CONFLICT); |
| 4188 AddPrerender(url, 1); |
| 4189 prerender->WaitForStart(); |
| 4190 prerender->WaitForLoads(1); |
| 4191 // Ensure that in the prerendered page, querying the cookie again |
| 4192 // via javascript yields the same value that was set during load. |
| 4193 EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); |
| 4194 |
| 4195 // The prerender has loaded. Ensure that the change is not visible |
| 4196 // to visible tabs. |
| 4197 std::string value; |
| 4198 RunJSReturningString("GetCookie('c')", &value); |
| 4199 ASSERT_EQ(value, "1"); |
| 4200 |
| 4201 // Make a conflicting cookie change, which should cancel the prerender. |
| 4202 RunJS("SetCookie('c', '3')"); |
| 4203 prerender->WaitForStop(); |
| 4204 } |
| 4205 |
| 4206 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCookieChangeUseTest) { |
| 4207 // Permit 2 concurrent prerenders. |
| 4208 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; |
| 4209 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; |
| 4210 |
| 4211 // Go to a first URL setting the cookie to value "1". |
| 4212 NavigateStraightToURL( |
| 4213 "files/prerender/prerender_cookie.html?set=1&key=c&value=1"); |
| 4214 |
| 4215 // Prerender a URL setting the cookie to value "2". |
| 4216 GURL url = test_server()->GetURL( |
| 4217 "files/prerender/prerender_cookie.html?set=1&key=c&value=2"); |
| 4218 |
| 4219 scoped_ptr<TestPrerender> prerender1 = ExpectPrerender(FINAL_STATUS_USED); |
| 4220 AddPrerender(url, 1); |
| 4221 prerender1->WaitForStart(); |
| 4222 prerender1->WaitForLoads(1); |
| 4223 |
| 4224 // Launch a second prerender, setting the cookie to value "3". |
| 4225 scoped_ptr<TestPrerender> prerender2 = |
| 4226 ExpectPrerender(FINAL_STATUS_COOKIE_CONFLICT); |
| 4227 AddPrerender(test_server()->GetURL( |
| 4228 "files/prerender/prerender_cookie.html?set=1&key=c&value=3"), 1); |
| 4229 prerender2->WaitForStart(); |
| 4230 prerender2->WaitForLoads(1); |
| 4231 |
| 4232 // Both prerenders have loaded. Ensure that the visible tab is still |
| 4233 // unchanged and cannot see their changes. |
| 4234 // to visible tabs. |
| 4235 std::string value; |
| 4236 RunJSReturningString("GetCookie('c')", &value); |
| 4237 ASSERT_EQ(value, "1"); |
| 4238 |
| 4239 // Navigate to the prerendered URL. The first prerender should be swapped in, |
| 4240 // and the changes should now be visible. The second prerender should |
| 4241 // be cancelled due to the conflict. |
| 4242 ui_test_utils::NavigateToURLWithDisposition( |
| 4243 current_browser(), |
| 4244 url, |
| 4245 CURRENT_TAB, |
| 4246 ui_test_utils::BROWSER_TEST_NONE); |
| 4247 RunJSReturningString("GetCookie('c')", &value); |
| 4248 ASSERT_EQ(value, "2"); |
| 4249 prerender2->WaitForStop(); |
| 4250 } |
| 4251 |
| 4252 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| 4253 PrerenderCookieChangeConflictHTTPHeaderTest) { |
| 4254 NavigateStraightToURL( |
| 4255 "files/prerender/prerender_cookie.html?set=1&key=c&value=1"); |
| 4256 |
| 4257 GURL url = test_server()->GetURL("set-cookie?c=2"); |
| 4258 scoped_ptr<TestPrerender> prerender = |
| 4259 ExpectPrerender(FINAL_STATUS_COOKIE_CONFLICT); |
| 4260 AddPrerender(url, 1); |
| 4261 prerender->WaitForStart(); |
| 4262 prerender->WaitForLoads(1); |
| 4263 |
| 4264 // The prerender has loaded. Ensure that the change is not visible |
| 4265 // to visible tabs. |
| 4266 std::string value; |
| 4267 RunJSReturningString("GetCookie('c')", &value); |
| 4268 ASSERT_EQ(value, "1"); |
| 4269 |
| 4270 // Make a conflicting cookie change, which should cancel the prerender. |
| 4271 RunJS("SetCookie('c', '3')"); |
| 4272 prerender->WaitForStop(); |
| 4273 } |
| 4274 |
4156 // Checks that a prerender which calls window.close() on itself is aborted. | 4275 // Checks that a prerender which calls window.close() on itself is aborted. |
4157 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWindowClose) { | 4276 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWindowClose) { |
4158 DisableLoadEventCheck(); | 4277 DisableLoadEventCheck(); |
4159 PrerenderTestURL("files/prerender/prerender_window_close.html", | 4278 PrerenderTestURL("files/prerender/prerender_window_close.html", |
4160 FINAL_STATUS_CLOSED, 0); | 4279 FINAL_STATUS_CLOSED, 0); |
4161 } | 4280 } |
4162 | 4281 |
4163 class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest { | 4282 class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest { |
4164 public: | 4283 public: |
4165 virtual void SetUpOnMainThread() OVERRIDE { | 4284 virtual void SetUpOnMainThread() OVERRIDE { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4223 url, | 4342 url, |
4224 web_contents->GetController().GetSessionStorageNamespaceMap(), | 4343 web_contents->GetController().GetSessionStorageNamespaceMap(), |
4225 gfx::Size(50, 50)); | 4344 gfx::Size(50, 50)); |
4226 prerender->WaitForStart(); | 4345 prerender->WaitForStart(); |
4227 return prerender.Pass(); | 4346 return prerender.Pass(); |
4228 } | 4347 } |
4229 }; | 4348 }; |
4230 | 4349 |
4231 // Checks that closing the omnibox popup cancels an omnibox prerender. | 4350 // Checks that closing the omnibox popup cancels an omnibox prerender. |
4232 IN_PROC_BROWSER_TEST_F(PrerenderOmniboxBrowserTest, PrerenderOmniboxCancel) { | 4351 IN_PROC_BROWSER_TEST_F(PrerenderOmniboxBrowserTest, PrerenderOmniboxCancel) { |
| 4352 // Ensure the cookie store has been loaded. |
| 4353 if (!GetPrerenderManager()->cookie_store_loaded()) { |
| 4354 base::RunLoop loop; |
| 4355 GetPrerenderManager()->set_on_cookie_store_loaded_cb_for_testing( |
| 4356 loop.QuitClosure()); |
| 4357 loop.Run(); |
| 4358 } |
| 4359 |
4233 // Fake an omnibox prerender. | 4360 // Fake an omnibox prerender. |
4234 scoped_ptr<TestPrerender> prerender = StartOmniboxPrerender( | 4361 scoped_ptr<TestPrerender> prerender = StartOmniboxPrerender( |
4235 test_server()->GetURL("files/empty.html"), | 4362 test_server()->GetURL("files/empty.html"), |
4236 FINAL_STATUS_CANCELLED); | 4363 FINAL_STATUS_CANCELLED); |
4237 | 4364 |
4238 // Revert the location bar. This should cancel the prerender. | 4365 // Revert the location bar. This should cancel the prerender. |
4239 GetLocationBar()->Revert(); | 4366 GetLocationBar()->Revert(); |
4240 prerender->WaitForStop(); | 4367 prerender->WaitForStop(); |
4241 } | 4368 } |
4242 | 4369 |
4243 // Checks that closing the omnibox popup cancels an omnibox prerender. | 4370 // Checks that closing the omnibox popup cancels an omnibox prerender. |
4244 IN_PROC_BROWSER_TEST_F(PrerenderOmniboxBrowserTest, PrerenderOmniboxAbandon) { | 4371 IN_PROC_BROWSER_TEST_F(PrerenderOmniboxBrowserTest, PrerenderOmniboxAbandon) { |
4245 // Set the abandon timeout to something high so it does not introduce | 4372 // Set the abandon timeout to something high so it does not introduce |
4246 // flakiness if the prerender times out before the test completes. | 4373 // flakiness if the prerender times out before the test completes. |
4247 GetPrerenderManager()->mutable_config().abandon_time_to_live = | 4374 GetPrerenderManager()->mutable_config().abandon_time_to_live = |
4248 base::TimeDelta::FromDays(999); | 4375 base::TimeDelta::FromDays(999); |
4249 | 4376 |
| 4377 // Ensure the cookie store has been loaded. |
| 4378 if (!GetPrerenderManager()->cookie_store_loaded()) { |
| 4379 base::RunLoop loop; |
| 4380 GetPrerenderManager()->set_on_cookie_store_loaded_cb_for_testing( |
| 4381 loop.QuitClosure()); |
| 4382 loop.Run(); |
| 4383 } |
| 4384 |
4250 // Enter a URL into the Omnibox. | 4385 // Enter a URL into the Omnibox. |
4251 OmniboxView* omnibox_view = GetOmniboxView(); | 4386 OmniboxView* omnibox_view = GetOmniboxView(); |
4252 omnibox_view->OnBeforePossibleChange(); | 4387 omnibox_view->OnBeforePossibleChange(); |
4253 omnibox_view->SetUserText( | 4388 omnibox_view->SetUserText( |
4254 base::UTF8ToUTF16(test_server()->GetURL("files/empty.html?1").spec())); | 4389 base::UTF8ToUTF16(test_server()->GetURL("files/empty.html?1").spec())); |
4255 omnibox_view->OnAfterPossibleChange(); | 4390 omnibox_view->OnAfterPossibleChange(); |
4256 WaitForAutocompleteDone(omnibox_view); | 4391 WaitForAutocompleteDone(omnibox_view); |
4257 | 4392 |
4258 // Fake an omnibox prerender for a different URL. | 4393 // Fake an omnibox prerender for a different URL. |
4259 scoped_ptr<TestPrerender> prerender = StartOmniboxPrerender( | 4394 scoped_ptr<TestPrerender> prerender = StartOmniboxPrerender( |
4260 test_server()->GetURL("files/empty.html?2"), | 4395 test_server()->GetURL("files/empty.html?2"), |
4261 FINAL_STATUS_APP_TERMINATING); | 4396 FINAL_STATUS_APP_TERMINATING); |
4262 | 4397 |
4263 // Navigate to the URL entered. | 4398 // Navigate to the URL entered. |
4264 omnibox_view->model()->AcceptInput(CURRENT_TAB, false); | 4399 omnibox_view->model()->AcceptInput(CURRENT_TAB, false); |
4265 | 4400 |
4266 // Prerender should be running, but abandoned. | 4401 // Prerender should be running, but abandoned. |
4267 EXPECT_TRUE( | 4402 EXPECT_TRUE( |
4268 GetAutocompleteActionPredictor()->IsPrerenderAbandonedForTesting()); | 4403 GetAutocompleteActionPredictor()->IsPrerenderAbandonedForTesting()); |
4269 } | 4404 } |
4270 | 4405 |
4271 } // namespace prerender | 4406 } // namespace prerender |
OLD | NEW |