Index: content/browser/renderer_host/render_widget_host_impl.cc |
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc |
index 25b1fcde7d784b5695b40eb81a7e6c4d5509c691..5e49b1f0849a7008c5ec7571c32966a5209b37a5 100644 |
--- a/content/browser/renderer_host/render_widget_host_impl.cc |
+++ b/content/browser/renderer_host/render_widget_host_impl.cc |
@@ -184,6 +184,7 @@ RenderWidgetHostImpl::RenderWidgetHostImpl(RenderWidgetHostDelegate* delegate, |
allow_privileged_mouse_lock_(false), |
has_touch_handler_(false), |
next_browser_snapshot_id_(1), |
+ owned_by_render_frame_host_(false), |
weak_factory_(this) { |
CHECK(delegate_); |
if (routing_id_ == MSG_ROUTING_NONE) { |
@@ -414,6 +415,11 @@ void RenderWidgetHostImpl::Init() { |
WasResized(); |
} |
+void RenderWidgetHostImpl::InitForFrame() { |
+ DCHECK(process_->HasConnection()); |
+ renderer_initialized_ = true; |
+} |
+ |
void RenderWidgetHostImpl::Shutdown() { |
RejectMouseLockOrUnlockIfNecessary(); |
@@ -1312,6 +1318,13 @@ void RenderWidgetHostImpl::SetAutoResize(bool enable, |
max_size_for_auto_resize_ = max_size; |
} |
+void RenderWidgetHostImpl::Cleanup() { |
+ if (view_) { |
+ view_->Destroy(); |
+ view_ = nullptr; |
+ } |
+} |
+ |
void RenderWidgetHostImpl::Destroy() { |
NotificationService::current()->Notify( |
NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, |
@@ -1322,8 +1335,10 @@ void RenderWidgetHostImpl::Destroy() { |
// Note that in the process of the view shutting down, it can call a ton |
// of other messages on us. So if you do any other deinitialization here, |
// do it after this call to view_->Destroy(). |
- if (view_) |
+ if (view_) { |
view_->Destroy(); |
+ view_ = nullptr; |
+ } |
delete this; |
} |
@@ -1350,10 +1365,16 @@ void RenderWidgetHostImpl::OnRenderViewReady() { |
} |
void RenderWidgetHostImpl::OnRenderProcessGone(int status, int exit_code) { |
- // TODO(evanm): This synchronously ends up calling "delete this". |
- // Is that really what we want in response to this message? I'm matching |
- // previous behavior of the code here. |
- Destroy(); |
+ // RenderFrameHost owns a RenderWidgetHost when it needs one, in which case |
+ // it handles destruction. |
+ if (!owned_by_render_frame_host_) { |
+ // TODO(evanm): This synchronously ends up calling "delete this". |
+ // Is that really what we want in response to this message? I'm matching |
+ // previous behavior of the code here. |
+ Destroy(); |
+ } else { |
+ RendererExited(static_cast<base::TerminationStatus>(status), exit_code); |
+ } |
} |
void RenderWidgetHostImpl::OnClose() { |