Chromium Code Reviews| Index: chrome/renderer/extensions/module_system.cc |
| diff --git a/chrome/renderer/extensions/module_system.cc b/chrome/renderer/extensions/module_system.cc |
| index 69b2c78fddf1b215350b554030c2f7bd7149c871..7678569f4fb815bc9491d907ec45964cad83a5aa 100644 |
| --- a/chrome/renderer/extensions/module_system.cc |
| +++ b/chrome/renderer/extensions/module_system.cc |
| @@ -9,6 +9,7 @@ |
| namespace { |
| +const char* kArgument = "argument"; |
| const char* kModuleSystem = "module_system"; |
| const char* kModuleName = "module_name"; |
| const char* kModuleField = "module_field"; |
| @@ -168,20 +169,33 @@ void ModuleSystem::CallModuleMethod(const std::string& module_name, |
| v8::Local<v8::Value> value = |
| v8::Handle<v8::Object>::Cast(module)->Get( |
| v8::String::New(method_name.c_str())); |
| + CallModuleMethod(value, 0, NULL); |
| +} |
| + |
| +v8::Handle<v8::Value> ModuleSystem::CallModuleMethod( |
| + v8::Local<v8::Value> value, |
| + int argc, |
| + v8::Handle<v8::Value> argv[]) { |
| if (value.IsEmpty() || !value->IsFunction()) |
| - return; |
| + return v8::Handle<v8::Value>(); |
| v8::Handle<v8::Function> func = |
| v8::Handle<v8::Function>::Cast(value); |
| // TODO(jeremya/koz): refer to context_ here, not the current context. |
| v8::Handle<v8::Object> global(v8::Context::GetCurrent()->Global()); |
| + v8::Handle<v8::Value> ret; |
| { |
| WebKit::WebScopedMicrotaskSuppression suppression; |
| v8::TryCatch try_catch; |
| try_catch.SetCaptureMessage(true); |
| - func->Call(global, 0, NULL); |
| + ret = func->Call(global, argc, argv); |
| if (try_catch.HasCaught()) |
| HandleException(try_catch); |
| } |
| + return ret; |
| +} |
| + |
| +bool ModuleSystem::HasNativeHandler(const std::string& name) { |
| + return native_handler_map_.find(name) != native_handler_map_.end(); |
| } |
| void ModuleSystem::RegisterNativeHandler(const std::string& name, |
| @@ -228,19 +242,37 @@ v8::Handle<v8::Value> ModuleSystem::LazyFieldGetter( |
| v8::Handle<v8::String> field = |
| parameters->Get(v8::String::New(kModuleField))->ToString(); |
| - return handle_scope.Close(module->Get(field)); |
| + v8::Local<v8::Value> value = module->Get(field); |
|
not at google - send to devlin
2012/12/13 22:26:40
Something to add a TODO about - it seems like we c
|
| + if (!parameters->Has(v8::String::New(kArgument))) |
| + return handle_scope.Close(module->Get(field)); |
| + v8::Handle<v8::Value> argv[] = {parameters->Get(v8::String::New(kArgument))}; |
| + |
| + NativesEnabledScope scope(module_system); |
| + return handle_scope.Close(module_system->CallModuleMethod(value, 1, argv)); |
|
not at google - send to devlin
2012/12/13 22:26:40
Yeah, all this stuff - can it go in schema_binding
|
| } |
| void ModuleSystem::SetLazyField(v8::Handle<v8::Object> object, |
| const std::string& field, |
| const std::string& module_name, |
| const std::string& module_field) { |
| + SetLazyField(object, field, module_name, module_field, ""); |
| +} |
| + |
| +void ModuleSystem::SetLazyField(v8::Handle<v8::Object> object, |
| + const std::string& field, |
| + const std::string& module_name, |
| + const std::string& module_field, |
| + const std::string& arg) { |
| v8::HandleScope handle_scope; |
| v8::Handle<v8::Object> parameters = v8::Object::New(); |
| parameters->Set(v8::String::New(kModuleName), |
| v8::String::New(module_name.c_str())); |
| parameters->Set(v8::String::New(kModuleField), |
| v8::String::New(module_field.c_str())); |
| + if (arg.size()) { |
| + parameters->Set(v8::String::New(kArgument), |
| + v8::String::New(arg.c_str())); |
| + } |
| object->SetAccessor(v8::String::New(field.c_str()), |
| &ModuleSystem::LazyFieldGetter, |