Commit 63f5b310 authored by lazyboy's avatar lazyboy Committed by Commit bot

Make WebContentsImpl aware of all of its RWHs.

It used to be that WebContentsImpl only knew about the RWHs created
  through WebContentsImpl::CreateNewWidget() and stored them in
  WCI::created_widgets_. However, widgets created through
  FrameTree::CreateRenderViewHost() used to be left out.
This made RenderWidgetHostImpl::WasResized() to incorrectly send
  ViewMsg_Resize while the WebContents was being torn down. WasResized()
  has a check for !delegate_ but |delegate_| never became nullptr during
  WebContentsImpl shutdown. Adding all widgets to WCI::created_widgets_
  will ensure that we notify RWHs about the delegate's (WC) destruction
  via DetachDelegate and do not send ViewMsg_Resize while a the delegate
  (WC) is shutting down.

BUG=523644, 523451
Test=See https://code.google.com/p/chromium/issues/detail?id=523644#c16
  for repro steps. Ensure the renderer does not crash.

Review URL: https://codereview.chromium.org/1457203002

Cr-Commit-Position: refs/heads/master@{#361169}
parent 727acaba
...@@ -39,6 +39,9 @@ struct NativeWebKeyboardEvent; ...@@ -39,6 +39,9 @@ struct NativeWebKeyboardEvent;
// of the RenderWidgetHost. // of the RenderWidgetHost.
class CONTENT_EXPORT RenderWidgetHostDelegate { class CONTENT_EXPORT RenderWidgetHostDelegate {
public: public:
// The RenderWidgetHost has just been created.
virtual void RenderWidgetCreated(RenderWidgetHostImpl* render_widget_host) {}
// The RenderWidgetHost is going to be deleted. // The RenderWidgetHost is going to be deleted.
virtual void RenderWidgetDeleted(RenderWidgetHostImpl* render_widget_host) {} virtual void RenderWidgetDeleted(RenderWidgetHostImpl* render_widget_host) {}
......
...@@ -245,6 +245,8 @@ RenderWidgetHostImpl::RenderWidgetHostImpl(RenderWidgetHostDelegate* delegate, ...@@ -245,6 +245,8 @@ RenderWidgetHostImpl::RenderWidgetHostImpl(RenderWidgetHostDelegate* delegate,
new_content_rendering_timeout_.reset(new TimeoutMonitor( new_content_rendering_timeout_.reset(new TimeoutMonitor(
base::Bind(&RenderWidgetHostImpl::ClearDisplayedGraphics, base::Bind(&RenderWidgetHostImpl::ClearDisplayedGraphics,
weak_factory_.GetWeakPtr()))); weak_factory_.GetWeakPtr())));
delegate_->RenderWidgetCreated(this);
} }
RenderWidgetHostImpl::~RenderWidgetHostImpl() { RenderWidgetHostImpl::~RenderWidgetHostImpl() {
......
...@@ -1497,17 +1497,20 @@ void WebContentsImpl::LostCapture(RenderWidgetHostImpl* render_widget_host) { ...@@ -1497,17 +1497,20 @@ void WebContentsImpl::LostCapture(RenderWidgetHostImpl* render_widget_host) {
delegate_->LostCapture(); delegate_->LostCapture();
} }
void WebContentsImpl::RenderWidgetCreated(
RenderWidgetHostImpl* render_widget_host) {
created_widgets_.insert(render_widget_host);
}
void WebContentsImpl::RenderWidgetDeleted( void WebContentsImpl::RenderWidgetDeleted(
RenderWidgetHostImpl* render_widget_host) { RenderWidgetHostImpl* render_widget_host) {
if (is_being_destroyed_) { // Note that |is_being_destroyed_| can be true at this point as
// |created_widgets_| might have been destroyed. // ~WebContentsImpl() calls RFHM::ClearRFHsPendingShutdown(), which might lead
return; // us here.
} created_widgets_.erase(render_widget_host);
std::set<RenderWidgetHostImpl*>::iterator iter = if (is_being_destroyed_)
created_widgets_.find(render_widget_host); return;
if (iter != created_widgets_.end())
created_widgets_.erase(iter);
if (render_widget_host && if (render_widget_host &&
render_widget_host->GetRoutingID() == fullscreen_widget_routing_id_) { render_widget_host->GetRoutingID() == fullscreen_widget_routing_id_) {
...@@ -1923,7 +1926,6 @@ void WebContentsImpl::CreateNewWidget(int32 render_process_id, ...@@ -1923,7 +1926,6 @@ void WebContentsImpl::CreateNewWidget(int32 render_process_id,
RenderWidgetHostImpl* widget_host = RenderWidgetHostImpl* widget_host =
new RenderWidgetHostImpl(this, process, route_id, IsHidden()); new RenderWidgetHostImpl(this, process, route_id, IsHidden());
created_widgets_.insert(widget_host);
RenderWidgetHostViewBase* widget_view = RenderWidgetHostViewBase* widget_view =
static_cast<RenderWidgetHostViewBase*>( static_cast<RenderWidgetHostViewBase*>(
......
...@@ -560,6 +560,7 @@ class CONTENT_EXPORT WebContentsImpl ...@@ -560,6 +560,7 @@ class CONTENT_EXPORT WebContentsImpl
// RenderWidgetHostDelegate -------------------------------------------------- // RenderWidgetHostDelegate --------------------------------------------------
void RenderWidgetCreated(RenderWidgetHostImpl* render_widget_host) override;
void RenderWidgetDeleted(RenderWidgetHostImpl* render_widget_host) override; void RenderWidgetDeleted(RenderWidgetHostImpl* render_widget_host) override;
void RenderWidgetGotFocus(RenderWidgetHostImpl* render_widget_host) override; void RenderWidgetGotFocus(RenderWidgetHostImpl* render_widget_host) override;
void RenderWidgetWasResized(RenderWidgetHostImpl* render_widget_host, void RenderWidgetWasResized(RenderWidgetHostImpl* render_widget_host,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment