diff options
author | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-22 08:39:51 +0000 |
---|---|---|
committer | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-22 08:39:51 +0000 |
commit | 7c65ec8032e4639565c8d6b51ea3395f60ada334 (patch) | |
tree | 013d28442393fb7b6933b87ea4cd1ad702d21d94 /chrome/renderer/extensions | |
parent | e6dcd6186906ce5b6223c1a6929476eb9fce412b (diff) | |
download | chromium_src-7c65ec8032e4639565c8d6b51ea3395f60ada334.zip chromium_src-7c65ec8032e4639565c8d6b51ea3395f60ada334.tar.gz chromium_src-7c65ec8032e4639565c8d6b51ea3395f60ada334.tar.bz2 |
Merge 126884 - Make sure ports are closed when they're no longer used.
It appears to be a common pattern that extensions don't invoke the
responseCallback, and so the port objects leak. Register a callback that
triggers when the responseCallback is finalized to free up these resources.
BUG=114738, 93566
TEST=manual
Review URL: http://codereview.chromium.org/9693048
TBR=jochen@chromium.org
Review URL: https://chromiumcodereview.appspot.com/9808007
git-svn-id: svn://svn.chromium.org/chrome/branches/1025/src@128182 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/extensions')
-rw-r--r-- | chrome/renderer/extensions/miscellaneous_bindings.cc | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/chrome/renderer/extensions/miscellaneous_bindings.cc b/chrome/renderer/extensions/miscellaneous_bindings.cc index e118608..458551a 100644 --- a/chrome/renderer/extensions/miscellaneous_bindings.cc +++ b/chrome/renderer/extensions/miscellaneous_bindings.cc @@ -88,6 +88,8 @@ class ExtensionImpl : public ChromeV8Extension { return v8::FunctionTemplate::New(PortRelease); } else if (name->Equals(v8::String::New("GetL10nMessage"))) { return v8::FunctionTemplate::New(GetL10nMessage); + } else if (name->Equals(v8::String::New("BindToGC"))) { + return v8::FunctionTemplate::New(BindToGC); } return ChromeV8Extension::GetNativeFunction(name); } @@ -246,6 +248,35 @@ class ExtensionImpl : public ChromeV8Extension { return v8::String::New(ReplaceStringPlaceholders( message, substitutions, NULL).c_str()); } + + struct GCCallbackArgs { + v8::Persistent<v8::Object> object; + v8::Persistent<v8::Function> callback; + }; + + static void GCCallback(v8::Persistent<v8::Value> object, void* parameter) { + v8::HandleScope handle_scope; + GCCallbackArgs* args = reinterpret_cast<GCCallbackArgs*>(parameter); + args->callback->Call(args->callback->CreationContext()->Global(), 0, NULL); + args->callback.Dispose(); + args->object.Dispose(); + delete args; + } + + // Binds a callback to be invoked when the given object is garbage collected. + static v8::Handle<v8::Value> BindToGC(const v8::Arguments& args) { + if (args.Length() == 2 && args[0]->IsObject() && args[1]->IsFunction()) { + GCCallbackArgs* context = new GCCallbackArgs; + context->callback = v8::Persistent<v8::Function>::New( + v8::Handle<v8::Function>::Cast(args[1])); + context->object = v8::Persistent<v8::Object>::New( + v8::Handle<v8::Object>::Cast(args[0])); + context->object.MakeWeak(context, GCCallback); + } else { + NOTREACHED(); + } + return v8::Undefined(); + } }; } // namespace |