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 |