1/*
2 * Copyright 2013 Google Inc.
3 *
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 *
8 */
9
10#ifndef SkV8Example_Global_DEFINED
11#define SkV8Example_Global_DEFINED
12
13#include <map>
14
15#include <v8.h>
16
17using namespace v8;
18
19#include "SkTypes.h"
20#include "SkEvent.h"
21
22class SkOSWindow;
23
24typedef Persistent<Function, CopyablePersistentTraits<Function> > CopyablePersistentFn;
25
26// Provides the global isolate and context for our V8 instance.
27// Also implements all the global level functions.
28class Global : SkNoncopyable  {
29public:
30    Global(Isolate* isolate)
31        : fIsolate(isolate)
32        , fWindow(NULL)
33        , fLastTimerID(0)
34    {
35        gGlobal = this;
36        this->initialize();
37    }
38    virtual ~Global() {}
39
40    // The script will be parsed into the context this Global contains.
41    bool parseScript(const char script[]);
42
43    Local<Context> getContext() {
44        return Local<Context>::New(fIsolate, fContext);
45    }
46
47    Isolate* getIsolate() {
48        return fIsolate;
49    }
50
51    void setWindow(SkOSWindow* win) {
52        fWindow = win;
53    }
54    SkOSWindow* getWindow() {
55        return fWindow;
56    }
57
58    void reportException(TryCatch* tryCatch);
59
60private:
61    void initialize();
62    Handle<Context> createRootContext();
63    int32_t getNextTimerID();
64
65    static bool TimeOutProc(const SkEvent& evt);
66
67    // Static functions that implement the global JS functions we add to
68    // the context.
69    static void SetTimeout(const v8::FunctionCallbackInfo<v8::Value>& args);
70    static void Print(const v8::FunctionCallbackInfo<v8::Value>& args);
71    static void Inval(const v8::FunctionCallbackInfo<Value>& args);
72
73    Persistent<Context> fContext;
74    Isolate*            fIsolate;
75    SkOSWindow*         fWindow;
76    static Global*      gGlobal;
77
78    // Handle to the functions to call when a timeout triggers as indexed by id.
79    std::map<int32_t, CopyablePersistentFn > fTimeouts;
80
81    // Last timer ID generated.
82    int32_t fLastTimerID;
83};
84
85#endif
86