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 c02b51aeef383a7dec78d64262fea8961339d576..4a4945d3f1eb4e021bada1f78c1b4d6fff66b563 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,12 @@ void RenderWidgetHostImpl::Init() { |
WasResized(); |
} |
+void RenderWidgetHostImpl::InitForFrame() { |
+ DCHECK(process_->HasConnection()); |
+ owned_by_render_frame_host_ = true; |
+ renderer_initialized_ = true; |
+} |
+ |
void RenderWidgetHostImpl::Shutdown() { |
RejectMouseLockOrUnlockIfNecessary(); |
@@ -1331,7 +1338,10 @@ void RenderWidgetHostImpl::Destroy() { |
if (view_) |
view_->Destroy(); |
- delete this; |
+ // RenderFrameHost owns a RenderWidgetHost when it needs one, in which case |
+ // it handles destruction. |
+ if (!owned_by_render_frame_host_) |
+ delete this; |
} |
void RenderWidgetHostImpl::RendererIsUnresponsive() { |