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 3 // found in the LICENSE file. 4 5 #include "base/bind.h" 6 #include "base/prefs/pref_service.h" 7 #include "base/strings/string_number_conversions.h" 8 #include "base/strings/utf_string_conversions.h" 9 #include "chrome/app/chrome_command_ids.h" 10 #include "chrome/browser/chrome_notification_types.h" 11 #include "chrome/browser/renderer_context_menu/render_view_context_menu.h" 12 #include "chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h" 13 #include "chrome/browser/ui/browser.h" 14 #include "chrome/browser/ui/browser_commands.h" 15 #include "chrome/browser/ui/tabs/tab_strip_model.h" 16 #include "chrome/common/pref_names.h" 17 #include "chrome/test/base/in_process_browser_test.h" 18 #include "chrome/test/base/ui_test_utils.h" 19 #include "content/public/browser/navigation_controller.h" 20 #include "content/public/browser/navigation_entry.h" 21 #include "content/public/browser/notification_service.h" 22 #include "content/public/browser/render_view_host.h" 23 #include "content/public/browser/web_contents.h" 24 #include "content/public/test/browser_test_utils.h" 25 #include "net/test/spawned_test_server/spawned_test_server.h" 26 #include "third_party/WebKit/public/web/WebInputEvent.h" 27 28 namespace { 29 30 const base::FilePath::CharType kDocRoot[] = 31 FILE_PATH_LITERAL("chrome/test/data/referrer_policy"); 32 33 } // namespace 34 35 class ReferrerPolicyTest : public InProcessBrowserTest { 36 public: 37 ReferrerPolicyTest() {} 38 virtual ~ReferrerPolicyTest() {} 39 40 virtual void SetUp() OVERRIDE { 41 test_server_.reset(new net::SpawnedTestServer( 42 net::SpawnedTestServer::TYPE_HTTP, 43 net::SpawnedTestServer::kLocalhost, 44 base::FilePath(kDocRoot))); 45 ASSERT_TRUE(test_server_->Start()); 46 ssl_test_server_.reset(new net::SpawnedTestServer( 47 net::SpawnedTestServer::TYPE_HTTPS, 48 net::SpawnedTestServer::kLocalhost, 49 base::FilePath(kDocRoot))); 50 ASSERT_TRUE(ssl_test_server_->Start()); 51 52 InProcessBrowserTest::SetUp(); 53 } 54 55 protected: 56 enum ExpectedReferrer { 57 EXPECT_EMPTY_REFERRER, 58 EXPECT_FULL_REFERRER, 59 EXPECT_ORIGIN_AS_REFERRER 60 }; 61 62 // Returns the expected title for the tab with the given (full) referrer and 63 // the expected modification of it. 64 base::string16 GetExpectedTitle(const GURL& url, 65 ExpectedReferrer expected_referrer) { 66 std::string referrer; 67 switch (expected_referrer) { 68 case EXPECT_EMPTY_REFERRER: 69 referrer = "Referrer is empty"; 70 break; 71 case EXPECT_FULL_REFERRER: 72 referrer = "Referrer is " + url.spec(); 73 break; 74 case EXPECT_ORIGIN_AS_REFERRER: 75 referrer = "Referrer is " + url.GetWithEmptyPath().spec(); 76 break; 77 } 78 return base::ASCIIToUTF16(referrer); 79 } 80 81 // Adds all possible titles to the TitleWatcher, so we don't time out 82 // waiting for the title if the test fails. 83 void AddAllPossibleTitles(const GURL& url, 84 content::TitleWatcher* title_watcher) { 85 title_watcher->AlsoWaitForTitle( 86 GetExpectedTitle(url, EXPECT_EMPTY_REFERRER)); 87 title_watcher->AlsoWaitForTitle( 88 GetExpectedTitle(url, EXPECT_FULL_REFERRER)); 89 title_watcher->AlsoWaitForTitle( 90 GetExpectedTitle(url, EXPECT_ORIGIN_AS_REFERRER)); 91 } 92 93 // Returns a string representation of a given |referrer_policy|. 94 std::string ReferrerPolicyToString(blink::WebReferrerPolicy referrer_policy) { 95 switch (referrer_policy) { 96 case blink::WebReferrerPolicyDefault: 97 return "default"; 98 case blink::WebReferrerPolicyOrigin: 99 return "origin"; 100 case blink::WebReferrerPolicyAlways: 101 return "always"; 102 case blink::WebReferrerPolicyNever: 103 return "never"; 104 default: 105 NOTREACHED(); 106 return ""; 107 } 108 } 109 110 enum StartOnProtocol { START_ON_HTTP, START_ON_HTTPS, }; 111 112 enum LinkType { REGULAR_LINK, LINK_WITH_TARGET_BLANK, }; 113 114 enum RedirectType { NO_REDIRECT, SERVER_REDIRECT, SERVER_REDIRECT_ON_HTTP, }; 115 116 std::string RedirectTypeToString(RedirectType redirect) { 117 switch (redirect) { 118 case NO_REDIRECT: 119 return "none"; 120 case SERVER_REDIRECT: 121 return "https"; 122 case SERVER_REDIRECT_ON_HTTP: 123 return "http"; 124 } 125 NOTREACHED(); 126 return ""; 127 } 128 129 // Navigates from a page with a given |referrer_policy| and checks that the 130 // reported referrer matches the expectation. 131 // Parameters: 132 // referrer_policy: The referrer policy to test. 133 // start_protocol: The protocol the test should start on. 134 // link_type: The link type that is used to trigger the navigation. 135 // redirect: Whether the link target should redirect and how. 136 // disposition: The disposition for the navigation. 137 // button: If not WebMouseEvent::ButtonNone, click on the 138 // link with the specified mouse button. 139 // expected_referrer: The kind of referrer to expect. 140 // 141 // Returns: 142 // The URL of the first page navigated to. 143 GURL RunReferrerTest(const blink::WebReferrerPolicy referrer_policy, 144 StartOnProtocol start_protocol, 145 LinkType link_type, 146 RedirectType redirect, 147 WindowOpenDisposition disposition, 148 blink::WebMouseEvent::Button button, 149 ExpectedReferrer expected_referrer) { 150 GURL start_url; 151 net::SpawnedTestServer* start_server = start_protocol == START_ON_HTTPS 152 ? ssl_test_server_.get() 153 : test_server_.get(); 154 start_url = start_server->GetURL( 155 std::string("files/referrer-policy-start.html?") + "policy=" + 156 ReferrerPolicyToString(referrer_policy) + "&port=" + 157 base::IntToString(test_server_->host_port_pair().port()) + 158 "&ssl_port=" + 159 base::IntToString(ssl_test_server_->host_port_pair().port()) + 160 "&redirect=" + RedirectTypeToString(redirect) + "&link=" + 161 (button == blink::WebMouseEvent::ButtonNone ? "false" : "true") + 162 "&target=" + (link_type == LINK_WITH_TARGET_BLANK ? "_blank" : "")); 163 164 ui_test_utils::WindowedTabAddedNotificationObserver tab_added_observer( 165 content::NotificationService::AllSources()); 166 167 base::string16 expected_title = 168 GetExpectedTitle(start_url, expected_referrer); 169 content::WebContents* tab = 170 browser()->tab_strip_model()->GetActiveWebContents(); 171 content::TitleWatcher title_watcher(tab, expected_title); 172 173 // Watch for all possible outcomes to avoid timeouts if something breaks. 174 AddAllPossibleTitles(start_url, &title_watcher); 175 176 ui_test_utils::NavigateToURL(browser(), start_url); 177 178 if (button != blink::WebMouseEvent::ButtonNone) { 179 blink::WebMouseEvent mouse_event; 180 mouse_event.type = blink::WebInputEvent::MouseDown; 181 mouse_event.button = button; 182 mouse_event.x = 15; 183 mouse_event.y = 15; 184 mouse_event.clickCount = 1; 185 tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event); 186 mouse_event.type = blink::WebInputEvent::MouseUp; 187 tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event); 188 } 189 190 if (disposition == CURRENT_TAB) { 191 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 192 } else { 193 tab_added_observer.Wait(); 194 tab = tab_added_observer.GetTab(); 195 EXPECT_TRUE(tab); 196 content::TitleWatcher title_watcher2(tab, expected_title); 197 198 // Watch for all possible outcomes to avoid timeouts if something breaks. 199 AddAllPossibleTitles(start_url, &title_watcher2); 200 201 EXPECT_EQ(expected_title, title_watcher2.WaitAndGetTitle()); 202 } 203 204 EXPECT_EQ(referrer_policy, 205 tab->GetController().GetActiveEntry()->GetReferrer().policy); 206 207 return start_url; 208 } 209 210 scoped_ptr<net::SpawnedTestServer> test_server_; 211 scoped_ptr<net::SpawnedTestServer> ssl_test_server_; 212 }; 213 214 // The basic behavior of referrer policies is covered by layout tests in 215 // http/tests/security/referrer-policy-*. These tests cover (hopefully) all 216 // code paths chrome uses to navigate. To keep the number of combinations down, 217 // we only test the "origin" policy here. 218 // 219 // Some tests are marked as FAILS, see http://crbug.com/124750 220 221 // Content initiated navigation, from HTTP to HTTP. 222 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, Origin) { 223 RunReferrerTest(blink::WebReferrerPolicyOrigin, 224 START_ON_HTTP, 225 REGULAR_LINK, 226 NO_REDIRECT, 227 CURRENT_TAB, 228 blink::WebMouseEvent::ButtonNone, 229 EXPECT_ORIGIN_AS_REFERRER); 230 } 231 232 // Content initiated navigation, from HTTPS to HTTP. 233 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsDefault) { 234 RunReferrerTest(blink::WebReferrerPolicyOrigin, 235 START_ON_HTTPS, 236 REGULAR_LINK, 237 NO_REDIRECT, 238 CURRENT_TAB, 239 blink::WebMouseEvent::ButtonNone, 240 EXPECT_ORIGIN_AS_REFERRER); 241 } 242 243 // User initiated navigation, from HTTP to HTTP. 244 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, LeftClickOrigin) { 245 RunReferrerTest(blink::WebReferrerPolicyOrigin, 246 START_ON_HTTP, 247 REGULAR_LINK, 248 NO_REDIRECT, 249 CURRENT_TAB, 250 blink::WebMouseEvent::ButtonLeft, 251 EXPECT_ORIGIN_AS_REFERRER); 252 } 253 254 // User initiated navigation, from HTTPS to HTTP. 255 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsLeftClickOrigin) { 256 RunReferrerTest(blink::WebReferrerPolicyOrigin, 257 START_ON_HTTPS, 258 REGULAR_LINK, 259 NO_REDIRECT, 260 CURRENT_TAB, 261 blink::WebMouseEvent::ButtonLeft, 262 EXPECT_ORIGIN_AS_REFERRER); 263 } 264 265 // User initiated navigation, middle click, from HTTP to HTTP. 266 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickOrigin) { 267 RunReferrerTest(blink::WebReferrerPolicyOrigin, 268 START_ON_HTTP, 269 REGULAR_LINK, 270 NO_REDIRECT, 271 NEW_BACKGROUND_TAB, 272 blink::WebMouseEvent::ButtonMiddle, 273 EXPECT_ORIGIN_AS_REFERRER); 274 } 275 276 // User initiated navigation, middle click, from HTTPS to HTTP. 277 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsMiddleClickOrigin) { 278 RunReferrerTest(blink::WebReferrerPolicyOrigin, 279 START_ON_HTTPS, 280 REGULAR_LINK, 281 NO_REDIRECT, 282 NEW_BACKGROUND_TAB, 283 blink::WebMouseEvent::ButtonMiddle, 284 EXPECT_ORIGIN_AS_REFERRER); 285 } 286 287 // User initiated navigation, target blank, from HTTP to HTTP. 288 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, TargetBlankOrigin) { 289 RunReferrerTest(blink::WebReferrerPolicyOrigin, 290 START_ON_HTTP, 291 LINK_WITH_TARGET_BLANK, 292 NO_REDIRECT, 293 NEW_FOREGROUND_TAB, 294 blink::WebMouseEvent::ButtonLeft, 295 EXPECT_ORIGIN_AS_REFERRER); 296 } 297 298 // User initiated navigation, target blank, from HTTPS to HTTP. 299 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsTargetBlankOrigin) { 300 RunReferrerTest(blink::WebReferrerPolicyOrigin, 301 START_ON_HTTPS, 302 LINK_WITH_TARGET_BLANK, 303 NO_REDIRECT, 304 NEW_FOREGROUND_TAB, 305 blink::WebMouseEvent::ButtonLeft, 306 EXPECT_ORIGIN_AS_REFERRER); 307 } 308 309 // User initiated navigation, middle click, target blank, from HTTP to HTTP. 310 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickTargetBlankOrigin) { 311 RunReferrerTest(blink::WebReferrerPolicyOrigin, 312 START_ON_HTTP, 313 LINK_WITH_TARGET_BLANK, 314 NO_REDIRECT, 315 NEW_FOREGROUND_TAB, 316 blink::WebMouseEvent::ButtonMiddle, 317 EXPECT_ORIGIN_AS_REFERRER); 318 } 319 320 // User initiated navigation, middle click, target blank, from HTTPS to HTTP. 321 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsMiddleClickTargetBlankOrigin) { 322 RunReferrerTest(blink::WebReferrerPolicyOrigin, 323 START_ON_HTTPS, 324 LINK_WITH_TARGET_BLANK, 325 NO_REDIRECT, 326 NEW_FOREGROUND_TAB, 327 blink::WebMouseEvent::ButtonMiddle, 328 EXPECT_ORIGIN_AS_REFERRER); 329 } 330 331 // Context menu, from HTTP to HTTP. 332 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, ContextMenuOrigin) { 333 ContextMenuNotificationObserver context_menu_observer( 334 IDC_CONTENT_CONTEXT_OPENLINKNEWTAB); 335 RunReferrerTest(blink::WebReferrerPolicyOrigin, 336 START_ON_HTTP, 337 REGULAR_LINK, 338 NO_REDIRECT, 339 NEW_FOREGROUND_TAB, 340 blink::WebMouseEvent::ButtonRight, 341 EXPECT_ORIGIN_AS_REFERRER); 342 } 343 344 // Context menu, from HTTPS to HTTP. 345 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsContextMenuOrigin) { 346 ContextMenuNotificationObserver context_menu_observer( 347 IDC_CONTENT_CONTEXT_OPENLINKNEWTAB); 348 RunReferrerTest(blink::WebReferrerPolicyOrigin, 349 START_ON_HTTPS, 350 REGULAR_LINK, 351 NO_REDIRECT, 352 NEW_FOREGROUND_TAB, 353 blink::WebMouseEvent::ButtonRight, 354 EXPECT_ORIGIN_AS_REFERRER); 355 } 356 357 // Content initiated navigation, from HTTP to HTTP via server redirect. 358 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, Redirect) { 359 RunReferrerTest(blink::WebReferrerPolicyOrigin, 360 START_ON_HTTP, 361 REGULAR_LINK, 362 SERVER_REDIRECT, 363 CURRENT_TAB, 364 blink::WebMouseEvent::ButtonNone, 365 EXPECT_ORIGIN_AS_REFERRER); 366 } 367 368 // Content initiated navigation, from HTTPS to HTTP via server redirect. 369 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsRedirect) { 370 RunReferrerTest(blink::WebReferrerPolicyOrigin, 371 START_ON_HTTPS, 372 REGULAR_LINK, 373 SERVER_REDIRECT, 374 CURRENT_TAB, 375 blink::WebMouseEvent::ButtonNone, 376 EXPECT_ORIGIN_AS_REFERRER); 377 } 378 379 // User initiated navigation, from HTTP to HTTP via server redirect. 380 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, LeftClickRedirect) { 381 RunReferrerTest(blink::WebReferrerPolicyOrigin, 382 START_ON_HTTP, 383 REGULAR_LINK, 384 SERVER_REDIRECT, 385 CURRENT_TAB, 386 blink::WebMouseEvent::ButtonLeft, 387 EXPECT_ORIGIN_AS_REFERRER); 388 } 389 390 // User initiated navigation, from HTTPS to HTTP via server redirect. 391 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsLeftClickRedirect) { 392 RunReferrerTest(blink::WebReferrerPolicyOrigin, 393 START_ON_HTTPS, 394 REGULAR_LINK, 395 SERVER_REDIRECT, 396 CURRENT_TAB, 397 blink::WebMouseEvent::ButtonLeft, 398 EXPECT_ORIGIN_AS_REFERRER); 399 } 400 401 // User initiated navigation, middle click, from HTTP to HTTP via server 402 // redirect. 403 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickRedirect) { 404 RunReferrerTest(blink::WebReferrerPolicyOrigin, 405 START_ON_HTTP, 406 REGULAR_LINK, 407 SERVER_REDIRECT, 408 NEW_BACKGROUND_TAB, 409 blink::WebMouseEvent::ButtonMiddle, 410 EXPECT_ORIGIN_AS_REFERRER); 411 } 412 413 // User initiated navigation, middle click, from HTTPS to HTTP via server 414 // redirect. 415 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsMiddleClickRedirect) { 416 RunReferrerTest(blink::WebReferrerPolicyOrigin, 417 START_ON_HTTPS, 418 REGULAR_LINK, 419 SERVER_REDIRECT, 420 NEW_BACKGROUND_TAB, 421 blink::WebMouseEvent::ButtonMiddle, 422 EXPECT_ORIGIN_AS_REFERRER); 423 } 424 425 // User initiated navigation, target blank, from HTTP to HTTP via server 426 // redirect. 427 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, TargetBlankRedirect) { 428 RunReferrerTest(blink::WebReferrerPolicyOrigin, 429 START_ON_HTTP, 430 LINK_WITH_TARGET_BLANK, 431 SERVER_REDIRECT, 432 NEW_FOREGROUND_TAB, 433 blink::WebMouseEvent::ButtonLeft, 434 EXPECT_ORIGIN_AS_REFERRER); 435 } 436 437 // User initiated navigation, target blank, from HTTPS to HTTP via server 438 // redirect. 439 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsTargetBlankRedirect) { 440 RunReferrerTest(blink::WebReferrerPolicyOrigin, 441 START_ON_HTTPS, 442 LINK_WITH_TARGET_BLANK, 443 SERVER_REDIRECT, 444 NEW_FOREGROUND_TAB, 445 blink::WebMouseEvent::ButtonLeft, 446 EXPECT_ORIGIN_AS_REFERRER); 447 } 448 449 // User initiated navigation, middle click, target blank, from HTTP to HTTP via 450 // server redirect. 451 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickTargetBlankRedirect) { 452 RunReferrerTest(blink::WebReferrerPolicyOrigin, 453 START_ON_HTTP, 454 LINK_WITH_TARGET_BLANK, 455 SERVER_REDIRECT, 456 NEW_FOREGROUND_TAB, 457 blink::WebMouseEvent::ButtonMiddle, 458 EXPECT_ORIGIN_AS_REFERRER); 459 } 460 461 // User initiated navigation, middle click, target blank, from HTTPS to HTTP 462 // via server redirect. 463 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, 464 HttpsMiddleClickTargetBlankRedirect) { 465 RunReferrerTest(blink::WebReferrerPolicyOrigin, 466 START_ON_HTTPS, 467 LINK_WITH_TARGET_BLANK, 468 SERVER_REDIRECT, 469 NEW_FOREGROUND_TAB, 470 blink::WebMouseEvent::ButtonMiddle, 471 EXPECT_ORIGIN_AS_REFERRER); 472 } 473 474 // Context menu, from HTTP to HTTP via server redirect. 475 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, ContextMenuRedirect) { 476 ContextMenuNotificationObserver context_menu_observer( 477 IDC_CONTENT_CONTEXT_OPENLINKNEWTAB); 478 RunReferrerTest(blink::WebReferrerPolicyOrigin, 479 START_ON_HTTP, 480 REGULAR_LINK, 481 SERVER_REDIRECT, 482 NEW_FOREGROUND_TAB, 483 blink::WebMouseEvent::ButtonRight, 484 EXPECT_ORIGIN_AS_REFERRER); 485 } 486 487 // Context menu, from HTTPS to HTTP via server redirect. 488 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsContextMenuRedirect) { 489 ContextMenuNotificationObserver context_menu_observer( 490 IDC_CONTENT_CONTEXT_OPENLINKNEWTAB); 491 RunReferrerTest(blink::WebReferrerPolicyOrigin, 492 START_ON_HTTPS, 493 REGULAR_LINK, 494 SERVER_REDIRECT, 495 NEW_FOREGROUND_TAB, 496 blink::WebMouseEvent::ButtonRight, 497 EXPECT_ORIGIN_AS_REFERRER); 498 } 499 500 // Tests history navigation actions: Navigate from A to B with a referrer 501 // policy, then navigate to C, back to B, and reload. 502 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, History) { 503 // Navigate from A to B. 504 GURL start_url = RunReferrerTest(blink::WebReferrerPolicyOrigin, 505 START_ON_HTTPS, 506 REGULAR_LINK, 507 SERVER_REDIRECT, 508 CURRENT_TAB, 509 blink::WebMouseEvent::ButtonLeft, 510 EXPECT_ORIGIN_AS_REFERRER); 511 512 // Navigate to C. 513 ui_test_utils::NavigateToURL(browser(), test_server_->GetURL(std::string())); 514 515 base::string16 expected_title = 516 GetExpectedTitle(start_url, EXPECT_ORIGIN_AS_REFERRER); 517 content::WebContents* tab = 518 browser()->tab_strip_model()->GetActiveWebContents(); 519 scoped_ptr<content::TitleWatcher> title_watcher( 520 new content::TitleWatcher(tab, expected_title)); 521 522 // Watch for all possible outcomes to avoid timeouts if something breaks. 523 AddAllPossibleTitles(start_url, title_watcher.get()); 524 525 // Go back to B. 526 chrome::GoBack(browser(), CURRENT_TAB); 527 EXPECT_EQ(expected_title, title_watcher->WaitAndGetTitle()); 528 529 title_watcher.reset(new content::TitleWatcher(tab, expected_title)); 530 AddAllPossibleTitles(start_url, title_watcher.get()); 531 532 // Reload to B. 533 chrome::Reload(browser(), CURRENT_TAB); 534 EXPECT_EQ(expected_title, title_watcher->WaitAndGetTitle()); 535 536 title_watcher.reset(new content::TitleWatcher(tab, expected_title)); 537 AddAllPossibleTitles(start_url, title_watcher.get()); 538 539 // Shift-reload to B. 540 chrome::ReloadIgnoringCache(browser(), CURRENT_TAB); 541 EXPECT_EQ(expected_title, title_watcher->WaitAndGetTitle()); 542 } 543 544 // Tests that reloading a site for "request tablet version" correctly clears 545 // the referrer. 546 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, RequestTabletSite) { 547 GURL start_url = RunReferrerTest(blink::WebReferrerPolicyOrigin, 548 START_ON_HTTPS, 549 REGULAR_LINK, 550 SERVER_REDIRECT_ON_HTTP, 551 CURRENT_TAB, 552 blink::WebMouseEvent::ButtonLeft, 553 EXPECT_ORIGIN_AS_REFERRER); 554 555 base::string16 expected_title = 556 GetExpectedTitle(start_url, EXPECT_EMPTY_REFERRER); 557 content::WebContents* tab = 558 browser()->tab_strip_model()->GetActiveWebContents(); 559 content::TitleWatcher title_watcher(tab, expected_title); 560 561 // Watch for all possible outcomes to avoid timeouts if something breaks. 562 AddAllPossibleTitles(start_url, &title_watcher); 563 564 // Request tablet version. 565 chrome::ToggleRequestTabletSite(browser()); 566 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 567 } 568 569 // Test that an iframes gets the parent frames referrer and referrer policy if 570 // the load was triggered by the parent, or from the iframe itself, if the 571 // navigations was started by the iframe. 572 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, IFrame) { 573 browser()->profile()->GetPrefs()->SetBoolean( 574 prefs::kWebKitAllowRunningInsecureContent, true); 575 content::WebContents* tab = 576 browser()->tab_strip_model()->GetActiveWebContents(); 577 base::string16 expected_title(base::ASCIIToUTF16("loaded")); 578 scoped_ptr<content::TitleWatcher> title_watcher( 579 new content::TitleWatcher(tab, expected_title)); 580 581 // Load a page that loads an iframe. 582 ui_test_utils::NavigateToURL( 583 browser(), 584 ssl_test_server_->GetURL( 585 std::string("files/referrer-policy-iframe.html?") + 586 base::IntToString(test_server_->host_port_pair().port()))); 587 EXPECT_EQ(expected_title, title_watcher->WaitAndGetTitle()); 588 589 // Verify that the referrer policy was honored and the main page's origin was 590 // send as referrer. 591 content::RenderFrameHost* frame = content::FrameMatchingPredicate( 592 tab, base::Bind(&content::FrameIsChildOfMainFrame)); 593 std::string title; 594 EXPECT_TRUE(content::ExecuteScriptAndExtractString( 595 frame, 596 "window.domAutomationController.send(document.title)", 597 &title)); 598 EXPECT_EQ("Referrer is " + ssl_test_server_->GetURL(std::string()).spec(), 599 title); 600 601 // Reload the iframe. 602 expected_title = base::ASCIIToUTF16("reset"); 603 title_watcher.reset(new content::TitleWatcher(tab, expected_title)); 604 EXPECT_TRUE(content::ExecuteScript(tab, "document.title = 'reset'")); 605 EXPECT_EQ(expected_title, title_watcher->WaitAndGetTitle()); 606 607 expected_title = base::ASCIIToUTF16("loaded"); 608 title_watcher.reset(new content::TitleWatcher(tab, expected_title)); 609 EXPECT_TRUE(content::ExecuteScript(frame, "location.reload()")); 610 EXPECT_EQ(expected_title, title_watcher->WaitAndGetTitle()); 611 612 // Verify that the full url of the iframe was used as referrer. 613 EXPECT_TRUE(content::ExecuteScriptAndExtractString( 614 frame, 615 "window.domAutomationController.send(document.title)", 616 &title)); 617 EXPECT_EQ("Referrer is " + 618 test_server_->GetURL("files/referrer-policy-log.html").spec(), 619 title); 620 } 621