Home | History | Annotate | Download | only in gin
      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/runner.h"
      6 
      7 #include "gin/converter.h"
      8 #include "gin/per_context_data.h"
      9 #include "gin/try_catch.h"
     10 
     11 using v8::Context;
     12 using v8::HandleScope;
     13 using v8::Isolate;
     14 using v8::Object;
     15 using v8::ObjectTemplate;
     16 using v8::Script;
     17 
     18 namespace gin {
     19 
     20 RunnerDelegate::RunnerDelegate() {
     21 }
     22 
     23 RunnerDelegate::~RunnerDelegate() {
     24 }
     25 
     26 v8::Handle<ObjectTemplate> RunnerDelegate::GetGlobalTemplate(Runner* runner) {
     27   return v8::Handle<ObjectTemplate>();
     28 }
     29 
     30 void RunnerDelegate::DidCreateContext(Runner* runner) {
     31 }
     32 
     33 void RunnerDelegate::WillRunScript(Runner* runner) {
     34 }
     35 
     36 void RunnerDelegate::DidRunScript(Runner* runner) {
     37 }
     38 
     39 void RunnerDelegate::UnhandledException(Runner* runner, TryCatch& try_catch) {
     40 }
     41 
     42 Runner::Runner(RunnerDelegate* delegate, Isolate* isolate)
     43     : ContextHolder(isolate),
     44       delegate_(delegate),
     45       weak_factory_(this) {
     46   v8::Isolate::Scope isolate_scope(isolate);
     47   HandleScope handle_scope(isolate);
     48   v8::Handle<v8::Context> context =
     49       Context::New(isolate, NULL, delegate_->GetGlobalTemplate(this));
     50 
     51   SetContext(context);
     52   PerContextData::From(context)->set_runner(this);
     53 
     54   v8::Context::Scope scope(context);
     55   delegate_->DidCreateContext(this);
     56 }
     57 
     58 Runner::~Runner() {
     59 }
     60 
     61 void Runner::Run(const std::string& source, const std::string& resource_name) {
     62   Run(Script::New(StringToV8(isolate(), source),
     63                   StringToV8(isolate(), resource_name)));
     64 }
     65 
     66 void Runner::Run(v8::Handle<Script> script) {
     67   TryCatch try_catch;
     68   delegate_->WillRunScript(this);
     69 
     70   script->Run();
     71 
     72   delegate_->DidRunScript(this);
     73   if (try_catch.HasCaught())
     74     delegate_->UnhandledException(this, try_catch);
     75 }
     76 
     77 v8::Handle<v8::Value> Runner::Call(v8::Handle<v8::Function> function,
     78                                    v8::Handle<v8::Value> receiver,
     79                                    int argc,
     80                                    v8::Handle<v8::Value> argv[]) {
     81   TryCatch try_catch;
     82   delegate_->WillRunScript(this);
     83 
     84   v8::Handle<v8::Value> result = function->Call(receiver, argc, argv);
     85 
     86   delegate_->DidRunScript(this);
     87   if (try_catch.HasCaught())
     88     delegate_->UnhandledException(this, try_catch);
     89 
     90   return result;
     91 }
     92 
     93 Runner::Scope::Scope(Runner* runner)
     94     : isolate_scope_(runner->isolate()),
     95       handle_scope_(runner->isolate()),
     96       scope_(runner->context()) {
     97 }
     98 
     99 Runner::Scope::~Scope() {
    100 }
    101 
    102 }  // namespace gin
    103