// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "services/js/js_app_runner_delegate.h"

#include "base/path_service.h"
#include "gin/modules/console.h"
#include "gin/modules/timer.h"
#include "mojo/edk/js/core.h"
#include "mojo/edk/js/handle.h"
#include "mojo/edk/js/support.h"
#include "mojo/edk/js/threading.h"
#include "services/js/modules/clock/monotonic_clock.h"
#include "services/js/modules/gl/module.h"

namespace js {

namespace {

std::vector<base::FilePath> GetModuleSearchPaths() {
  std::vector<base::FilePath> search_paths(2);
  PathService::Get(base::DIR_SOURCE_ROOT, &search_paths[0]);
  PathService::Get(base::DIR_EXE, &search_paths[1]);
  search_paths[1] = search_paths[1].AppendASCII("gen");
  return search_paths;
}

// Shorten the AddBuiltinModule statements a little.
template<typename T>
void AddBuiltin(gin::ModuleRunnerDelegate* delegate) {
  delegate->AddBuiltinModule(T::kModuleName, T::GetModule);
}

} // namespace

JSAppRunnerDelegate::JSAppRunnerDelegate()
    : ModuleRunnerDelegate(GetModuleSearchPaths()) {
  AddBuiltin<gin::Console>(this);
  AddBuiltinModule(gin::TimerModule::kName, gin::TimerModule::GetModule);
  AddBuiltin<mojo::js::Core>(this);
  AddBuiltin<mojo::js::Support>(this);
  AddBuiltin<mojo::js::Threading>(this);
  AddBuiltin<gl::GL>(this);
  AddBuiltin<MonotonicClock>(this);
}

JSAppRunnerDelegate::~JSAppRunnerDelegate() {
}

void JSAppRunnerDelegate::UnhandledException(gin::ShellRunner* runner,
                                             gin::TryCatch& try_catch) {
  gin::ModuleRunnerDelegate::UnhandledException(runner, try_catch);
  LOG(ERROR) << try_catch.GetStackTrace();
}

} // namespace js

