diff options
author | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-30 20:35:06 +0000 |
---|---|---|
committer | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-30 20:35:06 +0000 |
commit | c21663ae815e6fc0faac03e6d752aae290a918d4 (patch) | |
tree | 1b60a045d1022d8d4c8e28c1c7678aafe6da7897 /content | |
parent | c534ef7a7142e8cf58702e058e437686f4557e32 (diff) | |
download | chromium_src-c21663ae815e6fc0faac03e6d752aae290a918d4.zip chromium_src-c21663ae815e6fc0faac03e6d752aae290a918d4.tar.gz chromium_src-c21663ae815e6fc0faac03e6d752aae290a918d4.tar.bz2 |
When reloading a crashed popup, correctly setup the opener relations
BUG=265817
R=creis@chromium.org
TEST=RenderViewHostManagerTest.CleanUpSwappedOutRVHOnProcessCrash
Review URL: https://codereview.chromium.org/21235002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@214436 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
4 files changed, 20 insertions, 2 deletions
diff --git a/content/browser/renderer_host/test_render_view_host.cc b/content/browser/renderer_host/test_render_view_host.cc index 7783e80..a395093 100644 --- a/content/browser/renderer_host/test_render_view_host.cc +++ b/content/browser/renderer_host/test_render_view_host.cc @@ -252,7 +252,8 @@ TestRenderViewHost::TestRenderViewHost( delete_counter_(NULL), simulate_fetch_via_proxy_(false), simulate_history_list_was_cleared_(false), - contents_mime_type_("text/html") { + contents_mime_type_("text/html"), + opener_route_id_(MSG_ROUTING_NONE) { // TestRenderWidgetHostView installs itself into this->view_ in its // constructor, and deletes itself when TestRenderWidgetHostView::Destroy() is // called. @@ -272,6 +273,7 @@ bool TestRenderViewHost::CreateRenderView( int32 max_page_id) { DCHECK(!render_view_created_); render_view_created_ = true; + opener_route_id_ = opener_route_id; return true; } diff --git a/content/browser/renderer_host/test_render_view_host.h b/content/browser/renderer_host/test_render_view_host.h index 0c3455a..37b46e2 100644 --- a/content/browser/renderer_host/test_render_view_host.h +++ b/content/browser/renderer_host/test_render_view_host.h @@ -308,6 +308,9 @@ class TestRenderViewHost // False by default. void set_simulate_history_list_was_cleared(bool cleared); + // The opener route id passed to CreateRenderView(). + int opener_route_id() const { return opener_route_id_; } + // RenderViewHost overrides -------------------------------------------------- virtual bool CreateRenderView(const string16& frame_name, @@ -350,6 +353,9 @@ class TestRenderViewHost // See SetContentsMimeType() above. std::string contents_mime_type_; + // See opener_route_id() above. + int opener_route_id_; + DISALLOW_COPY_AND_ASSIGN(TestRenderViewHost); }; diff --git a/content/browser/web_contents/render_view_host_manager.cc b/content/browser/web_contents/render_view_host_manager.cc index 4201eb8..0c8d26f 100644 --- a/content/browser/web_contents/render_view_host_manager.cc +++ b/content/browser/web_contents/render_view_host_manager.cc @@ -149,7 +149,10 @@ RenderViewHostImpl* RenderViewHostManager::Navigate( // If the renderer crashed, then try to create a new one to satisfy this // navigation request. if (!dest_render_view_host->IsRenderViewLive()) { - if (!InitRenderView(dest_render_view_host, MSG_ROUTING_NONE)) + // Recreate the opener chain. + int opener_route_id = delegate_->CreateOpenerRenderViewsForRenderManager( + dest_render_view_host->GetSiteInstance()); + if (!InitRenderView(dest_render_view_host, opener_route_id)) return NULL; // Now that we've created a new renderer, be sure to hide it if it isn't diff --git a/content/browser/web_contents/render_view_host_manager_unittest.cc b/content/browser/web_contents/render_view_host_manager_unittest.cc index ba09775..ea35e6b 100644 --- a/content/browser/web_contents/render_view_host_manager_unittest.cc +++ b/content/browser/web_contents/render_view_host_manager_unittest.cc @@ -1096,10 +1096,17 @@ TEST_F(RenderViewHostManagerTest, CleanUpSwappedOutRVHOnProcessCrash) { NOTIFICATION_RENDERER_PROCESS_CLOSED, Source<RenderProcessHost>(rvh1->GetProcess()), Details<RenderProcessHost::RendererClosedDetails>(&details)); + rvh1->set_render_view_created(false); // Ensure that the swapped out RenderViewHost has been deleted. EXPECT_FALSE(opener1_manager->GetSwappedOutRenderViewHost( rvh1->GetSiteInstance())); + + // Reload the initial tab. This should recreate the opener. + contents()->GetController().Reload(true); + + EXPECT_EQ(opener1_manager->current_host()->GetRoutingID(), + test_rvh()->opener_route_id()); } // Test that RenderViewHosts created for WebUI navigations are properly |