| // 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 "gin/shell_runner.h" | 
 |  | 
 | #include "gin/converter.h" | 
 | #include "gin/modules/module_registry.h" | 
 | #include "gin/per_context_data.h" | 
 | #include "gin/public/context_holder.h" | 
 | #include "gin/try_catch.h" | 
 |  | 
 | using v8::Context; | 
 | using v8::HandleScope; | 
 | using v8::Isolate; | 
 | using v8::Object; | 
 | using v8::ObjectTemplate; | 
 | using v8::Script; | 
 |  | 
 | namespace gin { | 
 |  | 
 | ShellRunnerDelegate::ShellRunnerDelegate() { | 
 | } | 
 |  | 
 | ShellRunnerDelegate::~ShellRunnerDelegate() { | 
 | } | 
 |  | 
 | v8::Handle<ObjectTemplate> ShellRunnerDelegate::GetGlobalTemplate( | 
 |     ShellRunner* runner, | 
 |     v8::Isolate* isolate) { | 
 |   return v8::Handle<ObjectTemplate>(); | 
 | } | 
 |  | 
 | void ShellRunnerDelegate::DidCreateContext(ShellRunner* runner) { | 
 | } | 
 |  | 
 | void ShellRunnerDelegate::WillRunScript(ShellRunner* runner) { | 
 | } | 
 |  | 
 | void ShellRunnerDelegate::DidRunScript(ShellRunner* runner) { | 
 | } | 
 |  | 
 | void ShellRunnerDelegate::UnhandledException(ShellRunner* runner, | 
 |                                                TryCatch& try_catch) { | 
 |   CHECK(false) << try_catch.GetStackTrace(); | 
 | } | 
 |  | 
 | ShellRunner::ShellRunner(ShellRunnerDelegate* delegate, Isolate* isolate) | 
 |     : delegate_(delegate) { | 
 |   v8::Isolate::Scope isolate_scope(isolate); | 
 |   HandleScope handle_scope(isolate); | 
 |   v8::Handle<v8::Context> context = | 
 |       Context::New(isolate, NULL, delegate_->GetGlobalTemplate(this, isolate)); | 
 |  | 
 |   context_holder_.reset(new ContextHolder(isolate)); | 
 |   context_holder_->SetContext(context); | 
 |   PerContextData::From(context)->set_runner(this); | 
 |  | 
 |   v8::Context::Scope scope(context); | 
 |   delegate_->DidCreateContext(this); | 
 | } | 
 |  | 
 | ShellRunner::~ShellRunner() { | 
 | } | 
 |  | 
 | void ShellRunner::Run(const std::string& source, | 
 |                       const std::string& resource_name) { | 
 |   TryCatch try_catch; | 
 |   v8::Isolate* isolate = GetContextHolder()->isolate(); | 
 |   v8::Handle<Script> script = Script::Compile( | 
 |       StringToV8(isolate, source), StringToV8(isolate, resource_name)); | 
 |   if (try_catch.HasCaught()) { | 
 |     delegate_->UnhandledException(this, try_catch); | 
 |     return; | 
 |   } | 
 |  | 
 |   Run(script); | 
 | } | 
 |  | 
 | v8::Handle<v8::Value> ShellRunner::Call(v8::Handle<v8::Function> function, | 
 |                                         v8::Handle<v8::Value> receiver, | 
 |                                         int argc, | 
 |                                         v8::Handle<v8::Value> argv[]) { | 
 |   TryCatch try_catch; | 
 |   delegate_->WillRunScript(this); | 
 |  | 
 |   v8::Handle<v8::Value> result = function->Call(receiver, argc, argv); | 
 |  | 
 |   delegate_->DidRunScript(this); | 
 |   if (try_catch.HasCaught()) | 
 |     delegate_->UnhandledException(this, try_catch); | 
 |  | 
 |   return result; | 
 | } | 
 |  | 
 | ContextHolder* ShellRunner::GetContextHolder() { | 
 |   return context_holder_.get(); | 
 | } | 
 |  | 
 | void ShellRunner::Run(v8::Handle<Script> script) { | 
 |   TryCatch try_catch; | 
 |   delegate_->WillRunScript(this); | 
 |  | 
 |   script->Run(); | 
 |  | 
 |   delegate_->DidRunScript(this); | 
 |   if (try_catch.HasCaught()) { | 
 |     delegate_->UnhandledException(this, try_catch); | 
 |   } | 
 | } | 
 |  | 
 | }  // namespace gin |