Index: content/plugin/webplugin_delegate_stub.cc |
diff --git a/content/plugin/webplugin_delegate_stub.cc b/content/plugin/webplugin_delegate_stub.cc |
index bc130b2a0e3e91b039958b4061f25fbf67d90a48..c74f07b15bbab99273f0063ba84f5136a2572763 100644 |
--- a/content/plugin/webplugin_delegate_stub.cc |
+++ b/content/plugin/webplugin_delegate_stub.cc |
@@ -9,7 +9,6 @@ |
#include "base/bind.h" |
#include "base/command_line.h" |
#include "base/string_number_conversions.h" |
-#include "content/common/npobject_stub.h" |
#include "content/common/plugin_messages.h" |
#include "content/plugin/plugin_channel.h" |
#include "content/plugin/plugin_thread.h" |
@@ -31,7 +30,13 @@ using webkit::npapi::WebPlugin; |
using webkit::npapi::WebPluginResourceClient; |
static void DestroyWebPluginAndDelegate( |
- webkit::npapi::WebPluginDelegateImpl* delegate, WebPlugin* webplugin) { |
+ base::WeakPtr<NPObjectStub> scriptable_object, |
+ webkit::npapi::WebPluginDelegateImpl* delegate, |
+ WebPlugin* webplugin) { |
+ // The plugin may not expect us to try to release the scriptable object |
+ // after calling NPP_Destroy on the instance, so delete the stub now. |
+ if (scriptable_object.get()) |
+ scriptable_object->DeleteSoon(); |
// WebPlugin must outlive WebPluginDelegate. |
if (delegate) |
delegate->PluginDestroyed(); |
@@ -58,10 +63,12 @@ WebPluginDelegateStub::~WebPluginDelegateStub() { |
// The delegate or an npobject is in the callstack, so don't delete it |
// right away. |
MessageLoop::current()->PostNonNestableTask(FROM_HERE, |
- base::Bind(&DestroyWebPluginAndDelegate, delegate_, webplugin_)); |
+ base::Bind(&DestroyWebPluginAndDelegate, plugin_scriptable_object_, |
+ delegate_, webplugin_)); |
} else { |
// Safe to delete right away. |
- DestroyWebPluginAndDelegate(delegate_, webplugin_); |
+ DestroyWebPluginAndDelegate( |
+ plugin_scriptable_object_, delegate_, webplugin_); |
} |
} |
@@ -282,11 +289,13 @@ void WebPluginDelegateStub::OnGetPluginScriptableObject(int* route_id) { |
} |
*route_id = channel_->GenerateRouteID(); |
- // The stub will delete itself when the proxy tells it that it's released, or |
- // otherwise when the channel is closed. |
- new NPObjectStub( |
+ // We will delete the stub immediately before calling PluginDestroyed on the |
+ // delegate. It will delete itself sooner if the proxy tells it that it has |
+ // been released, or if the channel to the proxy is closed. |
+ NPObjectStub* scriptable_stub = new NPObjectStub( |
object, channel_.get(), *route_id, webplugin_->containing_window(), |
page_url_); |
+ plugin_scriptable_object_ = scriptable_stub->AsWeakPtr(); |
// Release ref added by GetPluginScriptableObject (our stub holds its own). |
WebBindings::releaseObject(object); |