// 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_
