| Index: content/browser/frame_host/render_frame_host_manager_browsertest.cc
|
| diff --git a/content/browser/frame_host/render_frame_host_manager_browsertest.cc b/content/browser/frame_host/render_frame_host_manager_browsertest.cc
|
| index 103709908d6f9ea610d1d11e9d9a862eb8b8c9c0..a07d4707a366919b8cbb0cd503f5311c378c1767 100644
|
| --- a/content/browser/frame_host/render_frame_host_manager_browsertest.cc
|
| +++ b/content/browser/frame_host/render_frame_host_manager_browsertest.cc
|
| @@ -2163,4 +2163,47 @@ IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
|
| EXPECT_TRUE(watcher.did_exit_normally());
|
| }
|
|
|
| +// Tests that navigating cross-process and reusing an existing RenderViewHost
|
| +// (whose process has been killed/crashed) recreates properly the RenderView and
|
| +// RenderFrameProxy on the renderer side.
|
| +// See https://crbug.com/544271
|
| +IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
|
| + RenderViewInitAfterProcessKill) {
|
| + StartEmbeddedServer();
|
| + EXPECT_TRUE(NavigateToURL(
|
| + shell(), embedded_test_server()->GetURL("a.com", "/title1.html")));
|
| +
|
| + // Open a popup to navigate.
|
| + Shell* new_shell =
|
| + OpenPopup(shell()->web_contents(), GURL(url::kAboutBlankURL), "foo");
|
| + FrameTreeNode* popup_root =
|
| + static_cast<WebContentsImpl*>(new_shell->web_contents())
|
| + ->GetFrameTree()
|
| + ->root();
|
| + EXPECT_EQ(shell()->web_contents()->GetSiteInstance(),
|
| + new_shell->web_contents()->GetSiteInstance());
|
| +
|
| + // Navigate the popup to a different site.
|
| + EXPECT_TRUE(NavigateToURL(
|
| + new_shell, embedded_test_server()->GetURL("b.com", "/title2.html")));
|
| + EXPECT_NE(shell()->web_contents()->GetSiteInstance(),
|
| + new_shell->web_contents()->GetSiteInstance());
|
| +
|
| + // Kill the process hosting the popup.
|
| + RenderProcessHost* process = popup_root->current_frame_host()->GetProcess();
|
| + RenderProcessHostWatcher crash_observer(
|
| + process, RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
|
| + process->Shutdown(0, false);
|
| + crash_observer.Wait();
|
| + EXPECT_FALSE(popup_root->current_frame_host()->IsRenderFrameLive());
|
| + EXPECT_FALSE(
|
| + popup_root->current_frame_host()->render_view_host()->IsRenderViewLive());
|
| +
|
| + // Navigate the main tab to the site of the popup. This will cause the
|
| + // RenderView for b.com in the main tab to be recreated. If the issue
|
| + // is not fixed, this will result in process crash and failing test.
|
| + EXPECT_TRUE(NavigateToURL(
|
| + shell(), embedded_test_server()->GetURL("b.com", "/title3.html")));
|
| +}
|
| +
|
| } // namespace content
|
|
|