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

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

Issue 280403002: Only commit cookie changes in prerenders after a prerender is shown (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: fix sync related bug Created 6 years, 7 months 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 #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
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/prerender/external_prerender_handler_android.cc ('k') | chrome/browser/prerender/prerender_contents.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698