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

Side by Side Diff: content/browser/frame_host/navigator_impl_unittest.cc

Issue 914223002: PlzNavigate: Updated navigation cancel policy for renderer-initiated requests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changes from CR comments. Created 5 years, 10 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/macros.h" 6 #include "base/macros.h"
7 #include "base/time/time.h" 7 #include "base/time/time.h"
8 #include "content/browser/frame_host/navigation_controller_impl.h" 8 #include "content/browser/frame_host/navigation_controller_impl.h"
9 #include "content/browser/frame_host/navigation_entry_impl.h" 9 #include "content/browser/frame_host/navigation_entry_impl.h"
10 #include "content/browser/frame_host/navigation_request.h" 10 #include "content/browser/frame_host/navigation_request.h"
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 132
133 // Commit the navigation. 133 // Commit the navigation.
134 main_test_rfh()->SendNavigate(0, kUrl); 134 main_test_rfh()->SendNavigate(0, kUrl);
135 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, main_test_rfh()->rfh_state()); 135 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, main_test_rfh()->rfh_state());
136 EXPECT_EQ(SiteInstanceImpl::GetSiteForURL(browser_context(), kUrl), 136 EXPECT_EQ(SiteInstanceImpl::GetSiteForURL(browser_context(), kUrl),
137 main_test_rfh()->GetSiteInstance()->GetSiteURL()); 137 main_test_rfh()->GetSiteInstance()->GetSiteURL());
138 EXPECT_EQ(kUrl, contents()->GetLastCommittedURL()); 138 EXPECT_EQ(kUrl, contents()->GetLastCommittedURL());
139 EXPECT_FALSE(GetNavigationRequestForFrameTreeNode(node)); 139 EXPECT_FALSE(GetNavigationRequestForFrameTreeNode(node));
140 EXPECT_FALSE(node->render_manager()->pending_frame_host()); 140 EXPECT_FALSE(node->render_manager()->pending_frame_host());
141 141
142 // The main RFH should not have been changed, and the renderer should have 142 // The main RenderFrameHost should not have been changed, and the renderer
143 // been initialized. 143 // should have been initialized.
144 EXPECT_EQ(site_instance_id, main_test_rfh()->GetSiteInstance()->GetId()); 144 EXPECT_EQ(site_instance_id, main_test_rfh()->GetSiteInstance()->GetId());
145 EXPECT_TRUE(main_test_rfh()->IsRenderFrameLive()); 145 EXPECT_TRUE(main_test_rfh()->IsRenderFrameLive());
146 146
147 // After a navigation is finished no speculative RenderFrameHost should 147 // After a navigation is finished no speculative RenderFrameHost should
148 // exist. 148 // exist.
149 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); 149 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
150 150
151 // With PlzNavigate enabled a pending RenderFrameHost should never exist. 151 // With PlzNavigate enabled a pending RenderFrameHost should never exist.
152 EXPECT_FALSE(node->render_manager()->pending_frame_host()); 152 EXPECT_FALSE(node->render_manager()->pending_frame_host());
153 } 153 }
154 154
155 // PlzNavigate: Test a complete renderer-initiated same-site navigation. 155 // PlzNavigate: Test a complete renderer-initiated same-site navigation.
156 TEST_F(NavigatorTestWithBrowserSideNavigation, 156 TEST_F(NavigatorTestWithBrowserSideNavigation,
157 SimpleRendererInitiatedNavigation) { 157 SimpleRendererInitiatedNavigation) {
158 const GURL kUrl1("http://www.chromium.org/"); 158 const GURL kUrl1("http://www.chromium.org/");
159 const GURL kUrl2("http://www.chromium.org/Home"); 159 const GURL kUrl2("http://www.chromium.org/Home");
160 160
161 contents()->NavigateAndCommit(kUrl1); 161 contents()->NavigateAndCommit(kUrl1);
162 EXPECT_TRUE(main_test_rfh()->IsRenderFrameLive()); 162 EXPECT_TRUE(main_test_rfh()->IsRenderFrameLive());
163 163
164 // Start a renderer-initiated navigation. 164 // Start a renderer-initiated non-user-initiated navigation.
165 process()->sink().ClearMessages(); 165 process()->sink().ClearMessages();
166 main_test_rfh()->SendBeginNavigationWithURL(kUrl2); 166 main_test_rfh()->SendBeginNavigationWithURL(kUrl2, false);
167 FrameTreeNode* node = main_test_rfh()->frame_tree_node(); 167 FrameTreeNode* node = main_test_rfh()->frame_tree_node();
168 NavigationRequest* request = GetNavigationRequestForFrameTreeNode(node); 168 NavigationRequest* request = GetNavigationRequestForFrameTreeNode(node);
169 ASSERT_TRUE(request); 169 ASSERT_TRUE(request);
170 170
171 // The navigation is immediately started as there's no need to wait for 171 // The navigation is immediately started as there's no need to wait for
172 // beforeUnload to be executed. 172 // beforeUnload to be executed.
173 EXPECT_EQ(NavigationRequest::STARTED, request->state()); 173 EXPECT_EQ(NavigationRequest::STARTED, request->state());
174 EXPECT_FALSE(request->begin_params().has_user_gesture);
174 EXPECT_EQ(kUrl2, request->common_params().url); 175 EXPECT_EQ(kUrl2, request->common_params().url);
175 EXPECT_FALSE(request->browser_initiated()); 176 EXPECT_FALSE(request->browser_initiated());
176 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); 177 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
177 178
178 // Have the current RenderFrameHost commit the navigation. 179 // Have the current RenderFrameHost commit the navigation.
179 scoped_refptr<ResourceResponse> response(new ResourceResponse); 180 scoped_refptr<ResourceResponse> response(new ResourceResponse);
180 GetLoaderForNavigationRequest(request) 181 GetLoaderForNavigationRequest(request)
181 ->CallOnResponseStarted(response, MakeEmptyStream()); 182 ->CallOnResponseStarted(response, MakeEmptyStream());
182 EXPECT_TRUE(DidRenderFrameHostRequestCommit(main_test_rfh())); 183 EXPECT_TRUE(DidRenderFrameHostRequestCommit(main_test_rfh()));
183 EXPECT_EQ(NavigationRequest::RESPONSE_STARTED, request->state()); 184 EXPECT_EQ(NavigationRequest::RESPONSE_STARTED, request->state());
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 const GURL kUrl1("http://www.chromium.org/"); 369 const GURL kUrl1("http://www.chromium.org/");
369 const GURL kUrl2("http://www.google.com/"); 370 const GURL kUrl2("http://www.google.com/");
370 371
371 contents()->NavigateAndCommit(kUrl1); 372 contents()->NavigateAndCommit(kUrl1);
372 RenderFrameHostImpl* initial_rfh = main_test_rfh(); 373 RenderFrameHostImpl* initial_rfh = main_test_rfh();
373 FrameTreeNode* node = main_test_rfh()->frame_tree_node(); 374 FrameTreeNode* node = main_test_rfh()->frame_tree_node();
374 375
375 // Navigate to a different site. 376 // Navigate to a different site.
376 process()->sink().ClearMessages(); 377 process()->sink().ClearMessages();
377 RequestNavigation(node, kUrl2); 378 RequestNavigation(node, kUrl2);
378 main_test_rfh()->SendBeforeUnloadACK(true);
379 NavigationRequest* main_request = GetNavigationRequestForFrameTreeNode(node); 379 NavigationRequest* main_request = GetNavigationRequestForFrameTreeNode(node);
380 ASSERT_TRUE(main_request); 380 ASSERT_TRUE(main_request);
381 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
382
383 // Receive the beforeUnload ACK.
384 main_test_rfh()->SendBeforeUnloadACK(true);
381 EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); 385 EXPECT_TRUE(GetSpeculativeRenderFrameHost(node));
382 386
383 scoped_refptr<ResourceResponse> response(new ResourceResponse); 387 scoped_refptr<ResourceResponse> response(new ResourceResponse);
384 GetLoaderForNavigationRequest(main_request)->CallOnResponseStarted( 388 GetLoaderForNavigationRequest(main_request)->CallOnResponseStarted(
385 response, MakeEmptyStream()); 389 response, MakeEmptyStream());
386 TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node); 390 TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node);
387 ASSERT_TRUE(speculative_rfh); 391 ASSERT_TRUE(speculative_rfh);
388 EXPECT_TRUE(DidRenderFrameHostRequestCommit(speculative_rfh)); 392 EXPECT_TRUE(DidRenderFrameHostRequestCommit(speculative_rfh));
389 EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh())); 393 EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh()));
390 394
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 redirect_info.new_url = kUrl2; 427 redirect_info.new_url = kUrl2;
424 redirect_info.new_first_party_for_cookies = kUrl2; 428 redirect_info.new_first_party_for_cookies = kUrl2;
425 scoped_refptr<ResourceResponse> response(new ResourceResponse); 429 scoped_refptr<ResourceResponse> response(new ResourceResponse);
426 GetLoaderForNavigationRequest(main_request)->CallOnRequestRedirected( 430 GetLoaderForNavigationRequest(main_request)->CallOnRequestRedirected(
427 redirect_info, response); 431 redirect_info, response);
428 432
429 // The redirect should have been followed. 433 // The redirect should have been followed.
430 EXPECT_EQ(1, GetLoaderForNavigationRequest(main_request)->redirect_count()); 434 EXPECT_EQ(1, GetLoaderForNavigationRequest(main_request)->redirect_count());
431 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); 435 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
432 436
433 // Request the RenderFrameHost to commit. 437 // Have the RenderFrameHost commit the navigation.
434 response = new ResourceResponse; 438 response = new ResourceResponse;
435 GetLoaderForNavigationRequest(main_request)->CallOnResponseStarted( 439 GetLoaderForNavigationRequest(main_request)->CallOnResponseStarted(
436 response, MakeEmptyStream()); 440 response, MakeEmptyStream());
437 TestRenderFrameHost* final_speculative_rfh = 441 TestRenderFrameHost* final_speculative_rfh =
438 GetSpeculativeRenderFrameHost(node); 442 GetSpeculativeRenderFrameHost(node);
439 EXPECT_TRUE(final_speculative_rfh); 443 EXPECT_TRUE(final_speculative_rfh);
440 EXPECT_TRUE(DidRenderFrameHostRequestCommit(final_speculative_rfh)); 444 EXPECT_TRUE(DidRenderFrameHostRequestCommit(final_speculative_rfh));
441 445
442 // Commit the navigation. 446 // Commit the navigation.
443 final_speculative_rfh->SendNavigate(0, kUrl2); 447 final_speculative_rfh->SendNavigate(0, kUrl2);
(...skipping 24 matching lines...) Expand all
468 // Request navigation to the 1st URL. 472 // Request navigation to the 1st URL.
469 process()->sink().ClearMessages(); 473 process()->sink().ClearMessages();
470 RequestNavigation(node, kUrl1); 474 RequestNavigation(node, kUrl1);
471 main_test_rfh()->SendBeforeUnloadACK(true); 475 main_test_rfh()->SendBeforeUnloadACK(true);
472 NavigationRequest* request1 = GetNavigationRequestForFrameTreeNode(node); 476 NavigationRequest* request1 = GetNavigationRequestForFrameTreeNode(node);
473 ASSERT_TRUE(request1); 477 ASSERT_TRUE(request1);
474 EXPECT_EQ(kUrl1, request1->common_params().url); 478 EXPECT_EQ(kUrl1, request1->common_params().url);
475 EXPECT_TRUE(request1->browser_initiated()); 479 EXPECT_TRUE(request1->browser_initiated());
476 base::WeakPtr<TestNavigationURLLoader> loader1 = 480 base::WeakPtr<TestNavigationURLLoader> loader1 =
477 GetLoaderForNavigationRequest(request1)->AsWeakPtr(); 481 GetLoaderForNavigationRequest(request1)->AsWeakPtr();
482 EXPECT_TRUE(loader1);
478 483
479 // Confirm a speculative RFH was created. 484 // Confirm a speculative RenderFrameHost was created.
480 TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node); 485 TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node);
481 ASSERT_TRUE(speculative_rfh); 486 ASSERT_TRUE(speculative_rfh);
482 int32 site_instance_id_1 = speculative_rfh->GetSiteInstance()->GetId(); 487 int32 site_instance_id_1 = speculative_rfh->GetSiteInstance()->GetId();
483 EXPECT_EQ(kUrl1_site, speculative_rfh->GetSiteInstance()->GetSiteURL()); 488 EXPECT_EQ(kUrl1_site, speculative_rfh->GetSiteInstance()->GetSiteURL());
484 489
485 // Request navigation to the 2nd URL; the NavigationRequest must have been 490 // Request navigation to the 2nd URL; the NavigationRequest must have been
486 // replaced by a new one with a different URL. 491 // replaced by a new one with a different URL.
487 RequestNavigation(node, kUrl2); 492 RequestNavigation(node, kUrl2);
488 main_test_rfh()->SendBeforeUnloadACK(true); 493 main_test_rfh()->SendBeforeUnloadACK(true);
489 NavigationRequest* request2 = GetNavigationRequestForFrameTreeNode(node); 494 NavigationRequest* request2 = GetNavigationRequestForFrameTreeNode(node);
490 ASSERT_TRUE(request2); 495 ASSERT_TRUE(request2);
491 EXPECT_EQ(kUrl2, request2->common_params().url); 496 EXPECT_EQ(kUrl2, request2->common_params().url);
492 EXPECT_TRUE(request2->browser_initiated()); 497 EXPECT_TRUE(request2->browser_initiated());
493 498
494 // Confirm that the first loader got destroyed. 499 // Confirm that the first loader got destroyed.
495 EXPECT_FALSE(loader1); 500 EXPECT_FALSE(loader1);
496 501
497 // Confirm that a new speculative RFH was created. 502 // Confirm that a new speculative RenderFrameHost was created.
498 speculative_rfh = GetSpeculativeRenderFrameHost(node); 503 speculative_rfh = GetSpeculativeRenderFrameHost(node);
499 ASSERT_TRUE(speculative_rfh); 504 ASSERT_TRUE(speculative_rfh);
500 int32 site_instance_id_2 = speculative_rfh->GetSiteInstance()->GetId(); 505 int32 site_instance_id_2 = speculative_rfh->GetSiteInstance()->GetId();
501 EXPECT_NE(site_instance_id_1, site_instance_id_2); 506 EXPECT_NE(site_instance_id_1, site_instance_id_2);
502 507
503 // Request the RenderFrameHost to commit. 508 // Have the RenderFrameHost commit the navigation.
504 scoped_refptr<ResourceResponse> response(new ResourceResponse); 509 scoped_refptr<ResourceResponse> response(new ResourceResponse);
505 GetLoaderForNavigationRequest(request2)->CallOnResponseStarted( 510 GetLoaderForNavigationRequest(request2)->CallOnResponseStarted(
506 response, MakeEmptyStream()); 511 response, MakeEmptyStream());
507 EXPECT_TRUE(DidRenderFrameHostRequestCommit(speculative_rfh)); 512 EXPECT_TRUE(DidRenderFrameHostRequestCommit(speculative_rfh));
508 EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh())); 513 EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh()));
509 514
510 // Commit the navigation. 515 // Commit the navigation.
511 speculative_rfh->SendNavigate(0, kUrl2); 516 speculative_rfh->SendNavigate(0, kUrl2);
512 517
513 // Confirm that the commit corresponds to the new request. 518 // Confirm that the commit corresponds to the new request.
514 ASSERT_TRUE(main_test_rfh()); 519 ASSERT_TRUE(main_test_rfh());
515 EXPECT_EQ(kUrl2_site, main_test_rfh()->GetSiteInstance()->GetSiteURL()); 520 EXPECT_EQ(kUrl2_site, main_test_rfh()->GetSiteInstance()->GetSiteURL());
516 EXPECT_EQ(kUrl2, contents()->GetLastCommittedURL()); 521 EXPECT_EQ(kUrl2, contents()->GetLastCommittedURL());
517 522
518 // Confirm that the committed RFH is the latest speculative one. 523 // Confirm that the committed RenderFrameHost is the latest speculative one.
519 EXPECT_EQ(site_instance_id_2, main_test_rfh()->GetSiteInstance()->GetId()); 524 EXPECT_EQ(site_instance_id_2, main_test_rfh()->GetSiteInstance()->GetId());
520 } 525 }
521 526
527 // PlzNavigate: Test that a browser initiated navigation is canceled if a
Charlie Reis 2015/02/19 00:58:00 nit: hypenate
carlosk 2015/02/19 10:45:18 Done.
528 // renderer-initiated user-initiated request has been issued in the meantime.
529 TEST_F(NavigatorTestWithBrowserSideNavigation,
530 RendererUserInitiatedNavigationCancel) {
531 const GURL kUrl0("http://www.wikipedia.org/");
532 const GURL kUrl1("http://www.chromium.org/");
533 const GURL kUrl2("http://www.google.com/");
534
535 // Initialization.
536 contents()->NavigateAndCommit(kUrl0);
537 FrameTreeNode* node = main_test_rfh()->frame_tree_node();
538
539 // Start a browser-initiated navigation to the 1st URL and receive its
540 // beforeUnload ACK.
541 process()->sink().ClearMessages();
542 RequestNavigation(node, kUrl1);
543 main_test_rfh()->SendBeforeUnloadACK(true);
544 NavigationRequest* request1 = GetNavigationRequestForFrameTreeNode(node);
545 ASSERT_TRUE(request1);
546 EXPECT_EQ(kUrl1, request1->common_params().url);
547 EXPECT_TRUE(request1->browser_initiated());
548 base::WeakPtr<TestNavigationURLLoader> loader1 =
549 GetLoaderForNavigationRequest(request1)->AsWeakPtr();
550 EXPECT_TRUE(loader1);
551
552 // Confirm a speculative RenderFrameHost was created.
553 TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node);
554 ASSERT_TRUE(speculative_rfh);
555 int32 site_instance_id_1 = speculative_rfh->GetSiteInstance()->GetId();
556
557 // Now receive a renderer-initiated user-initiated request. It should replace
558 // the current NavigationRequest.
559 main_test_rfh()->SendBeginNavigationWithURL(kUrl2, true);
560 NavigationRequest* request2 = GetNavigationRequestForFrameTreeNode(node);
561 ASSERT_TRUE(request2);
562 EXPECT_EQ(kUrl2, request2->common_params().url);
563 EXPECT_FALSE(request2->browser_initiated());
564 EXPECT_TRUE(request2->begin_params().has_user_gesture);
565
566 // Confirm that the first loader got destroyed.
567 EXPECT_FALSE(loader1);
568
569 // Confirm that a new speculative RenderFrameHost was created.
570 speculative_rfh = GetSpeculativeRenderFrameHost(node);
571 ASSERT_TRUE(speculative_rfh);
572 int32 site_instance_id_2 = speculative_rfh->GetSiteInstance()->GetId();
573 EXPECT_NE(site_instance_id_1, site_instance_id_2);
574
575 // Have the RenderFrameHost commit the navigation.
576 scoped_refptr<ResourceResponse> response(new ResourceResponse);
577 GetLoaderForNavigationRequest(request2)
578 ->CallOnResponseStarted(response, MakeEmptyStream());
579 EXPECT_TRUE(DidRenderFrameHostRequestCommit(speculative_rfh));
580 EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh()));
581
582 // Commit the navigation.
583 speculative_rfh->SendNavigate(0, kUrl2);
584
585 // Confirm that the commit corresponds to the new request.
586 ASSERT_TRUE(main_test_rfh());
587 EXPECT_EQ(kUrl2, contents()->GetLastCommittedURL());
588
589 // Confirm that the committed RenderFrameHost is the latest speculative one.
590 EXPECT_EQ(site_instance_id_2, main_test_rfh()->GetSiteInstance()->GetId());
591 }
592
593 // PlzNavigate: Test that a renderer-initiated user-initiated navigation is NOT
594 // canceled if a renderer-initiated non-user-initiated request is issued in the
595 // meantime.
596 TEST_F(NavigatorTestWithBrowserSideNavigation,
597 RendererNonUserInitiatedNavigationDoesntCancelRendererUserInitiated) {
598 const GURL kUrl0("http://www.wikipedia.org/");
599 const GURL kUrl1("http://www.chromium.org/");
600 const GURL kUrl2("http://www.google.com/");
601
602 // Initialization.
603 contents()->NavigateAndCommit(kUrl0);
604 FrameTreeNode* node = main_test_rfh()->frame_tree_node();
605
606 // Start a renderer-initiated user-initiated navigation to the 1st URL.
607 process()->sink().ClearMessages();
608 main_test_rfh()->SendBeginNavigationWithURL(kUrl1, true);
609 NavigationRequest* request1 = GetNavigationRequestForFrameTreeNode(node);
610 ASSERT_TRUE(request1);
611 EXPECT_EQ(kUrl1, request1->common_params().url);
612 EXPECT_FALSE(request1->browser_initiated());
613 EXPECT_TRUE(request1->begin_params().has_user_gesture);
614 EXPECT_TRUE(GetSpeculativeRenderFrameHost(node));
615
616 // Now receive a renderer-initiated non-user-initiated request. Nothing should
617 // change.
618 main_test_rfh()->SendBeginNavigationWithURL(kUrl2, false);
619 NavigationRequest* request2 = GetNavigationRequestForFrameTreeNode(node);
620 ASSERT_TRUE(request2);
621 EXPECT_EQ(request1, request2);
622 EXPECT_EQ(kUrl1, request2->common_params().url);
623 EXPECT_FALSE(request2->browser_initiated());
624 EXPECT_TRUE(request2->begin_params().has_user_gesture);
625 TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node);
626 ASSERT_TRUE(speculative_rfh);
627
628 // Have the RenderFrameHost commit the navigation.
629 scoped_refptr<ResourceResponse> response(new ResourceResponse);
630 GetLoaderForNavigationRequest(request2)
631 ->CallOnResponseStarted(response, MakeEmptyStream());
632 EXPECT_TRUE(DidRenderFrameHostRequestCommit(speculative_rfh));
633 EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh()));
634
635 // Commit the navigation.
636 speculative_rfh->SendNavigate(0, kUrl1);
637 EXPECT_EQ(kUrl1, contents()->GetLastCommittedURL());
638 }
639
640 // PlzNavigate: Test that a browser-initiated navigation is NOT canceled if a
641 // renderer-initiated non-user-initiated request is issued in the meantime.
642 TEST_F(NavigatorTestWithBrowserSideNavigation,
643 RendererNonUserInitiatedNavigationDoesntCancelBrowserInitiated) {
644 const GURL kUrl0("http://www.wikipedia.org/");
645 const GURL kUrl1("http://www.chromium.org/");
646 const GURL kUrl2("http://www.google.com/");
647
648 // Initialization.
649 contents()->NavigateAndCommit(kUrl0);
650 FrameTreeNode* node = main_test_rfh()->frame_tree_node();
651
652 // Start a browser-initiated navigation to the 1st URL.
653 process()->sink().ClearMessages();
654 RequestNavigation(node, kUrl1);
655 NavigationRequest* request1 = GetNavigationRequestForFrameTreeNode(node);
656 ASSERT_TRUE(request1);
657 EXPECT_EQ(kUrl1, request1->common_params().url);
658 EXPECT_TRUE(request1->browser_initiated());
659 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
660
661 // Now receive a renderer-initiated non-user-initiated request. Nothing should
662 // change.
663 main_test_rfh()->SendBeginNavigationWithURL(kUrl2, false);
664 NavigationRequest* request2 = GetNavigationRequestForFrameTreeNode(node);
665 ASSERT_TRUE(request2);
666 EXPECT_EQ(request1, request2);
667 EXPECT_EQ(kUrl1, request2->common_params().url);
668 EXPECT_TRUE(request2->browser_initiated());
669 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
670
671 // Now receive the beforeUnload ACK from the still ongoing navigation.
672 main_test_rfh()->SendBeforeUnloadACK(true);
673 TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node);
674 ASSERT_TRUE(speculative_rfh);
675
676 // Have the RenderFrameHost commit the navigation.
677 scoped_refptr<ResourceResponse> response(new ResourceResponse);
678 GetLoaderForNavigationRequest(request2)
679 ->CallOnResponseStarted(response, MakeEmptyStream());
680 EXPECT_TRUE(DidRenderFrameHostRequestCommit(speculative_rfh));
681 EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh()));
682
683 // Commit the navigation.
684 speculative_rfh->SendNavigate(0, kUrl1);
685 EXPECT_EQ(kUrl1, contents()->GetLastCommittedURL());
686 }
687
688 // PlzNavigate: Test that a renderer-initiated non-user-initiated navigation is
689 // canceled if a another similar request is issued in the meantime.
690 TEST_F(NavigatorTestWithBrowserSideNavigation,
691 RendererNonUserInitiatedNavigationCancelSimilarNavigation) {
692 const GURL kUrl0("http://www.wikipedia.org/");
693 const GURL kUrl1("http://www.chromium.org/");
694 const GURL kUrl2("http://www.google.com/");
695
696 // Initialization.
697 contents()->NavigateAndCommit(kUrl0);
698 FrameTreeNode* node = main_test_rfh()->frame_tree_node();
699
700 // Start a renderer-initiated non-user-initiated navigation to the 1st URL.
701 process()->sink().ClearMessages();
702 main_test_rfh()->SendBeginNavigationWithURL(kUrl1, false);
703 NavigationRequest* request1 = GetNavigationRequestForFrameTreeNode(node);
704 ASSERT_TRUE(request1);
705 EXPECT_EQ(kUrl1, request1->common_params().url);
706 EXPECT_FALSE(request1->browser_initiated());
707 EXPECT_FALSE(request1->begin_params().has_user_gesture);
708 EXPECT_TRUE(GetSpeculativeRenderFrameHost(node));
709 base::WeakPtr<TestNavigationURLLoader> loader1 =
710 GetLoaderForNavigationRequest(request1)->AsWeakPtr();
711 EXPECT_TRUE(loader1);
712
713 // Now receive a 2nd similar request that should replace the current one.
714 main_test_rfh()->SendBeginNavigationWithURL(kUrl2, false);
715 NavigationRequest* request2 = GetNavigationRequestForFrameTreeNode(node);
716 EXPECT_EQ(kUrl2, request2->common_params().url);
717 EXPECT_FALSE(request2->browser_initiated());
718 EXPECT_FALSE(request2->begin_params().has_user_gesture);
719 TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node);
720 ASSERT_TRUE(speculative_rfh);
721
722 // Confirm that the first loader got destroyed.
723 EXPECT_FALSE(loader1);
724
725 // Have the RenderFrameHost commit the navigation.
726 scoped_refptr<ResourceResponse> response(new ResourceResponse);
727 GetLoaderForNavigationRequest(request2)
728 ->CallOnResponseStarted(response, MakeEmptyStream());
729 EXPECT_TRUE(DidRenderFrameHostRequestCommit(speculative_rfh));
730 EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh()));
731
732 // Commit the navigation.
733 speculative_rfh->SendNavigate(0, kUrl2);
734 EXPECT_EQ(kUrl2, contents()->GetLastCommittedURL());
735 }
736
522 // PlzNavigate: Test that a reload navigation is properly signaled to the 737 // PlzNavigate: Test that a reload navigation is properly signaled to the
523 // RenderFrame when the navigation can commit. A speculative RenderFrameHost 738 // RenderFrame when the navigation can commit. A speculative RenderFrameHost
524 // should not be created at any step. 739 // should not be created at any step.
525 TEST_F(NavigatorTestWithBrowserSideNavigation, Reload) { 740 TEST_F(NavigatorTestWithBrowserSideNavigation, Reload) {
526 const GURL kUrl("http://www.google.com/"); 741 const GURL kUrl("http://www.google.com/");
527 contents()->NavigateAndCommit(kUrl); 742 contents()->NavigateAndCommit(kUrl);
528 743
529 FrameTreeNode* node = main_test_rfh()->frame_tree_node(); 744 FrameTreeNode* node = main_test_rfh()->frame_tree_node();
530 RequestNavigationWithParameters(node, kUrl, Referrer(), 745 RequestNavigationWithParameters(node, kUrl, Referrer(),
531 ui::PAGE_TRANSITION_LINK, 746 ui::PAGE_TRANSITION_LINK,
(...skipping 28 matching lines...) Expand all
560 SpeculativeRendererWorksBaseCase) { 775 SpeculativeRendererWorksBaseCase) {
561 // Navigate to an initial site. 776 // Navigate to an initial site.
562 const GURL kUrlInit("http://wikipedia.org/"); 777 const GURL kUrlInit("http://wikipedia.org/");
563 contents()->NavigateAndCommit(kUrlInit); 778 contents()->NavigateAndCommit(kUrlInit);
564 FrameTreeNode* node = main_test_rfh()->frame_tree_node(); 779 FrameTreeNode* node = main_test_rfh()->frame_tree_node();
565 780
566 // Begin navigating to another site. 781 // Begin navigating to another site.
567 const GURL kUrl("http://google.com/"); 782 const GURL kUrl("http://google.com/");
568 process()->sink().ClearMessages(); 783 process()->sink().ClearMessages();
569 RequestNavigation(node, kUrl); 784 RequestNavigation(node, kUrl);
785 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
786
787 // Receive the beforeUnload ACK.
570 main_test_rfh()->SendBeforeUnloadACK(true); 788 main_test_rfh()->SendBeforeUnloadACK(true);
571 TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node); 789 TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node);
572 ASSERT_TRUE(speculative_rfh); 790 ASSERT_TRUE(speculative_rfh);
573 EXPECT_NE(speculative_rfh, main_test_rfh()); 791 EXPECT_NE(speculative_rfh, main_test_rfh());
574 EXPECT_EQ(SiteInstanceImpl::GetSiteForURL(browser_context(), kUrl), 792 EXPECT_EQ(SiteInstanceImpl::GetSiteForURL(browser_context(), kUrl),
575 speculative_rfh->GetSiteInstance()->GetSiteURL()); 793 speculative_rfh->GetSiteInstance()->GetSiteURL());
576 EXPECT_FALSE(node->render_manager()->pending_frame_host()); 794 EXPECT_FALSE(node->render_manager()->pending_frame_host());
577 int32 site_instance_id = speculative_rfh->GetSiteInstance()->GetId(); 795 int32 site_instance_id = speculative_rfh->GetSiteInstance()->GetId();
578 796
579 // Ask Navigator to commit the navigation by simulating a call to 797 // Ask Navigator to commit the navigation by simulating a call to
(...skipping 21 matching lines...) Expand all
601 // Navigate to an initial site. 819 // Navigate to an initial site.
602 const GURL kUrlInit("http://wikipedia.org/"); 820 const GURL kUrlInit("http://wikipedia.org/");
603 contents()->NavigateAndCommit(kUrlInit); 821 contents()->NavigateAndCommit(kUrlInit);
604 FrameTreeNode* node = main_test_rfh()->frame_tree_node(); 822 FrameTreeNode* node = main_test_rfh()->frame_tree_node();
605 int32 init_site_instance_id = main_test_rfh()->GetSiteInstance()->GetId(); 823 int32 init_site_instance_id = main_test_rfh()->GetSiteInstance()->GetId();
606 824
607 // Begin navigating to another site. 825 // Begin navigating to another site.
608 const GURL kUrl("http://google.com/"); 826 const GURL kUrl("http://google.com/");
609 process()->sink().ClearMessages(); 827 process()->sink().ClearMessages();
610 RequestNavigation(node, kUrl); 828 RequestNavigation(node, kUrl);
829 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
830
831 // Receive the beforeUnload ACK.
611 main_test_rfh()->SendBeforeUnloadACK(true); 832 main_test_rfh()->SendBeforeUnloadACK(true);
612 TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node); 833 TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node);
613 int32 site_instance_id = speculative_rfh->GetSiteInstance()->GetId(); 834 int32 site_instance_id = speculative_rfh->GetSiteInstance()->GetId();
614 EXPECT_NE(init_site_instance_id, site_instance_id); 835 EXPECT_NE(init_site_instance_id, site_instance_id);
615 EXPECT_EQ(init_site_instance_id, main_test_rfh()->GetSiteInstance()->GetId()); 836 EXPECT_EQ(init_site_instance_id, main_test_rfh()->GetSiteInstance()->GetId());
616 ASSERT_TRUE(speculative_rfh); 837 ASSERT_TRUE(speculative_rfh);
617 EXPECT_NE(speculative_rfh, main_test_rfh()); 838 EXPECT_NE(speculative_rfh, main_test_rfh());
618 EXPECT_EQ(SiteInstanceImpl::GetSiteForURL(browser_context(), kUrl), 839 EXPECT_EQ(SiteInstanceImpl::GetSiteForURL(browser_context(), kUrl),
619 speculative_rfh->GetSiteInstance()->GetSiteURL()); 840 speculative_rfh->GetSiteInstance()->GetSiteURL());
620 841
621 // It then redirects to yet another site. 842 // It then redirects to yet another site.
622 NavigationRequest* main_request = GetNavigationRequestForFrameTreeNode(node); 843 NavigationRequest* main_request = GetNavigationRequestForFrameTreeNode(node);
623 ASSERT_TRUE(main_request); 844 ASSERT_TRUE(main_request);
624 const GURL kUrlRedirect("https://www.google.com/"); 845 const GURL kUrlRedirect("https://www.google.com/");
625 net::RedirectInfo redirect_info; 846 net::RedirectInfo redirect_info;
626 redirect_info.status_code = 302; 847 redirect_info.status_code = 302;
627 redirect_info.new_method = "GET"; 848 redirect_info.new_method = "GET";
628 redirect_info.new_url = kUrlRedirect; 849 redirect_info.new_url = kUrlRedirect;
629 redirect_info.new_first_party_for_cookies = kUrlRedirect; 850 redirect_info.new_first_party_for_cookies = kUrlRedirect;
630 scoped_refptr<ResourceResponse> response(new ResourceResponse); 851 scoped_refptr<ResourceResponse> response(new ResourceResponse);
631 GetLoaderForNavigationRequest(main_request) 852 GetLoaderForNavigationRequest(main_request)
632 ->CallOnRequestRedirected(redirect_info, response); 853 ->CallOnRequestRedirected(redirect_info, response);
633 EXPECT_EQ(init_site_instance_id, main_test_rfh()->GetSiteInstance()->GetId()); 854 EXPECT_EQ(init_site_instance_id, main_test_rfh()->GetSiteInstance()->GetId());
634 speculative_rfh = GetSpeculativeRenderFrameHost(node); 855 speculative_rfh = GetSpeculativeRenderFrameHost(node);
635 ASSERT_TRUE(speculative_rfh); 856 ASSERT_TRUE(speculative_rfh);
636 857
637 // For now, ensure that the speculative RFH does not change after the 858 // For now, ensure that the speculative RenderFrameHost does not change after
638 // redirect. 859 // the redirect.
639 // TODO(carlosk): once the speculative RenderFrameHost updates with redirects 860 // TODO(carlosk): once the speculative RenderFrameHost updates with redirects
640 // this next check will be changed to verify that it actually happens. 861 // this next check will be changed to verify that it actually happens.
641 EXPECT_EQ(site_instance_id, speculative_rfh->GetSiteInstance()->GetId()); 862 EXPECT_EQ(site_instance_id, speculative_rfh->GetSiteInstance()->GetId());
642 863
643 // Commit the navigation with Navigator by simulating the call to 864 // Commit the navigation with Navigator by simulating the call to
644 // OnResponseStarted. 865 // OnResponseStarted.
645 response = new ResourceResponse; 866 response = new ResourceResponse;
646 GetLoaderForNavigationRequest(main_request) 867 GetLoaderForNavigationRequest(main_request)
647 ->CallOnResponseStarted(response, MakeEmptyStream()); 868 ->CallOnResponseStarted(response, MakeEmptyStream());
648 speculative_rfh = GetSpeculativeRenderFrameHost(node); 869 speculative_rfh = GetSpeculativeRenderFrameHost(node);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, main_test_rfh()->rfh_state()); 912 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, main_test_rfh()->rfh_state());
692 EXPECT_TRUE(rfhm->IsOnSwappedOutList(rfh1)); 913 EXPECT_TRUE(rfhm->IsOnSwappedOutList(rfh1));
693 914
694 // Now go back to the initial site so that the swapped out RenderFrameHost 915 // Now go back to the initial site so that the swapped out RenderFrameHost
695 // should be reused. 916 // should be reused.
696 process()->sink().ClearMessages(); 917 process()->sink().ClearMessages();
697 static_cast<MockRenderProcessHost*>(rfh1->GetProcess()) 918 static_cast<MockRenderProcessHost*>(rfh1->GetProcess())
698 ->sink() 919 ->sink()
699 .ClearMessages(); 920 .ClearMessages();
700 RequestNavigation(node, kUrl1); 921 RequestNavigation(node, kUrl1);
922 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
923
701 main_test_rfh()->SendBeforeUnloadACK(true); 924 main_test_rfh()->SendBeforeUnloadACK(true);
702 EXPECT_EQ(rfh1, GetSpeculativeRenderFrameHost(node)); 925 EXPECT_EQ(rfh1, GetSpeculativeRenderFrameHost(node));
703 EXPECT_NE(RenderFrameHostImpl::STATE_DEFAULT, 926 EXPECT_NE(RenderFrameHostImpl::STATE_DEFAULT,
704 GetSpeculativeRenderFrameHost(node)->rfh_state()); 927 GetSpeculativeRenderFrameHost(node)->rfh_state());
705 928
706 scoped_refptr<ResourceResponse> response(new ResourceResponse); 929 scoped_refptr<ResourceResponse> response(new ResourceResponse);
707 GetLoaderForNavigationRequest(GetNavigationRequestForFrameTreeNode(node)) 930 GetLoaderForNavigationRequest(GetNavigationRequestForFrameTreeNode(node))
708 ->CallOnResponseStarted(response, MakeEmptyStream()); 931 ->CallOnResponseStarted(response, MakeEmptyStream());
709 EXPECT_EQ(rfh1, GetSpeculativeRenderFrameHost(node)); 932 EXPECT_EQ(rfh1, GetSpeculativeRenderFrameHost(node));
710 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, 933 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT,
711 GetSpeculativeRenderFrameHost(node)->rfh_state()); 934 GetSpeculativeRenderFrameHost(node)->rfh_state());
712 EXPECT_TRUE(DidRenderFrameHostRequestCommit(rfh1)); 935 EXPECT_TRUE(DidRenderFrameHostRequestCommit(rfh1));
713 EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh())); 936 EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh()));
714 937
715 rfh1->SendNavigate(1, kUrl1); 938 rfh1->SendNavigate(1, kUrl1);
716 EXPECT_EQ(rfh1, main_test_rfh()); 939 EXPECT_EQ(rfh1, main_test_rfh());
717 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state()); 940 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state());
718 EXPECT_FALSE(rfhm->IsOnSwappedOutList(rfh1)); 941 EXPECT_FALSE(rfhm->IsOnSwappedOutList(rfh1));
719 } 942 }
720 943
721 } // namespace content 944 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/navigator_impl.cc ('k') | content/browser/frame_host/render_frame_host_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698