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 "base/command_line.h" | 5 #include "base/command_line.h" |
6 #include "base/logging.h" | 6 #include "base/logging.h" |
7 #include "base/strings/utf_string_conversions.h" | 7 #include "base/strings/utf_string_conversions.h" |
8 #include "content/browser/frame_host/cross_site_transferring_request.h" | 8 #include "content/browser/frame_host/cross_site_transferring_request.h" |
9 #include "content/browser/frame_host/interstitial_page_impl.h" | 9 #include "content/browser/frame_host/interstitial_page_impl.h" |
10 #include "content/browser/frame_host/navigation_entry_impl.h" | 10 #include "content/browser/frame_host/navigation_entry_impl.h" |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 | 152 |
153 int command_received_count() const { | 153 int command_received_count() const { |
154 return command_received_count_; | 154 return command_received_count_; |
155 } | 155 } |
156 | 156 |
157 void TestDomOperationResponse(const std::string& json_string) { | 157 void TestDomOperationResponse(const std::string& json_string) { |
158 if (enabled()) | 158 if (enabled()) |
159 CommandReceived(); | 159 CommandReceived(); |
160 } | 160 } |
161 | 161 |
162 void TestDidNavigate(int page_id, const GURL& url) { | 162 void TestDidNavigate(int page_id, |
| 163 int nav_entry_id, |
| 164 bool did_create_new_entry, |
| 165 const GURL& url) { |
163 FrameHostMsg_DidCommitProvisionalLoad_Params params; | 166 FrameHostMsg_DidCommitProvisionalLoad_Params params; |
164 InitNavigateParams(¶ms, page_id, url, ui::PAGE_TRANSITION_TYPED); | 167 InitNavigateParams(¶ms, page_id, nav_entry_id, did_create_new_entry, |
| 168 url, ui::PAGE_TRANSITION_TYPED); |
165 DidNavigate(GetMainFrame()->GetRenderViewHost(), params); | 169 DidNavigate(GetMainFrame()->GetRenderViewHost(), params); |
166 } | 170 } |
167 | 171 |
168 void TestRenderViewTerminated(base::TerminationStatus status, | 172 void TestRenderViewTerminated(base::TerminationStatus status, |
169 int error_code) { | 173 int error_code) { |
170 RenderViewTerminated(GetMainFrame()->GetRenderViewHost(), status, | 174 RenderViewTerminated(GetMainFrame()->GetRenderViewHost(), status, |
171 error_code); | 175 error_code); |
172 } | 176 } |
173 | 177 |
174 bool is_showing() const { | 178 bool is_showing() const { |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 DISALLOW_COPY_AND_ASSIGN(FakeValidationMessageDelegate); | 347 DISALLOW_COPY_AND_ASSIGN(FakeValidationMessageDelegate); |
344 }; | 348 }; |
345 | 349 |
346 } // namespace | 350 } // namespace |
347 | 351 |
348 // Test to make sure that title updates get stripped of whitespace. | 352 // Test to make sure that title updates get stripped of whitespace. |
349 TEST_F(WebContentsImplTest, UpdateTitle) { | 353 TEST_F(WebContentsImplTest, UpdateTitle) { |
350 NavigationControllerImpl& cont = | 354 NavigationControllerImpl& cont = |
351 static_cast<NavigationControllerImpl&>(controller()); | 355 static_cast<NavigationControllerImpl&>(controller()); |
352 FrameHostMsg_DidCommitProvisionalLoad_Params params; | 356 FrameHostMsg_DidCommitProvisionalLoad_Params params; |
353 InitNavigateParams( | 357 InitNavigateParams(¶ms, 0, 0, true, GURL(url::kAboutBlankURL), |
354 ¶ms, 0, GURL(url::kAboutBlankURL), ui::PAGE_TRANSITION_TYPED); | 358 ui::PAGE_TRANSITION_TYPED); |
355 | 359 |
356 LoadCommittedDetails details; | 360 LoadCommittedDetails details; |
357 cont.RendererDidNavigate(contents()->GetMainFrame(), params, &details); | 361 cont.RendererDidNavigate(contents()->GetMainFrame(), params, &details); |
358 | 362 |
359 contents()->UpdateTitle(contents()->GetMainFrame(), 0, | 363 contents()->UpdateTitle(contents()->GetMainFrame(), 0, |
360 base::ASCIIToUTF16(" Lots O' Whitespace\n"), | 364 base::ASCIIToUTF16(" Lots O' Whitespace\n"), |
361 base::i18n::LEFT_TO_RIGHT); | 365 base::i18n::LEFT_TO_RIGHT); |
362 EXPECT_EQ(base::ASCIIToUTF16("Lots O' Whitespace"), contents()->GetTitle()); | 366 EXPECT_EQ(base::ASCIIToUTF16("Lots O' Whitespace"), contents()->GetTitle()); |
363 } | 367 } |
364 | 368 |
(...skipping 21 matching lines...) Expand all Loading... |
386 TEST_F(WebContentsImplTest, NTPViewSource) { | 390 TEST_F(WebContentsImplTest, NTPViewSource) { |
387 NavigationControllerImpl& cont = | 391 NavigationControllerImpl& cont = |
388 static_cast<NavigationControllerImpl&>(controller()); | 392 static_cast<NavigationControllerImpl&>(controller()); |
389 const char kUrl[] = "view-source:chrome://blah"; | 393 const char kUrl[] = "view-source:chrome://blah"; |
390 const GURL kGURL(kUrl); | 394 const GURL kGURL(kUrl); |
391 | 395 |
392 process()->sink().ClearMessages(); | 396 process()->sink().ClearMessages(); |
393 | 397 |
394 cont.LoadURL( | 398 cont.LoadURL( |
395 kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 399 kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 400 int entry_id = cont.GetPendingEntry()->GetUniqueID(); |
396 rvh()->GetDelegate()->RenderViewCreated(rvh()); | 401 rvh()->GetDelegate()->RenderViewCreated(rvh()); |
397 // Did we get the expected message? | 402 // Did we get the expected message? |
398 EXPECT_TRUE(process()->sink().GetFirstMessageMatching( | 403 EXPECT_TRUE(process()->sink().GetFirstMessageMatching( |
399 ViewMsg_EnableViewSourceMode::ID)); | 404 ViewMsg_EnableViewSourceMode::ID)); |
400 | 405 |
401 FrameHostMsg_DidCommitProvisionalLoad_Params params; | 406 FrameHostMsg_DidCommitProvisionalLoad_Params params; |
402 InitNavigateParams(¶ms, 0, kGURL, ui::PAGE_TRANSITION_TYPED); | 407 InitNavigateParams(¶ms, 0, entry_id, true, kGURL, |
| 408 ui::PAGE_TRANSITION_TYPED); |
403 LoadCommittedDetails details; | 409 LoadCommittedDetails details; |
404 cont.RendererDidNavigate(contents()->GetMainFrame(), params, &details); | 410 cont.RendererDidNavigate(contents()->GetMainFrame(), params, &details); |
405 // Also check title and url. | 411 // Also check title and url. |
406 EXPECT_EQ(base::ASCIIToUTF16(kUrl), contents()->GetTitle()); | 412 EXPECT_EQ(base::ASCIIToUTF16(kUrl), contents()->GetTitle()); |
407 } | 413 } |
408 | 414 |
409 // Test to ensure UpdateMaxPageID is working properly. | 415 // Test to ensure UpdateMaxPageID is working properly. |
410 TEST_F(WebContentsImplTest, UpdateMaxPageID) { | 416 TEST_F(WebContentsImplTest, UpdateMaxPageID) { |
411 SiteInstance* instance1 = contents()->GetSiteInstance(); | 417 SiteInstance* instance1 = contents()->GetSiteInstance(); |
412 scoped_refptr<SiteInstance> instance2(SiteInstance::Create(nullptr)); | 418 scoped_refptr<SiteInstance> instance2(SiteInstance::Create(nullptr)); |
(...skipping 19 matching lines...) Expand all Loading... |
432 // Test simple same-SiteInstance navigation. | 438 // Test simple same-SiteInstance navigation. |
433 TEST_F(WebContentsImplTest, SimpleNavigation) { | 439 TEST_F(WebContentsImplTest, SimpleNavigation) { |
434 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 440 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
435 SiteInstance* instance1 = contents()->GetSiteInstance(); | 441 SiteInstance* instance1 = contents()->GetSiteInstance(); |
436 EXPECT_EQ(nullptr, contents()->GetPendingMainFrame()); | 442 EXPECT_EQ(nullptr, contents()->GetPendingMainFrame()); |
437 | 443 |
438 // Navigate to URL | 444 // Navigate to URL |
439 const GURL url("http://www.google.com"); | 445 const GURL url("http://www.google.com"); |
440 controller().LoadURL( | 446 controller().LoadURL( |
441 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 447 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 448 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
442 EXPECT_FALSE(contents()->cross_navigation_pending()); | 449 EXPECT_FALSE(contents()->cross_navigation_pending()); |
443 EXPECT_EQ(instance1, orig_rfh->GetSiteInstance()); | 450 EXPECT_EQ(instance1, orig_rfh->GetSiteInstance()); |
444 // Controller's pending entry will have a null site instance until we assign | 451 // Controller's pending entry will have a null site instance until we assign |
445 // it in DidNavigate. | 452 // it in DidNavigate. |
446 EXPECT_EQ( | 453 EXPECT_EQ( |
447 nullptr, | 454 nullptr, |
448 NavigationEntryImpl::FromNavigationEntry(controller().GetVisibleEntry())-> | 455 NavigationEntryImpl::FromNavigationEntry(controller().GetVisibleEntry())-> |
449 site_instance()); | 456 site_instance()); |
450 | 457 |
451 // DidNavigate from the page | 458 // DidNavigate from the page |
452 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 459 contents()->TestDidNavigate(orig_rfh, 1, entry_id, true, url, |
| 460 ui::PAGE_TRANSITION_TYPED); |
453 EXPECT_FALSE(contents()->cross_navigation_pending()); | 461 EXPECT_FALSE(contents()->cross_navigation_pending()); |
454 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 462 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
455 EXPECT_EQ(instance1, orig_rfh->GetSiteInstance()); | 463 EXPECT_EQ(instance1, orig_rfh->GetSiteInstance()); |
456 // Controller's entry should now have the SiteInstance, or else we won't be | 464 // Controller's entry should now have the SiteInstance, or else we won't be |
457 // able to find it later. | 465 // able to find it later. |
458 EXPECT_EQ( | 466 EXPECT_EQ( |
459 instance1, | 467 instance1, |
460 NavigationEntryImpl::FromNavigationEntry(controller().GetVisibleEntry())-> | 468 NavigationEntryImpl::FromNavigationEntry(controller().GetVisibleEntry())-> |
461 site_instance()); | 469 site_instance()); |
462 } | 470 } |
(...skipping 14 matching lines...) Expand all Loading... |
477 TEST_F(WebContentsImplTest, CrossSiteBoundaries) { | 485 TEST_F(WebContentsImplTest, CrossSiteBoundaries) { |
478 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 486 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
479 int orig_rvh_delete_count = 0; | 487 int orig_rvh_delete_count = 0; |
480 orig_rfh->GetRenderViewHost()->set_delete_counter(&orig_rvh_delete_count); | 488 orig_rfh->GetRenderViewHost()->set_delete_counter(&orig_rvh_delete_count); |
481 SiteInstance* instance1 = contents()->GetSiteInstance(); | 489 SiteInstance* instance1 = contents()->GetSiteInstance(); |
482 | 490 |
483 // Navigate to URL. First URL should use first RenderViewHost. | 491 // Navigate to URL. First URL should use first RenderViewHost. |
484 const GURL url("http://www.google.com"); | 492 const GURL url("http://www.google.com"); |
485 controller().LoadURL( | 493 controller().LoadURL( |
486 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 494 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 495 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
487 orig_rfh->PrepareForCommit(); | 496 orig_rfh->PrepareForCommit(); |
488 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 497 contents()->TestDidNavigate(orig_rfh, 1, entry_id, true, url, |
| 498 ui::PAGE_TRANSITION_TYPED); |
489 | 499 |
490 // Keep the number of active frames in orig_rfh's SiteInstance non-zero so | 500 // Keep the number of active frames in orig_rfh's SiteInstance non-zero so |
491 // that orig_rfh doesn't get deleted when it gets swapped out. | 501 // that orig_rfh doesn't get deleted when it gets swapped out. |
492 orig_rfh->GetSiteInstance()->increment_active_frame_count(); | 502 orig_rfh->GetSiteInstance()->increment_active_frame_count(); |
493 | 503 |
494 EXPECT_FALSE(contents()->cross_navigation_pending()); | 504 EXPECT_FALSE(contents()->cross_navigation_pending()); |
495 EXPECT_EQ(orig_rfh->GetRenderViewHost(), contents()->GetRenderViewHost()); | 505 EXPECT_EQ(orig_rfh->GetRenderViewHost(), contents()->GetRenderViewHost()); |
496 EXPECT_EQ(url, contents()->GetLastCommittedURL()); | 506 EXPECT_EQ(url, contents()->GetLastCommittedURL()); |
497 EXPECT_EQ(url, contents()->GetVisibleURL()); | 507 EXPECT_EQ(url, contents()->GetVisibleURL()); |
498 | 508 |
499 // Navigate to new site | 509 // Navigate to new site |
500 const GURL url2("http://www.yahoo.com"); | 510 const GURL url2("http://www.yahoo.com"); |
501 controller().LoadURL( | 511 controller().LoadURL( |
502 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 512 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 513 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
503 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 514 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
504 switches::kEnableBrowserSideNavigation)) { | 515 switches::kEnableBrowserSideNavigation)) { |
505 orig_rfh->PrepareForCommit(); | 516 orig_rfh->PrepareForCommit(); |
506 } | 517 } |
507 EXPECT_TRUE(contents()->cross_navigation_pending()); | 518 EXPECT_TRUE(contents()->cross_navigation_pending()); |
508 EXPECT_EQ(url, contents()->GetLastCommittedURL()); | 519 EXPECT_EQ(url, contents()->GetLastCommittedURL()); |
509 EXPECT_EQ(url2, contents()->GetVisibleURL()); | 520 EXPECT_EQ(url2, contents()->GetVisibleURL()); |
510 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); | 521 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); |
511 int pending_rvh_delete_count = 0; | 522 int pending_rvh_delete_count = 0; |
512 pending_rfh->GetRenderViewHost()->set_delete_counter( | 523 pending_rfh->GetRenderViewHost()->set_delete_counter( |
513 &pending_rvh_delete_count); | 524 &pending_rvh_delete_count); |
514 | 525 |
515 // Navigations should be suspended in pending_rfh until BeforeUnloadACK. | 526 // Navigations should be suspended in pending_rfh until BeforeUnloadACK. |
516 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( | 527 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
517 switches::kEnableBrowserSideNavigation)) { | 528 switches::kEnableBrowserSideNavigation)) { |
518 EXPECT_TRUE(pending_rfh->are_navigations_suspended()); | 529 EXPECT_TRUE(pending_rfh->are_navigations_suspended()); |
519 orig_rfh->SendBeforeUnloadACK(true); | 530 orig_rfh->SendBeforeUnloadACK(true); |
520 EXPECT_FALSE(pending_rfh->are_navigations_suspended()); | 531 EXPECT_FALSE(pending_rfh->are_navigations_suspended()); |
521 } | 532 } |
522 | 533 |
523 // DidNavigate from the pending page | 534 // DidNavigate from the pending page |
524 contents()->TestDidNavigate( | 535 contents()->TestDidNavigate(pending_rfh, 1, entry_id, true, url2, |
525 pending_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED); | 536 ui::PAGE_TRANSITION_TYPED); |
526 SiteInstance* instance2 = contents()->GetSiteInstance(); | 537 SiteInstance* instance2 = contents()->GetSiteInstance(); |
527 | 538 |
528 // Keep the number of active frames in pending_rfh's SiteInstance | 539 // Keep the number of active frames in pending_rfh's SiteInstance |
529 // non-zero so that orig_rfh doesn't get deleted when it gets | 540 // non-zero so that orig_rfh doesn't get deleted when it gets |
530 // swapped out. | 541 // swapped out. |
531 pending_rfh->GetSiteInstance()->increment_active_frame_count(); | 542 pending_rfh->GetSiteInstance()->increment_active_frame_count(); |
532 | 543 |
533 EXPECT_FALSE(contents()->cross_navigation_pending()); | 544 EXPECT_FALSE(contents()->cross_navigation_pending()); |
534 EXPECT_EQ(pending_rfh, contents()->GetMainFrame()); | 545 EXPECT_EQ(pending_rfh, contents()->GetMainFrame()); |
535 EXPECT_EQ(url2, contents()->GetLastCommittedURL()); | 546 EXPECT_EQ(url2, contents()->GetLastCommittedURL()); |
536 EXPECT_EQ(url2, contents()->GetVisibleURL()); | 547 EXPECT_EQ(url2, contents()->GetVisibleURL()); |
537 EXPECT_NE(instance1, instance2); | 548 EXPECT_NE(instance1, instance2); |
538 EXPECT_EQ(nullptr, contents()->GetPendingMainFrame()); | 549 EXPECT_EQ(nullptr, contents()->GetPendingMainFrame()); |
539 // We keep the original RFH around, swapped out. | 550 // We keep the original RFH around, swapped out. |
540 EXPECT_TRUE(contents()->GetRenderManagerForTesting()->IsOnSwappedOutList( | 551 EXPECT_TRUE(contents()->GetRenderManagerForTesting()->IsOnSwappedOutList( |
541 orig_rfh)); | 552 orig_rfh)); |
542 EXPECT_EQ(orig_rvh_delete_count, 0); | 553 EXPECT_EQ(orig_rvh_delete_count, 0); |
543 | 554 |
544 // Going back should switch SiteInstances again. The first SiteInstance is | 555 // Going back should switch SiteInstances again. The first SiteInstance is |
545 // stored in the NavigationEntry, so it should be the same as at the start. | 556 // stored in the NavigationEntry, so it should be the same as at the start. |
546 // We should use the same RFH as before, swapping it back in. | 557 // We should use the same RFH as before, swapping it back in. |
547 controller().GoBack(); | 558 controller().GoBack(); |
| 559 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
548 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 560 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
549 switches::kEnableBrowserSideNavigation)) { | 561 switches::kEnableBrowserSideNavigation)) { |
550 contents()->GetMainFrame()->PrepareForCommit(); | 562 contents()->GetMainFrame()->PrepareForCommit(); |
551 } | 563 } |
552 TestRenderFrameHost* goback_rfh = contents()->GetPendingMainFrame(); | 564 TestRenderFrameHost* goback_rfh = contents()->GetPendingMainFrame(); |
553 EXPECT_EQ(orig_rfh, goback_rfh); | 565 EXPECT_EQ(orig_rfh, goback_rfh); |
554 EXPECT_TRUE(contents()->cross_navigation_pending()); | 566 EXPECT_TRUE(contents()->cross_navigation_pending()); |
555 | 567 |
556 // Navigations should be suspended in goback_rfh until BeforeUnloadACK. | 568 // Navigations should be suspended in goback_rfh until BeforeUnloadACK. |
557 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( | 569 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
558 switches::kEnableBrowserSideNavigation)) { | 570 switches::kEnableBrowserSideNavigation)) { |
559 EXPECT_TRUE(goback_rfh->are_navigations_suspended()); | 571 EXPECT_TRUE(goback_rfh->are_navigations_suspended()); |
560 pending_rfh->SendBeforeUnloadACK(true); | 572 pending_rfh->SendBeforeUnloadACK(true); |
561 EXPECT_FALSE(goback_rfh->are_navigations_suspended()); | 573 EXPECT_FALSE(goback_rfh->are_navigations_suspended()); |
562 } | 574 } |
563 | 575 |
564 // DidNavigate from the back action | 576 // DidNavigate from the back action |
565 contents()->TestDidNavigate(goback_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED); | 577 contents()->TestDidNavigate(goback_rfh, 1, entry_id, false, url2, |
| 578 ui::PAGE_TRANSITION_TYPED); |
566 EXPECT_FALSE(contents()->cross_navigation_pending()); | 579 EXPECT_FALSE(contents()->cross_navigation_pending()); |
567 EXPECT_EQ(goback_rfh, contents()->GetMainFrame()); | 580 EXPECT_EQ(goback_rfh, contents()->GetMainFrame()); |
568 EXPECT_EQ(instance1, contents()->GetSiteInstance()); | 581 EXPECT_EQ(instance1, contents()->GetSiteInstance()); |
569 // The pending RFH should now be swapped out, not deleted. | 582 // The pending RFH should now be swapped out, not deleted. |
570 EXPECT_TRUE(contents()->GetRenderManagerForTesting()-> | 583 EXPECT_TRUE(contents()->GetRenderManagerForTesting()-> |
571 IsOnSwappedOutList(pending_rfh)); | 584 IsOnSwappedOutList(pending_rfh)); |
572 EXPECT_EQ(pending_rvh_delete_count, 0); | 585 EXPECT_EQ(pending_rvh_delete_count, 0); |
573 pending_rfh->OnSwappedOut(); | 586 pending_rfh->OnSwappedOut(); |
574 | 587 |
575 // Close contents and ensure RVHs are deleted. | 588 // Close contents and ensure RVHs are deleted. |
576 DeleteContents(); | 589 DeleteContents(); |
577 EXPECT_EQ(orig_rvh_delete_count, 1); | 590 EXPECT_EQ(orig_rvh_delete_count, 1); |
578 EXPECT_EQ(pending_rvh_delete_count, 1); | 591 EXPECT_EQ(pending_rvh_delete_count, 1); |
579 } | 592 } |
580 | 593 |
581 // Test that navigating across a site boundary after a crash creates a new | 594 // Test that navigating across a site boundary after a crash creates a new |
582 // RFH without requiring a cross-site transition (i.e., PENDING state). | 595 // RFH without requiring a cross-site transition (i.e., PENDING state). |
583 TEST_F(WebContentsImplTest, CrossSiteBoundariesAfterCrash) { | 596 TEST_F(WebContentsImplTest, CrossSiteBoundariesAfterCrash) { |
584 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 597 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
585 | 598 |
586 int orig_rvh_delete_count = 0; | 599 int orig_rvh_delete_count = 0; |
587 orig_rfh->GetRenderViewHost()->set_delete_counter(&orig_rvh_delete_count); | 600 orig_rfh->GetRenderViewHost()->set_delete_counter(&orig_rvh_delete_count); |
588 SiteInstance* instance1 = contents()->GetSiteInstance(); | 601 SiteInstance* instance1 = contents()->GetSiteInstance(); |
589 | 602 |
590 // Navigate to URL. First URL should use first RenderViewHost. | 603 // Navigate to URL. First URL should use first RenderViewHost. |
591 const GURL url("http://www.google.com"); | 604 const GURL url("http://www.google.com"); |
592 controller().LoadURL( | 605 controller().LoadURL( |
593 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 606 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 607 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
594 contents()->GetMainFrame()->PrepareForCommit(); | 608 contents()->GetMainFrame()->PrepareForCommit(); |
595 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 609 contents()->TestDidNavigate(orig_rfh, 1, entry_id, true, url, |
| 610 ui::PAGE_TRANSITION_TYPED); |
596 | 611 |
597 EXPECT_FALSE(contents()->cross_navigation_pending()); | 612 EXPECT_FALSE(contents()->cross_navigation_pending()); |
598 EXPECT_EQ(orig_rfh->GetRenderViewHost(), contents()->GetRenderViewHost()); | 613 EXPECT_EQ(orig_rfh->GetRenderViewHost(), contents()->GetRenderViewHost()); |
599 | 614 |
600 // Simulate a renderer crash. | 615 // Simulate a renderer crash. |
601 orig_rfh->GetRenderViewHost()->set_render_view_created(false); | 616 orig_rfh->GetRenderViewHost()->set_render_view_created(false); |
602 orig_rfh->SetRenderFrameCreated(false); | 617 orig_rfh->SetRenderFrameCreated(false); |
603 | 618 |
604 // Navigate to new site. We should not go into PENDING. | 619 // Navigate to new site. We should not go into PENDING. |
605 const GURL url2("http://www.yahoo.com"); | 620 const GURL url2("http://www.yahoo.com"); |
606 controller().LoadURL( | 621 controller().LoadURL( |
607 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 622 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 623 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
608 contents()->GetMainFrame()->PrepareForCommit(); | 624 contents()->GetMainFrame()->PrepareForCommit(); |
609 TestRenderFrameHost* new_rfh = contents()->GetMainFrame(); | 625 TestRenderFrameHost* new_rfh = contents()->GetMainFrame(); |
610 EXPECT_FALSE(contents()->cross_navigation_pending()); | 626 EXPECT_FALSE(contents()->cross_navigation_pending()); |
611 EXPECT_EQ(nullptr, contents()->GetPendingMainFrame()); | 627 EXPECT_EQ(nullptr, contents()->GetPendingMainFrame()); |
612 EXPECT_NE(orig_rfh, new_rfh); | 628 EXPECT_NE(orig_rfh, new_rfh); |
613 EXPECT_EQ(orig_rvh_delete_count, 1); | 629 EXPECT_EQ(orig_rvh_delete_count, 1); |
614 | 630 |
615 // DidNavigate from the new page | 631 // DidNavigate from the new page |
616 contents()->TestDidNavigate(new_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED); | 632 contents()->TestDidNavigate(new_rfh, 1, entry_id, true, url2, |
| 633 ui::PAGE_TRANSITION_TYPED); |
617 SiteInstance* instance2 = contents()->GetSiteInstance(); | 634 SiteInstance* instance2 = contents()->GetSiteInstance(); |
618 | 635 |
619 EXPECT_FALSE(contents()->cross_navigation_pending()); | 636 EXPECT_FALSE(contents()->cross_navigation_pending()); |
620 EXPECT_EQ(new_rfh, main_rfh()); | 637 EXPECT_EQ(new_rfh, main_rfh()); |
621 EXPECT_NE(instance1, instance2); | 638 EXPECT_NE(instance1, instance2); |
622 EXPECT_EQ(nullptr, contents()->GetPendingMainFrame()); | 639 EXPECT_EQ(nullptr, contents()->GetPendingMainFrame()); |
623 | 640 |
624 // Close contents and ensure RVHs are deleted. | 641 // Close contents and ensure RVHs are deleted. |
625 DeleteContents(); | 642 DeleteContents(); |
626 EXPECT_EQ(orig_rvh_delete_count, 1); | 643 EXPECT_EQ(orig_rvh_delete_count, 1); |
627 } | 644 } |
628 | 645 |
629 // Test that opening a new contents in the same SiteInstance and then navigating | 646 // Test that opening a new contents in the same SiteInstance and then navigating |
630 // both contentses to a new site will place both contentses in a single | 647 // both contentses to a new site will place both contentses in a single |
631 // SiteInstance. | 648 // SiteInstance. |
632 TEST_F(WebContentsImplTest, NavigateTwoTabsCrossSite) { | 649 TEST_F(WebContentsImplTest, NavigateTwoTabsCrossSite) { |
633 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 650 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
634 SiteInstance* instance1 = contents()->GetSiteInstance(); | 651 SiteInstance* instance1 = contents()->GetSiteInstance(); |
635 | 652 |
636 // Navigate to URL. First URL should use first RenderViewHost. | 653 // Navigate to URL. First URL should use first RenderViewHost. |
637 const GURL url("http://www.google.com"); | 654 const GURL url("http://www.google.com"); |
638 controller().LoadURL( | 655 controller().LoadURL( |
639 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 656 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 657 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
640 contents()->GetMainFrame()->PrepareForCommit(); | 658 contents()->GetMainFrame()->PrepareForCommit(); |
641 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 659 contents()->TestDidNavigate(orig_rfh, 1, entry_id, true, url, |
| 660 ui::PAGE_TRANSITION_TYPED); |
642 | 661 |
643 // Open a new contents with the same SiteInstance, navigated to the same site. | 662 // Open a new contents with the same SiteInstance, navigated to the same site. |
644 scoped_ptr<TestWebContents> contents2( | 663 scoped_ptr<TestWebContents> contents2( |
645 TestWebContents::Create(browser_context(), instance1)); | 664 TestWebContents::Create(browser_context(), instance1)); |
646 contents2->GetController().LoadURL(url, Referrer(), | 665 contents2->GetController().LoadURL(url, Referrer(), |
647 ui::PAGE_TRANSITION_TYPED, | 666 ui::PAGE_TRANSITION_TYPED, |
648 std::string()); | 667 std::string()); |
| 668 entry_id = contents2->GetController().GetPendingEntry()->GetUniqueID(); |
649 contents2->GetMainFrame()->PrepareForCommit(); | 669 contents2->GetMainFrame()->PrepareForCommit(); |
650 // Need this page id to be 2 since the site instance is the same (which is the | 670 // Need this page id to be 2 since the site instance is the same (which is the |
651 // scope of page IDs) and we want to consider this a new page. | 671 // scope of page IDs) and we want to consider this a new page. |
652 contents2->TestDidNavigate( | 672 contents2->TestDidNavigate(contents2->GetMainFrame(), 2, entry_id, true, url, |
653 contents2->GetMainFrame(), 2, url, ui::PAGE_TRANSITION_TYPED); | 673 ui::PAGE_TRANSITION_TYPED); |
654 | 674 |
655 // Navigate first contents to a new site. | 675 // Navigate first contents to a new site. |
656 const GURL url2a("http://www.yahoo.com"); | 676 const GURL url2a("http://www.yahoo.com"); |
657 controller().LoadURL( | 677 controller().LoadURL( |
658 url2a, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 678 url2a, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 679 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
659 orig_rfh->PrepareForCommit(); | 680 orig_rfh->PrepareForCommit(); |
660 TestRenderFrameHost* pending_rfh_a = contents()->GetPendingMainFrame(); | 681 TestRenderFrameHost* pending_rfh_a = contents()->GetPendingMainFrame(); |
661 contents()->TestDidNavigate( | 682 contents()->TestDidNavigate(pending_rfh_a, 1, entry_id, true, url2a, |
662 pending_rfh_a, 1, url2a, ui::PAGE_TRANSITION_TYPED); | 683 ui::PAGE_TRANSITION_TYPED); |
663 SiteInstance* instance2a = contents()->GetSiteInstance(); | 684 SiteInstance* instance2a = contents()->GetSiteInstance(); |
664 EXPECT_NE(instance1, instance2a); | 685 EXPECT_NE(instance1, instance2a); |
665 | 686 |
666 // Navigate second contents to the same site as the first tab. | 687 // Navigate second contents to the same site as the first tab. |
667 const GURL url2b("http://mail.yahoo.com"); | 688 const GURL url2b("http://mail.yahoo.com"); |
668 contents2->GetController().LoadURL(url2b, Referrer(), | 689 contents2->GetController().LoadURL(url2b, Referrer(), |
669 ui::PAGE_TRANSITION_TYPED, | 690 ui::PAGE_TRANSITION_TYPED, |
670 std::string()); | 691 std::string()); |
| 692 entry_id = contents2->GetController().GetPendingEntry()->GetUniqueID(); |
671 TestRenderFrameHost* rfh2 = contents2->GetMainFrame(); | 693 TestRenderFrameHost* rfh2 = contents2->GetMainFrame(); |
672 rfh2->PrepareForCommit(); | 694 rfh2->PrepareForCommit(); |
673 TestRenderFrameHost* pending_rfh_b = contents2->GetPendingMainFrame(); | 695 TestRenderFrameHost* pending_rfh_b = contents2->GetPendingMainFrame(); |
674 EXPECT_NE(nullptr, pending_rfh_b); | 696 EXPECT_NE(nullptr, pending_rfh_b); |
675 EXPECT_TRUE(contents2->cross_navigation_pending()); | 697 EXPECT_TRUE(contents2->cross_navigation_pending()); |
676 | 698 |
677 // NOTE(creis): We used to be in danger of showing a crash page here if the | 699 // NOTE(creis): We used to be in danger of showing a crash page here if the |
678 // second contents hadn't navigated somewhere first (bug 1145430). That case | 700 // second contents hadn't navigated somewhere first (bug 1145430). That case |
679 // is now covered by the CrossSiteBoundariesAfterCrash test. | 701 // is now covered by the CrossSiteBoundariesAfterCrash test. |
680 contents2->TestDidNavigate( | 702 contents2->TestDidNavigate(pending_rfh_b, 2, entry_id, true, url2b, |
681 pending_rfh_b, 2, url2b, ui::PAGE_TRANSITION_TYPED); | 703 ui::PAGE_TRANSITION_TYPED); |
682 SiteInstance* instance2b = contents2->GetSiteInstance(); | 704 SiteInstance* instance2b = contents2->GetSiteInstance(); |
683 EXPECT_NE(instance1, instance2b); | 705 EXPECT_NE(instance1, instance2b); |
684 | 706 |
685 // Both contentses should now be in the same SiteInstance. | 707 // Both contentses should now be in the same SiteInstance. |
686 EXPECT_EQ(instance2a, instance2b); | 708 EXPECT_EQ(instance2a, instance2b); |
687 } | 709 } |
688 | 710 |
689 // The embedder can request sites for certain urls not be be assigned to the | 711 // The embedder can request sites for certain urls not be be assigned to the |
690 // SiteInstance through ShouldAssignSiteForURL() in content browser client, | 712 // SiteInstance through ShouldAssignSiteForURL() in content browser client, |
691 // allowing to reuse the renderer backing certain chrome urls for subsequent | 713 // allowing to reuse the renderer backing certain chrome urls for subsequent |
692 // navigation. The test verifies that the override is honored. | 714 // navigation. The test verifies that the override is honored. |
693 TEST_F(WebContentsImplTest, NavigateFromSitelessUrl) { | 715 TEST_F(WebContentsImplTest, NavigateFromSitelessUrl) { |
694 WebContentsImplTestBrowserClient browser_client; | 716 WebContentsImplTestBrowserClient browser_client; |
695 SetBrowserClientForTesting(&browser_client); | 717 SetBrowserClientForTesting(&browser_client); |
696 | 718 |
697 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 719 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
698 int orig_rvh_delete_count = 0; | 720 int orig_rvh_delete_count = 0; |
699 orig_rfh->GetRenderViewHost()->set_delete_counter(&orig_rvh_delete_count); | 721 orig_rfh->GetRenderViewHost()->set_delete_counter(&orig_rvh_delete_count); |
700 SiteInstanceImpl* orig_instance = contents()->GetSiteInstance(); | 722 SiteInstanceImpl* orig_instance = contents()->GetSiteInstance(); |
701 | 723 |
702 browser_client.set_assign_site_for_url(false); | 724 browser_client.set_assign_site_for_url(false); |
703 // Navigate to an URL that will not assign a new SiteInstance. | 725 // Navigate to an URL that will not assign a new SiteInstance. |
704 const GURL native_url("non-site-url://stuffandthings"); | 726 const GURL native_url("non-site-url://stuffandthings"); |
705 controller().LoadURL( | 727 controller().LoadURL( |
706 native_url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 728 native_url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 729 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
707 contents()->GetMainFrame()->PrepareForCommit(); | 730 contents()->GetMainFrame()->PrepareForCommit(); |
708 contents()->TestDidNavigate( | 731 contents()->TestDidNavigate(orig_rfh, 1, entry_id, true, native_url, |
709 orig_rfh, 1, native_url, ui::PAGE_TRANSITION_TYPED); | 732 ui::PAGE_TRANSITION_TYPED); |
710 | 733 |
711 EXPECT_FALSE(contents()->cross_navigation_pending()); | 734 EXPECT_FALSE(contents()->cross_navigation_pending()); |
712 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 735 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
713 EXPECT_EQ(native_url, contents()->GetLastCommittedURL()); | 736 EXPECT_EQ(native_url, contents()->GetLastCommittedURL()); |
714 EXPECT_EQ(native_url, contents()->GetVisibleURL()); | 737 EXPECT_EQ(native_url, contents()->GetVisibleURL()); |
715 EXPECT_EQ(orig_instance, contents()->GetSiteInstance()); | 738 EXPECT_EQ(orig_instance, contents()->GetSiteInstance()); |
716 EXPECT_EQ(GURL(), contents()->GetSiteInstance()->GetSiteURL()); | 739 EXPECT_EQ(GURL(), contents()->GetSiteInstance()->GetSiteURL()); |
717 EXPECT_FALSE(orig_instance->HasSite()); | 740 EXPECT_FALSE(orig_instance->HasSite()); |
718 | 741 |
719 browser_client.set_assign_site_for_url(true); | 742 browser_client.set_assign_site_for_url(true); |
720 // Navigate to new site (should keep same site instance). | 743 // Navigate to new site (should keep same site instance). |
721 const GURL url("http://www.google.com"); | 744 const GURL url("http://www.google.com"); |
722 controller().LoadURL( | 745 controller().LoadURL( |
723 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 746 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 747 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
724 contents()->GetMainFrame()->PrepareForCommit(); | 748 contents()->GetMainFrame()->PrepareForCommit(); |
725 EXPECT_FALSE(contents()->cross_navigation_pending()); | 749 EXPECT_FALSE(contents()->cross_navigation_pending()); |
726 EXPECT_EQ(native_url, contents()->GetLastCommittedURL()); | 750 EXPECT_EQ(native_url, contents()->GetLastCommittedURL()); |
727 EXPECT_EQ(url, contents()->GetVisibleURL()); | 751 EXPECT_EQ(url, contents()->GetVisibleURL()); |
728 EXPECT_FALSE(contents()->GetPendingMainFrame()); | 752 EXPECT_FALSE(contents()->GetPendingMainFrame()); |
729 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 753 contents()->TestDidNavigate(orig_rfh, 2, entry_id, true, url, |
| 754 ui::PAGE_TRANSITION_TYPED); |
730 | 755 |
731 // Keep the number of active frames in orig_rfh's SiteInstance | 756 // Keep the number of active frames in orig_rfh's SiteInstance |
732 // non-zero so that orig_rfh doesn't get deleted when it gets | 757 // non-zero so that orig_rfh doesn't get deleted when it gets |
733 // swapped out. | 758 // swapped out. |
734 orig_rfh->GetSiteInstance()->increment_active_frame_count(); | 759 orig_rfh->GetSiteInstance()->increment_active_frame_count(); |
735 | 760 |
736 EXPECT_EQ(orig_instance, contents()->GetSiteInstance()); | 761 EXPECT_EQ(orig_instance, contents()->GetSiteInstance()); |
737 EXPECT_TRUE( | 762 EXPECT_TRUE( |
738 contents()->GetSiteInstance()->GetSiteURL().DomainIs("google.com")); | 763 contents()->GetSiteInstance()->GetSiteURL().DomainIs("google.com")); |
739 EXPECT_EQ(url, contents()->GetLastCommittedURL()); | 764 EXPECT_EQ(url, contents()->GetLastCommittedURL()); |
740 | 765 |
741 // Navigate to another new site (should create a new site instance). | 766 // Navigate to another new site (should create a new site instance). |
742 const GURL url2("http://www.yahoo.com"); | 767 const GURL url2("http://www.yahoo.com"); |
743 controller().LoadURL( | 768 controller().LoadURL( |
744 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 769 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 770 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
745 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 771 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
746 switches::kEnableBrowserSideNavigation)) { | 772 switches::kEnableBrowserSideNavigation)) { |
747 orig_rfh->PrepareForCommit(); | 773 orig_rfh->PrepareForCommit(); |
748 } | 774 } |
749 EXPECT_TRUE(contents()->cross_navigation_pending()); | 775 EXPECT_TRUE(contents()->cross_navigation_pending()); |
750 EXPECT_EQ(url, contents()->GetLastCommittedURL()); | 776 EXPECT_EQ(url, contents()->GetLastCommittedURL()); |
751 EXPECT_EQ(url2, contents()->GetVisibleURL()); | 777 EXPECT_EQ(url2, contents()->GetVisibleURL()); |
752 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); | 778 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); |
753 int pending_rvh_delete_count = 0; | 779 int pending_rvh_delete_count = 0; |
754 pending_rfh->GetRenderViewHost()->set_delete_counter( | 780 pending_rfh->GetRenderViewHost()->set_delete_counter( |
755 &pending_rvh_delete_count); | 781 &pending_rvh_delete_count); |
756 | 782 |
757 // Navigations should be suspended in pending_rvh until BeforeUnloadACK. | 783 // Navigations should be suspended in pending_rvh until BeforeUnloadACK. |
758 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( | 784 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
759 switches::kEnableBrowserSideNavigation)) { | 785 switches::kEnableBrowserSideNavigation)) { |
760 EXPECT_TRUE(pending_rfh->are_navigations_suspended()); | 786 EXPECT_TRUE(pending_rfh->are_navigations_suspended()); |
761 orig_rfh->SendBeforeUnloadACK(true); | 787 orig_rfh->SendBeforeUnloadACK(true); |
762 EXPECT_FALSE(pending_rfh->are_navigations_suspended()); | 788 EXPECT_FALSE(pending_rfh->are_navigations_suspended()); |
763 } | 789 } |
764 | 790 |
765 // DidNavigate from the pending page. | 791 // DidNavigate from the pending page. |
766 contents()->TestDidNavigate( | 792 contents()->TestDidNavigate(pending_rfh, 1, entry_id, true, url2, |
767 pending_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED); | 793 ui::PAGE_TRANSITION_TYPED); |
768 SiteInstance* new_instance = contents()->GetSiteInstance(); | 794 SiteInstance* new_instance = contents()->GetSiteInstance(); |
769 | 795 |
770 EXPECT_FALSE(contents()->cross_navigation_pending()); | 796 EXPECT_FALSE(contents()->cross_navigation_pending()); |
771 EXPECT_EQ(pending_rfh, contents()->GetMainFrame()); | 797 EXPECT_EQ(pending_rfh, contents()->GetMainFrame()); |
772 EXPECT_EQ(url2, contents()->GetLastCommittedURL()); | 798 EXPECT_EQ(url2, contents()->GetLastCommittedURL()); |
773 EXPECT_EQ(url2, contents()->GetVisibleURL()); | 799 EXPECT_EQ(url2, contents()->GetVisibleURL()); |
774 EXPECT_NE(new_instance, orig_instance); | 800 EXPECT_NE(new_instance, orig_instance); |
775 EXPECT_FALSE(contents()->GetPendingMainFrame()); | 801 EXPECT_FALSE(contents()->GetPendingMainFrame()); |
776 // We keep the original RFH around, swapped out. | 802 // We keep the original RFH around, swapped out. |
777 EXPECT_TRUE(contents()->GetRenderManagerForTesting()->IsOnSwappedOutList( | 803 EXPECT_TRUE(contents()->GetRenderManagerForTesting()->IsOnSwappedOutList( |
(...skipping 26 matching lines...) Expand all Loading... |
804 browser_context()); | 830 browser_context()); |
805 entry->SetPageID(0); | 831 entry->SetPageID(0); |
806 entries.push_back(entry); | 832 entries.push_back(entry); |
807 controller().Restore( | 833 controller().Restore( |
808 0, | 834 0, |
809 NavigationController::RESTORE_LAST_SESSION_EXITED_CLEANLY, | 835 NavigationController::RESTORE_LAST_SESSION_EXITED_CLEANLY, |
810 &entries); | 836 &entries); |
811 ASSERT_EQ(0u, entries.size()); | 837 ASSERT_EQ(0u, entries.size()); |
812 ASSERT_EQ(1, controller().GetEntryCount()); | 838 ASSERT_EQ(1, controller().GetEntryCount()); |
813 controller().GoToIndex(0); | 839 controller().GoToIndex(0); |
814 contents()->TestDidNavigate( | 840 entry = controller().GetPendingEntry(); |
815 orig_rfh, 0, native_url, ui::PAGE_TRANSITION_RELOAD); | 841 contents()->TestDidNavigate(orig_rfh, 0, entry->GetUniqueID(), false, |
| 842 native_url, ui::PAGE_TRANSITION_RELOAD); |
816 EXPECT_EQ(orig_instance, contents()->GetSiteInstance()); | 843 EXPECT_EQ(orig_instance, contents()->GetSiteInstance()); |
817 EXPECT_EQ(GURL(), contents()->GetSiteInstance()->GetSiteURL()); | 844 EXPECT_EQ(GURL(), contents()->GetSiteInstance()->GetSiteURL()); |
818 EXPECT_FALSE(orig_instance->HasSite()); | 845 EXPECT_FALSE(orig_instance->HasSite()); |
819 | 846 |
820 // Navigate to a regular site and verify that the SiteInstance was kept. | 847 // Navigate to a regular site and verify that the SiteInstance was kept. |
821 browser_client.set_assign_site_for_url(true); | 848 browser_client.set_assign_site_for_url(true); |
822 const GURL url("http://www.google.com"); | 849 const GURL url("http://www.google.com"); |
823 controller().LoadURL( | 850 controller().LoadURL( |
824 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 851 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
825 contents()->TestDidNavigate(orig_rfh, 2, url, ui::PAGE_TRANSITION_TYPED); | 852 entry = controller().GetPendingEntry(); |
| 853 contents()->TestDidNavigate(orig_rfh, 2, entry->GetUniqueID(), true, url, |
| 854 ui::PAGE_TRANSITION_TYPED); |
826 EXPECT_EQ(orig_instance, contents()->GetSiteInstance()); | 855 EXPECT_EQ(orig_instance, contents()->GetSiteInstance()); |
827 | 856 |
828 // Cleanup. | 857 // Cleanup. |
829 DeleteContents(); | 858 DeleteContents(); |
830 } | 859 } |
831 | 860 |
832 // Complement for NavigateFromRestoredSitelessUrl, verifying that when a regular | 861 // Complement for NavigateFromRestoredSitelessUrl, verifying that when a regular |
833 // tab is restored, the SiteInstance will change upon navigation. | 862 // tab is restored, the SiteInstance will change upon navigation. |
834 TEST_F(WebContentsImplTest, NavigateFromRestoredRegularUrl) { | 863 TEST_F(WebContentsImplTest, NavigateFromRestoredRegularUrl) { |
835 WebContentsImplTestBrowserClient browser_client; | 864 WebContentsImplTestBrowserClient browser_client; |
(...skipping 11 matching lines...) Expand all Loading... |
847 browser_context()); | 876 browser_context()); |
848 entry->SetPageID(0); | 877 entry->SetPageID(0); |
849 entries.push_back(entry); | 878 entries.push_back(entry); |
850 controller().Restore( | 879 controller().Restore( |
851 0, | 880 0, |
852 NavigationController::RESTORE_LAST_SESSION_EXITED_CLEANLY, | 881 NavigationController::RESTORE_LAST_SESSION_EXITED_CLEANLY, |
853 &entries); | 882 &entries); |
854 ASSERT_EQ(0u, entries.size()); | 883 ASSERT_EQ(0u, entries.size()); |
855 ASSERT_EQ(1, controller().GetEntryCount()); | 884 ASSERT_EQ(1, controller().GetEntryCount()); |
856 controller().GoToIndex(0); | 885 controller().GoToIndex(0); |
| 886 entry = controller().GetPendingEntry(); |
857 orig_rfh->PrepareForCommit(); | 887 orig_rfh->PrepareForCommit(); |
858 contents()->TestDidNavigate( | 888 contents()->TestDidNavigate(orig_rfh, 0, entry->GetUniqueID(), false, |
859 orig_rfh, 0, regular_url, ui::PAGE_TRANSITION_RELOAD); | 889 regular_url, ui::PAGE_TRANSITION_RELOAD); |
860 EXPECT_EQ(orig_instance, contents()->GetSiteInstance()); | 890 EXPECT_EQ(orig_instance, contents()->GetSiteInstance()); |
861 EXPECT_TRUE(orig_instance->HasSite()); | 891 EXPECT_TRUE(orig_instance->HasSite()); |
862 | 892 |
863 // Navigate to another site and verify that a new SiteInstance was created. | 893 // Navigate to another site and verify that a new SiteInstance was created. |
864 const GURL url("http://www.google.com"); | 894 const GURL url("http://www.google.com"); |
865 controller().LoadURL( | 895 controller().LoadURL( |
866 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 896 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 897 entry = controller().GetPendingEntry(); |
867 orig_rfh->PrepareForCommit(); | 898 orig_rfh->PrepareForCommit(); |
868 contents()->TestDidNavigate( | 899 contents()->TestDidNavigate(contents()->GetPendingMainFrame(), 2, |
869 contents()->GetPendingMainFrame(), 2, url, ui::PAGE_TRANSITION_TYPED); | 900 entry->GetUniqueID(), true, url, |
| 901 ui::PAGE_TRANSITION_TYPED); |
870 EXPECT_NE(orig_instance, contents()->GetSiteInstance()); | 902 EXPECT_NE(orig_instance, contents()->GetSiteInstance()); |
871 | 903 |
872 // Cleanup. | 904 // Cleanup. |
873 DeleteContents(); | 905 DeleteContents(); |
874 } | 906 } |
875 | 907 |
876 // Test that we can find an opener RVH even if it's pending. | 908 // Test that we can find an opener RVH even if it's pending. |
877 // http://crbug.com/176252. | 909 // http://crbug.com/176252. |
878 TEST_F(WebContentsImplTest, FindOpenerRVHWhenPending) { | 910 TEST_F(WebContentsImplTest, FindOpenerRVHWhenPending) { |
879 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 911 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
880 | 912 |
881 // Navigate to a URL. | 913 // Navigate to a URL. |
882 const GURL url("http://www.google.com"); | 914 const GURL url("http://www.google.com"); |
883 controller().LoadURL( | 915 controller().LoadURL( |
884 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 916 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 917 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
885 orig_rfh->PrepareForCommit(); | 918 orig_rfh->PrepareForCommit(); |
886 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 919 contents()->TestDidNavigate(orig_rfh, 1, entry_id, true, url, |
| 920 ui::PAGE_TRANSITION_TYPED); |
887 | 921 |
888 // Start to navigate first tab to a new site, so that it has a pending RVH. | 922 // Start to navigate first tab to a new site, so that it has a pending RVH. |
889 const GURL url2("http://www.yahoo.com"); | 923 const GURL url2("http://www.yahoo.com"); |
890 controller().LoadURL( | 924 controller().LoadURL( |
891 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 925 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
892 orig_rfh->PrepareForCommit(); | 926 orig_rfh->PrepareForCommit(); |
893 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); | 927 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); |
894 | 928 |
895 // While it is still pending, simulate opening a new tab with the first tab | 929 // While it is still pending, simulate opening a new tab with the first tab |
896 // as its opener. This will call WebContentsImpl::CreateOpenerRenderViews | 930 // as its opener. This will call WebContentsImpl::CreateOpenerRenderViews |
897 // on the opener to ensure that an RVH exists. | 931 // on the opener to ensure that an RVH exists. |
898 int opener_routing_id = | 932 int opener_routing_id = |
899 contents()->CreateOpenerRenderViews(pending_rfh->GetSiteInstance()); | 933 contents()->CreateOpenerRenderViews(pending_rfh->GetSiteInstance()); |
900 | 934 |
901 // We should find the pending RVH and not create a new one. | 935 // We should find the pending RVH and not create a new one. |
902 EXPECT_EQ(pending_rfh->GetRenderViewHost()->GetRoutingID(), | 936 EXPECT_EQ(pending_rfh->GetRenderViewHost()->GetRoutingID(), |
903 opener_routing_id); | 937 opener_routing_id); |
904 } | 938 } |
905 | 939 |
906 // Tests that WebContentsImpl uses the current URL, not the SiteInstance's site, | 940 // Tests that WebContentsImpl uses the current URL, not the SiteInstance's site, |
907 // to determine whether a navigation is cross-site. | 941 // to determine whether a navigation is cross-site. |
908 TEST_F(WebContentsImplTest, CrossSiteComparesAgainstCurrentPage) { | 942 TEST_F(WebContentsImplTest, CrossSiteComparesAgainstCurrentPage) { |
909 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 943 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
910 SiteInstance* instance1 = contents()->GetSiteInstance(); | 944 SiteInstance* instance1 = contents()->GetSiteInstance(); |
911 | 945 |
912 // Navigate to URL. | 946 // Navigate to URL. |
913 const GURL url("http://www.google.com"); | 947 const GURL url("http://www.google.com"); |
914 controller().LoadURL( | 948 controller().LoadURL( |
915 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 949 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 950 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
916 contents()->GetMainFrame()->PrepareForCommit(); | 951 contents()->GetMainFrame()->PrepareForCommit(); |
917 contents()->TestDidNavigate( | 952 contents()->TestDidNavigate(orig_rfh, 1, entry_id, true, url, |
918 orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 953 ui::PAGE_TRANSITION_TYPED); |
919 | 954 |
920 // Open a related contents to a second site. | 955 // Open a related contents to a second site. |
921 scoped_ptr<TestWebContents> contents2( | 956 scoped_ptr<TestWebContents> contents2( |
922 TestWebContents::Create(browser_context(), instance1)); | 957 TestWebContents::Create(browser_context(), instance1)); |
923 const GURL url2("http://www.yahoo.com"); | 958 const GURL url2("http://www.yahoo.com"); |
924 contents2->GetController().LoadURL(url2, Referrer(), | 959 contents2->GetController().LoadURL(url2, Referrer(), |
925 ui::PAGE_TRANSITION_TYPED, | 960 ui::PAGE_TRANSITION_TYPED, |
926 std::string()); | 961 std::string()); |
| 962 entry_id = contents2->GetController().GetPendingEntry()->GetUniqueID(); |
927 contents2->GetMainFrame()->PrepareForCommit(); | 963 contents2->GetMainFrame()->PrepareForCommit(); |
| 964 |
928 // The first RVH in contents2 isn't live yet, so we shortcut the cross site | 965 // The first RVH in contents2 isn't live yet, so we shortcut the cross site |
929 // pending. | 966 // pending. |
930 TestRenderFrameHost* rfh2 = contents2->GetMainFrame(); | 967 TestRenderFrameHost* rfh2 = contents2->GetMainFrame(); |
931 EXPECT_FALSE(contents2->cross_navigation_pending()); | 968 EXPECT_FALSE(contents2->cross_navigation_pending()); |
932 contents2->TestDidNavigate(rfh2, 2, url2, ui::PAGE_TRANSITION_TYPED); | 969 contents2->TestDidNavigate(rfh2, 2, entry_id, true, url2, |
| 970 ui::PAGE_TRANSITION_TYPED); |
933 SiteInstance* instance2 = contents2->GetSiteInstance(); | 971 SiteInstance* instance2 = contents2->GetSiteInstance(); |
934 EXPECT_NE(instance1, instance2); | 972 EXPECT_NE(instance1, instance2); |
935 EXPECT_FALSE(contents2->cross_navigation_pending()); | 973 EXPECT_FALSE(contents2->cross_navigation_pending()); |
936 | 974 |
937 // Simulate a link click in first contents to second site. Doesn't switch | 975 // Simulate a link click in first contents to second site. Doesn't switch |
938 // SiteInstances, because we don't intercept WebKit navigations. | 976 // SiteInstances, because we don't intercept Blink navigations. |
939 contents()->TestDidNavigate( | 977 contents()->TestDidNavigate(orig_rfh, 2, 0, true, url2, |
940 orig_rfh, 2, url2, ui::PAGE_TRANSITION_TYPED); | 978 ui::PAGE_TRANSITION_TYPED); |
941 SiteInstance* instance3 = contents()->GetSiteInstance(); | 979 SiteInstance* instance3 = contents()->GetSiteInstance(); |
942 EXPECT_EQ(instance1, instance3); | 980 EXPECT_EQ(instance1, instance3); |
943 EXPECT_FALSE(contents()->cross_navigation_pending()); | 981 EXPECT_FALSE(contents()->cross_navigation_pending()); |
944 | 982 |
945 // Navigate to the new site. Doesn't switch SiteInstancees, because we | 983 // Navigate to the new site. Doesn't switch SiteInstancees, because we |
946 // compare against the current URL, not the SiteInstance's site. | 984 // compare against the current URL, not the SiteInstance's site. |
947 const GURL url3("http://mail.yahoo.com"); | 985 const GURL url3("http://mail.yahoo.com"); |
948 controller().LoadURL( | 986 controller().LoadURL( |
949 url3, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 987 url3, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 988 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
950 EXPECT_FALSE(contents()->cross_navigation_pending()); | 989 EXPECT_FALSE(contents()->cross_navigation_pending()); |
951 contents()->GetMainFrame()->PrepareForCommit(); | 990 contents()->GetMainFrame()->PrepareForCommit(); |
952 contents()->TestDidNavigate( | 991 contents()->TestDidNavigate(orig_rfh, 3, entry_id, true, url3, |
953 orig_rfh, 3, url3, ui::PAGE_TRANSITION_TYPED); | 992 ui::PAGE_TRANSITION_TYPED); |
954 SiteInstance* instance4 = contents()->GetSiteInstance(); | 993 SiteInstance* instance4 = contents()->GetSiteInstance(); |
955 EXPECT_EQ(instance1, instance4); | 994 EXPECT_EQ(instance1, instance4); |
956 } | 995 } |
957 | 996 |
958 // Test that the onbeforeunload and onunload handlers run when navigating | 997 // Test that the onbeforeunload and onunload handlers run when navigating |
959 // across site boundaries. | 998 // across site boundaries. |
960 TEST_F(WebContentsImplTest, CrossSiteUnloadHandlers) { | 999 TEST_F(WebContentsImplTest, CrossSiteUnloadHandlers) { |
961 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 1000 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
962 SiteInstance* instance1 = contents()->GetSiteInstance(); | 1001 SiteInstance* instance1 = contents()->GetSiteInstance(); |
963 | 1002 |
964 // Navigate to URL. First URL should use first RenderViewHost. | 1003 // Navigate to URL. First URL should use first RenderViewHost. |
965 const GURL url("http://www.google.com"); | 1004 const GURL url("http://www.google.com"); |
966 controller().LoadURL( | 1005 controller().LoadURL( |
967 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1006 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1007 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
968 contents()->GetMainFrame()->PrepareForCommit(); | 1008 contents()->GetMainFrame()->PrepareForCommit(); |
969 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 1009 contents()->TestDidNavigate(orig_rfh, 1, entry_id, true, url, |
| 1010 ui::PAGE_TRANSITION_TYPED); |
970 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1011 EXPECT_FALSE(contents()->cross_navigation_pending()); |
971 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 1012 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
972 | 1013 |
973 // Navigate to new site, but simulate an onbeforeunload denial. | 1014 // Navigate to new site, but simulate an onbeforeunload denial. |
974 const GURL url2("http://www.yahoo.com"); | 1015 const GURL url2("http://www.yahoo.com"); |
975 controller().LoadURL( | 1016 controller().LoadURL( |
976 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1017 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
977 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 1018 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); |
978 base::TimeTicks now = base::TimeTicks::Now(); | 1019 base::TimeTicks now = base::TimeTicks::Now(); |
979 orig_rfh->OnMessageReceived( | 1020 orig_rfh->OnMessageReceived( |
980 FrameHostMsg_BeforeUnload_ACK(0, false, now, now)); | 1021 FrameHostMsg_BeforeUnload_ACK(0, false, now, now)); |
981 EXPECT_FALSE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 1022 EXPECT_FALSE(orig_rfh->IsWaitingForBeforeUnloadACK()); |
982 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1023 EXPECT_FALSE(contents()->cross_navigation_pending()); |
983 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 1024 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
984 | 1025 |
985 // Navigate again, but simulate an onbeforeunload approval. | 1026 // Navigate again, but simulate an onbeforeunload approval. |
986 controller().LoadURL( | 1027 controller().LoadURL( |
987 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1028 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1029 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
988 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 1030 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); |
989 now = base::TimeTicks::Now(); | 1031 now = base::TimeTicks::Now(); |
990 orig_rfh->PrepareForCommit(); | 1032 orig_rfh->PrepareForCommit(); |
991 EXPECT_FALSE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 1033 EXPECT_FALSE(orig_rfh->IsWaitingForBeforeUnloadACK()); |
992 EXPECT_TRUE(contents()->cross_navigation_pending()); | 1034 EXPECT_TRUE(contents()->cross_navigation_pending()); |
993 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); | 1035 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); |
994 | 1036 |
995 // We won't hear DidNavigate until the onunload handler has finished running. | 1037 // We won't hear DidNavigate until the onunload handler has finished running. |
996 | 1038 |
997 // DidNavigate from the pending page. | 1039 // DidNavigate from the pending page. |
998 contents()->TestDidNavigate( | 1040 contents()->TestDidNavigate(pending_rfh, 1, entry_id, true, url2, |
999 pending_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED); | 1041 ui::PAGE_TRANSITION_TYPED); |
1000 SiteInstance* instance2 = contents()->GetSiteInstance(); | 1042 SiteInstance* instance2 = contents()->GetSiteInstance(); |
1001 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1043 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1002 EXPECT_EQ(pending_rfh, contents()->GetMainFrame()); | 1044 EXPECT_EQ(pending_rfh, contents()->GetMainFrame()); |
1003 EXPECT_NE(instance1, instance2); | 1045 EXPECT_NE(instance1, instance2); |
1004 EXPECT_EQ(nullptr, contents()->GetPendingMainFrame()); | 1046 EXPECT_EQ(nullptr, contents()->GetPendingMainFrame()); |
1005 } | 1047 } |
1006 | 1048 |
1007 // Test that during a slow cross-site navigation, the original renderer can | 1049 // Test that during a slow cross-site navigation, the original renderer can |
1008 // navigate to a different URL and have it displayed, canceling the slow | 1050 // navigate to a different URL and have it displayed, canceling the slow |
1009 // navigation. | 1051 // navigation. |
1010 TEST_F(WebContentsImplTest, CrossSiteNavigationPreempted) { | 1052 TEST_F(WebContentsImplTest, CrossSiteNavigationPreempted) { |
1011 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 1053 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
1012 SiteInstance* instance1 = contents()->GetSiteInstance(); | 1054 SiteInstance* instance1 = contents()->GetSiteInstance(); |
1013 | 1055 |
1014 // Navigate to URL. First URL should use first RenderFrameHost. | 1056 // Navigate to URL. First URL should use first RenderFrameHost. |
1015 const GURL url("http://www.google.com"); | 1057 const GURL url("http://www.google.com"); |
1016 controller().LoadURL( | 1058 controller().LoadURL( |
1017 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1059 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1060 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
1018 contents()->GetMainFrame()->PrepareForCommit(); | 1061 contents()->GetMainFrame()->PrepareForCommit(); |
1019 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 1062 contents()->TestDidNavigate(orig_rfh, 1, entry_id, true, url, |
| 1063 ui::PAGE_TRANSITION_TYPED); |
1020 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1064 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1021 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 1065 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
1022 | 1066 |
1023 // Navigate to new site, simulating an onbeforeunload approval. | 1067 // Navigate to new site, simulating an onbeforeunload approval. |
1024 const GURL url2("http://www.yahoo.com"); | 1068 const GURL url2("http://www.yahoo.com"); |
1025 controller().LoadURL( | 1069 controller().LoadURL( |
1026 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1070 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
1027 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 1071 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); |
1028 orig_rfh->PrepareForCommit(); | 1072 orig_rfh->PrepareForCommit(); |
1029 EXPECT_TRUE(contents()->cross_navigation_pending()); | 1073 EXPECT_TRUE(contents()->cross_navigation_pending()); |
1030 | 1074 |
1031 // Suppose the original renderer navigates before the new one is ready. | 1075 // Suppose the original renderer navigates before the new one is ready. |
1032 orig_rfh->SendNavigate(2, GURL("http://www.google.com/foo")); | 1076 orig_rfh->SendNavigate(2, 0, true, GURL("http://www.google.com/foo")); |
1033 | 1077 |
1034 // Verify that the pending navigation is cancelled. | 1078 // Verify that the pending navigation is cancelled. |
1035 EXPECT_FALSE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 1079 EXPECT_FALSE(orig_rfh->IsWaitingForBeforeUnloadACK()); |
1036 SiteInstance* instance2 = contents()->GetSiteInstance(); | 1080 SiteInstance* instance2 = contents()->GetSiteInstance(); |
1037 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1081 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1038 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 1082 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
1039 EXPECT_EQ(instance1, instance2); | 1083 EXPECT_EQ(instance1, instance2); |
1040 EXPECT_EQ(nullptr, contents()->GetPendingMainFrame()); | 1084 EXPECT_EQ(nullptr, contents()->GetPendingMainFrame()); |
1041 } | 1085 } |
1042 | 1086 |
1043 TEST_F(WebContentsImplTest, CrossSiteNavigationBackPreempted) { | 1087 TEST_F(WebContentsImplTest, CrossSiteNavigationBackPreempted) { |
1044 // Start with a web ui page, which gets a new RVH with WebUI bindings. | 1088 // Start with a web ui page, which gets a new RVH with WebUI bindings. |
1045 const GURL url1("chrome://blah"); | 1089 const GURL url1("chrome://blah"); |
1046 controller().LoadURL( | 1090 controller().LoadURL( |
1047 url1, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1091 url1, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1092 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
1048 TestRenderFrameHost* ntp_rfh = contents()->GetMainFrame(); | 1093 TestRenderFrameHost* ntp_rfh = contents()->GetMainFrame(); |
1049 ntp_rfh->PrepareForCommit(); | 1094 ntp_rfh->PrepareForCommit(); |
1050 contents()->TestDidNavigate(ntp_rfh, 1, url1, ui::PAGE_TRANSITION_TYPED); | 1095 contents()->TestDidNavigate(ntp_rfh, 1, entry_id, true, url1, |
| 1096 ui::PAGE_TRANSITION_TYPED); |
1051 NavigationEntry* entry1 = controller().GetLastCommittedEntry(); | 1097 NavigationEntry* entry1 = controller().GetLastCommittedEntry(); |
1052 SiteInstance* instance1 = contents()->GetSiteInstance(); | 1098 SiteInstance* instance1 = contents()->GetSiteInstance(); |
1053 | 1099 |
1054 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1100 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1055 EXPECT_EQ(ntp_rfh, contents()->GetMainFrame()); | 1101 EXPECT_EQ(ntp_rfh, contents()->GetMainFrame()); |
1056 EXPECT_EQ(url1, entry1->GetURL()); | 1102 EXPECT_EQ(url1, entry1->GetURL()); |
1057 EXPECT_EQ(instance1, | 1103 EXPECT_EQ(instance1, |
1058 NavigationEntryImpl::FromNavigationEntry(entry1)->site_instance()); | 1104 NavigationEntryImpl::FromNavigationEntry(entry1)->site_instance()); |
1059 EXPECT_TRUE(ntp_rfh->GetRenderViewHost()->GetEnabledBindings() & | 1105 EXPECT_TRUE(ntp_rfh->GetRenderViewHost()->GetEnabledBindings() & |
1060 BINDINGS_POLICY_WEB_UI); | 1106 BINDINGS_POLICY_WEB_UI); |
1061 | 1107 |
1062 // Navigate to new site. | 1108 // Navigate to new site. |
1063 const GURL url2("http://www.google.com"); | 1109 const GURL url2("http://www.google.com"); |
1064 controller().LoadURL( | 1110 controller().LoadURL( |
1065 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1111 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1112 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
1066 EXPECT_TRUE(contents()->cross_navigation_pending()); | 1113 EXPECT_TRUE(contents()->cross_navigation_pending()); |
1067 TestRenderFrameHost* google_rfh = contents()->GetPendingMainFrame(); | 1114 TestRenderFrameHost* google_rfh = contents()->GetPendingMainFrame(); |
1068 | 1115 |
1069 // Simulate beforeunload approval. | 1116 // Simulate beforeunload approval. |
1070 EXPECT_TRUE(ntp_rfh->IsWaitingForBeforeUnloadACK()); | 1117 EXPECT_TRUE(ntp_rfh->IsWaitingForBeforeUnloadACK()); |
1071 base::TimeTicks now = base::TimeTicks::Now(); | 1118 base::TimeTicks now = base::TimeTicks::Now(); |
1072 ntp_rfh->PrepareForCommit(); | 1119 ntp_rfh->PrepareForCommit(); |
1073 | 1120 |
1074 // DidNavigate from the pending page. | 1121 // DidNavigate from the pending page. |
1075 contents()->TestDidNavigate( | 1122 contents()->TestDidNavigate(google_rfh, 1, entry_id, true, url2, |
1076 google_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED); | 1123 ui::PAGE_TRANSITION_TYPED); |
1077 NavigationEntry* entry2 = controller().GetLastCommittedEntry(); | 1124 NavigationEntry* entry2 = controller().GetLastCommittedEntry(); |
1078 SiteInstance* instance2 = contents()->GetSiteInstance(); | 1125 SiteInstance* instance2 = contents()->GetSiteInstance(); |
1079 | 1126 |
1080 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1127 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1081 EXPECT_EQ(google_rfh, contents()->GetMainFrame()); | 1128 EXPECT_EQ(google_rfh, contents()->GetMainFrame()); |
1082 EXPECT_NE(instance1, instance2); | 1129 EXPECT_NE(instance1, instance2); |
1083 EXPECT_FALSE(contents()->GetPendingMainFrame()); | 1130 EXPECT_FALSE(contents()->GetPendingMainFrame()); |
1084 EXPECT_EQ(url2, entry2->GetURL()); | 1131 EXPECT_EQ(url2, entry2->GetURL()); |
1085 EXPECT_EQ(instance2, | 1132 EXPECT_EQ(instance2, |
1086 NavigationEntryImpl::FromNavigationEntry(entry2)->site_instance()); | 1133 NavigationEntryImpl::FromNavigationEntry(entry2)->site_instance()); |
1087 EXPECT_FALSE(google_rfh->GetRenderViewHost()->GetEnabledBindings() & | 1134 EXPECT_FALSE(google_rfh->GetRenderViewHost()->GetEnabledBindings() & |
1088 BINDINGS_POLICY_WEB_UI); | 1135 BINDINGS_POLICY_WEB_UI); |
1089 | 1136 |
1090 // Navigate to third page on same site. | 1137 // Navigate to third page on same site. |
1091 const GURL url3("http://news.google.com"); | 1138 const GURL url3("http://news.google.com"); |
1092 controller().LoadURL( | 1139 controller().LoadURL( |
1093 url3, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1140 url3, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1141 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
1094 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1142 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1095 contents()->GetMainFrame()->PrepareForCommit(); | 1143 contents()->GetMainFrame()->PrepareForCommit(); |
1096 contents()->TestDidNavigate( | 1144 contents()->TestDidNavigate(google_rfh, 2, entry_id, true, url3, |
1097 google_rfh, 2, url3, ui::PAGE_TRANSITION_TYPED); | 1145 ui::PAGE_TRANSITION_TYPED); |
1098 NavigationEntry* entry3 = controller().GetLastCommittedEntry(); | 1146 NavigationEntry* entry3 = controller().GetLastCommittedEntry(); |
1099 SiteInstance* instance3 = contents()->GetSiteInstance(); | 1147 SiteInstance* instance3 = contents()->GetSiteInstance(); |
1100 | 1148 |
1101 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1149 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1102 EXPECT_EQ(google_rfh, contents()->GetMainFrame()); | 1150 EXPECT_EQ(google_rfh, contents()->GetMainFrame()); |
1103 EXPECT_EQ(instance2, instance3); | 1151 EXPECT_EQ(instance2, instance3); |
1104 EXPECT_FALSE(contents()->GetPendingMainFrame()); | 1152 EXPECT_FALSE(contents()->GetPendingMainFrame()); |
1105 EXPECT_EQ(url3, entry3->GetURL()); | 1153 EXPECT_EQ(url3, entry3->GetURL()); |
1106 EXPECT_EQ(instance3, | 1154 EXPECT_EQ(instance3, |
1107 NavigationEntryImpl::FromNavigationEntry(entry3)->site_instance()); | 1155 NavigationEntryImpl::FromNavigationEntry(entry3)->site_instance()); |
1108 | 1156 |
1109 // Go back within the site. | 1157 // Go back within the site. |
1110 controller().GoBack(); | 1158 controller().GoBack(); |
| 1159 NavigationEntry* goback_entry = controller().GetPendingEntry(); |
1111 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1160 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1112 EXPECT_EQ(entry2, controller().GetPendingEntry()); | 1161 EXPECT_EQ(entry2, controller().GetPendingEntry()); |
1113 | 1162 |
1114 // Before that commits, go back again. | 1163 // Before that commits, go back again. |
1115 controller().GoBack(); | 1164 controller().GoBack(); |
1116 EXPECT_TRUE(contents()->cross_navigation_pending()); | 1165 EXPECT_TRUE(contents()->cross_navigation_pending()); |
1117 EXPECT_TRUE(contents()->GetPendingMainFrame()); | 1166 EXPECT_TRUE(contents()->GetPendingMainFrame()); |
1118 EXPECT_EQ(entry1, controller().GetPendingEntry()); | 1167 EXPECT_EQ(entry1, controller().GetPendingEntry()); |
1119 | 1168 |
1120 // Simulate beforeunload approval. | 1169 // Simulate beforeunload approval. |
1121 EXPECT_TRUE(google_rfh->IsWaitingForBeforeUnloadACK()); | 1170 EXPECT_TRUE(google_rfh->IsWaitingForBeforeUnloadACK()); |
1122 now = base::TimeTicks::Now(); | 1171 now = base::TimeTicks::Now(); |
1123 google_rfh->PrepareForCommit(); | 1172 google_rfh->PrepareForCommit(); |
1124 google_rfh->OnMessageReceived( | 1173 google_rfh->OnMessageReceived( |
1125 FrameHostMsg_BeforeUnload_ACK(0, true, now, now)); | 1174 FrameHostMsg_BeforeUnload_ACK(0, true, now, now)); |
1126 | 1175 |
1127 // DidNavigate from the first back. This aborts the second back's pending RFH. | 1176 // DidNavigate from the first back. This aborts the second back's pending RFH. |
1128 contents()->TestDidNavigate(google_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED); | 1177 contents()->TestDidNavigate(google_rfh, 1, goback_entry->GetUniqueID(), false, |
| 1178 url2, ui::PAGE_TRANSITION_TYPED); |
1129 | 1179 |
1130 // We should commit this page and forget about the second back. | 1180 // We should commit this page and forget about the second back. |
1131 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1181 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1132 EXPECT_FALSE(controller().GetPendingEntry()); | 1182 EXPECT_FALSE(controller().GetPendingEntry()); |
1133 EXPECT_EQ(google_rfh, contents()->GetMainFrame()); | 1183 EXPECT_EQ(google_rfh, contents()->GetMainFrame()); |
1134 EXPECT_EQ(url2, controller().GetLastCommittedEntry()->GetURL()); | 1184 EXPECT_EQ(url2, controller().GetLastCommittedEntry()->GetURL()); |
1135 | 1185 |
1136 // We should not have corrupted the NTP entry. | 1186 // We should not have corrupted the NTP entry. |
1137 EXPECT_EQ(instance3, | 1187 EXPECT_EQ(instance3, |
1138 NavigationEntryImpl::FromNavigationEntry(entry3)->site_instance()); | 1188 NavigationEntryImpl::FromNavigationEntry(entry3)->site_instance()); |
1139 EXPECT_EQ(instance2, | 1189 EXPECT_EQ(instance2, |
1140 NavigationEntryImpl::FromNavigationEntry(entry2)->site_instance()); | 1190 NavigationEntryImpl::FromNavigationEntry(entry2)->site_instance()); |
1141 EXPECT_EQ(instance1, | 1191 EXPECT_EQ(instance1, |
1142 NavigationEntryImpl::FromNavigationEntry(entry1)->site_instance()); | 1192 NavigationEntryImpl::FromNavigationEntry(entry1)->site_instance()); |
1143 EXPECT_EQ(url1, entry1->GetURL()); | 1193 EXPECT_EQ(url1, entry1->GetURL()); |
1144 } | 1194 } |
1145 | 1195 |
1146 // Test that during a slow cross-site navigation, a sub-frame navigation in the | 1196 // Test that during a slow cross-site navigation, a sub-frame navigation in the |
1147 // original renderer will not cancel the slow navigation (bug 42029). | 1197 // original renderer will not cancel the slow navigation (bug 42029). |
1148 TEST_F(WebContentsImplTest, CrossSiteNavigationNotPreemptedByFrame) { | 1198 TEST_F(WebContentsImplTest, CrossSiteNavigationNotPreemptedByFrame) { |
1149 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 1199 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
1150 | 1200 |
1151 // Navigate to URL. First URL should use the original RenderFrameHost. | 1201 // Navigate to URL. First URL should use the original RenderFrameHost. |
1152 const GURL url("http://www.google.com"); | 1202 const GURL url("http://www.google.com"); |
1153 controller().LoadURL( | 1203 controller().LoadURL( |
1154 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1204 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1205 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
1155 contents()->GetMainFrame()->PrepareForCommit(); | 1206 contents()->GetMainFrame()->PrepareForCommit(); |
1156 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 1207 contents()->TestDidNavigate(orig_rfh, 1, entry_id, true, url, |
| 1208 ui::PAGE_TRANSITION_TYPED); |
1157 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1209 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1158 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 1210 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
1159 | 1211 |
1160 // Start navigating to new site. | 1212 // Start navigating to new site. |
1161 const GURL url2("http://www.yahoo.com"); | 1213 const GURL url2("http://www.yahoo.com"); |
1162 controller().LoadURL( | 1214 controller().LoadURL( |
1163 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1215 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
1164 | 1216 |
1165 // Simulate a sub-frame navigation arriving and ensure the RVH is still | 1217 // Simulate a sub-frame navigation arriving and ensure the RVH is still |
1166 // waiting for a before unload response. | 1218 // waiting for a before unload response. |
1167 TestRenderFrameHost* child_rfh = orig_rfh->AppendChild("subframe"); | 1219 TestRenderFrameHost* child_rfh = orig_rfh->AppendChild("subframe"); |
1168 child_rfh->SendNavigateWithTransition( | 1220 child_rfh->SendNavigateWithTransition(1, 0, false, |
1169 1, GURL("http://google.com/frame"), ui::PAGE_TRANSITION_AUTO_SUBFRAME); | 1221 GURL("http://google.com/frame"), |
| 1222 ui::PAGE_TRANSITION_AUTO_SUBFRAME); |
1170 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 1223 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); |
1171 | 1224 |
1172 // Now simulate the onbeforeunload approval and verify the navigation is | 1225 // Now simulate the onbeforeunload approval and verify the navigation is |
1173 // not canceled. | 1226 // not canceled. |
1174 orig_rfh->PrepareForCommit(); | 1227 orig_rfh->PrepareForCommit(); |
1175 EXPECT_FALSE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 1228 EXPECT_FALSE(orig_rfh->IsWaitingForBeforeUnloadACK()); |
1176 EXPECT_TRUE(contents()->cross_navigation_pending()); | 1229 EXPECT_TRUE(contents()->cross_navigation_pending()); |
1177 } | 1230 } |
1178 | 1231 |
1179 // Test that a cross-site navigation is not preempted if the previous | 1232 // Test that a cross-site navigation is not preempted if the previous |
1180 // renderer sends a FrameNavigate message just before being told to stop. | 1233 // renderer sends a FrameNavigate message just before being told to stop. |
1181 // We should only preempt the cross-site navigation if the previous renderer | 1234 // We should only preempt the cross-site navigation if the previous renderer |
1182 // has started a new navigation. See http://crbug.com/79176. | 1235 // has started a new navigation. See http://crbug.com/79176. |
1183 TEST_F(WebContentsImplTest, CrossSiteNotPreemptedDuringBeforeUnload) { | 1236 TEST_F(WebContentsImplTest, CrossSiteNotPreemptedDuringBeforeUnload) { |
1184 // Navigate to NTP URL. | 1237 // Navigate to NTP URL. |
1185 const GURL url("chrome://blah"); | 1238 const GURL url("chrome://blah"); |
1186 controller().LoadURL( | 1239 controller().LoadURL( |
1187 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1240 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1241 int entry1_id = controller().GetPendingEntry()->GetUniqueID(); |
1188 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 1242 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
1189 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1243 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1190 | 1244 |
1191 // Navigate to new site, with the beforeunload request in flight. | 1245 // Navigate to new site, with the beforeunload request in flight. |
1192 const GURL url2("http://www.yahoo.com"); | 1246 const GURL url2("http://www.yahoo.com"); |
1193 controller().LoadURL( | 1247 controller().LoadURL( |
1194 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1248 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1249 int entry2_id = controller().GetPendingEntry()->GetUniqueID(); |
1195 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); | 1250 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); |
1196 EXPECT_TRUE(contents()->cross_navigation_pending()); | 1251 EXPECT_TRUE(contents()->cross_navigation_pending()); |
1197 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 1252 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); |
1198 | 1253 |
1199 // Suppose the first navigation tries to commit now, with a | 1254 // Suppose the first navigation tries to commit now, with a |
1200 // FrameMsg_Stop in flight. This should not cancel the pending navigation, | 1255 // FrameMsg_Stop in flight. This should not cancel the pending navigation, |
1201 // but it should act as if the beforeunload ack arrived. | 1256 // but it should act as if the beforeunload ack arrived. |
1202 orig_rfh->SendNavigate(1, GURL("chrome://blah")); | 1257 orig_rfh->SendNavigate(1, entry1_id, true, GURL("chrome://blah")); |
1203 EXPECT_TRUE(contents()->cross_navigation_pending()); | 1258 EXPECT_TRUE(contents()->cross_navigation_pending()); |
1204 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 1259 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
1205 EXPECT_FALSE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 1260 EXPECT_FALSE(orig_rfh->IsWaitingForBeforeUnloadACK()); |
1206 | 1261 |
1207 // The pending navigation should be able to commit successfully. | 1262 // The pending navigation should be able to commit successfully. |
1208 contents()->TestDidNavigate(pending_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED); | 1263 contents()->TestDidNavigate(pending_rfh, 1, entry2_id, true, url2, |
| 1264 ui::PAGE_TRANSITION_TYPED); |
1209 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1265 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1210 EXPECT_EQ(pending_rfh, contents()->GetMainFrame()); | 1266 EXPECT_EQ(pending_rfh, contents()->GetMainFrame()); |
1211 } | 1267 } |
1212 | 1268 |
1213 // Test that NavigationEntries have the correct page state after going | 1269 // Test that NavigationEntries have the correct page state after going |
1214 // forward and back. Prevents regression for bug 1116137. | 1270 // forward and back. Prevents regression for bug 1116137. |
1215 TEST_F(WebContentsImplTest, NavigationEntryContentState) { | 1271 TEST_F(WebContentsImplTest, NavigationEntryContentState) { |
1216 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 1272 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
1217 | 1273 |
1218 // Navigate to URL. There should be no committed entry yet. | 1274 // Navigate to URL. There should be no committed entry yet. |
1219 const GURL url("http://www.google.com"); | 1275 const GURL url("http://www.google.com"); |
1220 controller().LoadURL( | 1276 controller().LoadURL( |
1221 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1277 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1278 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
1222 NavigationEntry* entry = controller().GetLastCommittedEntry(); | 1279 NavigationEntry* entry = controller().GetLastCommittedEntry(); |
1223 EXPECT_EQ(nullptr, entry); | 1280 EXPECT_EQ(nullptr, entry); |
1224 | 1281 |
1225 // Committed entry should have page state after DidNavigate. | 1282 // Committed entry should have page state after DidNavigate. |
1226 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 1283 contents()->TestDidNavigate(orig_rfh, 1, entry_id, true, url, |
| 1284 ui::PAGE_TRANSITION_TYPED); |
1227 entry = controller().GetLastCommittedEntry(); | 1285 entry = controller().GetLastCommittedEntry(); |
1228 EXPECT_TRUE(entry->GetPageState().IsValid()); | 1286 EXPECT_TRUE(entry->GetPageState().IsValid()); |
1229 | 1287 |
1230 // Navigate to same site. | 1288 // Navigate to same site. |
1231 const GURL url2("http://images.google.com"); | 1289 const GURL url2("http://images.google.com"); |
1232 controller().LoadURL( | 1290 controller().LoadURL( |
1233 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1291 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1292 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
1234 entry = controller().GetLastCommittedEntry(); | 1293 entry = controller().GetLastCommittedEntry(); |
1235 EXPECT_TRUE(entry->GetPageState().IsValid()); | 1294 EXPECT_TRUE(entry->GetPageState().IsValid()); |
1236 | 1295 |
1237 // Committed entry should have page state after DidNavigate. | 1296 // Committed entry should have page state after DidNavigate. |
1238 contents()->TestDidNavigate(orig_rfh, 2, url2, ui::PAGE_TRANSITION_TYPED); | 1297 contents()->TestDidNavigate(orig_rfh, 2, entry_id, true, url2, |
| 1298 ui::PAGE_TRANSITION_TYPED); |
1239 entry = controller().GetLastCommittedEntry(); | 1299 entry = controller().GetLastCommittedEntry(); |
1240 EXPECT_TRUE(entry->GetPageState().IsValid()); | 1300 EXPECT_TRUE(entry->GetPageState().IsValid()); |
1241 | 1301 |
1242 // Now go back. Committed entry should still have page state. | 1302 // Now go back. Committed entry should still have page state. |
1243 controller().GoBack(); | 1303 controller().GoBack(); |
1244 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 1304 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
| 1305 contents()->TestDidNavigate(orig_rfh, 1, entry_id, false, url, |
| 1306 ui::PAGE_TRANSITION_TYPED); |
1245 entry = controller().GetLastCommittedEntry(); | 1307 entry = controller().GetLastCommittedEntry(); |
1246 EXPECT_TRUE(entry->GetPageState().IsValid()); | 1308 EXPECT_TRUE(entry->GetPageState().IsValid()); |
1247 } | 1309 } |
1248 | 1310 |
1249 // Test that NavigationEntries have the correct page state and SiteInstance | 1311 // Test that NavigationEntries have the correct page state and SiteInstance |
1250 // state after opening a new window to about:blank. Prevents regression for | 1312 // state after opening a new window to about:blank. Prevents regression for |
1251 // bugs b/1116137 and http://crbug.com/111975. | 1313 // bugs b/1116137 and http://crbug.com/111975. |
1252 TEST_F(WebContentsImplTest, NavigationEntryContentStateNewWindow) { | 1314 TEST_F(WebContentsImplTest, NavigationEntryContentStateNewWindow) { |
1253 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 1315 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
1254 | 1316 |
1255 // When opening a new window, it is navigated to about:blank internally. | 1317 // Navigate to about:blank. |
1256 // Currently, this results in two DidNavigate events. | |
1257 const GURL url(url::kAboutBlankURL); | 1318 const GURL url(url::kAboutBlankURL); |
1258 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 1319 contents()->TestDidNavigate(orig_rfh, 1, 0, true, url, |
1259 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 1320 ui::PAGE_TRANSITION_TYPED); |
1260 | 1321 |
1261 // Should have a page state here. | 1322 // Should have a page state here. |
1262 NavigationEntry* entry = controller().GetLastCommittedEntry(); | 1323 NavigationEntry* entry = controller().GetLastCommittedEntry(); |
1263 EXPECT_TRUE(entry->GetPageState().IsValid()); | 1324 EXPECT_TRUE(entry->GetPageState().IsValid()); |
1264 | 1325 |
1265 // The SiteInstance should be available for other navigations to use. | 1326 // The SiteInstance should be available for other navigations to use. |
1266 NavigationEntryImpl* entry_impl = | 1327 NavigationEntryImpl* entry_impl = |
1267 NavigationEntryImpl::FromNavigationEntry(entry); | 1328 NavigationEntryImpl::FromNavigationEntry(entry); |
1268 EXPECT_FALSE(entry_impl->site_instance()->HasSite()); | 1329 EXPECT_FALSE(entry_impl->site_instance()->HasSite()); |
1269 int32 site_instance_id = entry_impl->site_instance()->GetId(); | 1330 int32 site_instance_id = entry_impl->site_instance()->GetId(); |
1270 | 1331 |
1271 // Navigating to a normal page should not cause a process swap. | 1332 // Navigating to a normal page should not cause a process swap. |
1272 const GURL new_url("http://www.google.com"); | 1333 const GURL new_url("http://www.google.com"); |
1273 controller().LoadURL(new_url, Referrer(), | 1334 controller().LoadURL(new_url, Referrer(), |
1274 ui::PAGE_TRANSITION_TYPED, std::string()); | 1335 ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1336 entry = controller().GetPendingEntry(); |
1275 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1337 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1276 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 1338 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
1277 contents()->TestDidNavigate(orig_rfh, 1, new_url, ui::PAGE_TRANSITION_TYPED); | 1339 contents()->TestDidNavigate(orig_rfh, 2, entry->GetUniqueID(), true, new_url, |
| 1340 ui::PAGE_TRANSITION_TYPED); |
1278 NavigationEntryImpl* entry_impl2 = NavigationEntryImpl::FromNavigationEntry( | 1341 NavigationEntryImpl* entry_impl2 = NavigationEntryImpl::FromNavigationEntry( |
1279 controller().GetLastCommittedEntry()); | 1342 controller().GetLastCommittedEntry()); |
1280 EXPECT_EQ(site_instance_id, entry_impl2->site_instance()->GetId()); | 1343 EXPECT_EQ(site_instance_id, entry_impl2->site_instance()->GetId()); |
1281 EXPECT_TRUE(entry_impl2->site_instance()->HasSite()); | 1344 EXPECT_TRUE(entry_impl2->site_instance()->HasSite()); |
1282 } | 1345 } |
1283 | 1346 |
1284 // Tests that fullscreen is exited throughout the object hierarchy when | 1347 // Tests that fullscreen is exited throughout the object hierarchy when |
1285 // navigating to a new page. | 1348 // navigating to a new page. |
1286 TEST_F(WebContentsImplTest, NavigationExitsFullscreen) { | 1349 TEST_F(WebContentsImplTest, NavigationExitsFullscreen) { |
1287 FakeFullscreenDelegate fake_delegate; | 1350 FakeFullscreenDelegate fake_delegate; |
1288 contents()->SetDelegate(&fake_delegate); | 1351 contents()->SetDelegate(&fake_delegate); |
1289 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 1352 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
1290 TestRenderViewHost* orig_rvh = orig_rfh->GetRenderViewHost(); | 1353 TestRenderViewHost* orig_rvh = orig_rfh->GetRenderViewHost(); |
1291 | 1354 |
1292 // Navigate to a site. | 1355 // Navigate to a site. |
1293 const GURL url("http://www.google.com"); | 1356 const GURL url("http://www.google.com"); |
1294 controller().LoadURL( | 1357 controller().LoadURL( |
1295 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1358 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1359 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
1296 contents()->GetMainFrame()->PrepareForCommit(); | 1360 contents()->GetMainFrame()->PrepareForCommit(); |
1297 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 1361 contents()->TestDidNavigate(orig_rfh, 1, entry_id, true, url, |
| 1362 ui::PAGE_TRANSITION_TYPED); |
1298 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 1363 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
1299 | 1364 |
1300 // Toggle fullscreen mode on (as if initiated via IPC from renderer). | 1365 // Toggle fullscreen mode on (as if initiated via IPC from renderer). |
1301 EXPECT_FALSE(orig_rvh->IsFullscreen()); | 1366 EXPECT_FALSE(orig_rvh->IsFullscreen()); |
1302 EXPECT_FALSE(contents()->IsFullscreenForCurrentTab()); | 1367 EXPECT_FALSE(contents()->IsFullscreenForCurrentTab()); |
1303 EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents())); | 1368 EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents())); |
1304 orig_rfh->OnMessageReceived( | 1369 orig_rfh->OnMessageReceived( |
1305 FrameHostMsg_ToggleFullscreen(orig_rfh->GetRoutingID(), true)); | 1370 FrameHostMsg_ToggleFullscreen(orig_rfh->GetRoutingID(), true)); |
1306 EXPECT_TRUE(orig_rvh->IsFullscreen()); | 1371 EXPECT_TRUE(orig_rvh->IsFullscreen()); |
1307 EXPECT_TRUE(contents()->IsFullscreenForCurrentTab()); | 1372 EXPECT_TRUE(contents()->IsFullscreenForCurrentTab()); |
1308 EXPECT_TRUE(fake_delegate.IsFullscreenForTabOrPending(contents())); | 1373 EXPECT_TRUE(fake_delegate.IsFullscreenForTabOrPending(contents())); |
1309 | 1374 |
1310 // Navigate to a new site. | 1375 // Navigate to a new site. |
1311 const GURL url2("http://www.yahoo.com"); | 1376 const GURL url2("http://www.yahoo.com"); |
1312 controller().LoadURL( | 1377 controller().LoadURL( |
1313 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1378 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1379 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
1314 contents()->GetMainFrame()->PrepareForCommit(); | 1380 contents()->GetMainFrame()->PrepareForCommit(); |
1315 TestRenderFrameHost* const pending_rfh = contents()->GetPendingMainFrame(); | 1381 TestRenderFrameHost* const pending_rfh = contents()->GetPendingMainFrame(); |
1316 contents()->TestDidNavigate( | 1382 contents()->TestDidNavigate(pending_rfh, 1, entry_id, true, url2, |
1317 pending_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED); | 1383 ui::PAGE_TRANSITION_TYPED); |
1318 | 1384 |
1319 // Confirm fullscreen has exited. | 1385 // Confirm fullscreen has exited. |
1320 EXPECT_FALSE(orig_rvh->IsFullscreen()); | 1386 EXPECT_FALSE(orig_rvh->IsFullscreen()); |
1321 EXPECT_FALSE(contents()->IsFullscreenForCurrentTab()); | 1387 EXPECT_FALSE(contents()->IsFullscreenForCurrentTab()); |
1322 EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents())); | 1388 EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents())); |
1323 | 1389 |
1324 contents()->SetDelegate(nullptr); | 1390 contents()->SetDelegate(nullptr); |
1325 } | 1391 } |
1326 | 1392 |
1327 // Tests that fullscreen is exited throughout the object hierarchy when | 1393 // Tests that fullscreen is exited throughout the object hierarchy when |
1328 // instructing NavigationController to GoBack() or GoForward(). | 1394 // instructing NavigationController to GoBack() or GoForward(). |
1329 TEST_F(WebContentsImplTest, HistoryNavigationExitsFullscreen) { | 1395 TEST_F(WebContentsImplTest, HistoryNavigationExitsFullscreen) { |
1330 FakeFullscreenDelegate fake_delegate; | 1396 FakeFullscreenDelegate fake_delegate; |
1331 contents()->SetDelegate(&fake_delegate); | 1397 contents()->SetDelegate(&fake_delegate); |
1332 TestRenderFrameHost* const orig_rfh = contents()->GetMainFrame(); | 1398 TestRenderFrameHost* const orig_rfh = contents()->GetMainFrame(); |
1333 TestRenderViewHost* const orig_rvh = orig_rfh->GetRenderViewHost(); | 1399 TestRenderViewHost* const orig_rvh = orig_rfh->GetRenderViewHost(); |
1334 | 1400 |
1335 // Navigate to a site. | 1401 // Navigate to a site. |
1336 const GURL url("http://www.google.com"); | 1402 const GURL url("http://www.google.com"); |
1337 controller().LoadURL( | 1403 controller().LoadURL( |
1338 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1404 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
1339 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 1405 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
| 1406 contents()->TestDidNavigate(orig_rfh, 1, entry_id, true, url, |
| 1407 ui::PAGE_TRANSITION_TYPED); |
1340 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 1408 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
1341 | 1409 |
1342 // Now, navigate to another page on the same site. | 1410 // Now, navigate to another page on the same site. |
1343 const GURL url2("http://www.google.com/search?q=kittens"); | 1411 const GURL url2("http://www.google.com/search?q=kittens"); |
1344 controller().LoadURL( | 1412 controller().LoadURL( |
1345 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1413 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1414 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
1346 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1415 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1347 contents()->TestDidNavigate(orig_rfh, 2, url2, ui::PAGE_TRANSITION_TYPED); | 1416 contents()->TestDidNavigate(orig_rfh, 2, entry_id, true, url2, |
| 1417 ui::PAGE_TRANSITION_TYPED); |
1348 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 1418 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
1349 | 1419 |
1350 // Sanity-check: Confirm we're not starting out in fullscreen mode. | 1420 // Sanity-check: Confirm we're not starting out in fullscreen mode. |
1351 EXPECT_FALSE(orig_rvh->IsFullscreen()); | 1421 EXPECT_FALSE(orig_rvh->IsFullscreen()); |
1352 EXPECT_FALSE(contents()->IsFullscreenForCurrentTab()); | 1422 EXPECT_FALSE(contents()->IsFullscreenForCurrentTab()); |
1353 EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents())); | 1423 EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents())); |
1354 | 1424 |
1355 for (int i = 0; i < 2; ++i) { | 1425 for (int i = 0; i < 2; ++i) { |
1356 // Toggle fullscreen mode on (as if initiated via IPC from renderer). | 1426 // Toggle fullscreen mode on (as if initiated via IPC from renderer). |
1357 orig_rfh->OnMessageReceived( | 1427 orig_rfh->OnMessageReceived( |
1358 FrameHostMsg_ToggleFullscreen(orig_rfh->GetRoutingID(), true)); | 1428 FrameHostMsg_ToggleFullscreen(orig_rfh->GetRoutingID(), true)); |
1359 EXPECT_TRUE(orig_rvh->IsFullscreen()); | 1429 EXPECT_TRUE(orig_rvh->IsFullscreen()); |
1360 EXPECT_TRUE(contents()->IsFullscreenForCurrentTab()); | 1430 EXPECT_TRUE(contents()->IsFullscreenForCurrentTab()); |
1361 EXPECT_TRUE(fake_delegate.IsFullscreenForTabOrPending(contents())); | 1431 EXPECT_TRUE(fake_delegate.IsFullscreenForTabOrPending(contents())); |
1362 | 1432 |
1363 // Navigate backward (or forward). | 1433 // Navigate backward (or forward). |
1364 if (i == 0) | 1434 if (i == 0) |
1365 controller().GoBack(); | 1435 controller().GoBack(); |
1366 else | 1436 else |
1367 controller().GoForward(); | 1437 controller().GoForward(); |
| 1438 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
1368 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1439 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1369 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 1440 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
1370 contents()->TestDidNavigate( | 1441 contents()->TestDidNavigate(orig_rfh, i + 1, entry_id, false, url, |
1371 orig_rfh, i + 1, url, ui::PAGE_TRANSITION_FORWARD_BACK); | 1442 ui::PAGE_TRANSITION_FORWARD_BACK); |
1372 | 1443 |
1373 // Confirm fullscreen has exited. | 1444 // Confirm fullscreen has exited. |
1374 EXPECT_FALSE(orig_rvh->IsFullscreen()); | 1445 EXPECT_FALSE(orig_rvh->IsFullscreen()); |
1375 EXPECT_FALSE(contents()->IsFullscreenForCurrentTab()); | 1446 EXPECT_FALSE(contents()->IsFullscreenForCurrentTab()); |
1376 EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents())); | 1447 EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents())); |
1377 } | 1448 } |
1378 | 1449 |
1379 contents()->SetDelegate(nullptr); | 1450 contents()->SetDelegate(nullptr); |
1380 } | 1451 } |
1381 | 1452 |
(...skipping 16 matching lines...) Expand all Loading... |
1398 // Tests that fullscreen is exited throughout the object hierarchy on a renderer | 1469 // Tests that fullscreen is exited throughout the object hierarchy on a renderer |
1399 // crash. | 1470 // crash. |
1400 TEST_F(WebContentsImplTest, CrashExitsFullscreen) { | 1471 TEST_F(WebContentsImplTest, CrashExitsFullscreen) { |
1401 FakeFullscreenDelegate fake_delegate; | 1472 FakeFullscreenDelegate fake_delegate; |
1402 contents()->SetDelegate(&fake_delegate); | 1473 contents()->SetDelegate(&fake_delegate); |
1403 | 1474 |
1404 // Navigate to a site. | 1475 // Navigate to a site. |
1405 const GURL url("http://www.google.com"); | 1476 const GURL url("http://www.google.com"); |
1406 controller().LoadURL( | 1477 controller().LoadURL( |
1407 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1478 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
1408 contents()->TestDidNavigate( | 1479 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
1409 contents()->GetMainFrame(), 1, url, ui::PAGE_TRANSITION_TYPED); | 1480 contents()->TestDidNavigate(contents()->GetMainFrame(), 1, entry_id, true, |
| 1481 url, ui::PAGE_TRANSITION_TYPED); |
1410 | 1482 |
1411 // Toggle fullscreen mode on (as if initiated via IPC from renderer). | 1483 // Toggle fullscreen mode on (as if initiated via IPC from renderer). |
1412 EXPECT_FALSE(test_rvh()->IsFullscreen()); | 1484 EXPECT_FALSE(test_rvh()->IsFullscreen()); |
1413 EXPECT_FALSE(contents()->IsFullscreenForCurrentTab()); | 1485 EXPECT_FALSE(contents()->IsFullscreenForCurrentTab()); |
1414 EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents())); | 1486 EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents())); |
1415 contents()->GetMainFrame()->OnMessageReceived(FrameHostMsg_ToggleFullscreen( | 1487 contents()->GetMainFrame()->OnMessageReceived(FrameHostMsg_ToggleFullscreen( |
1416 contents()->GetMainFrame()->GetRoutingID(), true)); | 1488 contents()->GetMainFrame()->GetRoutingID(), true)); |
1417 EXPECT_TRUE(test_rvh()->IsFullscreen()); | 1489 EXPECT_TRUE(test_rvh()->IsFullscreen()); |
1418 EXPECT_TRUE(contents()->IsFullscreenForCurrentTab()); | 1490 EXPECT_TRUE(contents()->IsFullscreenForCurrentTab()); |
1419 EXPECT_TRUE(fake_delegate.IsFullscreenForTabOrPending(contents())); | 1491 EXPECT_TRUE(fake_delegate.IsFullscreenForTabOrPending(contents())); |
(...skipping 15 matching lines...) Expand all Loading... |
1435 // Interstitial Tests | 1507 // Interstitial Tests |
1436 //////////////////////////////////////////////////////////////////////////////// | 1508 //////////////////////////////////////////////////////////////////////////////// |
1437 | 1509 |
1438 // Test navigating to a page (with the navigation initiated from the browser, | 1510 // Test navigating to a page (with the navigation initiated from the browser, |
1439 // as when a URL is typed in the location bar) that shows an interstitial and | 1511 // as when a URL is typed in the location bar) that shows an interstitial and |
1440 // creates a new navigation entry, then hiding it without proceeding. | 1512 // creates a new navigation entry, then hiding it without proceeding. |
1441 TEST_F(WebContentsImplTest, | 1513 TEST_F(WebContentsImplTest, |
1442 ShowInterstitialFromBrowserWithNewNavigationDontProceed) { | 1514 ShowInterstitialFromBrowserWithNewNavigationDontProceed) { |
1443 // Navigate to a page. | 1515 // Navigate to a page. |
1444 GURL url1("http://www.google.com"); | 1516 GURL url1("http://www.google.com"); |
1445 contents()->GetMainFrame()->SendNavigate(1, url1); | 1517 contents()->GetMainFrame()->SendNavigate(1, 0, true, url1); |
1446 EXPECT_EQ(1, controller().GetEntryCount()); | 1518 EXPECT_EQ(1, controller().GetEntryCount()); |
1447 | 1519 |
1448 // Initiate a browser navigation that will trigger the interstitial | 1520 // Initiate a browser navigation that will trigger the interstitial. |
1449 controller().LoadURL(GURL("http://www.evil.com"), Referrer(), | 1521 controller().LoadURL(GURL("http://www.evil.com"), Referrer(), |
1450 ui::PAGE_TRANSITION_TYPED, std::string()); | 1522 ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1523 NavigationEntry* entry = controller().GetPendingEntry(); |
1451 | 1524 |
1452 // Show an interstitial. | 1525 // Show an interstitial. |
1453 TestInterstitialPage::InterstitialState state = | 1526 TestInterstitialPage::InterstitialState state = |
1454 TestInterstitialPage::INVALID; | 1527 TestInterstitialPage::INVALID; |
1455 bool deleted = false; | 1528 bool deleted = false; |
1456 GURL url2("http://interstitial"); | 1529 GURL url2("http://interstitial"); |
1457 TestInterstitialPage* interstitial = | 1530 TestInterstitialPage* interstitial = |
1458 new TestInterstitialPage(contents(), true, url2, &state, &deleted); | 1531 new TestInterstitialPage(contents(), true, url2, &state, &deleted); |
1459 TestInterstitialPageStateGuard state_guard(interstitial); | 1532 TestInterstitialPageStateGuard state_guard(interstitial); |
1460 interstitial->Show(); | 1533 interstitial->Show(); |
| 1534 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
1461 // The interstitial should not show until its navigation has committed. | 1535 // The interstitial should not show until its navigation has committed. |
1462 EXPECT_FALSE(interstitial->is_showing()); | 1536 EXPECT_FALSE(interstitial->is_showing()); |
1463 EXPECT_FALSE(contents()->ShowingInterstitialPage()); | 1537 EXPECT_FALSE(contents()->ShowingInterstitialPage()); |
1464 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); | 1538 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); |
1465 // Let's commit the interstitial navigation. | 1539 // Let's commit the interstitial navigation. |
1466 interstitial->TestDidNavigate(1, url2); | 1540 interstitial->TestDidNavigate(1, interstitial_entry_id, true, url2); |
1467 EXPECT_TRUE(interstitial->is_showing()); | 1541 EXPECT_TRUE(interstitial->is_showing()); |
1468 EXPECT_TRUE(contents()->ShowingInterstitialPage()); | 1542 EXPECT_TRUE(contents()->ShowingInterstitialPage()); |
1469 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); | 1543 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); |
1470 NavigationEntry* entry = controller().GetVisibleEntry(); | 1544 entry = controller().GetVisibleEntry(); |
1471 ASSERT_NE(nullptr, entry); | 1545 ASSERT_NE(nullptr, entry); |
1472 EXPECT_TRUE(entry->GetURL() == url2); | 1546 EXPECT_TRUE(entry->GetURL() == url2); |
1473 | 1547 |
1474 // Now don't proceed. | 1548 // Now don't proceed. |
1475 interstitial->DontProceed(); | 1549 interstitial->DontProceed(); |
1476 EXPECT_EQ(TestInterstitialPage::CANCELED, state); | 1550 EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
1477 EXPECT_FALSE(contents()->ShowingInterstitialPage()); | 1551 EXPECT_FALSE(contents()->ShowingInterstitialPage()); |
1478 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); | 1552 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); |
1479 entry = controller().GetVisibleEntry(); | 1553 entry = controller().GetVisibleEntry(); |
1480 ASSERT_NE(nullptr, entry); | 1554 ASSERT_NE(nullptr, entry); |
1481 EXPECT_TRUE(entry->GetURL() == url1); | 1555 EXPECT_TRUE(entry->GetURL() == url1); |
1482 EXPECT_EQ(1, controller().GetEntryCount()); | 1556 EXPECT_EQ(1, controller().GetEntryCount()); |
1483 | 1557 |
1484 RunAllPendingInMessageLoop(); | 1558 RunAllPendingInMessageLoop(); |
1485 EXPECT_TRUE(deleted); | 1559 EXPECT_TRUE(deleted); |
1486 } | 1560 } |
1487 | 1561 |
1488 // Test navigating to a page (with the navigation initiated from the renderer, | 1562 // Test navigating to a page (with the navigation initiated from the renderer, |
1489 // as when clicking on a link in the page) that shows an interstitial and | 1563 // as when clicking on a link in the page) that shows an interstitial and |
1490 // creates a new navigation entry, then hiding it without proceeding. | 1564 // creates a new navigation entry, then hiding it without proceeding. |
1491 TEST_F(WebContentsImplTest, | 1565 TEST_F(WebContentsImplTest, |
1492 ShowInterstitiaFromRendererlWithNewNavigationDontProceed) { | 1566 ShowInterstitialFromRendererWithNewNavigationDontProceed) { |
1493 // Navigate to a page. | 1567 // Navigate to a page. |
1494 GURL url1("http://www.google.com"); | 1568 GURL url1("http://www.google.com"); |
1495 contents()->GetMainFrame()->SendNavigate(1, url1); | 1569 contents()->GetMainFrame()->SendNavigate(1, 0, true, url1); |
1496 EXPECT_EQ(1, controller().GetEntryCount()); | 1570 EXPECT_EQ(1, controller().GetEntryCount()); |
1497 | 1571 |
1498 // Show an interstitial (no pending entry, the interstitial would have been | 1572 // Show an interstitial (no pending entry, the interstitial would have been |
1499 // triggered by clicking on a link). | 1573 // triggered by clicking on a link). |
1500 TestInterstitialPage::InterstitialState state = | 1574 TestInterstitialPage::InterstitialState state = |
1501 TestInterstitialPage::INVALID; | 1575 TestInterstitialPage::INVALID; |
1502 bool deleted = false; | 1576 bool deleted = false; |
1503 GURL url2("http://interstitial"); | 1577 GURL url2("http://interstitial"); |
1504 TestInterstitialPage* interstitial = | 1578 TestInterstitialPage* interstitial = |
1505 new TestInterstitialPage(contents(), true, url2, &state, &deleted); | 1579 new TestInterstitialPage(contents(), true, url2, &state, &deleted); |
1506 TestInterstitialPageStateGuard state_guard(interstitial); | 1580 TestInterstitialPageStateGuard state_guard(interstitial); |
1507 interstitial->Show(); | 1581 interstitial->Show(); |
| 1582 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
1508 // The interstitial should not show until its navigation has committed. | 1583 // The interstitial should not show until its navigation has committed. |
1509 EXPECT_FALSE(interstitial->is_showing()); | 1584 EXPECT_FALSE(interstitial->is_showing()); |
1510 EXPECT_FALSE(contents()->ShowingInterstitialPage()); | 1585 EXPECT_FALSE(contents()->ShowingInterstitialPage()); |
1511 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); | 1586 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); |
1512 // Let's commit the interstitial navigation. | 1587 // Let's commit the interstitial navigation. |
1513 interstitial->TestDidNavigate(1, url2); | 1588 interstitial->TestDidNavigate(1, interstitial_entry_id, true, url2); |
1514 EXPECT_TRUE(interstitial->is_showing()); | 1589 EXPECT_TRUE(interstitial->is_showing()); |
1515 EXPECT_TRUE(contents()->ShowingInterstitialPage()); | 1590 EXPECT_TRUE(contents()->ShowingInterstitialPage()); |
1516 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); | 1591 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); |
1517 NavigationEntry* entry = controller().GetVisibleEntry(); | 1592 NavigationEntry* entry = controller().GetVisibleEntry(); |
1518 ASSERT_NE(nullptr, entry); | 1593 ASSERT_NE(nullptr, entry); |
1519 EXPECT_TRUE(entry->GetURL() == url2); | 1594 EXPECT_TRUE(entry->GetURL() == url2); |
1520 | 1595 |
1521 // Now don't proceed. | 1596 // Now don't proceed. |
1522 interstitial->DontProceed(); | 1597 interstitial->DontProceed(); |
1523 EXPECT_EQ(TestInterstitialPage::CANCELED, state); | 1598 EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
1524 EXPECT_FALSE(contents()->ShowingInterstitialPage()); | 1599 EXPECT_FALSE(contents()->ShowingInterstitialPage()); |
1525 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); | 1600 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); |
1526 entry = controller().GetVisibleEntry(); | 1601 entry = controller().GetVisibleEntry(); |
1527 ASSERT_NE(nullptr, entry); | 1602 ASSERT_NE(nullptr, entry); |
1528 EXPECT_TRUE(entry->GetURL() == url1); | 1603 EXPECT_TRUE(entry->GetURL() == url1); |
1529 EXPECT_EQ(1, controller().GetEntryCount()); | 1604 EXPECT_EQ(1, controller().GetEntryCount()); |
1530 | 1605 |
1531 RunAllPendingInMessageLoop(); | 1606 RunAllPendingInMessageLoop(); |
1532 EXPECT_TRUE(deleted); | 1607 EXPECT_TRUE(deleted); |
1533 } | 1608 } |
1534 | 1609 |
1535 // Test navigating to a page that shows an interstitial without creating a new | 1610 // Test navigating to a page that shows an interstitial without creating a new |
1536 // navigation entry (this happens when the interstitial is triggered by a | 1611 // navigation entry (this happens when the interstitial is triggered by a |
1537 // sub-resource in the page), then hiding it without proceeding. | 1612 // sub-resource in the page), then hiding it without proceeding. |
1538 TEST_F(WebContentsImplTest, ShowInterstitialNoNewNavigationDontProceed) { | 1613 TEST_F(WebContentsImplTest, ShowInterstitialNoNewNavigationDontProceed) { |
1539 // Navigate to a page. | 1614 // Navigate to a page. |
1540 GURL url1("http://www.google.com"); | 1615 GURL url1("http://www.google.com"); |
1541 contents()->GetMainFrame()->SendNavigate(1, url1); | 1616 contents()->GetMainFrame()->SendNavigate(1, 0, true, url1); |
1542 EXPECT_EQ(1, controller().GetEntryCount()); | 1617 EXPECT_EQ(1, controller().GetEntryCount()); |
1543 | 1618 |
1544 // Show an interstitial. | 1619 // Show an interstitial. |
1545 TestInterstitialPage::InterstitialState state = | 1620 TestInterstitialPage::InterstitialState state = |
1546 TestInterstitialPage::INVALID; | 1621 TestInterstitialPage::INVALID; |
1547 bool deleted = false; | 1622 bool deleted = false; |
1548 GURL url2("http://interstitial"); | 1623 GURL url2("http://interstitial"); |
1549 TestInterstitialPage* interstitial = | 1624 TestInterstitialPage* interstitial = |
1550 new TestInterstitialPage(contents(), false, url2, &state, &deleted); | 1625 new TestInterstitialPage(contents(), false, url2, &state, &deleted); |
1551 TestInterstitialPageStateGuard state_guard(interstitial); | 1626 TestInterstitialPageStateGuard state_guard(interstitial); |
1552 interstitial->Show(); | 1627 interstitial->Show(); |
1553 // The interstitial should not show until its navigation has committed. | 1628 // The interstitial should not show until its navigation has committed. |
1554 EXPECT_FALSE(interstitial->is_showing()); | 1629 EXPECT_FALSE(interstitial->is_showing()); |
1555 EXPECT_FALSE(contents()->ShowingInterstitialPage()); | 1630 EXPECT_FALSE(contents()->ShowingInterstitialPage()); |
1556 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); | 1631 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); |
1557 // Let's commit the interstitial navigation. | 1632 // Let's commit the interstitial navigation. |
1558 interstitial->TestDidNavigate(1, url2); | 1633 interstitial->TestDidNavigate(1, 0, true, url2); |
1559 EXPECT_TRUE(interstitial->is_showing()); | 1634 EXPECT_TRUE(interstitial->is_showing()); |
1560 EXPECT_TRUE(contents()->ShowingInterstitialPage()); | 1635 EXPECT_TRUE(contents()->ShowingInterstitialPage()); |
1561 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); | 1636 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); |
1562 NavigationEntry* entry = controller().GetVisibleEntry(); | 1637 NavigationEntry* entry = controller().GetVisibleEntry(); |
1563 ASSERT_NE(nullptr, entry); | 1638 ASSERT_NE(nullptr, entry); |
1564 // The URL specified to the interstitial should have been ignored. | 1639 // The URL specified to the interstitial should have been ignored. |
1565 EXPECT_TRUE(entry->GetURL() == url1); | 1640 EXPECT_TRUE(entry->GetURL() == url1); |
1566 | 1641 |
1567 // Now don't proceed. | 1642 // Now don't proceed. |
1568 interstitial->DontProceed(); | 1643 interstitial->DontProceed(); |
1569 EXPECT_EQ(TestInterstitialPage::CANCELED, state); | 1644 EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
1570 EXPECT_FALSE(contents()->ShowingInterstitialPage()); | 1645 EXPECT_FALSE(contents()->ShowingInterstitialPage()); |
1571 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); | 1646 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); |
1572 entry = controller().GetVisibleEntry(); | 1647 entry = controller().GetVisibleEntry(); |
1573 ASSERT_NE(nullptr, entry); | 1648 ASSERT_NE(nullptr, entry); |
1574 EXPECT_TRUE(entry->GetURL() == url1); | 1649 EXPECT_TRUE(entry->GetURL() == url1); |
1575 EXPECT_EQ(1, controller().GetEntryCount()); | 1650 EXPECT_EQ(1, controller().GetEntryCount()); |
1576 | 1651 |
1577 RunAllPendingInMessageLoop(); | 1652 RunAllPendingInMessageLoop(); |
1578 EXPECT_TRUE(deleted); | 1653 EXPECT_TRUE(deleted); |
1579 } | 1654 } |
1580 | 1655 |
1581 // Test navigating to a page (with the navigation initiated from the browser, | 1656 // Test navigating to a page (with the navigation initiated from the browser, |
1582 // as when a URL is typed in the location bar) that shows an interstitial and | 1657 // as when a URL is typed in the location bar) that shows an interstitial and |
1583 // creates a new navigation entry, then proceeding. | 1658 // creates a new navigation entry, then proceeding. |
1584 TEST_F(WebContentsImplTest, | 1659 TEST_F(WebContentsImplTest, |
1585 ShowInterstitialFromBrowserNewNavigationProceed) { | 1660 ShowInterstitialFromBrowserNewNavigationProceed) { |
1586 // Navigate to a page. | 1661 // Navigate to a page. |
1587 GURL url1("http://www.google.com"); | 1662 GURL url1("http://www.google.com"); |
1588 contents()->GetMainFrame()->SendNavigate(1, url1); | 1663 contents()->GetMainFrame()->SendNavigate(1, 0, true, url1); |
1589 EXPECT_EQ(1, controller().GetEntryCount()); | 1664 EXPECT_EQ(1, controller().GetEntryCount()); |
1590 | 1665 |
1591 // Initiate a browser navigation that will trigger the interstitial | 1666 // Initiate a browser navigation that will trigger the interstitial |
1592 controller().LoadURL(GURL("http://www.evil.com"), Referrer(), | 1667 controller().LoadURL(GURL("http://www.evil.com"), Referrer(), |
1593 ui::PAGE_TRANSITION_TYPED, std::string()); | 1668 ui::PAGE_TRANSITION_TYPED, std::string()); |
1594 | 1669 |
1595 // Show an interstitial. | 1670 // Show an interstitial. |
1596 TestInterstitialPage::InterstitialState state = | 1671 TestInterstitialPage::InterstitialState state = |
1597 TestInterstitialPage::INVALID; | 1672 TestInterstitialPage::INVALID; |
1598 bool deleted = false; | 1673 bool deleted = false; |
1599 GURL url2("http://interstitial"); | 1674 GURL url2("http://interstitial"); |
1600 TestInterstitialPage* interstitial = | 1675 TestInterstitialPage* interstitial = |
1601 new TestInterstitialPage(contents(), true, url2, &state, &deleted); | 1676 new TestInterstitialPage(contents(), true, url2, &state, &deleted); |
1602 TestInterstitialPageStateGuard state_guard(interstitial); | 1677 TestInterstitialPageStateGuard state_guard(interstitial); |
1603 interstitial->Show(); | 1678 interstitial->Show(); |
| 1679 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
1604 // The interstitial should not show until its navigation has committed. | 1680 // The interstitial should not show until its navigation has committed. |
1605 EXPECT_FALSE(interstitial->is_showing()); | 1681 EXPECT_FALSE(interstitial->is_showing()); |
1606 EXPECT_FALSE(contents()->ShowingInterstitialPage()); | 1682 EXPECT_FALSE(contents()->ShowingInterstitialPage()); |
1607 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); | 1683 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); |
1608 // Let's commit the interstitial navigation. | 1684 // Let's commit the interstitial navigation. |
1609 interstitial->TestDidNavigate(1, url2); | 1685 interstitial->TestDidNavigate(1, interstitial_entry_id, true, url2); |
1610 EXPECT_TRUE(interstitial->is_showing()); | 1686 EXPECT_TRUE(interstitial->is_showing()); |
1611 EXPECT_TRUE(contents()->ShowingInterstitialPage()); | 1687 EXPECT_TRUE(contents()->ShowingInterstitialPage()); |
1612 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); | 1688 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); |
1613 NavigationEntry* entry = controller().GetVisibleEntry(); | 1689 NavigationEntry* entry = controller().GetVisibleEntry(); |
1614 ASSERT_NE(nullptr, entry); | 1690 ASSERT_NE(nullptr, entry); |
1615 EXPECT_TRUE(entry->GetURL() == url2); | 1691 EXPECT_TRUE(entry->GetURL() == url2); |
1616 | 1692 |
1617 // Then proceed. | 1693 // Then proceed. |
1618 interstitial->Proceed(); | 1694 interstitial->Proceed(); |
1619 // The interstitial should show until the new navigation commits. | 1695 // The interstitial should show until the new navigation commits. |
1620 RunAllPendingInMessageLoop(); | 1696 RunAllPendingInMessageLoop(); |
1621 ASSERT_FALSE(deleted); | 1697 ASSERT_FALSE(deleted); |
1622 EXPECT_EQ(TestInterstitialPage::OKED, state); | 1698 EXPECT_EQ(TestInterstitialPage::OKED, state); |
1623 EXPECT_TRUE(contents()->ShowingInterstitialPage()); | 1699 EXPECT_TRUE(contents()->ShowingInterstitialPage()); |
1624 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); | 1700 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); |
1625 | 1701 |
1626 // Simulate the navigation to the page, that's when the interstitial gets | 1702 // Simulate the navigation to the page, that's when the interstitial gets |
1627 // hidden. | 1703 // hidden. |
1628 GURL url3("http://www.thepage.com"); | 1704 GURL url3("http://www.thepage.com"); |
1629 contents()->GetMainFrame()->SendNavigate(2, url3); | 1705 contents()->GetMainFrame()->SendNavigate(2, 0, true, url3); |
1630 | 1706 |
1631 EXPECT_FALSE(contents()->ShowingInterstitialPage()); | 1707 EXPECT_FALSE(contents()->ShowingInterstitialPage()); |
1632 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); | 1708 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); |
1633 entry = controller().GetVisibleEntry(); | 1709 entry = controller().GetVisibleEntry(); |
1634 ASSERT_NE(nullptr, entry); | 1710 ASSERT_NE(nullptr, entry); |
1635 EXPECT_TRUE(entry->GetURL() == url3); | 1711 EXPECT_TRUE(entry->GetURL() == url3); |
1636 | 1712 |
1637 EXPECT_EQ(2, controller().GetEntryCount()); | 1713 EXPECT_EQ(2, controller().GetEntryCount()); |
1638 | 1714 |
1639 RunAllPendingInMessageLoop(); | 1715 RunAllPendingInMessageLoop(); |
1640 EXPECT_TRUE(deleted); | 1716 EXPECT_TRUE(deleted); |
1641 } | 1717 } |
1642 | 1718 |
1643 // Test navigating to a page (with the navigation initiated from the renderer, | 1719 // Test navigating to a page (with the navigation initiated from the renderer, |
1644 // as when clicking on a link in the page) that shows an interstitial and | 1720 // as when clicking on a link in the page) that shows an interstitial and |
1645 // creates a new navigation entry, then proceeding. | 1721 // creates a new navigation entry, then proceeding. |
1646 TEST_F(WebContentsImplTest, | 1722 TEST_F(WebContentsImplTest, |
1647 ShowInterstitialFromRendererNewNavigationProceed) { | 1723 ShowInterstitialFromRendererNewNavigationProceed) { |
1648 // Navigate to a page. | 1724 // Navigate to a page. |
1649 GURL url1("http://www.google.com"); | 1725 GURL url1("http://www.google.com"); |
1650 contents()->GetMainFrame()->SendNavigate(1, url1); | 1726 contents()->GetMainFrame()->SendNavigate(1, 0, true, url1); |
1651 EXPECT_EQ(1, controller().GetEntryCount()); | 1727 EXPECT_EQ(1, controller().GetEntryCount()); |
1652 | 1728 |
1653 // Show an interstitial. | 1729 // Show an interstitial. |
1654 TestInterstitialPage::InterstitialState state = | 1730 TestInterstitialPage::InterstitialState state = |
1655 TestInterstitialPage::INVALID; | 1731 TestInterstitialPage::INVALID; |
1656 bool deleted = false; | 1732 bool deleted = false; |
1657 GURL url2("http://interstitial"); | 1733 GURL url2("http://interstitial"); |
1658 TestInterstitialPage* interstitial = | 1734 TestInterstitialPage* interstitial = |
1659 new TestInterstitialPage(contents(), true, url2, &state, &deleted); | 1735 new TestInterstitialPage(contents(), true, url2, &state, &deleted); |
1660 TestInterstitialPageStateGuard state_guard(interstitial); | 1736 TestInterstitialPageStateGuard state_guard(interstitial); |
1661 interstitial->Show(); | 1737 interstitial->Show(); |
| 1738 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
1662 // The interstitial should not show until its navigation has committed. | 1739 // The interstitial should not show until its navigation has committed. |
1663 EXPECT_FALSE(interstitial->is_showing()); | 1740 EXPECT_FALSE(interstitial->is_showing()); |
1664 EXPECT_FALSE(contents()->ShowingInterstitialPage()); | 1741 EXPECT_FALSE(contents()->ShowingInterstitialPage()); |
1665 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); | 1742 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); |
1666 // Let's commit the interstitial navigation. | 1743 // Let's commit the interstitial navigation. |
1667 interstitial->TestDidNavigate(1, url2); | 1744 interstitial->TestDidNavigate(1, interstitial_entry_id, true, url2); |
1668 EXPECT_TRUE(interstitial->is_showing()); | 1745 EXPECT_TRUE(interstitial->is_showing()); |
1669 EXPECT_TRUE(contents()->ShowingInterstitialPage()); | 1746 EXPECT_TRUE(contents()->ShowingInterstitialPage()); |
1670 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); | 1747 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); |
1671 NavigationEntry* entry = controller().GetVisibleEntry(); | 1748 NavigationEntry* entry = controller().GetVisibleEntry(); |
1672 ASSERT_NE(nullptr, entry); | 1749 ASSERT_NE(nullptr, entry); |
1673 EXPECT_TRUE(entry->GetURL() == url2); | 1750 EXPECT_TRUE(entry->GetURL() == url2); |
1674 | 1751 |
1675 // Then proceed. | 1752 // Then proceed. |
1676 interstitial->Proceed(); | 1753 interstitial->Proceed(); |
1677 // The interstitial should show until the new navigation commits. | 1754 // The interstitial should show until the new navigation commits. |
1678 RunAllPendingInMessageLoop(); | 1755 RunAllPendingInMessageLoop(); |
1679 ASSERT_FALSE(deleted); | 1756 ASSERT_FALSE(deleted); |
1680 EXPECT_EQ(TestInterstitialPage::OKED, state); | 1757 EXPECT_EQ(TestInterstitialPage::OKED, state); |
1681 EXPECT_TRUE(contents()->ShowingInterstitialPage()); | 1758 EXPECT_TRUE(contents()->ShowingInterstitialPage()); |
1682 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); | 1759 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); |
1683 | 1760 |
1684 // Simulate the navigation to the page, that's when the interstitial gets | 1761 // Simulate the navigation to the page, that's when the interstitial gets |
1685 // hidden. | 1762 // hidden. |
1686 GURL url3("http://www.thepage.com"); | 1763 GURL url3("http://www.thepage.com"); |
1687 contents()->GetMainFrame()->SendNavigate(2, url3); | 1764 contents()->GetMainFrame()->SendNavigate(2, 0, true, url3); |
1688 | 1765 |
1689 EXPECT_FALSE(contents()->ShowingInterstitialPage()); | 1766 EXPECT_FALSE(contents()->ShowingInterstitialPage()); |
1690 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); | 1767 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); |
1691 entry = controller().GetVisibleEntry(); | 1768 entry = controller().GetVisibleEntry(); |
1692 ASSERT_NE(nullptr, entry); | 1769 ASSERT_NE(nullptr, entry); |
1693 EXPECT_TRUE(entry->GetURL() == url3); | 1770 EXPECT_TRUE(entry->GetURL() == url3); |
1694 | 1771 |
1695 EXPECT_EQ(2, controller().GetEntryCount()); | 1772 EXPECT_EQ(2, controller().GetEntryCount()); |
1696 | 1773 |
1697 RunAllPendingInMessageLoop(); | 1774 RunAllPendingInMessageLoop(); |
1698 EXPECT_TRUE(deleted); | 1775 EXPECT_TRUE(deleted); |
1699 } | 1776 } |
1700 | 1777 |
1701 // Test navigating to a page that shows an interstitial without creating a new | 1778 // Test navigating to a page that shows an interstitial without creating a new |
1702 // navigation entry (this happens when the interstitial is triggered by a | 1779 // navigation entry (this happens when the interstitial is triggered by a |
1703 // sub-resource in the page), then proceeding. | 1780 // sub-resource in the page), then proceeding. |
1704 TEST_F(WebContentsImplTest, ShowInterstitialNoNewNavigationProceed) { | 1781 TEST_F(WebContentsImplTest, ShowInterstitialNoNewNavigationProceed) { |
1705 // Navigate to a page so we have a navigation entry in the controller. | 1782 // Navigate to a page so we have a navigation entry in the controller. |
1706 GURL url1("http://www.google.com"); | 1783 GURL url1("http://www.google.com"); |
1707 contents()->GetMainFrame()->SendNavigate(1, url1); | 1784 contents()->GetMainFrame()->SendNavigate(1, 0, true, url1); |
1708 EXPECT_EQ(1, controller().GetEntryCount()); | 1785 EXPECT_EQ(1, controller().GetEntryCount()); |
1709 | 1786 |
1710 // Show an interstitial. | 1787 // Show an interstitial. |
1711 TestInterstitialPage::InterstitialState state = | 1788 TestInterstitialPage::InterstitialState state = |
1712 TestInterstitialPage::INVALID; | 1789 TestInterstitialPage::INVALID; |
1713 bool deleted = false; | 1790 bool deleted = false; |
1714 GURL url2("http://interstitial"); | 1791 GURL url2("http://interstitial"); |
1715 TestInterstitialPage* interstitial = | 1792 TestInterstitialPage* interstitial = |
1716 new TestInterstitialPage(contents(), false, url2, &state, &deleted); | 1793 new TestInterstitialPage(contents(), false, url2, &state, &deleted); |
1717 TestInterstitialPageStateGuard state_guard(interstitial); | 1794 TestInterstitialPageStateGuard state_guard(interstitial); |
1718 interstitial->Show(); | 1795 interstitial->Show(); |
1719 // The interstitial should not show until its navigation has committed. | 1796 // The interstitial should not show until its navigation has committed. |
1720 EXPECT_FALSE(interstitial->is_showing()); | 1797 EXPECT_FALSE(interstitial->is_showing()); |
1721 EXPECT_FALSE(contents()->ShowingInterstitialPage()); | 1798 EXPECT_FALSE(contents()->ShowingInterstitialPage()); |
1722 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); | 1799 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); |
1723 // Let's commit the interstitial navigation. | 1800 // Let's commit the interstitial navigation. |
1724 interstitial->TestDidNavigate(1, url2); | 1801 interstitial->TestDidNavigate(1, 0, true, url2); |
1725 EXPECT_TRUE(interstitial->is_showing()); | 1802 EXPECT_TRUE(interstitial->is_showing()); |
1726 EXPECT_TRUE(contents()->ShowingInterstitialPage()); | 1803 EXPECT_TRUE(contents()->ShowingInterstitialPage()); |
1727 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); | 1804 EXPECT_TRUE(contents()->GetInterstitialPage() == interstitial); |
1728 NavigationEntry* entry = controller().GetVisibleEntry(); | 1805 NavigationEntry* entry = controller().GetVisibleEntry(); |
1729 ASSERT_NE(nullptr, entry); | 1806 ASSERT_NE(nullptr, entry); |
1730 // The URL specified to the interstitial should have been ignored. | 1807 // The URL specified to the interstitial should have been ignored. |
1731 EXPECT_TRUE(entry->GetURL() == url1); | 1808 EXPECT_TRUE(entry->GetURL() == url1); |
1732 | 1809 |
1733 // Then proceed. | 1810 // Then proceed. |
1734 interstitial->Proceed(); | 1811 interstitial->Proceed(); |
(...skipping 16 matching lines...) Expand all Loading... |
1751 TEST_F(WebContentsImplTest, ShowInterstitialThenNavigate) { | 1828 TEST_F(WebContentsImplTest, ShowInterstitialThenNavigate) { |
1752 // Show interstitial. | 1829 // Show interstitial. |
1753 TestInterstitialPage::InterstitialState state = | 1830 TestInterstitialPage::InterstitialState state = |
1754 TestInterstitialPage::INVALID; | 1831 TestInterstitialPage::INVALID; |
1755 bool deleted = false; | 1832 bool deleted = false; |
1756 GURL url("http://interstitial"); | 1833 GURL url("http://interstitial"); |
1757 TestInterstitialPage* interstitial = | 1834 TestInterstitialPage* interstitial = |
1758 new TestInterstitialPage(contents(), true, url, &state, &deleted); | 1835 new TestInterstitialPage(contents(), true, url, &state, &deleted); |
1759 TestInterstitialPageStateGuard state_guard(interstitial); | 1836 TestInterstitialPageStateGuard state_guard(interstitial); |
1760 interstitial->Show(); | 1837 interstitial->Show(); |
1761 interstitial->TestDidNavigate(1, url); | 1838 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
| 1839 interstitial->TestDidNavigate(1, interstitial_entry_id, true, url); |
1762 | 1840 |
1763 // While interstitial showing, navigate to a new URL. | 1841 // While interstitial showing, navigate to a new URL. |
1764 const GURL url2("http://www.yahoo.com"); | 1842 const GURL url2("http://www.yahoo.com"); |
1765 contents()->GetMainFrame()->SendNavigate(1, url2); | 1843 contents()->GetMainFrame()->SendNavigate(1, 1, true, url2); |
1766 | 1844 |
1767 EXPECT_EQ(TestInterstitialPage::CANCELED, state); | 1845 EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
1768 | 1846 |
1769 RunAllPendingInMessageLoop(); | 1847 RunAllPendingInMessageLoop(); |
1770 EXPECT_TRUE(deleted); | 1848 EXPECT_TRUE(deleted); |
1771 } | 1849 } |
1772 | 1850 |
1773 // Test navigating to a page that shows an interstitial, then going back. | 1851 // Test navigating to a page that shows an interstitial, then going back. |
1774 TEST_F(WebContentsImplTest, ShowInterstitialThenGoBack) { | 1852 TEST_F(WebContentsImplTest, ShowInterstitialThenGoBack) { |
1775 // Navigate to a page so we have a navigation entry in the controller. | 1853 // Navigate to a page so we have a navigation entry in the controller. |
1776 GURL url1("http://www.google.com"); | 1854 GURL url1("http://www.google.com"); |
1777 contents()->GetMainFrame()->SendNavigate(1, url1); | 1855 contents()->GetMainFrame()->SendNavigate(1, 0, true, url1); |
1778 EXPECT_EQ(1, controller().GetEntryCount()); | 1856 EXPECT_EQ(1, controller().GetEntryCount()); |
| 1857 NavigationEntry* entry = controller().GetLastCommittedEntry(); |
1779 | 1858 |
1780 // Show interstitial. | 1859 // Show interstitial. |
1781 TestInterstitialPage::InterstitialState state = | 1860 TestInterstitialPage::InterstitialState state = |
1782 TestInterstitialPage::INVALID; | 1861 TestInterstitialPage::INVALID; |
1783 bool deleted = false; | 1862 bool deleted = false; |
1784 GURL interstitial_url("http://interstitial"); | 1863 GURL interstitial_url("http://interstitial"); |
1785 TestInterstitialPage* interstitial = | 1864 TestInterstitialPage* interstitial = |
1786 new TestInterstitialPage(contents(), true, interstitial_url, | 1865 new TestInterstitialPage(contents(), true, interstitial_url, |
1787 &state, &deleted); | 1866 &state, &deleted); |
1788 TestInterstitialPageStateGuard state_guard(interstitial); | 1867 TestInterstitialPageStateGuard state_guard(interstitial); |
1789 interstitial->Show(); | 1868 interstitial->Show(); |
1790 interstitial->TestDidNavigate(2, interstitial_url); | 1869 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
| 1870 interstitial->TestDidNavigate(2, interstitial_entry_id, true, |
| 1871 interstitial_url); |
1791 | 1872 |
1792 // While the interstitial is showing, go back. | 1873 // While the interstitial is showing, go back. |
1793 controller().GoBack(); | 1874 controller().GoBack(); |
1794 contents()->GetMainFrame()->SendNavigate(1, url1); | 1875 contents()->GetMainFrame()->SendNavigate(1, entry->GetUniqueID(), false, |
| 1876 url1); |
1795 | 1877 |
1796 // Make sure we are back to the original page and that the interstitial is | 1878 // Make sure we are back to the original page and that the interstitial is |
1797 // gone. | 1879 // gone. |
1798 EXPECT_EQ(TestInterstitialPage::CANCELED, state); | 1880 EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
1799 NavigationEntry* entry = controller().GetVisibleEntry(); | 1881 entry = controller().GetVisibleEntry(); |
1800 ASSERT_TRUE(entry); | 1882 ASSERT_TRUE(entry); |
1801 EXPECT_EQ(url1.spec(), entry->GetURL().spec()); | 1883 EXPECT_EQ(url1.spec(), entry->GetURL().spec()); |
1802 | 1884 |
1803 RunAllPendingInMessageLoop(); | 1885 RunAllPendingInMessageLoop(); |
1804 EXPECT_TRUE(deleted); | 1886 EXPECT_TRUE(deleted); |
1805 } | 1887 } |
1806 | 1888 |
1807 // Test navigating to a page that shows an interstitial, has a renderer crash, | 1889 // Test navigating to a page that shows an interstitial, has a renderer crash, |
1808 // and then goes back. | 1890 // and then goes back. |
1809 TEST_F(WebContentsImplTest, ShowInterstitialCrashRendererThenGoBack) { | 1891 TEST_F(WebContentsImplTest, ShowInterstitialCrashRendererThenGoBack) { |
1810 // Navigate to a page so we have a navigation entry in the controller. | 1892 // Navigate to a page so we have a navigation entry in the controller. |
1811 GURL url1("http://www.google.com"); | 1893 GURL url1("http://www.google.com"); |
1812 contents()->GetMainFrame()->SendNavigate(1, url1); | 1894 contents()->GetMainFrame()->SendNavigate(1, 0, true, url1); |
1813 EXPECT_EQ(1, controller().GetEntryCount()); | 1895 EXPECT_EQ(1, controller().GetEntryCount()); |
| 1896 NavigationEntry* entry = controller().GetLastCommittedEntry(); |
1814 | 1897 |
1815 // Show interstitial. | 1898 // Show interstitial. |
1816 TestInterstitialPage::InterstitialState state = | 1899 TestInterstitialPage::InterstitialState state = |
1817 TestInterstitialPage::INVALID; | 1900 TestInterstitialPage::INVALID; |
1818 bool deleted = false; | 1901 bool deleted = false; |
1819 GURL interstitial_url("http://interstitial"); | 1902 GURL interstitial_url("http://interstitial"); |
1820 TestInterstitialPage* interstitial = | 1903 TestInterstitialPage* interstitial = |
1821 new TestInterstitialPage(contents(), true, interstitial_url, | 1904 new TestInterstitialPage(contents(), true, interstitial_url, |
1822 &state, &deleted); | 1905 &state, &deleted); |
1823 TestInterstitialPageStateGuard state_guard(interstitial); | 1906 TestInterstitialPageStateGuard state_guard(interstitial); |
1824 interstitial->Show(); | 1907 interstitial->Show(); |
1825 interstitial->TestDidNavigate(2, interstitial_url); | 1908 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
| 1909 interstitial->TestDidNavigate(2, interstitial_entry_id, true, |
| 1910 interstitial_url); |
1826 | 1911 |
1827 // Crash the renderer | 1912 // Crash the renderer |
1828 main_rfh()->OnMessageReceived( | 1913 main_rfh()->OnMessageReceived( |
1829 FrameHostMsg_RenderProcessGone( | 1914 FrameHostMsg_RenderProcessGone( |
1830 0, base::TERMINATION_STATUS_PROCESS_CRASHED, -1)); | 1915 0, base::TERMINATION_STATUS_PROCESS_CRASHED, -1)); |
1831 | 1916 |
1832 // While the interstitial is showing, go back. | 1917 // While the interstitial is showing, go back. |
1833 controller().GoBack(); | 1918 controller().GoBack(); |
1834 contents()->GetMainFrame()->SendNavigate(1, url1); | 1919 contents()->GetMainFrame()->SendNavigate(1, entry->GetUniqueID(), false, |
| 1920 url1); |
1835 | 1921 |
1836 // Make sure we are back to the original page and that the interstitial is | 1922 // Make sure we are back to the original page and that the interstitial is |
1837 // gone. | 1923 // gone. |
1838 EXPECT_EQ(TestInterstitialPage::CANCELED, state); | 1924 EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
1839 NavigationEntry* entry = controller().GetVisibleEntry(); | 1925 entry = controller().GetVisibleEntry(); |
1840 ASSERT_TRUE(entry); | 1926 ASSERT_TRUE(entry); |
1841 EXPECT_EQ(url1.spec(), entry->GetURL().spec()); | 1927 EXPECT_EQ(url1.spec(), entry->GetURL().spec()); |
1842 | 1928 |
1843 RunAllPendingInMessageLoop(); | 1929 RunAllPendingInMessageLoop(); |
1844 EXPECT_TRUE(deleted); | 1930 EXPECT_TRUE(deleted); |
1845 } | 1931 } |
1846 | 1932 |
1847 // Test navigating to a page that shows an interstitial, has the renderer crash, | 1933 // Test navigating to a page that shows an interstitial, has the renderer crash, |
1848 // and then navigates to the interstitial. | 1934 // and then navigates to the interstitial. |
1849 TEST_F(WebContentsImplTest, ShowInterstitialCrashRendererThenNavigate) { | 1935 TEST_F(WebContentsImplTest, ShowInterstitialCrashRendererThenNavigate) { |
1850 // Navigate to a page so we have a navigation entry in the controller. | 1936 // Navigate to a page so we have a navigation entry in the controller. |
1851 GURL url1("http://www.google.com"); | 1937 GURL url1("http://www.google.com"); |
1852 contents()->GetMainFrame()->SendNavigate(1, url1); | 1938 contents()->GetMainFrame()->SendNavigate(1, 0, true, url1); |
1853 EXPECT_EQ(1, controller().GetEntryCount()); | 1939 EXPECT_EQ(1, controller().GetEntryCount()); |
1854 | 1940 |
1855 // Show interstitial. | 1941 // Show interstitial. |
1856 TestInterstitialPage::InterstitialState state = | 1942 TestInterstitialPage::InterstitialState state = |
1857 TestInterstitialPage::INVALID; | 1943 TestInterstitialPage::INVALID; |
1858 bool deleted = false; | 1944 bool deleted = false; |
1859 GURL interstitial_url("http://interstitial"); | 1945 GURL interstitial_url("http://interstitial"); |
1860 TestInterstitialPage* interstitial = | 1946 TestInterstitialPage* interstitial = |
1861 new TestInterstitialPage(contents(), true, interstitial_url, | 1947 new TestInterstitialPage(contents(), true, interstitial_url, |
1862 &state, &deleted); | 1948 &state, &deleted); |
1863 TestInterstitialPageStateGuard state_guard(interstitial); | 1949 TestInterstitialPageStateGuard state_guard(interstitial); |
1864 interstitial->Show(); | 1950 interstitial->Show(); |
| 1951 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
1865 | 1952 |
1866 // Crash the renderer | 1953 // Crash the renderer |
1867 main_rfh()->OnMessageReceived( | 1954 main_rfh()->OnMessageReceived( |
1868 FrameHostMsg_RenderProcessGone( | 1955 FrameHostMsg_RenderProcessGone( |
1869 0, base::TERMINATION_STATUS_PROCESS_CRASHED, -1)); | 1956 0, base::TERMINATION_STATUS_PROCESS_CRASHED, -1)); |
1870 | 1957 |
1871 interstitial->TestDidNavigate(2, interstitial_url); | 1958 interstitial->TestDidNavigate(2, interstitial_entry_id, true, |
| 1959 interstitial_url); |
1872 } | 1960 } |
1873 | 1961 |
1874 // Test navigating to a page that shows an interstitial, then close the | 1962 // Test navigating to a page that shows an interstitial, then close the |
1875 // contents. | 1963 // contents. |
1876 TEST_F(WebContentsImplTest, ShowInterstitialThenCloseTab) { | 1964 TEST_F(WebContentsImplTest, ShowInterstitialThenCloseTab) { |
1877 // Show interstitial. | 1965 // Show interstitial. |
1878 TestInterstitialPage::InterstitialState state = | 1966 TestInterstitialPage::InterstitialState state = |
1879 TestInterstitialPage::INVALID; | 1967 TestInterstitialPage::INVALID; |
1880 bool deleted = false; | 1968 bool deleted = false; |
1881 GURL url("http://interstitial"); | 1969 GURL url("http://interstitial"); |
1882 TestInterstitialPage* interstitial = | 1970 TestInterstitialPage* interstitial = |
1883 new TestInterstitialPage(contents(), true, url, &state, &deleted); | 1971 new TestInterstitialPage(contents(), true, url, &state, &deleted); |
1884 TestInterstitialPageStateGuard state_guard(interstitial); | 1972 TestInterstitialPageStateGuard state_guard(interstitial); |
1885 interstitial->Show(); | 1973 interstitial->Show(); |
1886 interstitial->TestDidNavigate(1, url); | 1974 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
| 1975 interstitial->TestDidNavigate(1, interstitial_entry_id, true, url); |
1887 | 1976 |
1888 // Now close the contents. | 1977 // Now close the contents. |
1889 DeleteContents(); | 1978 DeleteContents(); |
1890 EXPECT_EQ(TestInterstitialPage::CANCELED, state); | 1979 EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
1891 | 1980 |
1892 RunAllPendingInMessageLoop(); | 1981 RunAllPendingInMessageLoop(); |
1893 EXPECT_TRUE(deleted); | 1982 EXPECT_TRUE(deleted); |
1894 } | 1983 } |
1895 | 1984 |
1896 // Test navigating to a page that shows an interstitial, then close the | 1985 // Test navigating to a page that shows an interstitial, then close the |
1897 // contents. | 1986 // contents. |
1898 TEST_F(WebContentsImplTest, ShowInterstitialThenCloseAndShutdown) { | 1987 TEST_F(WebContentsImplTest, ShowInterstitialThenCloseAndShutdown) { |
1899 // Show interstitial. | 1988 // Show interstitial. |
1900 TestInterstitialPage::InterstitialState state = | 1989 TestInterstitialPage::InterstitialState state = |
1901 TestInterstitialPage::INVALID; | 1990 TestInterstitialPage::INVALID; |
1902 bool deleted = false; | 1991 bool deleted = false; |
1903 GURL url("http://interstitial"); | 1992 GURL url("http://interstitial"); |
1904 TestInterstitialPage* interstitial = | 1993 TestInterstitialPage* interstitial = |
1905 new TestInterstitialPage(contents(), true, url, &state, &deleted); | 1994 new TestInterstitialPage(contents(), true, url, &state, &deleted); |
1906 TestInterstitialPageStateGuard state_guard(interstitial); | 1995 TestInterstitialPageStateGuard state_guard(interstitial); |
1907 interstitial->Show(); | 1996 interstitial->Show(); |
1908 interstitial->TestDidNavigate(1, url); | 1997 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
| 1998 interstitial->TestDidNavigate(1, interstitial_entry_id, true, url); |
1909 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( | 1999 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
1910 interstitial->GetMainFrame()->GetRenderViewHost()); | 2000 interstitial->GetMainFrame()->GetRenderViewHost()); |
1911 | 2001 |
1912 // Now close the contents. | 2002 // Now close the contents. |
1913 DeleteContents(); | 2003 DeleteContents(); |
1914 EXPECT_EQ(TestInterstitialPage::CANCELED, state); | 2004 EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
1915 | 2005 |
1916 // Before the interstitial has a chance to process its shutdown task, | 2006 // Before the interstitial has a chance to process its shutdown task, |
1917 // simulate quitting the browser. This goes through all processes and | 2007 // simulate quitting the browser. This goes through all processes and |
1918 // tells them to destruct. | 2008 // tells them to destruct. |
1919 rvh->GetMainFrame()->OnMessageReceived( | 2009 rvh->GetMainFrame()->OnMessageReceived( |
1920 FrameHostMsg_RenderProcessGone(0, 0, 0)); | 2010 FrameHostMsg_RenderProcessGone(0, 0, 0)); |
1921 | 2011 |
1922 RunAllPendingInMessageLoop(); | 2012 RunAllPendingInMessageLoop(); |
1923 EXPECT_TRUE(deleted); | 2013 EXPECT_TRUE(deleted); |
1924 } | 2014 } |
1925 | 2015 |
1926 // Test that after Proceed is called and an interstitial is still shown, no more | 2016 // Test that after Proceed is called and an interstitial is still shown, no more |
1927 // commands get executed. | 2017 // commands get executed. |
1928 TEST_F(WebContentsImplTest, ShowInterstitialProceedMultipleCommands) { | 2018 TEST_F(WebContentsImplTest, ShowInterstitialProceedMultipleCommands) { |
1929 // Navigate to a page so we have a navigation entry in the controller. | 2019 // Navigate to a page so we have a navigation entry in the controller. |
1930 GURL url1("http://www.google.com"); | 2020 GURL url1("http://www.google.com"); |
1931 contents()->GetMainFrame()->SendNavigate(1, url1); | 2021 contents()->GetMainFrame()->SendNavigate(1, 0, true, url1); |
1932 EXPECT_EQ(1, controller().GetEntryCount()); | 2022 EXPECT_EQ(1, controller().GetEntryCount()); |
1933 | 2023 |
1934 // Show an interstitial. | 2024 // Show an interstitial. |
1935 TestInterstitialPage::InterstitialState state = | 2025 TestInterstitialPage::InterstitialState state = |
1936 TestInterstitialPage::INVALID; | 2026 TestInterstitialPage::INVALID; |
1937 bool deleted = false; | 2027 bool deleted = false; |
1938 GURL url2("http://interstitial"); | 2028 GURL url2("http://interstitial"); |
1939 TestInterstitialPage* interstitial = | 2029 TestInterstitialPage* interstitial = |
1940 new TestInterstitialPage(contents(), true, url2, &state, &deleted); | 2030 new TestInterstitialPage(contents(), true, url2, &state, &deleted); |
1941 TestInterstitialPageStateGuard state_guard(interstitial); | 2031 TestInterstitialPageStateGuard state_guard(interstitial); |
1942 interstitial->Show(); | 2032 interstitial->Show(); |
1943 interstitial->TestDidNavigate(1, url2); | 2033 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
| 2034 interstitial->TestDidNavigate(1, interstitial_entry_id, true, url2); |
1944 | 2035 |
1945 // Run a command. | 2036 // Run a command. |
1946 EXPECT_EQ(0, interstitial->command_received_count()); | 2037 EXPECT_EQ(0, interstitial->command_received_count()); |
1947 interstitial->TestDomOperationResponse("toto"); | 2038 interstitial->TestDomOperationResponse("toto"); |
1948 EXPECT_EQ(1, interstitial->command_received_count()); | 2039 EXPECT_EQ(1, interstitial->command_received_count()); |
1949 | 2040 |
1950 // Then proceed. | 2041 // Then proceed. |
1951 interstitial->Proceed(); | 2042 interstitial->Proceed(); |
1952 RunAllPendingInMessageLoop(); | 2043 RunAllPendingInMessageLoop(); |
1953 ASSERT_FALSE(deleted); | 2044 ASSERT_FALSE(deleted); |
1954 | 2045 |
1955 // While the navigation to the new page is pending, send other commands, they | 2046 // While the navigation to the new page is pending, send other commands, they |
1956 // should be ignored. | 2047 // should be ignored. |
1957 interstitial->TestDomOperationResponse("hello"); | 2048 interstitial->TestDomOperationResponse("hello"); |
1958 interstitial->TestDomOperationResponse("hi"); | 2049 interstitial->TestDomOperationResponse("hi"); |
1959 EXPECT_EQ(1, interstitial->command_received_count()); | 2050 EXPECT_EQ(1, interstitial->command_received_count()); |
1960 } | 2051 } |
1961 | 2052 |
1962 // Test showing an interstitial while another interstitial is already showing. | 2053 // Test showing an interstitial while another interstitial is already showing. |
1963 TEST_F(WebContentsImplTest, ShowInterstitialOnInterstitial) { | 2054 TEST_F(WebContentsImplTest, ShowInterstitialOnInterstitial) { |
1964 // Navigate to a page so we have a navigation entry in the controller. | 2055 // Navigate to a page so we have a navigation entry in the controller. |
1965 GURL start_url("http://www.google.com"); | 2056 GURL start_url("http://www.google.com"); |
1966 contents()->GetMainFrame()->SendNavigate(1, start_url); | 2057 contents()->GetMainFrame()->SendNavigate(1, 0, true, start_url); |
1967 EXPECT_EQ(1, controller().GetEntryCount()); | 2058 EXPECT_EQ(1, controller().GetEntryCount()); |
1968 | 2059 |
1969 // Show an interstitial. | 2060 // Show an interstitial. |
1970 TestInterstitialPage::InterstitialState state1 = | 2061 TestInterstitialPage::InterstitialState state1 = |
1971 TestInterstitialPage::INVALID; | 2062 TestInterstitialPage::INVALID; |
1972 bool deleted1 = false; | 2063 bool deleted1 = false; |
1973 GURL url1("http://interstitial1"); | 2064 GURL url1("http://interstitial1"); |
1974 TestInterstitialPage* interstitial1 = | 2065 TestInterstitialPage* interstitial1 = |
1975 new TestInterstitialPage(contents(), true, url1, &state1, &deleted1); | 2066 new TestInterstitialPage(contents(), true, url1, &state1, &deleted1); |
1976 TestInterstitialPageStateGuard state_guard1(interstitial1); | 2067 TestInterstitialPageStateGuard state_guard1(interstitial1); |
1977 interstitial1->Show(); | 2068 interstitial1->Show(); |
1978 interstitial1->TestDidNavigate(1, url1); | 2069 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
| 2070 interstitial1->TestDidNavigate(1, interstitial_entry_id, true, url1); |
1979 | 2071 |
1980 // Now show another interstitial. | 2072 // Now show another interstitial. |
1981 TestInterstitialPage::InterstitialState state2 = | 2073 TestInterstitialPage::InterstitialState state2 = |
1982 TestInterstitialPage::INVALID; | 2074 TestInterstitialPage::INVALID; |
1983 bool deleted2 = false; | 2075 bool deleted2 = false; |
1984 GURL url2("http://interstitial2"); | 2076 GURL url2("http://interstitial2"); |
1985 TestInterstitialPage* interstitial2 = | 2077 TestInterstitialPage* interstitial2 = |
1986 new TestInterstitialPage(contents(), true, url2, &state2, &deleted2); | 2078 new TestInterstitialPage(contents(), true, url2, &state2, &deleted2); |
1987 TestInterstitialPageStateGuard state_guard2(interstitial2); | 2079 TestInterstitialPageStateGuard state_guard2(interstitial2); |
1988 interstitial2->Show(); | 2080 interstitial2->Show(); |
1989 interstitial2->TestDidNavigate(1, url2); | 2081 interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
| 2082 interstitial2->TestDidNavigate(1, interstitial_entry_id, true, url2); |
1990 | 2083 |
1991 // Showing interstitial2 should have caused interstitial1 to go away. | 2084 // Showing interstitial2 should have caused interstitial1 to go away. |
1992 EXPECT_EQ(TestInterstitialPage::CANCELED, state1); | 2085 EXPECT_EQ(TestInterstitialPage::CANCELED, state1); |
1993 EXPECT_EQ(TestInterstitialPage::UNDECIDED, state2); | 2086 EXPECT_EQ(TestInterstitialPage::UNDECIDED, state2); |
1994 | 2087 |
1995 RunAllPendingInMessageLoop(); | 2088 RunAllPendingInMessageLoop(); |
1996 EXPECT_TRUE(deleted1); | 2089 EXPECT_TRUE(deleted1); |
1997 ASSERT_FALSE(deleted2); | 2090 ASSERT_FALSE(deleted2); |
1998 | 2091 |
1999 // Let's make sure interstitial2 is working as intended. | 2092 // Let's make sure interstitial2 is working as intended. |
2000 interstitial2->Proceed(); | 2093 interstitial2->Proceed(); |
2001 GURL landing_url("http://www.thepage.com"); | 2094 GURL landing_url("http://www.thepage.com"); |
2002 contents()->GetMainFrame()->SendNavigate(2, landing_url); | 2095 contents()->GetMainFrame()->SendNavigate(2, 0, true, landing_url); |
2003 | 2096 |
2004 EXPECT_FALSE(contents()->ShowingInterstitialPage()); | 2097 EXPECT_FALSE(contents()->ShowingInterstitialPage()); |
2005 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); | 2098 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); |
2006 NavigationEntry* entry = controller().GetVisibleEntry(); | 2099 NavigationEntry* entry = controller().GetVisibleEntry(); |
2007 ASSERT_NE(nullptr, entry); | 2100 ASSERT_NE(nullptr, entry); |
2008 EXPECT_TRUE(entry->GetURL() == landing_url); | 2101 EXPECT_TRUE(entry->GetURL() == landing_url); |
2009 EXPECT_EQ(2, controller().GetEntryCount()); | 2102 EXPECT_EQ(2, controller().GetEntryCount()); |
2010 RunAllPendingInMessageLoop(); | 2103 RunAllPendingInMessageLoop(); |
2011 EXPECT_TRUE(deleted2); | 2104 EXPECT_TRUE(deleted2); |
2012 } | 2105 } |
2013 | 2106 |
2014 // Test showing an interstitial, proceeding and then navigating to another | 2107 // Test showing an interstitial, proceeding and then navigating to another |
2015 // interstitial. | 2108 // interstitial. |
2016 TEST_F(WebContentsImplTest, ShowInterstitialProceedShowInterstitial) { | 2109 TEST_F(WebContentsImplTest, ShowInterstitialProceedShowInterstitial) { |
2017 // Navigate to a page so we have a navigation entry in the controller. | 2110 // Navigate to a page so we have a navigation entry in the controller. |
2018 GURL start_url("http://www.google.com"); | 2111 GURL start_url("http://www.google.com"); |
2019 contents()->GetMainFrame()->SendNavigate(1, start_url); | 2112 contents()->GetMainFrame()->SendNavigate(1, 0, true, start_url); |
2020 EXPECT_EQ(1, controller().GetEntryCount()); | 2113 EXPECT_EQ(1, controller().GetEntryCount()); |
2021 | 2114 |
2022 // Show an interstitial. | 2115 // Show an interstitial. |
2023 TestInterstitialPage::InterstitialState state1 = | 2116 TestInterstitialPage::InterstitialState state1 = |
2024 TestInterstitialPage::INVALID; | 2117 TestInterstitialPage::INVALID; |
2025 bool deleted1 = false; | 2118 bool deleted1 = false; |
2026 GURL url1("http://interstitial1"); | 2119 GURL url1("http://interstitial1"); |
2027 TestInterstitialPage* interstitial1 = | 2120 TestInterstitialPage* interstitial1 = |
2028 new TestInterstitialPage(contents(), true, url1, &state1, &deleted1); | 2121 new TestInterstitialPage(contents(), true, url1, &state1, &deleted1); |
2029 TestInterstitialPageStateGuard state_guard1(interstitial1); | 2122 TestInterstitialPageStateGuard state_guard1(interstitial1); |
2030 interstitial1->Show(); | 2123 interstitial1->Show(); |
2031 interstitial1->TestDidNavigate(1, url1); | 2124 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
| 2125 interstitial1->TestDidNavigate(1, interstitial_entry_id, true, url1); |
2032 | 2126 |
2033 // Take action. The interstitial won't be hidden until the navigation is | 2127 // Take action. The interstitial won't be hidden until the navigation is |
2034 // committed. | 2128 // committed. |
2035 interstitial1->Proceed(); | 2129 interstitial1->Proceed(); |
2036 EXPECT_EQ(TestInterstitialPage::OKED, state1); | 2130 EXPECT_EQ(TestInterstitialPage::OKED, state1); |
2037 | 2131 |
2038 // Now show another interstitial (simulating the navigation causing another | 2132 // Now show another interstitial (simulating the navigation causing another |
2039 // interstitial). | 2133 // interstitial). |
2040 TestInterstitialPage::InterstitialState state2 = | 2134 TestInterstitialPage::InterstitialState state2 = |
2041 TestInterstitialPage::INVALID; | 2135 TestInterstitialPage::INVALID; |
2042 bool deleted2 = false; | 2136 bool deleted2 = false; |
2043 GURL url2("http://interstitial2"); | 2137 GURL url2("http://interstitial2"); |
2044 TestInterstitialPage* interstitial2 = | 2138 TestInterstitialPage* interstitial2 = |
2045 new TestInterstitialPage(contents(), true, url2, &state2, &deleted2); | 2139 new TestInterstitialPage(contents(), true, url2, &state2, &deleted2); |
2046 TestInterstitialPageStateGuard state_guard2(interstitial2); | 2140 TestInterstitialPageStateGuard state_guard2(interstitial2); |
2047 interstitial2->Show(); | 2141 interstitial2->Show(); |
2048 interstitial2->TestDidNavigate(1, url2); | 2142 interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
| 2143 interstitial2->TestDidNavigate(1, interstitial_entry_id, true, url2); |
2049 | 2144 |
2050 // Showing interstitial2 should have caused interstitial1 to go away. | 2145 // Showing interstitial2 should have caused interstitial1 to go away. |
2051 EXPECT_EQ(TestInterstitialPage::UNDECIDED, state2); | 2146 EXPECT_EQ(TestInterstitialPage::UNDECIDED, state2); |
2052 RunAllPendingInMessageLoop(); | 2147 RunAllPendingInMessageLoop(); |
2053 EXPECT_TRUE(deleted1); | 2148 EXPECT_TRUE(deleted1); |
2054 ASSERT_FALSE(deleted2); | 2149 ASSERT_FALSE(deleted2); |
2055 | 2150 |
2056 // Let's make sure interstitial2 is working as intended. | 2151 // Let's make sure interstitial2 is working as intended. |
2057 interstitial2->Proceed(); | 2152 interstitial2->Proceed(); |
2058 GURL landing_url("http://www.thepage.com"); | 2153 GURL landing_url("http://www.thepage.com"); |
2059 contents()->GetMainFrame()->SendNavigate(2, landing_url); | 2154 contents()->GetMainFrame()->SendNavigate(2, 0, true, landing_url); |
2060 | 2155 |
2061 RunAllPendingInMessageLoop(); | 2156 RunAllPendingInMessageLoop(); |
2062 EXPECT_TRUE(deleted2); | 2157 EXPECT_TRUE(deleted2); |
2063 EXPECT_FALSE(contents()->ShowingInterstitialPage()); | 2158 EXPECT_FALSE(contents()->ShowingInterstitialPage()); |
2064 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); | 2159 EXPECT_EQ(nullptr, contents()->GetInterstitialPage()); |
2065 NavigationEntry* entry = controller().GetVisibleEntry(); | 2160 NavigationEntry* entry = controller().GetVisibleEntry(); |
2066 ASSERT_NE(nullptr, entry); | 2161 ASSERT_NE(nullptr, entry); |
2067 EXPECT_TRUE(entry->GetURL() == landing_url); | 2162 EXPECT_TRUE(entry->GetURL() == landing_url); |
2068 EXPECT_EQ(2, controller().GetEntryCount()); | 2163 EXPECT_EQ(2, controller().GetEntryCount()); |
2069 } | 2164 } |
2070 | 2165 |
2071 // Test that navigating away from an interstitial while it's loading cause it | 2166 // Test that navigating away from an interstitial while it's loading cause it |
2072 // not to show. | 2167 // not to show. |
2073 TEST_F(WebContentsImplTest, NavigateBeforeInterstitialShows) { | 2168 TEST_F(WebContentsImplTest, NavigateBeforeInterstitialShows) { |
2074 // Show an interstitial. | 2169 // Show an interstitial. |
2075 TestInterstitialPage::InterstitialState state = | 2170 TestInterstitialPage::InterstitialState state = |
2076 TestInterstitialPage::INVALID; | 2171 TestInterstitialPage::INVALID; |
2077 bool deleted = false; | 2172 bool deleted = false; |
2078 GURL interstitial_url("http://interstitial"); | 2173 GURL interstitial_url("http://interstitial"); |
2079 TestInterstitialPage* interstitial = | 2174 TestInterstitialPage* interstitial = |
2080 new TestInterstitialPage(contents(), true, interstitial_url, | 2175 new TestInterstitialPage(contents(), true, interstitial_url, |
2081 &state, &deleted); | 2176 &state, &deleted); |
2082 TestInterstitialPageStateGuard state_guard(interstitial); | 2177 TestInterstitialPageStateGuard state_guard(interstitial); |
2083 interstitial->Show(); | 2178 interstitial->Show(); |
| 2179 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
2084 | 2180 |
2085 // Let's simulate a navigation initiated from the browser before the | 2181 // Let's simulate a navigation initiated from the browser before the |
2086 // interstitial finishes loading. | 2182 // interstitial finishes loading. |
2087 const GURL url("http://www.google.com"); | 2183 const GURL url("http://www.google.com"); |
2088 controller().LoadURL( | 2184 controller().LoadURL( |
2089 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 2185 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
2090 EXPECT_FALSE(interstitial->is_showing()); | 2186 EXPECT_FALSE(interstitial->is_showing()); |
2091 RunAllPendingInMessageLoop(); | 2187 RunAllPendingInMessageLoop(); |
2092 ASSERT_FALSE(deleted); | 2188 ASSERT_FALSE(deleted); |
2093 | 2189 |
2094 // Now let's make the interstitial navigation commit. | 2190 // Now let's make the interstitial navigation commit. |
2095 interstitial->TestDidNavigate(1, interstitial_url); | 2191 interstitial->TestDidNavigate(1, interstitial_entry_id, true, |
| 2192 interstitial_url); |
2096 | 2193 |
2097 // After it loaded the interstitial should be gone. | 2194 // After it loaded the interstitial should be gone. |
2098 EXPECT_EQ(TestInterstitialPage::CANCELED, state); | 2195 EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
2099 | 2196 |
2100 RunAllPendingInMessageLoop(); | 2197 RunAllPendingInMessageLoop(); |
2101 EXPECT_TRUE(deleted); | 2198 EXPECT_TRUE(deleted); |
2102 } | 2199 } |
2103 | 2200 |
2104 // Test that a new request to show an interstitial while an interstitial is | 2201 // Test that a new request to show an interstitial while an interstitial is |
2105 // pending does not cause problems. htp://crbug/29655 and htp://crbug/9442. | 2202 // pending does not cause problems. htp://crbug/29655 and htp://crbug/9442. |
(...skipping 13 matching lines...) Expand all Loading... |
2119 // Show another interstitial on that same contents before the first one had | 2216 // Show another interstitial on that same contents before the first one had |
2120 // time to load. | 2217 // time to load. |
2121 TestInterstitialPage::InterstitialState state2 = | 2218 TestInterstitialPage::InterstitialState state2 = |
2122 TestInterstitialPage::INVALID; | 2219 TestInterstitialPage::INVALID; |
2123 bool deleted2 = false; | 2220 bool deleted2 = false; |
2124 TestInterstitialPage* interstitial2 = | 2221 TestInterstitialPage* interstitial2 = |
2125 new TestInterstitialPage(contents(), true, interstitial_url, | 2222 new TestInterstitialPage(contents(), true, interstitial_url, |
2126 &state2, &deleted2); | 2223 &state2, &deleted2); |
2127 TestInterstitialPageStateGuard state_guard2(interstitial2); | 2224 TestInterstitialPageStateGuard state_guard2(interstitial2); |
2128 interstitial2->Show(); | 2225 interstitial2->Show(); |
| 2226 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
2129 | 2227 |
2130 // The first interstitial should have been closed and deleted. | 2228 // The first interstitial should have been closed and deleted. |
2131 EXPECT_EQ(TestInterstitialPage::CANCELED, state1); | 2229 EXPECT_EQ(TestInterstitialPage::CANCELED, state1); |
2132 // The 2nd one should still be OK. | 2230 // The 2nd one should still be OK. |
2133 EXPECT_EQ(TestInterstitialPage::UNDECIDED, state2); | 2231 EXPECT_EQ(TestInterstitialPage::UNDECIDED, state2); |
2134 | 2232 |
2135 RunAllPendingInMessageLoop(); | 2233 RunAllPendingInMessageLoop(); |
2136 EXPECT_TRUE(deleted1); | 2234 EXPECT_TRUE(deleted1); |
2137 ASSERT_FALSE(deleted2); | 2235 ASSERT_FALSE(deleted2); |
2138 | 2236 |
2139 // Make the interstitial navigation commit it should be showing. | 2237 // Make the interstitial navigation commit it should be showing. |
2140 interstitial2->TestDidNavigate(1, interstitial_url); | 2238 interstitial2->TestDidNavigate(1, interstitial_entry_id, true, |
| 2239 interstitial_url); |
2141 EXPECT_EQ(interstitial2, contents()->GetInterstitialPage()); | 2240 EXPECT_EQ(interstitial2, contents()->GetInterstitialPage()); |
2142 } | 2241 } |
2143 | 2242 |
2144 // Test showing an interstitial and have its renderer crash. | 2243 // Test showing an interstitial and have its renderer crash. |
2145 TEST_F(WebContentsImplTest, InterstitialCrasher) { | 2244 TEST_F(WebContentsImplTest, InterstitialCrasher) { |
2146 // Show an interstitial. | 2245 // Show an interstitial. |
2147 TestInterstitialPage::InterstitialState state = | 2246 TestInterstitialPage::InterstitialState state = |
2148 TestInterstitialPage::INVALID; | 2247 TestInterstitialPage::INVALID; |
2149 bool deleted = false; | 2248 bool deleted = false; |
2150 GURL url("http://interstitial"); | 2249 GURL url("http://interstitial"); |
2151 TestInterstitialPage* interstitial = | 2250 TestInterstitialPage* interstitial = |
2152 new TestInterstitialPage(contents(), true, url, &state, &deleted); | 2251 new TestInterstitialPage(contents(), true, url, &state, &deleted); |
2153 TestInterstitialPageStateGuard state_guard(interstitial); | 2252 TestInterstitialPageStateGuard state_guard(interstitial); |
2154 interstitial->Show(); | 2253 interstitial->Show(); |
2155 // Simulate a renderer crash before the interstitial is shown. | 2254 // Simulate a renderer crash before the interstitial is shown. |
2156 interstitial->TestRenderViewTerminated( | 2255 interstitial->TestRenderViewTerminated( |
2157 base::TERMINATION_STATUS_PROCESS_CRASHED, -1); | 2256 base::TERMINATION_STATUS_PROCESS_CRASHED, -1); |
2158 // The interstitial should have been dismissed. | 2257 // The interstitial should have been dismissed. |
2159 EXPECT_EQ(TestInterstitialPage::CANCELED, state); | 2258 EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
2160 RunAllPendingInMessageLoop(); | 2259 RunAllPendingInMessageLoop(); |
2161 EXPECT_TRUE(deleted); | 2260 EXPECT_TRUE(deleted); |
2162 | 2261 |
2163 // Now try again but this time crash the intersitial after it was shown. | 2262 // Now try again but this time crash the intersitial after it was shown. |
2164 interstitial = | 2263 interstitial = |
2165 new TestInterstitialPage(contents(), true, url, &state, &deleted); | 2264 new TestInterstitialPage(contents(), true, url, &state, &deleted); |
2166 interstitial->Show(); | 2265 interstitial->Show(); |
2167 interstitial->TestDidNavigate(1, url); | 2266 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
| 2267 interstitial->TestDidNavigate(1, interstitial_entry_id, true, url); |
2168 // Simulate a renderer crash. | 2268 // Simulate a renderer crash. |
2169 interstitial->TestRenderViewTerminated( | 2269 interstitial->TestRenderViewTerminated( |
2170 base::TERMINATION_STATUS_PROCESS_CRASHED, -1); | 2270 base::TERMINATION_STATUS_PROCESS_CRASHED, -1); |
2171 // The interstitial should have been dismissed. | 2271 // The interstitial should have been dismissed. |
2172 EXPECT_EQ(TestInterstitialPage::CANCELED, state); | 2272 EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
2173 RunAllPendingInMessageLoop(); | 2273 RunAllPendingInMessageLoop(); |
2174 EXPECT_TRUE(deleted); | 2274 EXPECT_TRUE(deleted); |
2175 } | 2275 } |
2176 | 2276 |
2177 // Tests that showing an interstitial as a result of a browser initiated | 2277 // Tests that showing an interstitial as a result of a browser initiated |
2178 // navigation while an interstitial is showing does not remove the pending | 2278 // navigation while an interstitial is showing does not remove the pending |
2179 // entry (see http://crbug.com/9791). | 2279 // entry (see http://crbug.com/9791). |
2180 TEST_F(WebContentsImplTest, NewInterstitialDoesNotCancelPendingEntry) { | 2280 TEST_F(WebContentsImplTest, NewInterstitialDoesNotCancelPendingEntry) { |
2181 const char kUrl[] = "http://www.badguys.com/"; | 2281 const char kUrl[] = "http://www.badguys.com/"; |
2182 const GURL kGURL(kUrl); | 2282 const GURL kGURL(kUrl); |
2183 | 2283 |
2184 // Start a navigation to a page | 2284 // Start a navigation to a page |
2185 contents()->GetController().LoadURL( | 2285 contents()->GetController().LoadURL( |
2186 kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 2286 kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
2187 | 2287 |
2188 // Simulate that navigation triggering an interstitial. | 2288 // Simulate that navigation triggering an interstitial. |
2189 TestInterstitialPage::InterstitialState state = | 2289 TestInterstitialPage::InterstitialState state = |
2190 TestInterstitialPage::INVALID; | 2290 TestInterstitialPage::INVALID; |
2191 bool deleted = false; | 2291 bool deleted = false; |
2192 TestInterstitialPage* interstitial = | 2292 TestInterstitialPage* interstitial = |
2193 new TestInterstitialPage(contents(), true, kGURL, &state, &deleted); | 2293 new TestInterstitialPage(contents(), true, kGURL, &state, &deleted); |
2194 TestInterstitialPageStateGuard state_guard(interstitial); | 2294 TestInterstitialPageStateGuard state_guard(interstitial); |
2195 interstitial->Show(); | 2295 interstitial->Show(); |
2196 interstitial->TestDidNavigate(1, kGURL); | 2296 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
| 2297 interstitial->TestDidNavigate(1, interstitial_entry_id, true, kGURL); |
2197 | 2298 |
2198 // Initiate a new navigation from the browser that also triggers an | 2299 // Initiate a new navigation from the browser that also triggers an |
2199 // interstitial. | 2300 // interstitial. |
2200 contents()->GetController().LoadURL( | 2301 contents()->GetController().LoadURL( |
2201 kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 2302 kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
2202 TestInterstitialPage::InterstitialState state2 = | 2303 TestInterstitialPage::InterstitialState state2 = |
2203 TestInterstitialPage::INVALID; | 2304 TestInterstitialPage::INVALID; |
2204 bool deleted2 = false; | 2305 bool deleted2 = false; |
2205 TestInterstitialPage* interstitial2 = | 2306 TestInterstitialPage* interstitial2 = |
2206 new TestInterstitialPage(contents(), true, kGURL, &state2, &deleted2); | 2307 new TestInterstitialPage(contents(), true, kGURL, &state2, &deleted2); |
2207 TestInterstitialPageStateGuard state_guard2(interstitial2); | 2308 TestInterstitialPageStateGuard state_guard2(interstitial2); |
2208 interstitial2->Show(); | 2309 interstitial2->Show(); |
2209 interstitial2->TestDidNavigate(1, kGURL); | 2310 interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
| 2311 interstitial2->TestDidNavigate(1, interstitial_entry_id, true, kGURL); |
2210 | 2312 |
2211 // Make sure we still have an entry. | 2313 // Make sure we still have an entry. |
2212 NavigationEntry* entry = contents()->GetController().GetPendingEntry(); | 2314 NavigationEntry* entry = contents()->GetController().GetPendingEntry(); |
2213 ASSERT_TRUE(entry); | 2315 ASSERT_TRUE(entry); |
2214 EXPECT_EQ(kUrl, entry->GetURL().spec()); | 2316 EXPECT_EQ(kUrl, entry->GetURL().spec()); |
2215 | 2317 |
2216 // And that the first interstitial is gone, but not the second. | 2318 // And that the first interstitial is gone, but not the second. |
2217 EXPECT_EQ(TestInterstitialPage::CANCELED, state); | 2319 EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
2218 EXPECT_EQ(TestInterstitialPage::UNDECIDED, state2); | 2320 EXPECT_EQ(TestInterstitialPage::UNDECIDED, state2); |
2219 RunAllPendingInMessageLoop(); | 2321 RunAllPendingInMessageLoop(); |
2220 EXPECT_TRUE(deleted); | 2322 EXPECT_TRUE(deleted); |
2221 EXPECT_FALSE(deleted2); | 2323 EXPECT_FALSE(deleted2); |
2222 } | 2324 } |
2223 | 2325 |
2224 // Tests that Javascript messages are not shown while an interstitial is | 2326 // Tests that Javascript messages are not shown while an interstitial is |
2225 // showing. | 2327 // showing. |
2226 TEST_F(WebContentsImplTest, NoJSMessageOnInterstitials) { | 2328 TEST_F(WebContentsImplTest, NoJSMessageOnInterstitials) { |
2227 const char kUrl[] = "http://www.badguys.com/"; | 2329 const char kUrl[] = "http://www.badguys.com/"; |
2228 const GURL kGURL(kUrl); | 2330 const GURL kGURL(kUrl); |
2229 | 2331 |
2230 // Start a navigation to a page | 2332 // Start a navigation to a page |
2231 contents()->GetController().LoadURL( | 2333 contents()->GetController().LoadURL( |
2232 kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 2334 kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 2335 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
2233 // DidNavigate from the page | 2336 // DidNavigate from the page |
2234 contents()->TestDidNavigate( | 2337 contents()->TestDidNavigate(contents()->GetMainFrame(), 1, entry_id, true, |
2235 contents()->GetMainFrame(), 1, kGURL, ui::PAGE_TRANSITION_TYPED); | 2338 kGURL, ui::PAGE_TRANSITION_TYPED); |
2236 | 2339 |
2237 // Simulate showing an interstitial while the page is showing. | 2340 // Simulate showing an interstitial while the page is showing. |
2238 TestInterstitialPage::InterstitialState state = | 2341 TestInterstitialPage::InterstitialState state = |
2239 TestInterstitialPage::INVALID; | 2342 TestInterstitialPage::INVALID; |
2240 bool deleted = false; | 2343 bool deleted = false; |
2241 TestInterstitialPage* interstitial = | 2344 TestInterstitialPage* interstitial = |
2242 new TestInterstitialPage(contents(), true, kGURL, &state, &deleted); | 2345 new TestInterstitialPage(contents(), true, kGURL, &state, &deleted); |
2243 TestInterstitialPageStateGuard state_guard(interstitial); | 2346 TestInterstitialPageStateGuard state_guard(interstitial); |
2244 interstitial->Show(); | 2347 interstitial->Show(); |
2245 interstitial->TestDidNavigate(1, kGURL); | 2348 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
| 2349 interstitial->TestDidNavigate(1, interstitial_entry_id, true, kGURL); |
2246 | 2350 |
2247 // While the interstitial is showing, let's simulate the hidden page | 2351 // While the interstitial is showing, let's simulate the hidden page |
2248 // attempting to show a JS message. | 2352 // attempting to show a JS message. |
2249 IPC::Message* dummy_message = new IPC::Message; | 2353 IPC::Message* dummy_message = new IPC::Message; |
2250 contents()->RunJavaScriptMessage(contents()->GetMainFrame(), | 2354 contents()->RunJavaScriptMessage(contents()->GetMainFrame(), |
2251 base::ASCIIToUTF16("This is an informative message"), | 2355 base::ASCIIToUTF16("This is an informative message"), |
2252 base::ASCIIToUTF16("OK"), | 2356 base::ASCIIToUTF16("OK"), |
2253 kGURL, JAVASCRIPT_MESSAGE_TYPE_ALERT, dummy_message); | 2357 kGURL, JAVASCRIPT_MESSAGE_TYPE_ALERT, dummy_message); |
2254 EXPECT_TRUE(contents()->last_dialog_suppressed_); | 2358 EXPECT_TRUE(contents()->last_dialog_suppressed_); |
2255 } | 2359 } |
2256 | 2360 |
2257 // Makes sure that if the source passed to CopyStateFromAndPrune has an | 2361 // Makes sure that if the source passed to CopyStateFromAndPrune has an |
2258 // interstitial it isn't copied over to the destination. | 2362 // interstitial it isn't copied over to the destination. |
2259 TEST_F(WebContentsImplTest, CopyStateFromAndPruneSourceInterstitial) { | 2363 TEST_F(WebContentsImplTest, CopyStateFromAndPruneSourceInterstitial) { |
2260 // Navigate to a page. | 2364 // Navigate to a page. |
2261 GURL url1("http://www.google.com"); | 2365 GURL url1("http://www.google.com"); |
2262 contents()->GetMainFrame()->SendNavigate(1, url1); | 2366 contents()->GetMainFrame()->SendNavigate(1, 0, true, url1); |
2263 EXPECT_EQ(1, controller().GetEntryCount()); | 2367 EXPECT_EQ(1, controller().GetEntryCount()); |
2264 | 2368 |
2265 // Initiate a browser navigation that will trigger the interstitial | 2369 // Initiate a browser navigation that will trigger the interstitial |
2266 controller().LoadURL(GURL("http://www.evil.com"), Referrer(), | 2370 controller().LoadURL(GURL("http://www.evil.com"), Referrer(), |
2267 ui::PAGE_TRANSITION_TYPED, std::string()); | 2371 ui::PAGE_TRANSITION_TYPED, std::string()); |
2268 | 2372 |
2269 // Show an interstitial. | 2373 // Show an interstitial. |
2270 TestInterstitialPage::InterstitialState state = | 2374 TestInterstitialPage::InterstitialState state = |
2271 TestInterstitialPage::INVALID; | 2375 TestInterstitialPage::INVALID; |
2272 bool deleted = false; | 2376 bool deleted = false; |
2273 GURL url2("http://interstitial"); | 2377 GURL url2("http://interstitial"); |
2274 TestInterstitialPage* interstitial = | 2378 TestInterstitialPage* interstitial = |
2275 new TestInterstitialPage(contents(), true, url2, &state, &deleted); | 2379 new TestInterstitialPage(contents(), true, url2, &state, &deleted); |
2276 TestInterstitialPageStateGuard state_guard(interstitial); | 2380 TestInterstitialPageStateGuard state_guard(interstitial); |
2277 interstitial->Show(); | 2381 interstitial->Show(); |
2278 interstitial->TestDidNavigate(1, url2); | 2382 int interstitial_entry_id = controller().GetTransientEntry()->GetUniqueID(); |
| 2383 interstitial->TestDidNavigate(1, interstitial_entry_id, true, url2); |
2279 EXPECT_TRUE(interstitial->is_showing()); | 2384 EXPECT_TRUE(interstitial->is_showing()); |
2280 EXPECT_EQ(2, controller().GetEntryCount()); | 2385 EXPECT_EQ(2, controller().GetEntryCount()); |
2281 | 2386 |
2282 // Create another NavigationController. | 2387 // Create another NavigationController. |
2283 GURL url3("http://foo2"); | 2388 GURL url3("http://foo2"); |
2284 scoped_ptr<TestWebContents> other_contents( | 2389 scoped_ptr<TestWebContents> other_contents( |
2285 static_cast<TestWebContents*>(CreateTestWebContents())); | 2390 static_cast<TestWebContents*>(CreateTestWebContents())); |
2286 NavigationControllerImpl& other_controller = other_contents->GetController(); | 2391 NavigationControllerImpl& other_controller = other_contents->GetController(); |
2287 other_contents->NavigateAndCommit(url3); | 2392 other_contents->NavigateAndCommit(url3); |
2288 other_contents->ExpectSetHistoryOffsetAndLength(1, 2); | 2393 other_contents->ExpectSetHistoryOffsetAndLength(1, 2); |
(...skipping 28 matching lines...) Expand all Loading... |
2317 // Show an interstitial. | 2422 // Show an interstitial. |
2318 TestInterstitialPage::InterstitialState state = | 2423 TestInterstitialPage::InterstitialState state = |
2319 TestInterstitialPage::INVALID; | 2424 TestInterstitialPage::INVALID; |
2320 bool deleted = false; | 2425 bool deleted = false; |
2321 GURL url3("http://interstitial"); | 2426 GURL url3("http://interstitial"); |
2322 TestInterstitialPage* interstitial = | 2427 TestInterstitialPage* interstitial = |
2323 new TestInterstitialPage(other_contents.get(), true, url3, &state, | 2428 new TestInterstitialPage(other_contents.get(), true, url3, &state, |
2324 &deleted); | 2429 &deleted); |
2325 TestInterstitialPageStateGuard state_guard(interstitial); | 2430 TestInterstitialPageStateGuard state_guard(interstitial); |
2326 interstitial->Show(); | 2431 interstitial->Show(); |
2327 interstitial->TestDidNavigate(1, url3); | 2432 int interstitial_entry_id = |
| 2433 other_controller.GetTransientEntry()->GetUniqueID(); |
| 2434 interstitial->TestDidNavigate(1, interstitial_entry_id, true, url3); |
2328 EXPECT_TRUE(interstitial->is_showing()); | 2435 EXPECT_TRUE(interstitial->is_showing()); |
2329 EXPECT_EQ(2, other_controller.GetEntryCount()); | 2436 EXPECT_EQ(2, other_controller.GetEntryCount()); |
2330 | 2437 |
2331 // Ensure that we do not allow calling CopyStateFromAndPrune when an | 2438 // Ensure that we do not allow calling CopyStateFromAndPrune when an |
2332 // interstitial is showing in the target. | 2439 // interstitial is showing in the target. |
2333 EXPECT_FALSE(other_controller.CanPruneAllButLastCommitted()); | 2440 EXPECT_FALSE(other_controller.CanPruneAllButLastCommitted()); |
2334 } | 2441 } |
2335 | 2442 |
2336 // Regression test for http://crbug.com/168611 - the URLs passed by the | 2443 // Regression test for http://crbug.com/168611 - the URLs passed by the |
2337 // DidFinishLoad and DidFailLoadWithError IPCs should get filtered. | 2444 // DidFinishLoad and DidFailLoadWithError IPCs should get filtered. |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2754 const GURL bar_url("http://bar.chromium.org"); | 2861 const GURL bar_url("http://bar.chromium.org"); |
2755 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 2862 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
2756 | 2863 |
2757 // Use a WebContentsObserver to approximate the behavior of the tab's spinner. | 2864 // Use a WebContentsObserver to approximate the behavior of the tab's spinner. |
2758 LoadingWebContentsObserver observer(contents()); | 2865 LoadingWebContentsObserver observer(contents()); |
2759 | 2866 |
2760 // Navigate the main RenderFrame, simulate the DidStartLoading, and commit. | 2867 // Navigate the main RenderFrame, simulate the DidStartLoading, and commit. |
2761 // The frame should still be loading. | 2868 // The frame should still be loading. |
2762 controller().LoadURL( | 2869 controller().LoadURL( |
2763 main_url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 2870 main_url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 2871 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
2764 orig_rfh->OnMessageReceived( | 2872 orig_rfh->OnMessageReceived( |
2765 FrameHostMsg_DidStartLoading(orig_rfh->GetRoutingID(), false)); | 2873 FrameHostMsg_DidStartLoading(orig_rfh->GetRoutingID(), false)); |
2766 contents()->TestDidNavigate(orig_rfh, 1, main_url, ui::PAGE_TRANSITION_TYPED); | 2874 contents()->TestDidNavigate(orig_rfh, 1, entry_id, true, main_url, |
| 2875 ui::PAGE_TRANSITION_TYPED); |
2767 EXPECT_FALSE(contents()->cross_navigation_pending()); | 2876 EXPECT_FALSE(contents()->cross_navigation_pending()); |
2768 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 2877 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
2769 EXPECT_TRUE(contents()->IsLoading()); | 2878 EXPECT_TRUE(contents()->IsLoading()); |
2770 EXPECT_TRUE(observer.is_loading()); | 2879 EXPECT_TRUE(observer.is_loading()); |
2771 | 2880 |
2772 // Create a child frame to navigate multiple times. | 2881 // Create a child frame to navigate multiple times. |
2773 TestRenderFrameHost* subframe = orig_rfh->AppendChild("subframe"); | 2882 TestRenderFrameHost* subframe = orig_rfh->AppendChild("subframe"); |
2774 | 2883 |
2775 // Navigate the child frame to about:blank, which will send both | 2884 // Navigate the child frame to about:blank, which will send both |
2776 // DidStartLoading and DidStopLoading messages. | 2885 // DidStartLoading and DidStopLoading messages. |
2777 { | 2886 { |
2778 subframe->OnMessageReceived( | 2887 subframe->OnMessageReceived( |
2779 FrameHostMsg_DidStartLoading(subframe->GetRoutingID(), true)); | 2888 FrameHostMsg_DidStartLoading(subframe->GetRoutingID(), true)); |
2780 subframe->SendNavigateWithTransition( | 2889 subframe->SendNavigateWithTransition(1, 0, false, GURL("about:blank"), |
2781 1, GURL("about:blank"), ui::PAGE_TRANSITION_AUTO_SUBFRAME); | 2890 ui::PAGE_TRANSITION_AUTO_SUBFRAME); |
2782 subframe->OnMessageReceived( | 2891 subframe->OnMessageReceived( |
2783 FrameHostMsg_DidStopLoading(subframe->GetRoutingID())); | 2892 FrameHostMsg_DidStopLoading(subframe->GetRoutingID())); |
2784 } | 2893 } |
2785 | 2894 |
2786 // Navigate the frame to another URL, which will send again | 2895 // Navigate the frame to another URL, which will send again |
2787 // DidStartLoading and DidStopLoading messages. | 2896 // DidStartLoading and DidStopLoading messages. |
2788 { | 2897 { |
2789 subframe->OnMessageReceived( | 2898 subframe->OnMessageReceived( |
2790 FrameHostMsg_DidStartLoading(subframe->GetRoutingID(), true)); | 2899 FrameHostMsg_DidStartLoading(subframe->GetRoutingID(), true)); |
2791 subframe->SendNavigateWithTransition( | 2900 subframe->SendNavigateWithTransition(1, 0, false, foo_url, |
2792 1, foo_url, ui::PAGE_TRANSITION_AUTO_SUBFRAME); | 2901 ui::PAGE_TRANSITION_AUTO_SUBFRAME); |
2793 subframe->OnMessageReceived( | 2902 subframe->OnMessageReceived( |
2794 FrameHostMsg_DidStopLoading(subframe->GetRoutingID())); | 2903 FrameHostMsg_DidStopLoading(subframe->GetRoutingID())); |
2795 } | 2904 } |
2796 | 2905 |
2797 // Since the main frame hasn't sent any DidStopLoading messages, it is | 2906 // Since the main frame hasn't sent any DidStopLoading messages, it is |
2798 // expected that the WebContents is still in loading state. | 2907 // expected that the WebContents is still in loading state. |
2799 EXPECT_TRUE(contents()->IsLoading()); | 2908 EXPECT_TRUE(contents()->IsLoading()); |
2800 EXPECT_TRUE(observer.is_loading()); | 2909 EXPECT_TRUE(observer.is_loading()); |
2801 | 2910 |
2802 // Navigate the frame again, this time using LoadURLWithParams. This causes | 2911 // Navigate the frame again, this time using LoadURLWithParams. This causes |
2803 // RenderFrameHost to call into WebContents::DidStartLoading, which starts | 2912 // RenderFrameHost to call into WebContents::DidStartLoading, which starts |
2804 // the spinner. | 2913 // the spinner. |
2805 { | 2914 { |
2806 NavigationController::LoadURLParams load_params(bar_url); | 2915 NavigationController::LoadURLParams load_params(bar_url); |
2807 load_params.referrer = | 2916 load_params.referrer = |
2808 Referrer(GURL("http://referrer"), blink::WebReferrerPolicyDefault); | 2917 Referrer(GURL("http://referrer"), blink::WebReferrerPolicyDefault); |
2809 load_params.transition_type = ui::PAGE_TRANSITION_GENERATED; | 2918 load_params.transition_type = ui::PAGE_TRANSITION_GENERATED; |
2810 load_params.extra_headers = "content-type: text/plain"; | 2919 load_params.extra_headers = "content-type: text/plain"; |
2811 load_params.load_type = NavigationController::LOAD_TYPE_DEFAULT; | 2920 load_params.load_type = NavigationController::LOAD_TYPE_DEFAULT; |
2812 load_params.is_renderer_initiated = false; | 2921 load_params.is_renderer_initiated = false; |
2813 load_params.override_user_agent = NavigationController::UA_OVERRIDE_TRUE; | 2922 load_params.override_user_agent = NavigationController::UA_OVERRIDE_TRUE; |
2814 load_params.frame_tree_node_id = | 2923 load_params.frame_tree_node_id = |
2815 subframe->frame_tree_node()->frame_tree_node_id(); | 2924 subframe->frame_tree_node()->frame_tree_node_id(); |
2816 controller().LoadURLWithParams(load_params); | 2925 controller().LoadURLWithParams(load_params); |
| 2926 entry_id = controller().GetPendingEntry()->GetUniqueID(); |
2817 | 2927 |
2818 subframe->OnMessageReceived( | 2928 subframe->OnMessageReceived( |
2819 FrameHostMsg_DidStartLoading(subframe->GetRoutingID(), true)); | 2929 FrameHostMsg_DidStartLoading(subframe->GetRoutingID(), true)); |
2820 | 2930 |
2821 // Commit the navigation in the child frame and send the DidStopLoading | 2931 // Commit the navigation in the child frame and send the DidStopLoading |
2822 // message. | 2932 // message. |
2823 contents()->TestDidNavigate( | 2933 contents()->TestDidNavigate(subframe, 3, entry_id, true, bar_url, |
2824 subframe, 3, bar_url, ui::PAGE_TRANSITION_MANUAL_SUBFRAME); | 2934 ui::PAGE_TRANSITION_MANUAL_SUBFRAME); |
2825 subframe->OnMessageReceived( | 2935 subframe->OnMessageReceived( |
2826 FrameHostMsg_DidStopLoading(subframe->GetRoutingID())); | 2936 FrameHostMsg_DidStopLoading(subframe->GetRoutingID())); |
2827 } | 2937 } |
2828 | 2938 |
2829 // At this point the status should still be loading, since the main frame | 2939 // At this point the status should still be loading, since the main frame |
2830 // hasn't sent the DidstopLoading message yet. | 2940 // hasn't sent the DidstopLoading message yet. |
2831 EXPECT_TRUE(contents()->IsLoading()); | 2941 EXPECT_TRUE(contents()->IsLoading()); |
2832 EXPECT_TRUE(observer.is_loading()); | 2942 EXPECT_TRUE(observer.is_loading()); |
2833 | 2943 |
2834 // Send the DidStopLoading for the main frame and ensure it isn't loading | 2944 // Send the DidStopLoading for the main frame and ensure it isn't loading |
(...skipping 15 matching lines...) Expand all Loading... |
2850 const GURL kUrl3("http://www.wikipedia.org"); | 2960 const GURL kUrl3("http://www.wikipedia.org"); |
2851 | 2961 |
2852 contents()->NavigateAndCommit(kUrl1); | 2962 contents()->NavigateAndCommit(kUrl1); |
2853 | 2963 |
2854 TestRenderFrameHost* current_rfh = contents()->GetMainFrame(); | 2964 TestRenderFrameHost* current_rfh = contents()->GetMainFrame(); |
2855 | 2965 |
2856 // Start a browser-initiated cross-process navigation to |kUrl2|. There should | 2966 // Start a browser-initiated cross-process navigation to |kUrl2|. There should |
2857 // be a pending RenderFrameHost and the WebContents should be loading. | 2967 // be a pending RenderFrameHost and the WebContents should be loading. |
2858 controller().LoadURL( | 2968 controller().LoadURL( |
2859 kUrl2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 2969 kUrl2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 2970 int entry_id = controller().GetPendingEntry()->GetUniqueID(); |
2860 EXPECT_TRUE(contents()->cross_navigation_pending()); | 2971 EXPECT_TRUE(contents()->cross_navigation_pending()); |
2861 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); | 2972 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); |
2862 ASSERT_TRUE(pending_rfh); | 2973 ASSERT_TRUE(pending_rfh); |
2863 EXPECT_TRUE(contents()->IsLoading()); | 2974 EXPECT_TRUE(contents()->IsLoading()); |
2864 | 2975 |
2865 // The current RenderFrameHost starts a non user-initiated render-initiated | 2976 // The current RenderFrameHost starts a non user-initiated render-initiated |
2866 // navigation and sends a DidStartLoading IPC. The WebContents should still be | 2977 // navigation and sends a DidStartLoading IPC. The WebContents should still be |
2867 // loading. | 2978 // loading. |
2868 current_rfh->OnMessageReceived( | 2979 current_rfh->OnMessageReceived( |
2869 FrameHostMsg_DidStartLoading(current_rfh->GetRoutingID(), false)); | 2980 FrameHostMsg_DidStartLoading(current_rfh->GetRoutingID(), false)); |
2870 EXPECT_TRUE(contents()->IsLoading()); | 2981 EXPECT_TRUE(contents()->IsLoading()); |
2871 | 2982 |
2872 // Simulate the pending RenderFrameHost DidStartLoading. There should still be | 2983 // Simulate the pending RenderFrameHost DidStartLoading. There should still be |
2873 // a pending RenderFrameHost and the WebContents should still be loading. | 2984 // a pending RenderFrameHost and the WebContents should still be loading. |
2874 pending_rfh->PrepareForCommit(); | 2985 pending_rfh->PrepareForCommit(); |
2875 pending_rfh->OnMessageReceived( | 2986 pending_rfh->OnMessageReceived( |
2876 FrameHostMsg_DidStartLoading(pending_rfh->GetRoutingID(), false)); | 2987 FrameHostMsg_DidStartLoading(pending_rfh->GetRoutingID(), false)); |
2877 EXPECT_EQ(contents()->GetPendingMainFrame(), pending_rfh); | 2988 EXPECT_EQ(contents()->GetPendingMainFrame(), pending_rfh); |
2878 EXPECT_TRUE(contents()->IsLoading()); | 2989 EXPECT_TRUE(contents()->IsLoading()); |
2879 | 2990 |
2880 // Simulate the commit and DidStopLoading from the renderer-initiated | 2991 // Simulate the commit and DidStopLoading from the renderer-initiated |
2881 // navigation in the current RenderFrameHost. There should still be a pending | 2992 // navigation in the current RenderFrameHost. There should still be a pending |
2882 // RenderFrameHost and the WebContents should still be loading. | 2993 // RenderFrameHost and the WebContents should still be loading. |
2883 current_rfh->SendNavigate(1, kUrl3); | 2994 current_rfh->SendNavigate(1, 0, true, kUrl3); |
2884 current_rfh->OnMessageReceived( | 2995 current_rfh->OnMessageReceived( |
2885 FrameHostMsg_DidStopLoading(current_rfh->GetRoutingID())); | 2996 FrameHostMsg_DidStopLoading(current_rfh->GetRoutingID())); |
2886 EXPECT_EQ(contents()->GetPendingMainFrame(), pending_rfh); | 2997 EXPECT_EQ(contents()->GetPendingMainFrame(), pending_rfh); |
2887 EXPECT_TRUE(contents()->IsLoading()); | 2998 EXPECT_TRUE(contents()->IsLoading()); |
2888 | 2999 |
2889 // Commit the navigation. The formerly pending RenderFrameHost should now be | 3000 // Commit the navigation. The formerly pending RenderFrameHost should now be |
2890 // the current RenderFrameHost and the WebContents should still be loading. | 3001 // the current RenderFrameHost and the WebContents should still be loading. |
2891 contents()->TestDidNavigate(pending_rfh, 1, kUrl2, | 3002 contents()->TestDidNavigate(pending_rfh, 1, entry_id, true, kUrl2, |
2892 ui::PAGE_TRANSITION_TYPED); | 3003 ui::PAGE_TRANSITION_TYPED); |
2893 EXPECT_FALSE(contents()->GetPendingMainFrame()); | 3004 EXPECT_FALSE(contents()->GetPendingMainFrame()); |
2894 TestRenderFrameHost* new_current_rfh = contents()->GetMainFrame(); | 3005 TestRenderFrameHost* new_current_rfh = contents()->GetMainFrame(); |
2895 EXPECT_EQ(new_current_rfh, pending_rfh); | 3006 EXPECT_EQ(new_current_rfh, pending_rfh); |
2896 EXPECT_TRUE(contents()->IsLoading()); | 3007 EXPECT_TRUE(contents()->IsLoading()); |
2897 | 3008 |
2898 // Simulate the new current RenderFrameHost DidStopLoading. The WebContents | 3009 // Simulate the new current RenderFrameHost DidStopLoading. The WebContents |
2899 // should now have stopped loading. | 3010 // should now have stopped loading. |
2900 new_current_rfh->OnMessageReceived( | 3011 new_current_rfh->OnMessageReceived( |
2901 FrameHostMsg_DidStopLoading(new_current_rfh->GetRoutingID())); | 3012 FrameHostMsg_DidStopLoading(new_current_rfh->GetRoutingID())); |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3014 contents()->GetMainFrame()->OnMessageReceived( | 3125 contents()->GetMainFrame()->OnMessageReceived( |
3015 FrameHostMsg_RenderProcessGone( | 3126 FrameHostMsg_RenderProcessGone( |
3016 0, base::TERMINATION_STATUS_PROCESS_CRASHED, -1)); | 3127 0, base::TERMINATION_STATUS_PROCESS_CRASHED, -1)); |
3017 | 3128 |
3018 // Verify that all the power save blockers have been released. | 3129 // Verify that all the power save blockers have been released. |
3019 EXPECT_FALSE(contents()->has_video_power_save_blocker_for_testing()); | 3130 EXPECT_FALSE(contents()->has_video_power_save_blocker_for_testing()); |
3020 EXPECT_FALSE(contents()->has_audio_power_save_blocker_for_testing()); | 3131 EXPECT_FALSE(contents()->has_audio_power_save_blocker_for_testing()); |
3021 } | 3132 } |
3022 | 3133 |
3023 } // namespace content | 3134 } // namespace content |
OLD | NEW |