| Index: chrome/renderer/extensions/native_handler.cc
|
| diff --git a/chrome/renderer/extensions/native_handler.cc b/chrome/renderer/extensions/native_handler.cc
|
| index a294891b9cb0119e371233e1ec7b260bc72653b5..4561f19c656d8e6a256cd228a135d83d9ac24db1 100644
|
| --- a/chrome/renderer/extensions/native_handler.cc
|
| +++ b/chrome/renderer/extensions/native_handler.cc
|
| @@ -38,15 +38,25 @@ v8::Handle<v8::Value> NativeHandler::Router(const v8::Arguments& args) {
|
| return handler_function->Run(args);
|
| }
|
|
|
| +// static
|
| +void NativeHandler::DisposeFunction(v8::Persistent<v8::Value> object,
|
| + void* parameter) {
|
| + HandlerFunction* handler_function =
|
| + reinterpret_cast<HandlerFunction*>(parameter);
|
| +
|
| + object.Dispose();
|
| + delete handler_function;
|
| +}
|
| +
|
| void NativeHandler::RouteFunction(const std::string& name,
|
| const HandlerFunction& handler_function) {
|
| - linked_ptr<HandlerFunction> function(new HandlerFunction(handler_function));
|
| - // TODO(koz): Investigate using v8's MakeWeak() function instead of holding
|
| - // on to these pointers here.
|
| - handler_functions_.push_back(function);
|
| + HandlerFunction* function = new HandlerFunction(handler_function);
|
| + // Deleted in DisposeFunction once v8 garbage collects function_template.
|
| + v8::Persistent<v8::External> function_value =
|
| + v8::Persistent<v8::External>::New(v8::External::New(function));
|
| + function_value.MakeWeak(function, DisposeFunction);
|
| v8::Handle<v8::FunctionTemplate> function_template =
|
| - v8::FunctionTemplate::New(Router,
|
| - v8::External::New(function.get()));
|
| + v8::FunctionTemplate::New(Router, function_value);
|
| object_template_->Set(name.c_str(), function_template);
|
| }
|
|
|
|
|