Index: content/browser/web_contents/web_contents_impl.cc |
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc |
index 8256d033f6112937f6cf2299271e2503c2bc632f..4cb28fc969492870b7d5d00da9596cc098d6da47 100644 |
--- a/content/browser/web_contents/web_contents_impl.cc |
+++ b/content/browser/web_contents/web_contents_impl.cc |
@@ -362,6 +362,12 @@ WebContentsImpl::WebContentsImpl( |
WebContentsImpl::~WebContentsImpl() { |
is_being_destroyed_ = true; |
+ for (std::set<RenderWidgetHostImpl*>::iterator iter = |
+ created_widgets_.begin(); iter != created_widgets_.end(); ++iter) { |
+ (*iter)->DetachDelegate(); |
+ } |
+ created_widgets_.clear(); |
+ |
// Clear out any JavaScript state. |
if (dialog_creator_) |
dialog_creator_->ResetJavaScriptState(this); |
@@ -1161,6 +1167,19 @@ void WebContentsImpl::LostCapture() { |
delegate_->LostCapture(); |
} |
+void WebContentsImpl::RenderWidgetDeleted( |
+ RenderWidgetHostImpl* render_widget_host) { |
+ if (is_being_destroyed_) { |
+ // |created_widgets_| might have been destroyed. |
+ return; |
+ } |
+ |
+ std::set<RenderWidgetHostImpl*>::iterator iter = |
+ created_widgets_.find(render_widget_host); |
+ if (iter != created_widgets_.end()) |
+ created_widgets_.erase(iter); |
+} |
+ |
bool WebContentsImpl::PreHandleKeyboardEvent( |
const NativeWebKeyboardEvent& event, |
bool* is_keyboard_shortcut) { |
@@ -1323,6 +1342,8 @@ void WebContentsImpl::CreateNewWidget(int route_id, |
content::RenderProcessHost* process = GetRenderProcessHost(); |
RenderWidgetHostImpl* widget_host = |
new RenderWidgetHostImpl(this, process, route_id); |
+ created_widgets_.insert(widget_host); |
+ |
RenderWidgetHostViewPort* widget_view = |
RenderWidgetHostViewPort::CreateViewForWidget(widget_host); |
if (!is_fullscreen) { |