// 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. #ifndef GIN_SHELL_RUNNER_H_ #define GIN_SHELL_RUNNER_H_ #include "gin/runner.h" namespace gin { class ContextHolder; class ShellRunner; class TryCatch; // Subclass ShellRunnerDelegate to customize the behavior of ShellRunner. // Typical embedders will want to subclass one of the specialized // ShellRunnerDelegates, such as ModuleRunnerDelegate. class GIN_EXPORT ShellRunnerDelegate { public: ShellRunnerDelegate(); virtual ~ShellRunnerDelegate(); // Returns the template for the global object. virtual v8::Handle<v8::ObjectTemplate> GetGlobalTemplate( ShellRunner* runner, v8::Isolate* isolate); virtual void DidCreateContext(ShellRunner* runner); virtual void WillRunScript(ShellRunner* runner); virtual void DidRunScript(ShellRunner* runner); virtual void UnhandledException(ShellRunner* runner, TryCatch& try_catch); }; // ShellRunner executes the script/functions directly in a v8::Context. // ShellRunner owns a ContextHolder and v8::Context, both of which are destroyed // when the ShellRunner is deleted. class GIN_EXPORT ShellRunner : public Runner { public: ShellRunner(ShellRunnerDelegate* delegate, v8::Isolate* isolate); virtual ~ShellRunner(); // Before running script in this context, you'll need to enter the runner's // context by creating an instance of Runner::Scope on the stack. // Runner overrides: virtual void Run(const std::string& source, const std::string& resource_name) OVERRIDE; virtual v8::Handle<v8::Value> Call(v8::Handle<v8::Function> function, v8::Handle<v8::Value> receiver, int argc, v8::Handle<v8::Value> argv[]) OVERRIDE; virtual ContextHolder* GetContextHolder() OVERRIDE; private: friend class Scope; void Run(v8::Handle<v8::Script> script); ShellRunnerDelegate* delegate_; scoped_ptr<ContextHolder> context_holder_; DISALLOW_COPY_AND_ASSIGN(ShellRunner); }; } // namespace gin #endif // GIN_SHELL_RUNNER_H_