| OLD | NEW |
| 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/utf_string_conversions.h" | 5 #include "base/utf_string_conversions.h" |
| 6 #include "content/browser/browser_thread_impl.h" | 6 #include "content/browser/browser_thread_impl.h" |
| 7 #include "content/browser/mock_content_browser_client.h" | 7 #include "content/browser/mock_content_browser_client.h" |
| 8 #include "content/browser/renderer_host/test_render_view_host.h" | 8 #include "content/browser/renderer_host/test_render_view_host.h" |
| 9 #include "content/browser/site_instance_impl.h" | 9 #include "content/browser/site_instance_impl.h" |
| 10 #include "content/browser/web_contents/navigation_entry_impl.h" | 10 #include "content/browser/web_contents/navigation_entry_impl.h" |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 old_rvh->SendShouldCloseACK(true); | 165 old_rvh->SendShouldCloseACK(true); |
| 166 | 166 |
| 167 // Commit the navigation with a new page ID. | 167 // Commit the navigation with a new page ID. |
| 168 int32 max_page_id = contents()->GetMaxPageIDForSiteInstance( | 168 int32 max_page_id = contents()->GetMaxPageIDForSiteInstance( |
| 169 active_rvh()->GetSiteInstance()); | 169 active_rvh()->GetSiteInstance()); |
| 170 active_test_rvh()->SendNavigate(max_page_id + 1, url); | 170 active_test_rvh()->SendNavigate(max_page_id + 1, url); |
| 171 | 171 |
| 172 // Simulate the SwapOut_ACK that fires if you commit a cross-site navigation | 172 // Simulate the SwapOut_ACK that fires if you commit a cross-site navigation |
| 173 // without making any network requests. | 173 // without making any network requests. |
| 174 if (old_rvh != active_rvh()) | 174 if (old_rvh != active_rvh()) |
| 175 old_rvh->OnSwapOutACK(); | 175 old_rvh->OnSwapOutACK(false); |
| 176 } | 176 } |
| 177 | 177 |
| 178 bool ShouldSwapProcesses(RenderViewHostManager* manager, | 178 bool ShouldSwapProcesses(RenderViewHostManager* manager, |
| 179 const NavigationEntryImpl* cur_entry, | 179 const NavigationEntryImpl* cur_entry, |
| 180 const NavigationEntryImpl* new_entry) const { | 180 const NavigationEntryImpl* new_entry) const { |
| 181 return manager->ShouldSwapProcessesForNavigation(cur_entry, new_entry); | 181 return manager->ShouldSwapProcessesForNavigation(cur_entry, new_entry); |
| 182 } | 182 } |
| 183 | 183 |
| 184 private: | 184 private: |
| 185 RenderViewHostManagerTestClient client_; | 185 RenderViewHostManagerTestClient client_; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 // requiring a beforeunload ack. | 219 // requiring a beforeunload ack. |
| 220 contents2.GetController().LoadURL( | 220 contents2.GetController().LoadURL( |
| 221 kDestUrl, content::Referrer(), content::PAGE_TRANSITION_LINK, | 221 kDestUrl, content::Referrer(), content::PAGE_TRANSITION_LINK, |
| 222 std::string()); | 222 std::string()); |
| 223 EXPECT_TRUE(contents2.cross_navigation_pending()); | 223 EXPECT_TRUE(contents2.cross_navigation_pending()); |
| 224 TestRenderViewHost* dest_rvh2 = static_cast<TestRenderViewHost*>( | 224 TestRenderViewHost* dest_rvh2 = static_cast<TestRenderViewHost*>( |
| 225 contents2.GetRenderManagerForTesting()->pending_render_view_host()); | 225 contents2.GetRenderManagerForTesting()->pending_render_view_host()); |
| 226 ASSERT_TRUE(dest_rvh2); | 226 ASSERT_TRUE(dest_rvh2); |
| 227 ntp_rvh2->SendShouldCloseACK(true); | 227 ntp_rvh2->SendShouldCloseACK(true); |
| 228 dest_rvh2->SendNavigate(101, kDestUrl); | 228 dest_rvh2->SendNavigate(101, kDestUrl); |
| 229 ntp_rvh2->OnSwapOutACK(); | 229 ntp_rvh2->OnSwapOutACK(false); |
| 230 | 230 |
| 231 // The two RVH's should be different in every way. | 231 // The two RVH's should be different in every way. |
| 232 EXPECT_NE(active_rvh()->GetProcess(), dest_rvh2->GetProcess()); | 232 EXPECT_NE(active_rvh()->GetProcess(), dest_rvh2->GetProcess()); |
| 233 EXPECT_NE(active_rvh()->GetSiteInstance(), dest_rvh2->GetSiteInstance()); | 233 EXPECT_NE(active_rvh()->GetSiteInstance(), dest_rvh2->GetSiteInstance()); |
| 234 EXPECT_NE(static_cast<SiteInstanceImpl*>(active_rvh()->GetSiteInstance())-> | 234 EXPECT_NE(static_cast<SiteInstanceImpl*>(active_rvh()->GetSiteInstance())-> |
| 235 browsing_instance_, | 235 browsing_instance_, |
| 236 static_cast<SiteInstanceImpl*>(dest_rvh2->GetSiteInstance())-> | 236 static_cast<SiteInstanceImpl*>(dest_rvh2->GetSiteInstance())-> |
| 237 browsing_instance_); | 237 browsing_instance_); |
| 238 | 238 |
| 239 // Navigate both to the new tab page, and verify that they share a | 239 // Navigate both to the new tab page, and verify that they share a |
| 240 // SiteInstance. | 240 // SiteInstance. |
| 241 NavigateActiveAndCommit(kNtpUrl); | 241 NavigateActiveAndCommit(kNtpUrl); |
| 242 | 242 |
| 243 contents2.GetController().LoadURL( | 243 contents2.GetController().LoadURL( |
| 244 kNtpUrl, content::Referrer(), content::PAGE_TRANSITION_LINK, | 244 kNtpUrl, content::Referrer(), content::PAGE_TRANSITION_LINK, |
| 245 std::string()); | 245 std::string()); |
| 246 dest_rvh2->SendShouldCloseACK(true); | 246 dest_rvh2->SendShouldCloseACK(true); |
| 247 static_cast<TestRenderViewHost*>(contents2.GetRenderManagerForTesting()-> | 247 static_cast<TestRenderViewHost*>(contents2.GetRenderManagerForTesting()-> |
| 248 pending_render_view_host())->SendNavigate(102, kNtpUrl); | 248 pending_render_view_host())->SendNavigate(102, kNtpUrl); |
| 249 dest_rvh2->OnSwapOutACK(); | 249 dest_rvh2->OnSwapOutACK(false); |
| 250 | 250 |
| 251 EXPECT_EQ(active_rvh()->GetSiteInstance(), | 251 EXPECT_EQ(active_rvh()->GetSiteInstance(), |
| 252 contents2.GetRenderViewHost()->GetSiteInstance()); | 252 contents2.GetRenderViewHost()->GetSiteInstance()); |
| 253 } | 253 } |
| 254 | 254 |
| 255 // Ensure that the browser ignores most IPC messages that arrive from a | 255 // Ensure that the browser ignores most IPC messages that arrive from a |
| 256 // RenderViewHost that has been swapped out. We do not want to take | 256 // RenderViewHost that has been swapped out. We do not want to take |
| 257 // action on requests from a non-active renderer. The main exception is | 257 // action on requests from a non-active renderer. The main exception is |
| 258 // for synchronous messages, which cannot be ignored without leaving the | 258 // for synchronous messages, which cannot be ignored without leaving the |
| 259 // renderer in a stuck state. See http://crbug.com/93427. | 259 // renderer in a stuck state. See http://crbug.com/93427. |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 test_host->SendShouldCloseACK(true); | 576 test_host->SendShouldCloseACK(true); |
| 577 | 577 |
| 578 // CrossSiteResourceHandler::StartCrossSiteTransition triggers a | 578 // CrossSiteResourceHandler::StartCrossSiteTransition triggers a |
| 579 // call of RenderViewHostManager::OnCrossSiteResponse before | 579 // call of RenderViewHostManager::OnCrossSiteResponse before |
| 580 // RenderViewHostManager::DidNavigateMainFrame is called. | 580 // RenderViewHostManager::DidNavigateMainFrame is called. |
| 581 // The RVH is not swapped out until the commit. | 581 // The RVH is not swapped out until the commit. |
| 582 manager.OnCrossSiteResponse(host2->GetProcess()->GetID(), | 582 manager.OnCrossSiteResponse(host2->GetProcess()->GetID(), |
| 583 host2->GetPendingRequestId()); | 583 host2->GetPendingRequestId()); |
| 584 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( | 584 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( |
| 585 ViewMsg_SwapOut::ID)); | 585 ViewMsg_SwapOut::ID)); |
| 586 test_host->OnSwapOutACK(); | 586 test_host->OnSwapOutACK(false); |
| 587 | 587 |
| 588 EXPECT_EQ(host, manager.current_host()); | 588 EXPECT_EQ(host, manager.current_host()); |
| 589 EXPECT_FALSE(static_cast<RenderViewHostImpl*>( | 589 EXPECT_FALSE(static_cast<RenderViewHostImpl*>( |
| 590 manager.current_host())->is_swapped_out()); | 590 manager.current_host())->is_swapped_out()); |
| 591 EXPECT_EQ(host2, manager.pending_render_view_host()); | 591 EXPECT_EQ(host2, manager.pending_render_view_host()); |
| 592 // There should be still no navigation messages being sent. | 592 // There should be still no navigation messages being sent. |
| 593 EXPECT_FALSE(test_process_host2->sink().GetUniqueMessageMatching( | 593 EXPECT_FALSE(test_process_host2->sink().GetUniqueMessageMatching( |
| 594 ViewMsg_Navigate::ID)); | 594 ViewMsg_Navigate::ID)); |
| 595 | 595 |
| 596 // 3) Cross-site navigate to next site before 2) has committed. -------------- | 596 // 3) Cross-site navigate to next site before 2) has committed. -------------- |
| (...skipping 27 matching lines...) Expand all Loading... |
| 624 | 624 |
| 625 // CrossSiteResourceHandler::StartCrossSiteTransition triggers a | 625 // CrossSiteResourceHandler::StartCrossSiteTransition triggers a |
| 626 // call of RenderViewHostManager::OnCrossSiteResponse before | 626 // call of RenderViewHostManager::OnCrossSiteResponse before |
| 627 // RenderViewHostManager::DidNavigateMainFrame is called. | 627 // RenderViewHostManager::DidNavigateMainFrame is called. |
| 628 // The RVH is not swapped out until the commit. | 628 // The RVH is not swapped out until the commit. |
| 629 manager.OnCrossSiteResponse(host3->GetProcess()->GetID(), | 629 manager.OnCrossSiteResponse(host3->GetProcess()->GetID(), |
| 630 static_cast<RenderViewHostImpl*>( | 630 static_cast<RenderViewHostImpl*>( |
| 631 host3)->GetPendingRequestId()); | 631 host3)->GetPendingRequestId()); |
| 632 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( | 632 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( |
| 633 ViewMsg_SwapOut::ID)); | 633 ViewMsg_SwapOut::ID)); |
| 634 test_host->OnSwapOutACK(); | 634 test_host->OnSwapOutACK(false); |
| 635 | 635 |
| 636 // Commit. | 636 // Commit. |
| 637 manager.DidNavigateMainFrame(host3); | 637 manager.DidNavigateMainFrame(host3); |
| 638 EXPECT_TRUE(host3 == manager.current_host()); | 638 EXPECT_TRUE(host3 == manager.current_host()); |
| 639 ASSERT_TRUE(host3); | 639 ASSERT_TRUE(host3); |
| 640 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host3->GetSiteInstance())-> | 640 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host3->GetSiteInstance())-> |
| 641 HasSite()); | 641 HasSite()); |
| 642 // Check the pending RenderViewHost has been committed. | 642 // Check the pending RenderViewHost has been committed. |
| 643 EXPECT_FALSE(manager.pending_render_view_host()); | 643 EXPECT_FALSE(manager.pending_render_view_host()); |
| 644 | 644 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 | 763 |
| 764 // We should be able to navigate forward. | 764 // We should be able to navigate forward. |
| 765 contents()->GetController().GoForward(); | 765 contents()->GetController().GoForward(); |
| 766 contents()->ProceedWithCrossSiteNavigation(); | 766 contents()->ProceedWithCrossSiteNavigation(); |
| 767 const NavigationEntry* entry2 = contents()->GetController().GetPendingEntry(); | 767 const NavigationEntry* entry2 = contents()->GetController().GetPendingEntry(); |
| 768 rvh2->SendNavigate(entry2->GetPageID(), entry2->GetURL()); | 768 rvh2->SendNavigate(entry2->GetPageID(), entry2->GetURL()); |
| 769 EXPECT_EQ(rvh2, rvh()); | 769 EXPECT_EQ(rvh2, rvh()); |
| 770 EXPECT_FALSE(rvh2->is_swapped_out()); | 770 EXPECT_FALSE(rvh2->is_swapped_out()); |
| 771 EXPECT_TRUE(rvh1->is_swapped_out()); | 771 EXPECT_TRUE(rvh1->is_swapped_out()); |
| 772 } | 772 } |
| OLD | NEW |