/*
* Copyright 2013 Google Inc.
*
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
*/
#ifndef SkV8Example_Global_DEFINED
#define SkV8Example_Global_DEFINED
#include <map>
#include <v8.h>
#include "SkTypes.h"
#include "SkEvent.h"
class SkOSWindow;
typedef v8::Persistent<v8::Function, v8::CopyablePersistentTraits<v8::Function> > CopyablePersistentFn;
// Provides the global isolate and context for our V8 instance.
// Also implements all the global level functions.
class Global : SkNoncopyable {
public:
Global(v8::Isolate* isolate)
: fIsolate(isolate)
, fWindow(NULL)
, fLastTimerID(0)
{
gGlobal = this;
this->initialize();
}
virtual ~Global() {}
// The script will be parsed into the context this Global contains.
bool parseScript(const char script[]);
v8::Local<v8::Context> getContext() {
return v8::Local<v8::Context>::New(fIsolate, fContext);
}
v8::Isolate* getIsolate() {
return fIsolate;
}
void setWindow(SkOSWindow* win) {
fWindow = win;
}
SkOSWindow* getWindow() {
return fWindow;
}
void reportException(v8::TryCatch* tryCatch);
private:
void initialize();
v8::Handle<v8::Context> createRootContext();
int32_t getNextTimerID();
static bool TimeOutProc(const SkEvent& evt);
// Static functions that implement the global JS functions we add to
// the context.
static void SetTimeout(const v8::FunctionCallbackInfo<v8::Value>& args);
static void Print(const v8::FunctionCallbackInfo<v8::Value>& args);
static void Inval(const v8::FunctionCallbackInfo<v8::Value>& args);
v8::Persistent<v8::Context> fContext;
v8::Isolate* fIsolate;
SkOSWindow* fWindow;
static Global* gGlobal;
// Handle to the functions to call when a timeout triggers as indexed by id.
std::map<int32_t, CopyablePersistentFn > fTimeouts;
// Last timer ID generated.
int32_t fLastTimerID;
};
#endif