| 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..d64cca76fffd1e184f205adf8a9eff5ca7dc881a 100644
|
| --- a/chrome/renderer/extensions/module_system.cc
|
| +++ b/chrome/renderer/extensions/module_system.cc
|
| @@ -103,9 +103,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 +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,
|
| @@ -199,9 +213,42 @@ void ModuleSystem::RunString(const std::string& code, const std::string& name) {
|
| RunString(v8::String::New(code.c_str()), v8::String::New(name.c_str()));
|
| }
|
|
|
| +v8::Handle<v8::Object> ModuleSystem::GetModule(
|
| + v8::Handle<v8::Object> parameters) {
|
| + NativesEnabledScope scope(this);
|
| + v8::Handle<v8::Object> module = v8::Handle<v8::Object>::Cast(
|
| + RequireForJsInner(
|
| + parameters->Get(v8::String::New(kModuleName))->ToString()));
|
| + return module;
|
| +}
|
| +
|
| +v8::Handle<v8::Object> ModuleSystem::GetNativeModule(
|
| + v8::Handle<v8::Object> parameters) {
|
| + NativesEnabledScope scope(this);
|
| + std::string name = *v8::String::AsciiValue(
|
| + parameters->Get(v8::String::New(kModuleName))->ToString());
|
| + v8::Handle<v8::Object> module = v8::Handle<v8::Object>::Cast(
|
| + GetNativeFromString(name));
|
| + return module;
|
| +}
|
| +
|
| +// static
|
| +v8::Handle<v8::Value> ModuleSystem::NativeLazyFieldGetter(
|
| + v8::Local<v8::String> property, const v8::AccessorInfo& info) {
|
| + return BaseLazyFieldGetter(property, info, &ModuleSystem::GetNativeModule);
|
| +}
|
| +
|
| // static
|
| v8::Handle<v8::Value> ModuleSystem::LazyFieldGetter(
|
| v8::Local<v8::String> property, const v8::AccessorInfo& info) {
|
| + return BaseLazyFieldGetter(property, info, &ModuleSystem::GetModule);
|
| +}
|
| +
|
| +// static
|
| +v8::Handle<v8::Value> ModuleSystem::BaseLazyFieldGetter(
|
| + v8::Local<v8::String> property,
|
| + const v8::AccessorInfo& info,
|
| + GetModuleFunc get_module) {
|
| CHECK(!info.Data().IsEmpty());
|
| CHECK(info.Data()->IsObject());
|
| v8::HandleScope handle_scope;
|
| @@ -216,12 +263,7 @@ v8::Handle<v8::Value> ModuleSystem::LazyFieldGetter(
|
| ModuleSystem* module_system = static_cast<ModuleSystem*>(
|
| v8::Handle<v8::External>::Cast(module_system_value)->Value());
|
|
|
| - v8::Handle<v8::Object> module;
|
| - {
|
| - NativesEnabledScope scope(module_system);
|
| - module = v8::Handle<v8::Object>::Cast(module_system->RequireForJsInner(
|
| - parameters->Get(v8::String::New(kModuleName))->ToString()));
|
| - }
|
| + v8::Handle<v8::Object> module = (module_system->*get_module)(parameters);
|
| if (module.IsEmpty())
|
| return handle_scope.Close(v8::Handle<v8::Value>());
|
|
|
| @@ -235,6 +277,15 @@ 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,
|
| + &ModuleSystem::LazyFieldGetter);
|
| +}
|
| +
|
| +void ModuleSystem::SetLazyField(v8::Handle<v8::Object> object,
|
| + const std::string& field,
|
| + const std::string& module_name,
|
| + const std::string& module_field,
|
| + v8::AccessorGetter getter) {
|
| v8::HandleScope handle_scope;
|
| v8::Handle<v8::Object> parameters = v8::Object::New();
|
| parameters->Set(v8::String::New(kModuleName),
|
| @@ -243,11 +294,19 @@ void ModuleSystem::SetLazyField(v8::Handle<v8::Object> object,
|
| v8::String::New(module_field.c_str()));
|
|
|
| object->SetAccessor(v8::String::New(field.c_str()),
|
| - &ModuleSystem::LazyFieldGetter,
|
| + getter,
|
| NULL,
|
| parameters);
|
| }
|
|
|
| +void ModuleSystem::SetNativeLazyField(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,
|
| + &ModuleSystem::NativeLazyFieldGetter);
|
| +}
|
| +
|
| v8::Handle<v8::Value> ModuleSystem::RunString(v8::Handle<v8::String> code,
|
| v8::Handle<v8::String> name) {
|
| v8::HandleScope handle_scope;
|
| @@ -279,11 +338,16 @@ v8::Handle<v8::Value> ModuleSystem::GetSource(
|
|
|
| v8::Handle<v8::Value> ModuleSystem::GetNative(const v8::Arguments& args) {
|
| CHECK_EQ(1, args.Length());
|
| + std::string native_name = *v8::String::AsciiValue(args[0]->ToString());
|
| + return GetNativeFromString(native_name);
|
| +}
|
| +
|
| +v8::Handle<v8::Value> ModuleSystem::GetNativeFromString(
|
| + const std::string& native_name) {
|
| if (natives_enabled_ == 0)
|
| return ThrowException("Natives disabled");
|
| - std::string native_name = *v8::String::AsciiValue(args[0]->ToString());
|
| if (overridden_native_handlers_.count(native_name) > 0u)
|
| - return RequireForJs(args);
|
| + return RequireForJsInner(v8::String::New(native_name.c_str()));
|
| NativeHandlerMap::iterator i = native_handler_map_.find(native_name);
|
| if (i == native_handler_map_.end())
|
| return v8::Undefined();
|
|
|