Home | History | Annotate | Download | only in shell
      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 "base/at_exit.h"
      6 #include "base/bind.h"
      7 #include "base/command_line.h"
      8 #include "base/files/file_util.h"
      9 #include "base/i18n/icu_util.h"
     10 #include "base/message_loop/message_loop.h"
     11 #include "gin/array_buffer.h"
     12 #include "gin/modules/console.h"
     13 #include "gin/modules/module_runner_delegate.h"
     14 #include "gin/public/isolate_holder.h"
     15 #include "gin/test/file_runner.h"
     16 #include "gin/try_catch.h"
     17 
     18 namespace gin {
     19 namespace {
     20 
     21 std::string Load(const base::FilePath& path) {
     22   std::string source;
     23   if (!ReadFileToString(path, &source))
     24     LOG(FATAL) << "Unable to read " << path.LossyDisplayName();
     25   return source;
     26 }
     27 
     28 void Run(base::WeakPtr<Runner> runner, const base::FilePath& path) {
     29   if (!runner)
     30     return;
     31   Runner::Scope scope(runner.get());
     32   runner->Run(Load(path), path.AsUTF8Unsafe());
     33 }
     34 
     35 std::vector<base::FilePath> GetModuleSearchPaths() {
     36   std::vector<base::FilePath> module_base(1);
     37   CHECK(base::GetCurrentDirectory(&module_base[0]));
     38   return module_base;
     39 }
     40 
     41 class GinShellRunnerDelegate : public ModuleRunnerDelegate {
     42  public:
     43   GinShellRunnerDelegate() : ModuleRunnerDelegate(GetModuleSearchPaths()) {
     44     AddBuiltinModule(Console::kModuleName, Console::GetModule);
     45   }
     46 
     47   virtual void UnhandledException(ShellRunner* runner,
     48                                   TryCatch& try_catch) OVERRIDE {
     49     ModuleRunnerDelegate::UnhandledException(runner, try_catch);
     50     LOG(ERROR) << try_catch.GetStackTrace();
     51   }
     52 
     53  private:
     54   DISALLOW_COPY_AND_ASSIGN(GinShellRunnerDelegate);
     55 };
     56 
     57 }  // namespace
     58 }  // namespace gin
     59 
     60 int main(int argc, char** argv) {
     61   base::AtExitManager at_exit;
     62   CommandLine::Init(argc, argv);
     63   base::i18n::InitializeICU();
     64 
     65   gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
     66                                  gin::ArrayBufferAllocator::SharedInstance());
     67   gin::IsolateHolder instance;
     68 
     69   base::MessageLoop message_loop;
     70 
     71   gin::GinShellRunnerDelegate delegate;
     72   gin::ShellRunner runner(&delegate, instance.isolate());
     73 
     74   {
     75     gin::Runner::Scope scope(&runner);
     76     v8::V8::SetCaptureStackTraceForUncaughtExceptions(true);
     77   }
     78 
     79   CommandLine::StringVector args = CommandLine::ForCurrentProcess()->GetArgs();
     80   for (CommandLine::StringVector::const_iterator it = args.begin();
     81        it != args.end(); ++it) {
     82     base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
     83         gin::Run, runner.GetWeakPtr(), base::FilePath(*it)));
     84   }
     85 
     86   message_loop.RunUntilIdle();
     87   return 0;
     88 }
     89