summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/extensions
diff options
context:
space:
mode:
authorjochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-22 08:39:51 +0000
committerjochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-22 08:39:51 +0000
commit7c65ec8032e4639565c8d6b51ea3395f60ada334 (patch)
tree013d28442393fb7b6933b87ea4cd1ad702d21d94 /chrome/renderer/extensions
parente6dcd6186906ce5b6223c1a6929476eb9fce412b (diff)
downloadchromium_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.cc31
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