| 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..2758b297a701b94b717a99363b7c415cf4831f1b 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";
|
| @@ -103,9 +104,10 @@ void ModuleSystem::DumpException(const v8::TryCatch& try_catch) {
|
| << "{" << stack_trace << "}";
|
| }
|
|
|
| -void ModuleSystem::Require(const std::string& module_name) {
|
| +v8::Handle<v8::Value> ModuleSystem::Require(const std::string& module_name) {
|
| v8::HandleScope handle_scope;
|
| - RequireForJsInner(v8::String::New(module_name.c_str()));
|
| + return handle_scope.Close(
|
| + RequireForJsInner(v8::String::New(module_name.c_str())));
|
| }
|
|
|
| v8::Handle<v8::Value> ModuleSystem::RequireForJs(const v8::Arguments& args) {
|
| @@ -168,20 +170,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 +243,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);
|
| + 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));
|
| }
|
|
|
| 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,
|
|
|