1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "gin/modules/module_runner_delegate.h" 6 7 #include "base/bind.h" 8 #include "base/bind_helpers.h" 9 #include "gin/modules/module_registry.h" 10 #include "gin/object_template_builder.h" 11 #include "gin/public/context_holder.h" 12 13 namespace gin { 14 15 ModuleRunnerDelegate::ModuleRunnerDelegate( 16 const std::vector<base::FilePath>& search_paths) 17 : module_provider_(search_paths) { 18 } 19 20 ModuleRunnerDelegate::~ModuleRunnerDelegate() { 21 } 22 23 void ModuleRunnerDelegate::AddBuiltinModule(const std::string& id, 24 ModuleGetter getter) { 25 builtin_modules_[id] = base::Bind(getter); 26 } 27 28 void ModuleRunnerDelegate::AddBuiltinModule(const std::string& id, 29 const ModuleGetterCallback& getter) { 30 builtin_modules_[id] = getter; 31 } 32 33 void ModuleRunnerDelegate::AttemptToLoadMoreModules(Runner* runner) { 34 ModuleRegistry* registry = ModuleRegistry::From( 35 runner->GetContextHolder()->context()); 36 registry->AttemptToLoadMoreModules(runner->GetContextHolder()->isolate()); 37 module_provider_.AttempToLoadModules( 38 runner, registry->unsatisfied_dependencies()); 39 } 40 41 v8::Handle<v8::ObjectTemplate> ModuleRunnerDelegate::GetGlobalTemplate( 42 ShellRunner* runner, 43 v8::Isolate* isolate) { 44 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplateBuilder(isolate).Build(); 45 ModuleRegistry::RegisterGlobals(isolate, templ); 46 return templ; 47 } 48 49 void ModuleRunnerDelegate::DidCreateContext(ShellRunner* runner) { 50 ShellRunnerDelegate::DidCreateContext(runner); 51 52 v8::Handle<v8::Context> context = runner->GetContextHolder()->context(); 53 ModuleRegistry* registry = ModuleRegistry::From(context); 54 55 v8::Isolate* isolate = runner->GetContextHolder()->isolate(); 56 57 for (BuiltinModuleMap::const_iterator it = builtin_modules_.begin(); 58 it != builtin_modules_.end(); ++it) { 59 registry->AddBuiltinModule(isolate, it->first, it->second.Run(isolate)); 60 } 61 } 62 63 void ModuleRunnerDelegate::DidRunScript(ShellRunner* runner) { 64 AttemptToLoadMoreModules(runner); 65 } 66 67 } // namespace gin 68