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
13namespace gin {
14
15ModuleRunnerDelegate::ModuleRunnerDelegate(
16  const std::vector<base::FilePath>& search_paths)
17    : module_provider_(search_paths) {
18}
19
20ModuleRunnerDelegate::~ModuleRunnerDelegate() {
21}
22
23void ModuleRunnerDelegate::AddBuiltinModule(const std::string& id,
24                                            ModuleGetter getter) {
25  builtin_modules_[id] = base::Bind(getter);
26}
27
28void ModuleRunnerDelegate::AddBuiltinModule(const std::string& id,
29    const ModuleGetterCallback& getter) {
30  builtin_modules_[id] = getter;
31}
32
33void 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
41v8::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
49void 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
63void ModuleRunnerDelegate::DidRunScript(ShellRunner* runner) {
64  AttemptToLoadMoreModules(runner);
65}
66
67}  // namespace gin
68