Index: content/browser/tab_contents/render_view_host_manager_unittest.cc |
diff --git a/content/browser/tab_contents/render_view_host_manager_unittest.cc b/content/browser/tab_contents/render_view_host_manager_unittest.cc |
index b7f14634f7449ff9faa6feb0dc7b6086f75c3f5a..c27e2ee0c71997714bab980d509cfa34b1447ecf 100644 |
--- a/content/browser/tab_contents/render_view_host_manager_unittest.cc |
+++ b/content/browser/tab_contents/render_view_host_manager_unittest.cc |
@@ -428,13 +428,16 @@ TEST_F(RenderViewHostManagerTest, NavigateWithEarlyReNavigation) { |
string16() /* title */, content::PAGE_TRANSITION_TYPED, |
false /* is_renderer_init */); |
RenderViewHost* host2 = manager.Navigate(entry2); |
+ int host2_process_id = host2->process()->GetID(); |
// A new RenderViewHost should be created. |
EXPECT_TRUE(manager.pending_render_view_host()); |
ASSERT_EQ(host2, manager.pending_render_view_host()); |
+ EXPECT_NE(host2, host); |
// Check that the navigation is still suspended because the old RVH |
// is not swapped out, yet. |
+ EXPECT_TRUE(host2->are_navigations_suspended()); |
MockRenderProcessHost* test_process_host2 = |
static_cast<MockRenderProcessHost*>(host2->process()); |
test_process_host2->sink().ClearMessages(); |
@@ -444,7 +447,7 @@ TEST_F(RenderViewHostManagerTest, NavigateWithEarlyReNavigation) { |
// Allow closing the current Render View (precondition for swapping out |
// the RVH): Simulate response from RenderView for ViewMsg_ShouldClose sent by |
- // FirePageBeforeUnload |
+ // FirePageBeforeUnload. |
TestRenderViewHost* test_host = static_cast<TestRenderViewHost*>(host); |
MockRenderProcessHost* test_process_host = |
static_cast<MockRenderProcessHost*>(test_host->process()); |
@@ -452,10 +455,10 @@ TEST_F(RenderViewHostManagerTest, NavigateWithEarlyReNavigation) { |
ViewMsg_ShouldClose::ID)); |
test_host->SendShouldCloseACK(true); |
- // CrossSiteResourceHandler::StartCrossSiteTransition can trigger a |
+ // CrossSiteResourceHandler::StartCrossSiteTransition triggers a |
// call of RenderViewHostManager::OnCrossSiteResponse before |
- // RenderViewHostManager::DidNavigateMainFrame is called. In this case the |
- // RVH is swapped out. |
+ // RenderViewHostManager::DidNavigateMainFrame is called. |
+ // The RVH is not swapped out until the commit. |
manager.OnCrossSiteResponse(host2->process()->GetID(), |
host2->GetPendingRequestId()); |
EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( |
@@ -463,7 +466,7 @@ TEST_F(RenderViewHostManagerTest, NavigateWithEarlyReNavigation) { |
test_host->OnSwapOutACK(); |
EXPECT_EQ(host, manager.current_host()); |
- EXPECT_TRUE(manager.current_host()->is_swapped_out()); |
+ EXPECT_FALSE(manager.current_host()->is_swapped_out()); |
EXPECT_EQ(host2, manager.pending_render_view_host()); |
// There should be still no navigation messages being sent. |
EXPECT_FALSE(test_process_host2->sink().GetUniqueMessageMatching( |
@@ -475,28 +478,36 @@ TEST_F(RenderViewHostManagerTest, NavigateWithEarlyReNavigation) { |
content::Referrer(), string16() /* title */, |
content::PAGE_TRANSITION_TYPED, |
false /* is_renderer_init */); |
+ test_process_host->sink().ClearMessages(); |
RenderViewHost* host3 = manager.Navigate(entry3); |
- // A new RenderViewHost should be created. |
+ // A new RenderViewHost should be created. host2 is now deleted. |
EXPECT_TRUE(manager.pending_render_view_host()); |
ASSERT_EQ(host3, manager.pending_render_view_host()); |
+ EXPECT_NE(host3, host); |
+ EXPECT_NE(host3->process()->GetID(), host2_process_id); |
+ // Navigations in the new RVH should be suspended, which is ok because the |
+ // old RVH is not yet swapped out and can respond to a second beforeunload |
+ // request. |
+ EXPECT_TRUE(host3->are_navigations_suspended()); |
EXPECT_EQ(host, manager.current_host()); |
- EXPECT_TRUE(manager.current_host()->is_swapped_out()); |
- |
- // The navigation should not be suspended because the RVH |host| has been |
- // swapped out already. Therefore, the RVH should send a navigation event |
- // immediately. |
- MockRenderProcessHost* test_process_host3 = |
- static_cast<MockRenderProcessHost*>(host3->process()); |
- test_process_host3->sink().ClearMessages(); |
- |
- // Usually TabContents::NavigateToEntry would call |
- // RenderViewHostManager::Navigate followed by RenderViewHost::Navigate. |
- // Here we need to call the latter ourselves. |
- host3->NavigateToURL(kUrl3); |
- EXPECT_TRUE(test_process_host3->sink().GetUniqueMessageMatching( |
- ViewMsg_Navigate::ID)); |
+ EXPECT_FALSE(manager.current_host()->is_swapped_out()); |
+ |
+ // Simulate a response to the second beforeunload request. |
+ EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( |
+ ViewMsg_ShouldClose::ID)); |
+ test_host->SendShouldCloseACK(true); |
+ |
+ // CrossSiteResourceHandler::StartCrossSiteTransition triggers a |
+ // call of RenderViewHostManager::OnCrossSiteResponse before |
+ // RenderViewHostManager::DidNavigateMainFrame is called. |
+ // The RVH is not swapped out until the commit. |
+ manager.OnCrossSiteResponse(host3->process()->GetID(), |
+ host3->GetPendingRequestId()); |
+ EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( |
+ ViewMsg_SwapOut::ID)); |
+ test_host->OnSwapOutACK(); |
// Commit. |
manager.DidNavigateMainFrame(host3); |