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 |