| 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 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 main_test_rfh()->SendNavigate(0, kUrl2); | 186 main_test_rfh()->SendNavigate(0, kUrl2); |
| 187 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, main_test_rfh()->rfh_state()); | 187 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, main_test_rfh()->rfh_state()); |
| 188 EXPECT_EQ(SiteInstanceImpl::GetSiteForURL(browser_context(), kUrl2), | 188 EXPECT_EQ(SiteInstanceImpl::GetSiteForURL(browser_context(), kUrl2), |
| 189 main_test_rfh()->GetSiteInstance()->GetSiteURL()); | 189 main_test_rfh()->GetSiteInstance()->GetSiteURL()); |
| 190 EXPECT_EQ(kUrl2, contents()->GetLastCommittedURL()); | 190 EXPECT_EQ(kUrl2, contents()->GetLastCommittedURL()); |
| 191 EXPECT_FALSE(GetNavigationRequestForFrameTreeNode(node)); | 191 EXPECT_FALSE(GetNavigationRequestForFrameTreeNode(node)); |
| 192 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); | 192 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 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 the navigator waits for a beforeUnload ack before |
| 197 // starting the navigation when beforeUnload handlers are present in the frame. |
| 198 TEST_F(NavigatorTestWithBrowserSideNavigation, BeforeUnloadACK) { |
| 199 const GURL kUrl1("http://www.google.com/"); |
| 200 const GURL kUrl2("http://www.chromium.org/"); |
| 201 |
| 202 contents()->NavigateAndCommit(kUrl1); |
| 203 main_test_rfh()->SendBeforeUnloadHandlersPresent(true); |
| 204 |
| 205 // Start a new navigation. |
| 206 FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
| 207 RequestNavigation(node, kUrl2); |
| 208 NavigationRequest* request = GetNavigationRequestForFrameTreeNode(node); |
| 209 ASSERT_TRUE(request); |
| 210 EXPECT_TRUE(request->browser_initiated()); |
| 211 EXPECT_EQ(NavigationRequest::WAITING_FOR_RENDERER_RESPONSE, request->state()); |
| 212 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 213 EXPECT_FALSE(request->loader_for_testing()); |
| 214 |
| 215 // Simulate a beforeUnload ACK. |
| 216 main_test_rfh()->SendBeforeUnloadACK(true); |
| 217 EXPECT_TRUE(GetNavigationRequestForFrameTreeNode(node)); |
| 218 EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 219 EXPECT_EQ(NavigationRequest::STARTED, request->state()); |
| 220 EXPECT_TRUE(request->loader_for_testing()); |
| 221 } |
| 222 |
| 196 // PlzNavigate: Test that a beforeUnload denial cancels the navigation. | 223 // PlzNavigate: Test that a beforeUnload denial cancels the navigation. |
| 197 TEST_F(NavigatorTestWithBrowserSideNavigation, | 224 TEST_F(NavigatorTestWithBrowserSideNavigation, |
| 198 BeforeUnloadDenialCancelNavigation) { | 225 BeforeUnloadDenialCancelNavigation) { |
| 199 const GURL kUrl1("http://www.google.com/"); | 226 const GURL kUrl1("http://www.google.com/"); |
| 200 const GURL kUrl2("http://www.chromium.org/"); | 227 const GURL kUrl2("http://www.chromium.org/"); |
| 201 | 228 |
| 202 contents()->NavigateAndCommit(kUrl1); | 229 contents()->NavigateAndCommit(kUrl1); |
| 230 main_test_rfh()->SendBeforeUnloadHandlersPresent(true); |
| 203 | 231 |
| 204 // Start a new navigation. | 232 // Start a new navigation. |
| 205 FrameTreeNode* node = main_test_rfh()->frame_tree_node(); | 233 FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
| 206 RequestNavigation(node, kUrl2); | 234 RequestNavigation(node, kUrl2); |
| 207 NavigationRequest* request = GetNavigationRequestForFrameTreeNode(node); | 235 NavigationRequest* request = GetNavigationRequestForFrameTreeNode(node); |
| 208 ASSERT_TRUE(request); | 236 ASSERT_TRUE(request); |
| 209 EXPECT_TRUE(request->browser_initiated()); | 237 EXPECT_TRUE(request->browser_initiated()); |
| 210 EXPECT_EQ(NavigationRequest::WAITING_FOR_RENDERER_RESPONSE, request->state()); | 238 EXPECT_EQ(NavigationRequest::WAITING_FOR_RENDERER_RESPONSE, request->state()); |
| 211 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); | 239 EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 212 | 240 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 EXPECT_TRUE(GetSpeculativeRenderFrameHost(subframe_node)); | 288 EXPECT_TRUE(GetSpeculativeRenderFrameHost(subframe_node)); |
| 261 } else { | 289 } else { |
| 262 EXPECT_FALSE(GetSpeculativeRenderFrameHost(subframe_node)); | 290 EXPECT_FALSE(GetSpeculativeRenderFrameHost(subframe_node)); |
| 263 } | 291 } |
| 264 | 292 |
| 265 // Now start a navigation at the root node. | 293 // Now start a navigation at the root node. |
| 266 RequestNavigation(root_node, kUrl3); | 294 RequestNavigation(root_node, kUrl3); |
| 267 NavigationRequest* main_request = | 295 NavigationRequest* main_request = |
| 268 GetNavigationRequestForFrameTreeNode(root_node); | 296 GetNavigationRequestForFrameTreeNode(root_node); |
| 269 ASSERT_TRUE(main_request); | 297 ASSERT_TRUE(main_request); |
| 270 EXPECT_EQ(NavigationRequest::WAITING_FOR_RENDERER_RESPONSE, | 298 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); | |
| 276 TestNavigationURLLoader* main_loader = | 299 TestNavigationURLLoader* main_loader = |
| 277 GetLoaderForNavigationRequest(main_request); | 300 GetLoaderForNavigationRequest(main_request); |
| 278 EXPECT_EQ(kUrl3, main_request->common_params().url); | 301 EXPECT_EQ(kUrl3, main_request->common_params().url); |
| 279 EXPECT_EQ(kUrl3, main_loader->request_info()->common_params.url); | 302 EXPECT_EQ(kUrl3, main_loader->request_info()->common_params.url); |
| 280 EXPECT_EQ(kUrl3, main_loader->request_info()->first_party_for_cookies); | 303 EXPECT_EQ(kUrl3, main_loader->request_info()->first_party_for_cookies); |
| 281 EXPECT_TRUE(main_loader->request_info()->is_main_frame); | 304 EXPECT_TRUE(main_loader->request_info()->is_main_frame); |
| 282 EXPECT_FALSE(main_loader->request_info()->parent_is_main_frame); | 305 EXPECT_FALSE(main_loader->request_info()->parent_is_main_frame); |
| 283 EXPECT_TRUE(main_request->browser_initiated()); | 306 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 | 307 |
| 288 // Main frame navigation to a different site should use a speculative | 308 // Main frame navigation to a different site should use a speculative |
| 289 // RenderFrameHost. | 309 // RenderFrameHost. |
| 290 EXPECT_TRUE(GetSpeculativeRenderFrameHost(root_node)); | 310 EXPECT_TRUE(GetSpeculativeRenderFrameHost(root_node)); |
| 291 | 311 |
| 292 // As the main frame hasn't yet committed the subframe still exists. Thus, the | 312 // As the main frame hasn't yet committed the subframe still exists. Thus, the |
| 293 // above situation regarding subframe navigations is valid here. | 313 // above situation regarding subframe navigations is valid here. |
| 294 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 314 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 295 switches::kSitePerProcess)) { | 315 switches::kSitePerProcess)) { |
| 296 EXPECT_TRUE(GetSpeculativeRenderFrameHost(subframe_node)); | 316 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()); | 711 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, main_test_rfh()->rfh_state()); |
| 692 EXPECT_TRUE(rfhm->IsOnSwappedOutList(rfh1)); | 712 EXPECT_TRUE(rfhm->IsOnSwappedOutList(rfh1)); |
| 693 | 713 |
| 694 // Now go back to the initial site so that the swapped out RenderFrameHost | 714 // Now go back to the initial site so that the swapped out RenderFrameHost |
| 695 // should be reused. | 715 // should be reused. |
| 696 process()->sink().ClearMessages(); | 716 process()->sink().ClearMessages(); |
| 697 static_cast<MockRenderProcessHost*>(rfh1->GetProcess()) | 717 static_cast<MockRenderProcessHost*>(rfh1->GetProcess()) |
| 698 ->sink() | 718 ->sink() |
| 699 .ClearMessages(); | 719 .ClearMessages(); |
| 700 RequestNavigation(node, kUrl1); | 720 RequestNavigation(node, kUrl1); |
| 701 main_test_rfh()->SendBeforeUnloadACK(true); | |
| 702 EXPECT_EQ(rfh1, GetSpeculativeRenderFrameHost(node)); | 721 EXPECT_EQ(rfh1, GetSpeculativeRenderFrameHost(node)); |
| 703 EXPECT_NE(RenderFrameHostImpl::STATE_DEFAULT, | 722 EXPECT_NE(RenderFrameHostImpl::STATE_DEFAULT, |
| 704 GetSpeculativeRenderFrameHost(node)->rfh_state()); | 723 GetSpeculativeRenderFrameHost(node)->rfh_state()); |
| 705 | 724 |
| 706 scoped_refptr<ResourceResponse> response(new ResourceResponse); | 725 scoped_refptr<ResourceResponse> response(new ResourceResponse); |
| 707 GetLoaderForNavigationRequest(GetNavigationRequestForFrameTreeNode(node)) | 726 GetLoaderForNavigationRequest(GetNavigationRequestForFrameTreeNode(node)) |
| 708 ->CallOnResponseStarted(response, MakeEmptyStream()); | 727 ->CallOnResponseStarted(response, MakeEmptyStream()); |
| 709 EXPECT_EQ(rfh1, GetSpeculativeRenderFrameHost(node)); | 728 EXPECT_EQ(rfh1, GetSpeculativeRenderFrameHost(node)); |
| 710 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, | 729 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, |
| 711 GetSpeculativeRenderFrameHost(node)->rfh_state()); | 730 GetSpeculativeRenderFrameHost(node)->rfh_state()); |
| 712 EXPECT_TRUE(DidRenderFrameHostRequestCommit(rfh1)); | 731 EXPECT_TRUE(DidRenderFrameHostRequestCommit(rfh1)); |
| 713 EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh())); | 732 EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh())); |
| 714 | 733 |
| 715 rfh1->SendNavigate(1, kUrl1); | 734 rfh1->SendNavigate(1, kUrl1); |
| 716 EXPECT_EQ(rfh1, main_test_rfh()); | 735 EXPECT_EQ(rfh1, main_test_rfh()); |
| 717 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state()); | 736 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state()); |
| 718 EXPECT_FALSE(rfhm->IsOnSwappedOutList(rfh1)); | 737 EXPECT_FALSE(rfhm->IsOnSwappedOutList(rfh1)); |
| 719 } | 738 } |
| 720 | 739 |
| 721 } // namespace content | 740 } // namespace content |
| OLD | NEW |