Chromium Code Reviews| Index: extensions/renderer/module_system.cc |
| diff --git a/extensions/renderer/module_system.cc b/extensions/renderer/module_system.cc |
| index 78d485c3ccaf95b440563bd55fe1f0cbf60de0a5..c66ab94ca0c672ab8935f896bd2e70ac22e41659 100644 |
| --- a/extensions/renderer/module_system.cc |
| +++ b/extensions/renderer/module_system.cc |
| @@ -227,7 +227,15 @@ v8::Local<v8::Value> ModuleSystem::RequireForJsInner( |
| if (!exports->IsUndefined()) |
| return handle_scope.Escape(exports); |
| - exports = LoadModule(*v8::String::Utf8Value(module_name)); |
| + std::string module_name_str = *v8::String::Utf8Value(module_name); |
| + |
| + v8::Handle<v8::Value> source(GetSource(module_name_str)); |
| + if (source.IsEmpty() || source->IsUndefined()) { |
| + Fatal(context_, "No source for require(" + module_name_str + ")"); |
| + return v8::Undefined(GetIsolate()); |
| + } |
| + |
| + exports = LoadModule(module_name_str, source); |
| modules->Set(module_name, exports); |
| return handle_scope.Escape(exports); |
| } |
| @@ -538,13 +546,24 @@ void ModuleSystem::RequireAsync( |
| GetIsolate(), "Extension view no longer exists"))); |
| return; |
| } |
| + |
| + v8::Handle<v8::Value> source(GetSource(module_name)); |
| + if ((source.IsEmpty() || source->IsUndefined()) && |
|
Sam McNally
2015/01/22 07:42:11
I'm not a fan of this. It introduces ordering depe
|
| + !ContainsKey(module_registry->available_modules(), module_name)) { |
| + std::string error_text = "No source for require(" + module_name + ")"; |
| + Fatal(context_, error_text); |
| + resolver->Reject(v8::Exception::Error( |
| + v8::String::NewFromUtf8(GetIsolate(), error_text.c_str()))); |
| + return; |
| + } |
| + |
| module_registry->LoadModule(GetIsolate(), |
| module_name, |
| base::Bind(&ModuleSystem::OnModuleLoaded, |
| weak_factory_.GetWeakPtr(), |
| base::Passed(&persistent_resolver))); |
| if (module_registry->available_modules().count(module_name) == 0) |
| - LoadModule(module_name); |
| + LoadModule(module_name, source); |
| } |
| v8::Handle<v8::String> ModuleSystem::WrapSource(v8::Handle<v8::String> source) { |
| @@ -588,17 +607,14 @@ void ModuleSystem::Private(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| args.GetReturnValue().Set(privates); |
| } |
| -v8::Handle<v8::Value> ModuleSystem::LoadModule(const std::string& module_name) { |
| +v8::Handle<v8::Value> ModuleSystem::LoadModule( |
| + const std::string& module_name, |
| + v8::Handle<v8::Value> module_source) { |
| v8::EscapableHandleScope handle_scope(GetIsolate()); |
| v8::Context::Scope context_scope(context()->v8_context()); |
| - v8::Handle<v8::Value> source(GetSource(module_name)); |
| - if (source.IsEmpty() || source->IsUndefined()) { |
| - Fatal(context_, "No source for require(" + module_name + ")"); |
| - return v8::Undefined(GetIsolate()); |
| - } |
| v8::Handle<v8::String> wrapped_source( |
| - WrapSource(v8::Handle<v8::String>::Cast(source))); |
| + WrapSource(v8::Handle<v8::String>::Cast(module_source))); |
| // Modules are wrapped in (function(){...}) so they always return functions. |
| v8::Handle<v8::Value> func_as_value = |
| RunString(wrapped_source, |
| @@ -669,7 +685,7 @@ void ModuleSystem::OnDidAddPendingModule( |
| // responsible for loading their module dependencies when required. |
| if (registry->available_modules().count(dependency) == 0 && |
| (module_system_managed || source_map_->Contains(dependency))) { |
| - LoadModule(dependency); |
| + LoadModule(dependency, GetSource(dependency)); |
| } |
| } |
| registry->AttemptToLoadMoreModules(GetIsolate()); |
| @@ -678,8 +694,10 @@ void ModuleSystem::OnDidAddPendingModule( |
| void ModuleSystem::OnModuleLoaded( |
| scoped_ptr<v8::UniquePersistent<v8::Promise::Resolver> > resolver, |
| v8::Handle<v8::Value> value) { |
| - if (!is_valid()) |
| + if (!is_valid()) { |
| + LOG(ERROR) << "!is_valid"; |
| return; |
| + } |
| v8::HandleScope handle_scope(GetIsolate()); |
| v8::Handle<v8::Promise::Resolver> resolver_local( |
| v8::Local<v8::Promise::Resolver>::New(GetIsolate(), *resolver)); |