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

Side by Side Diff: content/browser/web_contents/web_contents_impl_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698