Fix a fatal error due to cloning a global document object
[pdfium.git] / fpdfsdk / include / javascript / JS_Value.h
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4  
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #ifndef _JS_VALUE_H_
8 #define _JS_VALUE_H_
9
10 class CJS_Array;
11 class CJS_Date;
12 class CJS_Document;
13 class CJS_Object;
14
15 class CJS_Value
16 {
17 public:
18         CJS_Value(v8::Isolate* isolate);
19         CJS_Value(v8::Isolate* isolate, v8::Handle<v8::Value> pValue,FXJSVALUETYPE t);
20         CJS_Value(v8::Isolate* isolate, const int &iValue);
21         CJS_Value(v8::Isolate* isolate, const double &dValue);
22         CJS_Value(v8::Isolate* isolate, const float &fValue);
23         CJS_Value(v8::Isolate* isolate, const bool &bValue);
24         CJS_Value(v8::Isolate* isolate, JSFXObject);
25         CJS_Value(v8::Isolate* isolate, CJS_Object*);
26         CJS_Value(v8::Isolate* isolate, CJS_Document*);
27         CJS_Value(v8::Isolate* isolate, FX_LPCSTR pStr);
28         CJS_Value(v8::Isolate* isolate, FX_LPCWSTR pWstr);
29         CJS_Value(v8::Isolate* isolate, CJS_Array& array);
30
31         ~CJS_Value();
32
33         void SetNull();
34     void Attach(v8::Handle<v8::Value> pValue,FXJSVALUETYPE t);
35         void Attach(CJS_Value *pValue);
36         void Detach();
37
38
39         operator int() const;
40         operator bool() const;
41         operator double() const;
42         operator float() const;
43         operator CJS_Object*() const;
44         operator v8::Handle<v8::Object>() const;
45         operator v8::Handle<v8::Array>() const;
46         operator CFX_WideString() const;
47         operator CFX_ByteString() const;
48         v8::Handle<v8::Value> ToJSValue();
49
50         void operator = (int iValue);
51         void operator = (bool bValue);
52         void operator = (double);
53         void operator = (float);
54         void operator = (CJS_Object*);
55         void operator = (CJS_Document*);
56         void operator = (v8::Handle<v8::Object>);
57         void operator = (CJS_Array &);
58         void operator = (CJS_Date &);
59         void operator = (FX_LPCWSTR pWstr);
60         void operator = (FX_LPCSTR pStr);
61         void operator = (CJS_Value value);
62
63         FX_BOOL IsArrayObject() const;
64         FX_BOOL IsDateObject() const;
65         FXJSVALUETYPE GetType() const;
66
67         FX_BOOL ConvertToArray(CJS_Array &) const;
68         FX_BOOL ConvertToDate(CJS_Date &) const;
69
70         v8::Isolate* GetIsolate() {return m_isolate;}
71 protected:
72         v8::Handle<v8::Value> m_pValue;
73         FXJSVALUETYPE m_eType;
74         v8::Isolate* m_isolate;
75 };
76
77 class CJS_Parameters : public CFX_ArrayTemplate<CJS_Value>
78 {
79 public:
80         void push_back(const CJS_Value& newElement) {
81                 CFX_ArrayTemplate<CJS_Value>::Add(newElement);
82         }
83         int size() const {
84                 return CFX_ArrayTemplate<CJS_Value>::GetSize();
85         }
86 };
87
88 class CJS_PropValue: public CJS_Value
89 {
90 public:
91         CJS_PropValue(const CJS_Value&);
92         CJS_PropValue(v8::Isolate* isolate);
93         ~CJS_PropValue();
94 public:
95         FX_BOOL IsSetting();
96         FX_BOOL IsGetting();
97         void operator<<(int);
98         void operator>>(int&) const;
99         void operator<<(bool);
100         void operator>>(bool&) const;
101         void operator<<(double);
102         void operator>>(double&) const;
103         void operator<<(CJS_Object* pObj);
104         void operator>>(CJS_Object*& ppObj) const;
105         void operator<<(CJS_Document* pJsDoc);
106         void operator>>(CJS_Document*& ppJsDoc) const;
107         void operator<<(CFX_ByteString);
108         void operator>>(CFX_ByteString&) const;
109         void operator<<(CFX_WideString);
110         void operator>>(CFX_WideString&) const;
111         void operator<<(FX_LPCWSTR c_string);
112         void operator<<(JSFXObject);
113         void operator>>(JSFXObject&) const;
114         void operator>>(CJS_Array& array) const;
115         void operator<<(CJS_Array& array);
116         void operator<<(CJS_Date& date);
117         void operator>>(CJS_Date& date) const;
118         operator v8::Handle<v8::Value>() const;
119         void StartSetting();
120         void StartGetting();
121 private:
122         FX_BOOL m_bIsSetting;
123 };
124
125 class CJS_Array
126 {
127 public:
128         CJS_Array(v8::Isolate* isolate);
129         virtual ~CJS_Array();
130
131         void Attach(v8::Handle<v8::Array> pArray);
132         void GetElement(unsigned index,CJS_Value &value);
133         void SetElement(unsigned index,CJS_Value value);
134     int GetLength();
135         FX_BOOL IsAttached();
136         operator v8::Handle<v8::Array>();
137
138         v8::Isolate* GetIsolate() {return m_isolate;}
139 private:
140         v8::Handle<v8::Array> m_pArray;
141         v8::Isolate* m_isolate;
142 };
143
144 class CJS_Date
145 {
146 friend class CJS_Value;
147 public:
148         CJS_Date(v8::Isolate* isolate);
149         CJS_Date(v8::Isolate* isolate,double dMsec_time);
150         CJS_Date(v8::Isolate* isolate,int year, int mon, int day,int hour, int min, int sec);
151         virtual ~CJS_Date();
152         void Attach(v8::Handle<v8::Value> pDate);
153
154         int     GetYear();
155         void    SetYear(int iYear);
156
157         int     GetMonth();
158         void    SetMonth(int iMonth);
159
160         int     GetDay();
161         void    SetDay(int iDay);
162
163         int     GetHours();
164         void    SetHours(int iHours);
165
166         int     GetMinutes();
167         void    SetMinutes(int minutes);
168
169         int     GetSeconds();
170         void    SetSeconds(int seconds);
171
172         operator v8::Handle<v8::Value>();
173         operator double() const;
174
175         CFX_WideString  ToString() const;
176
177         static double   MakeDate(int year, int mon, int mday,int hour, int min, int sec,int ms);
178
179         FX_BOOL IsValidDate();
180
181 protected:
182         v8::Handle<v8::Value> m_pDate;
183         v8::Isolate* m_isolate;
184 };
185
186 #endif //_JS_VALUE_H_
187