Index: content/renderer/pepper/pepper_plugin_instance_impl.cc |
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc |
index 50c7fe3420e6642c7ca977b0c7bdde2938922f58..2168d5a885cc1a5e03fa39a777eb7f41aba0ae25 100644 |
--- a/content/renderer/pepper/pepper_plugin_instance_impl.cc |
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc |
@@ -543,6 +543,26 @@ PepperPluginInstanceImpl::PepperPluginInstanceImpl( |
if (render_frame) { // NULL in tests |
render_frame->render_view()->PepperInstanceCreated(this); |
+ // Bind a callback now so that we can inform the RenderViewImpl when we are |
+ // destroyed. This works around a temporary problem stemming from work to |
+ // move parts of RenderViewImpl in to RenderFrameImpl (see |
+ // crbug.com/245126). If destruction happens in this order: |
+ // 1) RenderFrameImpl |
+ // 2) PepperPluginInstanceImpl |
+ // 3) RenderViewImpl |
+ // Then after 1), the PepperPluginInstanceImpl doesn't have any way to talk |
+ // to the RenderViewImpl. But when the instance is destroyed, it still |
+ // needs to inform the RenderViewImpl that it has gone away, otherwise |
+ // between (2) and (3), the RenderViewImpl will still have the dead |
+ // instance in its active set, and so might make calls on the deleted |
+ // instance. See crbug.com/343576 for more information. Once the plugin |
+ // calls move entirely from RenderViewImpl in to RenderFrameImpl, this |
+ // can be a little bit simplified by instead making a direct call on |
+ // RenderFrameImpl in the destructor (but only if render_frame_ is valid). |
+ instance_deleted_callback_ = |
+ base::Bind(&RenderViewImpl::PepperInstanceDeleted, |
+ render_frame->render_view()->AsWeakPtr(), |
+ base::Unretained(this)); |
view_data_.is_page_visible = !render_frame_->GetRenderWidget()->is_hidden(); |
// Set the initial focus. |
@@ -584,8 +604,8 @@ PepperPluginInstanceImpl::~PepperPluginInstanceImpl() { |
if (TrackedCallback::IsPending(lock_mouse_callback_)) |
lock_mouse_callback_->Abort(); |
- if (render_frame_ && render_frame_->render_view()) |
- render_frame_->render_view()->PepperInstanceDeleted(this); |
+ if (!instance_deleted_callback_.is_null()) |
+ instance_deleted_callback_.Run(); |
if (!module_->IsProxied() && render_frame_) { |
PepperBrowserConnection* browser_connection = |