blob: d3cd4ebe6e4a24f820e2a0180f7c018fd5db976f [file] [log] [blame]
John Abd-El-Malek5110c472014-05-17 22:33:34 -07001// 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.
Tom Sepez2311b782015-02-23 10:22:51 -08004
John Abd-El-Malek5110c472014-05-17 22:33:34 -07005// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
Tom Sepezba038bc2015-10-08 12:03:00 -07007// FXJS_V8 is a layer that makes it easier to define native objects in V8, but
8// has no knowledge of PDF-specific native objects. It could in theory be used
9// to implement other sets of native objects.
10
11// PDFium code should include this file rather than including V8 headers
12// directly.
Tom Sepez9a3f8122015-04-07 15:35:48 -070013
Tom Sepez19922bb2015-05-28 13:23:12 -070014#ifndef FPDFSDK_INCLUDE_JSAPI_FXJS_V8_H_
15#define FPDFSDK_INCLUDE_JSAPI_FXJS_V8_H_
John Abd-El-Malek5110c472014-05-17 22:33:34 -070016
17#include <v8.h>
Tom Sepezed7b2b52015-09-22 08:36:17 -070018#include "../../../core/include/fxcrt/fx_basic.h"
19
20// FXJS_V8 places no interpretation on these two classes; it merely
21// passes them on to the caller-provided FXJS_CONSTRUCTORs.
Tom Sepezba038bc2015-10-08 12:03:00 -070022class IJS_Context;
23class IJS_Runtime;
Tom Sepezed7b2b52015-09-22 08:36:17 -070024
25// FXJS_V8 places no interpreation on this calass; it merely passes it
26// along to XFA.
27class CFXJSE_RuntimeData;
John Abd-El-Malek5110c472014-05-17 22:33:34 -070028
Nico Weber9d8ec5a2015-08-04 13:00:21 -070029enum FXJSOBJTYPE {
Tom Sepezcd56a7d2015-10-06 11:45:28 -070030 FXJSOBJTYPE_DYNAMIC = 0, // Created by native method and returned to JS.
31 FXJSOBJTYPE_STATIC, // Created by init and hung off of global object.
32 FXJSOBJTYPE_GLOBAL, // The global object itself (may only appear once).
John Abd-El-Malek5110c472014-05-17 22:33:34 -070033};
34
Nico Weber9d8ec5a2015-08-04 13:00:21 -070035struct FXJSErr {
36 const wchar_t* message;
37 const wchar_t* srcline;
38 unsigned linnum;
John Abd-El-Malek5110c472014-05-17 22:33:34 -070039};
40
Tom Sepezed7b2b52015-09-22 08:36:17 -070041class FXJS_PerIsolateData {
42 public:
43 static void SetUp(v8::Isolate* pIsolate);
44 static FXJS_PerIsolateData* Get(v8::Isolate* pIsolate);
45
46 CFX_PtrArray m_ObjectDefnArray;
Tom Sepezed7b2b52015-09-22 08:36:17 -070047 CFXJSE_RuntimeData* m_pFXJSERuntimeData;
48
49 protected:
Tom Sepeza25fd092015-09-28 09:06:03 -070050 FXJS_PerIsolateData() : m_pFXJSERuntimeData(nullptr) {}
Tom Sepezed7b2b52015-09-22 08:36:17 -070051};
52
Tom Sepez142165e2015-09-11 13:21:50 -070053extern const wchar_t kFXJSValueNameString[];
54extern const wchar_t kFXJSValueNameNumber[];
55extern const wchar_t kFXJSValueNameBoolean[];
56extern const wchar_t kFXJSValueNameDate[];
57extern const wchar_t kFXJSValueNameObject[];
58extern const wchar_t kFXJSValueNameFxobj[];
59extern const wchar_t kFXJSValueNameNull[];
60extern const wchar_t kFXJSValueNameUndefined[];
John Abd-El-Malek5110c472014-05-17 22:33:34 -070061
John Abd-El-Malek5110c472014-05-17 22:33:34 -070062
Tom Sepez39bfe122015-09-17 15:25:23 -070063class FXJS_ArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
Tom Sepez7d0fcbf2015-09-15 15:30:34 -070064 void* Allocate(size_t length) override;
65 void* AllocateUninitialized(size_t length) override;
66 void Free(void* data, size_t length) override;
67};
68
Tom Sepezba038bc2015-10-08 12:03:00 -070069using FXJS_CONSTRUCTOR = void (*)(IJS_Context* cc, v8::Local<v8::Object> obj);
Tom Sepez39bfe122015-09-17 15:25:23 -070070using FXJS_DESTRUCTOR = void (*)(v8::Local<v8::Object> obj);
71
72// Call before making FXJS_PrepareIsolate call.
Tom Sepeza72e8e22015-10-07 10:17:53 -070073void FXJS_Initialize(unsigned int embedderDataSlot, v8::Isolate* pIsolate);
Tom Sepez39bfe122015-09-17 15:25:23 -070074void FXJS_Release();
75
Tom Sepeza72e8e22015-10-07 10:17:53 -070076// Gets the global isolate set by FXJS_Initialize(), or makes a new one each
77// time if there is no such isolate. Returns true if a new isolate had to be
78// created.
79bool FXJS_GetIsolate(v8::Isolate** pResultIsolate);
80
Lei Zhang3fa115b2015-10-08 12:04:47 -070081// Get the global isolate's ref count.
82size_t FXJS_GlobalIsolateRefCount();
83
Tom Sepez39bfe122015-09-17 15:25:23 -070084// Call before making FXJS_Define* calls. Resources allocated here are cleared
85// as part of FXJS_ReleaseRuntime().
86void FXJS_PrepareIsolate(v8::Isolate* pIsolate);
John Abd-El-Malek5110c472014-05-17 22:33:34 -070087
Tom Sepez7d0fcbf2015-09-15 15:30:34 -070088// Call before making JS_Define* calls. Resources allocated here are cleared
89// as part of JS_ReleaseRuntime().
90void JS_PrepareIsolate(v8::Isolate* pIsolate);
91
Tom Sepez142165e2015-09-11 13:21:50 -070092// Always returns a valid, newly-created objDefnID.
Tom Sepez39bfe122015-09-17 15:25:23 -070093int FXJS_DefineObj(v8::Isolate* pIsolate,
94 const wchar_t* sObjName,
95 FXJSOBJTYPE eObjType,
96 FXJS_CONSTRUCTOR pConstructor,
97 FXJS_DESTRUCTOR pDestructor);
Tom Sepez142165e2015-09-11 13:21:50 -070098
Tom Sepez39bfe122015-09-17 15:25:23 -070099void FXJS_DefineObjMethod(v8::Isolate* pIsolate,
Tom Sepez142165e2015-09-11 13:21:50 -0700100 int nObjDefnID,
Tom Sepez39bfe122015-09-17 15:25:23 -0700101 const wchar_t* sMethodName,
102 v8::FunctionCallback pMethodCall);
103void FXJS_DefineObjProperty(v8::Isolate* pIsolate,
104 int nObjDefnID,
105 const wchar_t* sPropName,
106 v8::AccessorGetterCallback pPropGet,
107 v8::AccessorSetterCallback pPropPut);
108void FXJS_DefineObjAllProperties(v8::Isolate* pIsolate,
109 int nObjDefnID,
110 v8::NamedPropertyQueryCallback pPropQurey,
111 v8::NamedPropertyGetterCallback pPropGet,
112 v8::NamedPropertySetterCallback pPropPut,
113 v8::NamedPropertyDeleterCallback pPropDel);
114void FXJS_DefineObjConst(v8::Isolate* pIsolate,
115 int nObjDefnID,
116 const wchar_t* sConstName,
117 v8::Local<v8::Value> pDefault);
118void FXJS_DefineGlobalMethod(v8::Isolate* pIsolate,
119 const wchar_t* sMethodName,
120 v8::FunctionCallback pMethodCall);
121void FXJS_DefineGlobalConst(v8::Isolate* pIsolate,
122 const wchar_t* sConstName,
123 v8::Local<v8::Value> pDefault);
John Abd-El-Malek5110c472014-05-17 22:33:34 -0700124
Tom Sepez39bfe122015-09-17 15:25:23 -0700125// Called after FXJS_Define* calls made.
126void FXJS_InitializeRuntime(v8::Isolate* pIsolate,
Tom Sepezba038bc2015-10-08 12:03:00 -0700127 IJS_Runtime* pFXRuntime,
128 IJS_Context* context,
Tom Sepez39bfe122015-09-17 15:25:23 -0700129 v8::Global<v8::Context>& v8PersistentContext);
130void FXJS_ReleaseRuntime(v8::Isolate* pIsolate,
131 v8::Global<v8::Context>& v8PersistentContext);
Tom Sepezba038bc2015-10-08 12:03:00 -0700132IJS_Runtime* FXJS_GetRuntimeFromIsolate(v8::Isolate* pIsolate);
Tom Sepez7d0fcbf2015-09-15 15:30:34 -0700133
Tom Sepez39bfe122015-09-17 15:25:23 -0700134// Called after FXJS_InitializeRuntime call made.
135int FXJS_Execute(v8::Isolate* pIsolate,
Tom Sepezba038bc2015-10-08 12:03:00 -0700136 IJS_Context* pJSContext,
Tom Sepez39bfe122015-09-17 15:25:23 -0700137 const wchar_t* script,
138 long length,
139 FXJSErr* perror);
Tom Sepez7d0fcbf2015-09-15 15:30:34 -0700140
Tom Sepez39bfe122015-09-17 15:25:23 -0700141v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate,
Tom Sepezba038bc2015-10-08 12:03:00 -0700142 IJS_Context* pJSContext,
Tom Sepez39bfe122015-09-17 15:25:23 -0700143 int nObjDefnID);
144v8::Local<v8::Object> FXJS_GetThisObj(v8::Isolate* pIsolate);
145int FXJS_GetObjDefnID(v8::Local<v8::Object> pObj);
Tom Sepez39bfe122015-09-17 15:25:23 -0700146v8::Isolate* FXJS_GetRuntime(v8::Local<v8::Object> pObj);
147const wchar_t* FXJS_GetTypeof(v8::Local<v8::Value> pObj);
John Abd-El-Malek5110c472014-05-17 22:33:34 -0700148
Tom Sepez39bfe122015-09-17 15:25:23 -0700149void FXJS_SetPrivate(v8::Isolate* pIsolate,
150 v8::Local<v8::Object> pObj,
151 void* p);
Tom Sepez39bfe122015-09-17 15:25:23 -0700152void* FXJS_GetPrivate(v8::Isolate* pIsolate, v8::Local<v8::Object> pObj);
Tom Sepez39bfe122015-09-17 15:25:23 -0700153void FXJS_FreePrivate(void* p);
154void FXJS_FreePrivate(v8::Local<v8::Object> pObj);
John Abd-El-Malek5110c472014-05-17 22:33:34 -0700155
Tom Sepez39bfe122015-09-17 15:25:23 -0700156void FXJS_Error(v8::Isolate* isolate, const CFX_WideString& message);
157v8::Local<v8::String> FXJS_WSToJSString(v8::Isolate* pIsolate,
158 const wchar_t* PropertyName,
159 int Len = -1);
160
161v8::Local<v8::Value> FXJS_GetObjectElement(v8::Isolate* pIsolate,
162 v8::Local<v8::Object> pObj,
163 const wchar_t* PropertyName);
164v8::Local<v8::Array> FXJS_GetObjectElementNames(v8::Isolate* pIsolate,
165 v8::Local<v8::Object> pObj);
166
167v8::Local<v8::Value> FXJS_GetArrayElement(v8::Isolate* pIsolate,
168 v8::Local<v8::Array> pArray,
169 unsigned index);
170unsigned FXJS_GetArrayLength(v8::Local<v8::Array> pArray);
171
172void FXJS_PutObjectString(v8::Isolate* pIsolate,
173 v8::Local<v8::Object> pObj,
174 const wchar_t* PropertyName,
175 const wchar_t* sValue);
176void FXJS_PutObjectNumber(v8::Isolate* pIsolate,
177 v8::Local<v8::Object> pObj,
178 const wchar_t* PropertyName,
179 int nValue);
180void FXJS_PutObjectNumber(v8::Isolate* pIsolate,
181 v8::Local<v8::Object> pObj,
182 const wchar_t* PropertyName,
183 float fValue);
184void FXJS_PutObjectNumber(v8::Isolate* pIsolate,
185 v8::Local<v8::Object> pObj,
186 const wchar_t* PropertyName,
187 double dValue);
188void FXJS_PutObjectBoolean(v8::Isolate* pIsolate,
189 v8::Local<v8::Object> pObj,
190 const wchar_t* PropertyName,
191 bool bValue);
192void FXJS_PutObjectObject(v8::Isolate* pIsolate,
193 v8::Local<v8::Object> pObj,
194 const wchar_t* PropertyName,
195 v8::Local<v8::Object> pPut);
196void FXJS_PutObjectNull(v8::Isolate* pIsolate,
197 v8::Local<v8::Object> pObj,
198 const wchar_t* PropertyName);
199unsigned FXJS_PutArrayElement(v8::Isolate* pIsolate,
200 v8::Local<v8::Array> pArray,
201 unsigned index,
202 v8::Local<v8::Value> pValue);
203
204v8::Local<v8::Array> FXJS_NewArray(v8::Isolate* pIsolate);
205v8::Local<v8::Value> FXJS_NewNumber(v8::Isolate* pIsolate, int number);
206v8::Local<v8::Value> FXJS_NewNumber(v8::Isolate* pIsolate, double number);
207v8::Local<v8::Value> FXJS_NewNumber(v8::Isolate* pIsolate, float number);
208v8::Local<v8::Value> FXJS_NewBoolean(v8::Isolate* pIsolate, bool b);
209v8::Local<v8::Value> FXJS_NewObject(v8::Isolate* pIsolate,
210 v8::Local<v8::Object> pObj);
211v8::Local<v8::Value> FXJS_NewObject2(v8::Isolate* pIsolate,
212 v8::Local<v8::Array> pObj);
213v8::Local<v8::Value> FXJS_NewString(v8::Isolate* pIsolate,
214 const wchar_t* string);
215v8::Local<v8::Value> FXJS_NewNull();
216v8::Local<v8::Value> FXJS_NewDate(v8::Isolate* pIsolate, double d);
217
218int FXJS_ToInt32(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue);
219bool FXJS_ToBoolean(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue);
220double FXJS_ToNumber(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue);
221v8::Local<v8::Object> FXJS_ToObject(v8::Isolate* pIsolate,
222 v8::Local<v8::Value> pValue);
223CFX_WideString FXJS_ToString(v8::Isolate* pIsolate,
224 v8::Local<v8::Value> pValue);
225v8::Local<v8::Array> FXJS_ToArray(v8::Isolate* pIsolate,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700226 v8::Local<v8::Value> pValue);
Tom Sepez39bfe122015-09-17 15:25:23 -0700227void FXJS_ValueCopy(v8::Local<v8::Value>& pTo, v8::Local<v8::Value> pFrom);
John Abd-El-Malek5110c472014-05-17 22:33:34 -0700228
Tom Sepez19922bb2015-05-28 13:23:12 -0700229#endif // FPDFSDK_INCLUDE_JSAPI_FXJS_V8_H_