Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 193 EXPECT_FALSE(node->render_manager()->pending_frame_host()); | 193 EXPECT_FALSE(node->render_manager()->pending_frame_host()); |
| 194 } | 194 } |
| 195 | 195 |
| 196 // PlzNavigate: Test that a beforeUnload denial cancels the navigation. | 196 // PlzNavigate: Test that a beforeUnload denial cancels the navigation. |
| 197 TEST_F(NavigatorTestWithBrowserSideNavigation, | 197 TEST_F(NavigatorTestWithBrowserSideNavigation, |
| 198 BeforeUnloadDenialCancelNavigation) { | 198 BeforeUnloadDenialCancelNavigation) { |
| 199 const GURL kUrl1("http://www.google.com/"); | 199 const GURL kUrl1("http://www.google.com/"); |
| 200 const GURL kUrl2("http://www.chromium.org/"); | 200 const GURL kUrl2("http://www.chromium.org/"); |
| 201 | 201 |
| 202 contents()->NavigateAndCommit(kUrl1); | 202 contents()->NavigateAndCommit(kUrl1); |
| 203 main_test_rfh()->SendBeforeUnloadHandlersPresent(true); | |
| 203 | 204 |
| 204 // Start a new navigation. | 205 // Start a new navigation. |
| 205 FrameTreeNode* node = main_test_rfh()->frame_tree_node(); | 206 FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
| 206 RequestNavigation(node, kUrl2); | 207 RequestNavigation(node, kUrl2); |
| 207 NavigationRequest* request = GetNavigationRequestForFrameTreeNode(node); | 208 NavigationRequest* request = GetNavigationRequestForFrameTreeNode(node); |
| 208 ASSERT_TRUE(request); | 209 ASSERT_TRUE(request); |
| 209 EXPECT_TRUE(request->browser_initiated()); | 210 EXPECT_TRUE(request->browser_initiated()); |
| 210 EXPECT_EQ(NavigationRequest::WAITING_FOR_RENDERER_RESPONSE, request->state()); | 211 EXPECT_EQ(NavigationRequest::WAITING_FOR_RENDERER_RESPONSE, request->state()); |
| 211 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); | 212 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 212 | 213 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 260 EXPECT_TRUE(GetSpeculativeRenderFrameHost(subframe_node)); | 261 EXPECT_TRUE(GetSpeculativeRenderFrameHost(subframe_node)); |
| 261 } else { | 262 } else { |
| 262 EXPECT_FALSE(GetSpeculativeRenderFrameHost(subframe_node)); | 263 EXPECT_FALSE(GetSpeculativeRenderFrameHost(subframe_node)); |
| 263 } | 264 } |
| 264 | 265 |
| 265 // Now start a navigation at the root node. | 266 // Now start a navigation at the root node. |
| 266 RequestNavigation(root_node, kUrl3); | 267 RequestNavigation(root_node, kUrl3); |
| 267 NavigationRequest* main_request = | 268 NavigationRequest* main_request = |
| 268 GetNavigationRequestForFrameTreeNode(root_node); | 269 GetNavigationRequestForFrameTreeNode(root_node); |
| 269 ASSERT_TRUE(main_request); | 270 ASSERT_TRUE(main_request); |
| 270 EXPECT_EQ(NavigationRequest::WAITING_FOR_RENDERER_RESPONSE, | 271 EXPECT_EQ(NavigationRequest::STARTED, main_request->state()); |
| 271 main_request->state()); | |
| 272 EXPECT_FALSE(GetSpeculativeRenderFrameHost(root_node)); | |
| 273 | |
| 274 // Simulate a BeforeUnloadACK IPC on the main frame. | |
| 275 main_test_rfh()->SendBeforeUnloadACK(true); | |
|
Charlie Reis
2015/02/17 23:04:31
We should include a PlzNavigate test for the case
clamy
2015/02/18 13:27:23
I added a test to check that we properly wait befo
Charlie Reis
2015/02/19 00:33:44
Acknowledged.
| |
| 276 TestNavigationURLLoader* main_loader = | 272 TestNavigationURLLoader* main_loader = |
| 277 GetLoaderForNavigationRequest(main_request); | 273 GetLoaderForNavigationRequest(main_request); |
| 278 EXPECT_EQ(kUrl3, main_request->common_params().url); | 274 EXPECT_EQ(kUrl3, main_request->common_params().url); |
| 279 EXPECT_EQ(kUrl3, main_loader->request_info()->common_params.url); | 275 EXPECT_EQ(kUrl3, main_loader->request_info()->common_params.url); |
| 280 EXPECT_EQ(kUrl3, main_loader->request_info()->first_party_for_cookies); | 276 EXPECT_EQ(kUrl3, main_loader->request_info()->first_party_for_cookies); |
| 281 EXPECT_TRUE(main_loader->request_info()->is_main_frame); | 277 EXPECT_TRUE(main_loader->request_info()->is_main_frame); |
| 282 EXPECT_FALSE(main_loader->request_info()->parent_is_main_frame); | 278 EXPECT_FALSE(main_loader->request_info()->parent_is_main_frame); |
| 283 EXPECT_TRUE(main_request->browser_initiated()); | 279 EXPECT_TRUE(main_request->browser_initiated()); |
| 284 // BeforeUnloadACK was received from the renderer so the navigation should | |
| 285 // have started. | |
| 286 EXPECT_EQ(NavigationRequest::STARTED, main_request->state()); | |
| 287 | 280 |
| 288 // Main frame navigation to a different site should use a speculative | 281 // Main frame navigation to a different site should use a speculative |
| 289 // RenderFrameHost. | 282 // RenderFrameHost. |
| 290 EXPECT_TRUE(GetSpeculativeRenderFrameHost(root_node)); | 283 EXPECT_TRUE(GetSpeculativeRenderFrameHost(root_node)); |
| 291 | 284 |
| 292 // As the main frame hasn't yet committed the subframe still exists. Thus, the | 285 // As the main frame hasn't yet committed the subframe still exists. Thus, the |
| 293 // above situation regarding subframe navigations is valid here. | 286 // above situation regarding subframe navigations is valid here. |
| 294 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 287 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 295 switches::kSitePerProcess)) { | 288 switches::kSitePerProcess)) { |
| 296 EXPECT_TRUE(GetSpeculativeRenderFrameHost(subframe_node)); | 289 EXPECT_TRUE(GetSpeculativeRenderFrameHost(subframe_node)); |
| (...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 691 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, main_test_rfh()->rfh_state()); | 684 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, main_test_rfh()->rfh_state()); |
| 692 EXPECT_TRUE(rfhm->IsOnSwappedOutList(rfh1)); | 685 EXPECT_TRUE(rfhm->IsOnSwappedOutList(rfh1)); |
| 693 | 686 |
| 694 // Now go back to the initial site so that the swapped out RenderFrameHost | 687 // Now go back to the initial site so that the swapped out RenderFrameHost |
| 695 // should be reused. | 688 // should be reused. |
| 696 process()->sink().ClearMessages(); | 689 process()->sink().ClearMessages(); |
| 697 static_cast<MockRenderProcessHost*>(rfh1->GetProcess()) | 690 static_cast<MockRenderProcessHost*>(rfh1->GetProcess()) |
| 698 ->sink() | 691 ->sink() |
| 699 .ClearMessages(); | 692 .ClearMessages(); |
| 700 RequestNavigation(node, kUrl1); | 693 RequestNavigation(node, kUrl1); |
| 701 main_test_rfh()->SendBeforeUnloadACK(true); | |
| 702 EXPECT_EQ(rfh1, GetSpeculativeRenderFrameHost(node)); | 694 EXPECT_EQ(rfh1, GetSpeculativeRenderFrameHost(node)); |
| 703 EXPECT_NE(RenderFrameHostImpl::STATE_DEFAULT, | 695 EXPECT_NE(RenderFrameHostImpl::STATE_DEFAULT, |
| 704 GetSpeculativeRenderFrameHost(node)->rfh_state()); | 696 GetSpeculativeRenderFrameHost(node)->rfh_state()); |
| 705 | 697 |
| 706 scoped_refptr<ResourceResponse> response(new ResourceResponse); | 698 scoped_refptr<ResourceResponse> response(new ResourceResponse); |
| 707 GetLoaderForNavigationRequest(GetNavigationRequestForFrameTreeNode(node)) | 699 GetLoaderForNavigationRequest(GetNavigationRequestForFrameTreeNode(node)) |
| 708 ->CallOnResponseStarted(response, MakeEmptyStream()); | 700 ->CallOnResponseStarted(response, MakeEmptyStream()); |
| 709 EXPECT_EQ(rfh1, GetSpeculativeRenderFrameHost(node)); | 701 EXPECT_EQ(rfh1, GetSpeculativeRenderFrameHost(node)); |
| 710 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, | 702 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, |
| 711 GetSpeculativeRenderFrameHost(node)->rfh_state()); | 703 GetSpeculativeRenderFrameHost(node)->rfh_state()); |
| 712 EXPECT_TRUE(DidRenderFrameHostRequestCommit(rfh1)); | 704 EXPECT_TRUE(DidRenderFrameHostRequestCommit(rfh1)); |
| 713 EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh())); | 705 EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh())); |
| 714 | 706 |
| 715 rfh1->SendNavigate(1, kUrl1); | 707 rfh1->SendNavigate(1, kUrl1); |
| 716 EXPECT_EQ(rfh1, main_test_rfh()); | 708 EXPECT_EQ(rfh1, main_test_rfh()); |
| 717 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state()); | 709 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state()); |
| 718 EXPECT_FALSE(rfhm->IsOnSwappedOutList(rfh1)); | 710 EXPECT_FALSE(rfhm->IsOnSwappedOutList(rfh1)); |
| 719 } | 711 } |
| 720 | 712 |
| 721 } // namespace content | 713 } // namespace content |
| OLD | NEW |