| 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..8a5f7582e2b5c9d6a9fba5af2f67ba0ab0a2ee01 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,35 @@ 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);
|
| + } else {
|
| + NOTREACHED();
|
| + }
|
| + return v8::Undefined();
|
| + }
|
| };
|
|
|
| } // namespace
|
|
|