Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/path_service.h" | 8 #include "base/path_service.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "base/utf_string_conversions.h" | |
| 10 #include "chrome/browser/content_settings/host_content_settings_map.h" | 11 #include "chrome/browser/content_settings/host_content_settings_map.h" |
| 11 #include "chrome/browser/prefs/pref_service.h" | 12 #include "chrome/browser/prefs/pref_service.h" |
| 12 #include "chrome/browser/prerender/prerender_contents.h" | 13 #include "chrome/browser/prerender/prerender_contents.h" |
| 13 #include "chrome/browser/prerender/prerender_manager.h" | 14 #include "chrome/browser/prerender/prerender_manager.h" |
| 14 #include "chrome/browser/profiles/profile.h" | 15 #include "chrome/browser/profiles/profile.h" |
| 15 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 16 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| 16 #include "chrome/browser/task_manager/task_manager.h" | 17 #include "chrome/browser/task_manager/task_manager.h" |
| 17 #include "chrome/browser/ui/browser.h" | 18 #include "chrome/browser/ui/browser.h" |
| 18 #include "chrome/browser/ui/browser_window.h" | 19 #include "chrome/browser/ui/browser_window.h" |
| 19 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 20 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| 20 #include "chrome/common/chrome_paths.h" | 21 #include "chrome/common/chrome_paths.h" |
| 21 #include "chrome/common/chrome_switches.h" | 22 #include "chrome/common/chrome_switches.h" |
| 22 #include "chrome/common/pref_names.h" | 23 #include "chrome/common/pref_names.h" |
| 23 #include "chrome/test/in_process_browser_test.h" | 24 #include "chrome/test/in_process_browser_test.h" |
| 24 #include "chrome/test/ui_test_utils.h" | 25 #include "chrome/test/ui_test_utils.h" |
| 25 #include "content/browser/renderer_host/render_view_host.h" | 26 #include "content/browser/renderer_host/render_view_host.h" |
| 26 #include "content/browser/tab_contents/tab_contents.h" | 27 #include "content/browser/tab_contents/tab_contents.h" |
| 28 #include "content/browser/tab_contents/title_updated_details.h" | |
| 27 #include "content/common/notification_service.h" | 29 #include "content/common/notification_service.h" |
| 28 #include "grit/generated_resources.h" | 30 #include "grit/generated_resources.h" |
| 29 #include "net/url_request/url_request_context.h" | 31 #include "net/url_request/url_request_context.h" |
| 30 #include "net/url_request/url_request_context_getter.h" | 32 #include "net/url_request/url_request_context_getter.h" |
| 31 #include "ui/base/l10n/l10n_util.h" | 33 #include "ui/base/l10n/l10n_util.h" |
| 32 | 34 |
| 33 // Prerender tests work as follows: | 35 // Prerender tests work as follows: |
| 34 // | 36 // |
| 35 // A page with a prefetch link to the test page is loaded. Once prerendered, | 37 // A page with a prefetch link to the test page is loaded. Once prerendered, |
| 36 // its Javascript function DidPrerenderPass() is called, which returns true if | 38 // its Javascript function DidPrerenderPass() is called, which returns true if |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 233 profile, url, | 235 profile, url, |
| 234 referrer, number_of_loads_, | 236 referrer, number_of_loads_, |
| 235 expected_final_status); | 237 expected_final_status); |
| 236 } | 238 } |
| 237 | 239 |
| 238 private: | 240 private: |
| 239 int number_of_loads_; | 241 int number_of_loads_; |
| 240 std::deque<FinalStatus> expected_final_status_queue_; | 242 std::deque<FinalStatus> expected_final_status_queue_; |
| 241 }; | 243 }; |
| 242 | 244 |
| 245 // Watches title changes on a tab, blocking until an expected change occurs. | |
| 246 class TitleWatcher : public NotificationObserver { | |
|
Paweł Hajdan Jr.
2011/06/09 09:23:15
Could you move this to chrome/test/ui_test_utils?
cbentzel
2011/06/09 15:29:21
This seems like a pretty specific class, and doesn
Paweł Hajdan Jr.
2011/06/09 19:24:12
Yes please, for now it's not used by more tests bu
| |
| 247 public: | |
| 248 TitleWatcher(TabContents* tab_contents, const string16& expected_title) | |
| 249 : expected_tab_(tab_contents), | |
| 250 expected_title_(expected_title), | |
| 251 title_observed_(false), | |
| 252 quit_loop_on_observation_(false) { | |
| 253 EXPECT_TRUE(tab_contents != NULL); | |
| 254 notification_registrar_.Add(this, | |
| 255 NotificationType::TAB_CONTENTS_TITLE_UPDATED, | |
| 256 Source<TabContents>(tab_contents)); | |
| 257 } | |
| 258 | |
| 259 ~TitleWatcher() { | |
| 260 } | |
| 261 | |
| 262 virtual void Observe(NotificationType type, | |
| 263 const NotificationSource& source, | |
| 264 const NotificationDetails& details) OVERRIDE { | |
| 265 if (type != NotificationType::TAB_CONTENTS_TITLE_UPDATED) | |
| 266 return; | |
| 267 | |
| 268 TabContents* source_contents = Source<TabContents>(source).ptr(); | |
| 269 ASSERT_EQ(expected_tab_, source_contents); | |
| 270 if (source_contents->GetTitle() != expected_title_) | |
| 271 return; | |
| 272 | |
| 273 title_observed_ = true; | |
| 274 if (quit_loop_on_observation_) | |
| 275 MessageLoopForUI::current()->Quit(); | |
| 276 } | |
| 277 | |
| 278 bool WaitForTitleChange() { | |
|
Paweł Hajdan Jr.
2011/06/09 09:23:15
nit: Add WARN_UNUSED_RESULT from base/compiler_spe
cbentzel
2011/06/09 15:29:21
Done.
| |
| 279 if (title_observed_) | |
| 280 return true; | |
| 281 quit_loop_on_observation_ = true; | |
| 282 ui_test_utils::RunMessageLoop(); | |
| 283 return title_observed_; | |
| 284 } | |
| 285 | |
| 286 private: | |
| 287 TabContents* expected_tab_; | |
| 288 string16 expected_title_; | |
| 289 NotificationRegistrar notification_registrar_; | |
| 290 bool title_observed_; | |
| 291 bool quit_loop_on_observation_; | |
|
Paweł Hajdan Jr.
2011/06/09 09:23:15
nit: DISALLOW_COPY_AND_ASSIGN.
cbentzel
2011/06/09 15:29:21
Done.
| |
| 292 }; | |
| 293 | |
| 243 } // namespace | 294 } // namespace |
| 244 | 295 |
| 245 // A SafeBrowingService implementation that returns a fixed result for a given | 296 // A SafeBrowingService implementation that returns a fixed result for a given |
| 246 // URL. | 297 // URL. |
| 247 class FakeSafeBrowsingService : public SafeBrowsingService { | 298 class FakeSafeBrowsingService : public SafeBrowsingService { |
| 248 public: | 299 public: |
| 249 FakeSafeBrowsingService() : | 300 FakeSafeBrowsingService() : |
| 250 result_(SAFE) {} | 301 result_(SAFE) {} |
| 251 | 302 |
| 252 virtual ~FakeSafeBrowsingService() {} | 303 virtual ~FakeSafeBrowsingService() {} |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 308 private: | 359 private: |
| 309 FakeSafeBrowsingService* most_recent_service_; | 360 FakeSafeBrowsingService* most_recent_service_; |
| 310 }; | 361 }; |
| 311 | 362 |
| 312 class PrerenderBrowserTest : public InProcessBrowserTest { | 363 class PrerenderBrowserTest : public InProcessBrowserTest { |
| 313 public: | 364 public: |
| 314 PrerenderBrowserTest() | 365 PrerenderBrowserTest() |
| 315 : safe_browsing_factory_(new TestSafeBrowsingServiceFactory()), | 366 : safe_browsing_factory_(new TestSafeBrowsingServiceFactory()), |
| 316 prerender_contents_factory_(NULL), | 367 prerender_contents_factory_(NULL), |
| 317 use_https_src_server_(false), | 368 use_https_src_server_(false), |
| 318 call_javascript_(true) { | 369 call_javascript_(true), |
| 370 loader_path_("files/prerender/prerender_loader.html") { | |
| 319 EnableDOMAutomation(); | 371 EnableDOMAutomation(); |
| 320 } | 372 } |
| 321 | 373 |
| 322 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { | 374 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { |
| 323 SafeBrowsingService::RegisterFactory(safe_browsing_factory_.get()); | 375 SafeBrowsingService::RegisterFactory(safe_browsing_factory_.get()); |
| 324 } | 376 } |
| 325 | 377 |
| 326 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { | 378 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
| 327 command_line->AppendSwitchASCII(switches::kPrerender, | 379 command_line->AppendSwitchASCII(switches::kPrerender, |
| 328 switches::kPrerenderSwitchValueEnabled); | 380 switches::kPrerenderSwitchValueEnabled); |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 458 PrerenderManager* prerender_manager() const { | 510 PrerenderManager* prerender_manager() const { |
| 459 Profile* profile = browser()->GetSelectedTabContents()->profile(); | 511 Profile* profile = browser()->GetSelectedTabContents()->profile(); |
| 460 PrerenderManager* prerender_manager = profile->GetPrerenderManager(); | 512 PrerenderManager* prerender_manager = profile->GetPrerenderManager(); |
| 461 return prerender_manager; | 513 return prerender_manager; |
| 462 } | 514 } |
| 463 | 515 |
| 464 FakeSafeBrowsingService* GetSafeBrowsingService() { | 516 FakeSafeBrowsingService* GetSafeBrowsingService() { |
| 465 return safe_browsing_factory_->most_recent_service(); | 517 return safe_browsing_factory_->most_recent_service(); |
| 466 } | 518 } |
| 467 | 519 |
| 520 void set_loader_path(const std::string& path) { | |
|
dominich
2011/06/09 14:26:56
Did you consider adding another PrerenderTestURL v
cbentzel
2011/06/09 15:29:21
I did consider it, but it seemed like the combinat
| |
| 521 loader_path_ = path; | |
| 522 } | |
| 523 | |
| 468 private: | 524 private: |
| 469 void PrerenderTestURLImpl( | 525 void PrerenderTestURLImpl( |
| 470 const GURL& url, | 526 const GURL& url, |
| 471 const std::deque<FinalStatus>& expected_final_status_queue, | 527 const std::deque<FinalStatus>& expected_final_status_queue, |
| 472 int total_navigations) { | 528 int total_navigations) { |
| 473 dest_url_ = url; | 529 dest_url_ = url; |
| 474 | 530 |
| 475 std::vector<net::TestServer::StringPair> replacement_text; | 531 std::vector<net::TestServer::StringPair> replacement_text; |
| 476 replacement_text.push_back( | 532 replacement_text.push_back( |
| 477 make_pair("REPLACE_WITH_PRERENDER_URL", dest_url_.spec())); | 533 make_pair("REPLACE_WITH_PRERENDER_URL", dest_url_.spec())); |
| 478 std::string replacement_path; | 534 std::string replacement_path; |
| 479 ASSERT_TRUE(net::TestServer::GetFilePathWithReplacements( | 535 ASSERT_TRUE(net::TestServer::GetFilePathWithReplacements( |
| 480 "files/prerender/prerender_loader.html", | 536 loader_path_, |
| 481 replacement_text, | 537 replacement_text, |
| 482 &replacement_path)); | 538 &replacement_path)); |
| 483 | 539 |
| 484 net::TestServer* src_server = test_server(); | 540 net::TestServer* src_server = test_server(); |
| 485 scoped_ptr<net::TestServer> https_src_server; | 541 scoped_ptr<net::TestServer> https_src_server; |
| 486 if (use_https_src_server_) { | 542 if (use_https_src_server_) { |
| 487 https_src_server.reset( | 543 https_src_server.reset( |
| 488 new net::TestServer(net::TestServer::TYPE_HTTPS, | 544 new net::TestServer(net::TestServer::TYPE_HTTPS, |
| 489 FilePath(FILE_PATH_LITERAL("chrome/test/data")))); | 545 FilePath(FILE_PATH_LITERAL("chrome/test/data")))); |
| 490 ASSERT_TRUE(https_src_server->Start()); | 546 ASSERT_TRUE(https_src_server->Start()); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 564 &display_test_result)); | 620 &display_test_result)); |
| 565 EXPECT_TRUE(display_test_result); | 621 EXPECT_TRUE(display_test_result); |
| 566 } | 622 } |
| 567 } | 623 } |
| 568 | 624 |
| 569 scoped_ptr<TestSafeBrowsingServiceFactory> safe_browsing_factory_; | 625 scoped_ptr<TestSafeBrowsingServiceFactory> safe_browsing_factory_; |
| 570 WaitForLoadPrerenderContentsFactory* prerender_contents_factory_; | 626 WaitForLoadPrerenderContentsFactory* prerender_contents_factory_; |
| 571 GURL dest_url_; | 627 GURL dest_url_; |
| 572 bool use_https_src_server_; | 628 bool use_https_src_server_; |
| 573 bool call_javascript_; | 629 bool call_javascript_; |
| 630 std::string loader_path_; | |
| 574 }; | 631 }; |
| 575 | 632 |
| 576 // Checks that a page is correctly prerendered in the case of a | 633 // Checks that a page is correctly prerendered in the case of a |
| 577 // <link rel=prerender> tag and then loaded into a tab in response to a | 634 // <link rel=prerender> tag and then loaded into a tab in response to a |
| 578 // navigation. | 635 // navigation. |
| 579 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { | 636 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { |
| 580 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); | 637 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
| 581 NavigateToDestURL(); | 638 NavigateToDestURL(); |
| 582 } | 639 } |
| 583 | 640 |
| (...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1333 } | 1390 } |
| 1334 | 1391 |
| 1335 // Checks that a local storage write will not cause prerender to fail. | 1392 // Checks that a local storage write will not cause prerender to fail. |
| 1336 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderLocalStorageWrite) { | 1393 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderLocalStorageWrite) { |
| 1337 PrerenderTestURL("files/prerender/prerender_localstorage_write.html", | 1394 PrerenderTestURL("files/prerender/prerender_localstorage_write.html", |
| 1338 FINAL_STATUS_USED, | 1395 FINAL_STATUS_USED, |
| 1339 1); | 1396 1); |
| 1340 NavigateToDestURL(); | 1397 NavigateToDestURL(); |
| 1341 } | 1398 } |
| 1342 | 1399 |
| 1400 // Checks that when a prerendered page is swapped in to a referring page, the | |
| 1401 // unload handlers on the referring page are executed. | |
| 1402 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderUnload) { | |
| 1403 set_loader_path("files/prerender/prerender_loader_with_unload.html"); | |
| 1404 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); | |
| 1405 TabContents* tab_contents = browser()->GetSelectedTabContents(); | |
|
dominich
2011/06/09 14:26:56
nit: no need for this to be a local variable.
cbentzel
2011/06/09 15:29:21
Done.
| |
| 1406 TitleWatcher title_watcher(tab_contents, ASCIIToUTF16("Unloaded")); | |
| 1407 NavigateToDestURL(); | |
| 1408 EXPECT_TRUE(title_watcher.WaitForTitleChange()); | |
| 1409 } | |
| 1410 | |
| 1343 } // namespace prerender | 1411 } // namespace prerender |
| OLD | NEW |