Index: mojo/public/bindings/js/v8_runner.cc |
diff --git a/mojo/public/bindings/js/v8_runner.cc b/mojo/public/bindings/js/v8_runner.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ee6c532bfa7ee4d1457fb424329cd2b1fd7869c1 |
--- /dev/null |
+++ b/mojo/public/bindings/js/v8_runner.cc |
@@ -0,0 +1,50 @@ |
+// Copyright 2013 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 "mojo/public/bindings/js/v8_runner.h" |
+ |
+#include "mojo/public/bindings/js/v8_per_isolate_data.h" |
+ |
+namespace mojo { |
+namespace js { |
+ |
+Runner::Runner(v8::Isolate* isolate) |
+ : isolate_(isolate) { |
+ v8::HandleScope handle_scope(isolate_); |
+ context_.Reset(isolate_, v8::Context::New(isolate_)); |
+} |
+ |
+Runner::~Runner() { |
+ // TODO(abarth): Figure out how to set kResetInDestructor to true. |
+ context_.Reset(); |
+} |
+ |
+void Runner::Run(v8::Handle<v8::Script> script) { |
+ V8PerIsolateData* data = V8PerIsolateData::From(isolate_); |
+ v8::Handle<v8::Object> mojo = data->mojo_template()->NewInstance(); |
+ |
+ script->Run(); |
+ |
+ v8::Handle<v8::Context> context = v8::Local<v8::Context>::New(isolate_, |
+ context_); |
+ v8::Handle<v8::Object> global = context->Global(); |
+ v8::Handle<v8::Value> main_value = global->Get(v8::String::New("main")); |
+ if (main_value.IsEmpty() || !main_value->IsFunction()) |
+ return; |
+ v8::Handle<v8::Function> main = v8::Handle<v8::Function>::Cast(main_value); |
+ |
+ v8::Handle<v8::Value> argv[] = { mojo }; |
+ main->Call(global, 1, argv); |
+} |
+ |
+Runner::Scope::Scope(Runner* runner) |
+ : handle_scope_(runner->isolate_), |
+ scope_(v8::Local<v8::Context>::New(runner->isolate_, runner->context_)) { |
+} |
+ |
+Runner::Scope::~Scope() { |
+} |
+ |
+} // namespace js |
+} // namespace mojo |