Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(212)

Unified Diff: chrome/renderer/extensions/miscellaneous_bindings.cc

Issue 9693048: Make sure ports are closed when they're no longer used. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/extensions/miscellaneous_bindings.cc
diff --git a/chrome/renderer/extensions/miscellaneous_bindings.cc b/chrome/renderer/extensions/miscellaneous_bindings.cc
index 31a892399cd0e61440402854e9bcf01d4c9eda7b..b45a9249b89bca56228837fe8fb584d5d63797a2 100644
--- a/chrome/renderer/extensions/miscellaneous_bindings.cc
+++ b/chrome/renderer/extensions/miscellaneous_bindings.cc
@@ -84,6 +84,8 @@ class ExtensionImpl : public ChromeV8Extension {
return v8::FunctionTemplate::New(PortAddRef);
} else if (name->Equals(v8::String::New("PortRelease"))) {
return v8::FunctionTemplate::New(PortRelease);
+ } else if (name->Equals(v8::String::New("BindToGC"))) {
+ return v8::FunctionTemplate::New(BindToGC);
}
return ChromeV8Extension::GetNativeFunction(name);
}
@@ -149,6 +151,33 @@ class ExtensionImpl : public ChromeV8Extension {
}
return v8::Undefined();
}
+
+ 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);
+ }
Matt Perry 2012/03/13 19:54:39 nit: can you add an "else NOTREACHED()" here so we
+ return v8::Undefined();
+ }
};
} // namespace

Powered by Google App Engine
This is Rietveld 408576698