Index: content/browser/frame_host/frame_tree_browsertest.cc |
diff --git a/content/browser/frame_host/frame_tree_browsertest.cc b/content/browser/frame_host/frame_tree_browsertest.cc |
index d96ee59d10e7784f38e88e264369527ad95acee9..36b2cd4c8b0ae6d294629e78c893071b679f806e 100644 |
--- a/content/browser/frame_host/frame_tree_browsertest.cc |
+++ b/content/browser/frame_host/frame_tree_browsertest.cc |
@@ -105,6 +105,13 @@ IN_PROC_BROWSER_TEST_F(FrameTreeBrowserTest, FrameTreeAfterCrash) { |
NavigateToURL(shell(), |
test_server()->GetURL("files/frame_tree/top.html")); |
+ // Ensure the view and frame are live. |
+ RenderViewHost* rvh = shell()->web_contents()->GetRenderViewHost(); |
+ RenderFrameHostImpl* rfh = |
+ static_cast<RenderFrameHostImpl*>(rvh->GetMainFrame()); |
+ EXPECT_TRUE(rvh->IsRenderViewLive()); |
+ EXPECT_TRUE(rfh->IsRenderFrameLive()); |
+ |
// Crash the renderer so that it doesn't send any FrameDetached messages. |
RenderProcessHostWatcher crash_observer( |
shell()->web_contents(), |
@@ -117,11 +124,19 @@ IN_PROC_BROWSER_TEST_F(FrameTreeBrowserTest, FrameTreeAfterCrash) { |
FrameTreeNode* root = wc->GetFrameTree()->root(); |
EXPECT_EQ(0UL, root->child_count()); |
+ // Ensure the view and frame aren't live anymore. |
+ EXPECT_FALSE(rvh->IsRenderViewLive()); |
+ EXPECT_FALSE(rfh->IsRenderFrameLive()); |
+ |
// Navigate to a new URL. |
GURL url(test_server()->GetURL("files/title1.html")); |
NavigateToURL(shell(), url); |
EXPECT_EQ(0UL, root->child_count()); |
EXPECT_EQ(url, root->current_url()); |
+ |
+ // Ensure the view and frame are live again. |
+ EXPECT_TRUE(rvh->IsRenderViewLive()); |
+ EXPECT_TRUE(rfh->IsRenderFrameLive()); |
} |
// Test that we can navigate away if the previous renderer doesn't clean up its |
@@ -158,6 +173,32 @@ IN_PROC_BROWSER_TEST_F(FrameTreeBrowserTest, NavigateWithLeftoverFrames) { |
EXPECT_EQ(0UL, root->child_count()); |
} |
+// Ensure that IsRenderFrameLive is true for main frames and same-site iframes. |
+IN_PROC_BROWSER_TEST_F(FrameTreeBrowserTest, IsRenderFrameLive) { |
+ host_resolver()->AddRule("*", "127.0.0.1"); |
+ ASSERT_TRUE(test_server()->Start()); |
+ GURL main_url(test_server()->GetURL("files/frame_tree/top.html")); |
+ NavigateToURL(shell(), main_url); |
+ |
+ // It is safe to obtain the root frame tree node here, as it doesn't change. |
+ FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) |
+ ->GetFrameTree()->root(); |
+ |
+ // The root and subframe should each have a live RenderFrame. |
+ EXPECT_TRUE( |
+ root->current_frame_host()->render_view_host()->IsRenderViewLive()); |
+ EXPECT_TRUE(root->current_frame_host()->IsRenderFrameLive()); |
+ EXPECT_TRUE(root->child_at(0)->current_frame_host()->IsRenderFrameLive()); |
+ |
+ // Load a same-site page into iframe and it should still be live. |
+ GURL http_url(test_server()->GetURL("files/title1.html")); |
+ NavigateFrameToURL(root->child_at(0), http_url); |
+ EXPECT_TRUE( |
+ root->current_frame_host()->render_view_host()->IsRenderViewLive()); |
+ EXPECT_TRUE(root->current_frame_host()->IsRenderFrameLive()); |
+ EXPECT_TRUE(root->child_at(0)->current_frame_host()->IsRenderFrameLive()); |
+} |
+ |
class CrossProcessFrameTreeBrowserTest : public ContentBrowserTest { |
public: |
CrossProcessFrameTreeBrowserTest() {} |
@@ -226,6 +267,14 @@ IN_PROC_BROWSER_TEST_F(CrossProcessFrameTreeBrowserTest, |
EXPECT_FALSE(root->render_manager()->GetRenderFrameProxyHost(root_instance)); |
EXPECT_FALSE( |
child->render_manager()->GetRenderFrameProxyHost(child_instance)); |
+ |
+ // Ensure that the RenderViews and RenderFrames are all live. |
+ EXPECT_TRUE( |
+ root->current_frame_host()->render_view_host()->IsRenderViewLive()); |
+ EXPECT_TRUE( |
+ child->current_frame_host()->render_view_host()->IsRenderViewLive()); |
+ EXPECT_TRUE(root->current_frame_host()->IsRenderFrameLive()); |
+ EXPECT_TRUE(root->child_at(0)->current_frame_host()->IsRenderFrameLive()); |
} |
} // namespace content |