mojo_runner_delegate.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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 "mojo/apps/js/mojo_runner_delegate.h" 6 7#include "base/bind.h" 8#include "base/path_service.h" 9#include "gin/converter.h" 10#include "gin/modules/console.h" 11#include "gin/modules/module_registry.h" 12#include "gin/try_catch.h" 13#include "mojo/apps/js/bindings/core.h" 14#include "mojo/apps/js/bindings/support.h" 15#include "mojo/apps/js/bindings/threading.h" 16 17namespace mojo { 18namespace apps { 19 20namespace { 21 22// TODO(abarth): Rather than loading these modules from the file system, we 23// should load them from the network via Mojo IPC. 24std::vector<base::FilePath> GetModuleSearchPaths() { 25 std::vector<base::FilePath> search_paths(2); 26 PathService::Get(base::DIR_SOURCE_ROOT, &search_paths[0]); 27 PathService::Get(base::DIR_EXE, &search_paths[1]); 28 search_paths[1] = search_paths[1].AppendASCII("gen"); 29 return search_paths; 30} 31 32void StartCallback(base::WeakPtr<gin::Runner> runner, 33 MojoHandle pipe, 34 v8::Handle<v8::Value> module) { 35 v8::Isolate* isolate = runner->isolate(); 36 v8::Handle<v8::Function> start; 37 CHECK(gin::ConvertFromV8(isolate, module, &start)); 38 39 v8::Handle<v8::Value> args[] = { gin::ConvertToV8(isolate, pipe) }; 40 runner->Call(start, runner->global(), 1, args); 41} 42 43} // namespace 44 45MojoRunnerDelegate::MojoRunnerDelegate() 46 : ModuleRunnerDelegate(GetModuleSearchPaths()) { 47 AddBuiltinModule(Threading::kModuleName, Threading::GetTemplate); 48 AddBuiltinModule(gin::Console::kModuleName, gin::Console::GetTemplate); 49 AddBuiltinModule(js::Core::kModuleName, js::Core::GetTemplate); 50 AddBuiltinModule(js::Support::kModuleName, js::Support::GetTemplate); 51} 52 53MojoRunnerDelegate::~MojoRunnerDelegate() { 54} 55 56void MojoRunnerDelegate::Start(gin::Runner* runner, 57 MojoHandle pipe, 58 const std::string& module) { 59 gin::Runner::Scope scope(runner); 60 gin::ModuleRegistry* registry = gin::ModuleRegistry::From(runner->context()); 61 registry->LoadModule(runner->isolate(), module, 62 base::Bind(StartCallback, runner->GetWeakPtr(), pipe)); 63 AttemptToLoadMoreModules(runner); 64} 65 66void MojoRunnerDelegate::UnhandledException(gin::Runner* runner, 67 gin::TryCatch& try_catch) { 68 gin::ModuleRunnerDelegate::UnhandledException(runner, try_catch); 69 LOG(ERROR) << try_catch.GetStackTrace(); 70} 71 72} // namespace apps 73} // namespace mojo 74