blob: 992721e90a2590a05f235ed04c981862c1ff271d [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>
Lei Zhanga688a042015-11-09 13:57:49 -080018
Lei Zhangd88a3642015-11-10 09:38:57 -080019#include <vector>
20
21#include "core/include/fxcrt/fx_string.h"
22
23class CFXJS_ObjDefinition;
Tom Sepezed7b2b52015-09-22 08:36:17 -070024
Tom Sepez33420902015-10-13 15:00:10 -070025// FXJS_V8 places no restrictions on these two classes; it merely passes them
26// on to caller-provided methods.
27class IJS_Context; // A description of the event that caused JS execution.
28class IJS_Runtime; // A native runtime, typically owns the v8::Context.
Tom Sepezed7b2b52015-09-22 08:36:17 -070029
Tom Sepez51da0932015-11-25 16:05:49 -080030#ifdef PDF_ENABLE_XFA
Tom Sepezed7b2b52015-09-22 08:36:17 -070031// FXJS_V8 places no interpreation on this calass; it merely passes it
32// along to XFA.
33class CFXJSE_RuntimeData;
John Abd-El-Malek5110c472014-05-17 22:33:34 -070034
Tom Sepez51da0932015-11-25 16:05:49 -080035#endif
Nico Weber9d8ec5a2015-08-04 13:00:21 -070036enum FXJSOBJTYPE {
Tom Sepezcd56a7d2015-10-06 11:45:28 -070037 FXJSOBJTYPE_DYNAMIC = 0, // Created by native method and returned to JS.
38 FXJSOBJTYPE_STATIC, // Created by init and hung off of global object.
39 FXJSOBJTYPE_GLOBAL, // The global object itself (may only appear once).
John Abd-El-Malek5110c472014-05-17 22:33:34 -070040};
41
Nico Weber9d8ec5a2015-08-04 13:00:21 -070042struct FXJSErr {
43 const wchar_t* message;
44 const wchar_t* srcline;
45 unsigned linnum;
John Abd-El-Malek5110c472014-05-17 22:33:34 -070046};
47
Tom Sepezed7b2b52015-09-22 08:36:17 -070048class FXJS_PerIsolateData {
49 public:
50 static void SetUp(v8::Isolate* pIsolate);
51 static FXJS_PerIsolateData* Get(v8::Isolate* pIsolate);
52
Lei Zhangd88a3642015-11-10 09:38:57 -080053 std::vector<CFXJS_ObjDefinition*> m_ObjectDefnArray;
Tom Sepez51da0932015-11-25 16:05:49 -080054#ifdef PDF_ENABLE_XFA
Tom Sepezed7b2b52015-09-22 08:36:17 -070055 CFXJSE_RuntimeData* m_pFXJSERuntimeData;
Tom Sepez51da0932015-11-25 16:05:49 -080056#endif
Tom Sepezed7b2b52015-09-22 08:36:17 -070057
58 protected:
Tom Sepez51da0932015-11-25 16:05:49 -080059#ifndef PDF_ENABLE_XFA
60 FXJS_PerIsolateData() {}
61#else
Tom Sepeza25fd092015-09-28 09:06:03 -070062 FXJS_PerIsolateData() : m_pFXJSERuntimeData(nullptr) {}
Tom Sepez51da0932015-11-25 16:05:49 -080063#endif
Tom Sepezed7b2b52015-09-22 08:36:17 -070064};
65
Tom Sepez142165e2015-09-11 13:21:50 -070066extern const wchar_t kFXJSValueNameString[];
67extern const wchar_t kFXJSValueNameNumber[];
68extern const wchar_t kFXJSValueNameBoolean[];
69extern const wchar_t kFXJSValueNameDate[];
70extern const wchar_t kFXJSValueNameObject[];
71extern const wchar_t kFXJSValueNameFxobj[];
72extern const wchar_t kFXJSValueNameNull[];
73extern const wchar_t kFXJSValueNameUndefined[];
John Abd-El-Malek5110c472014-05-17 22:33:34 -070074
Tom Sepez39bfe122015-09-17 15:25:23 -070075class FXJS_ArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
Tom Sepez7d0fcbf2015-09-15 15:30:34 -070076 void* Allocate(size_t length) override;
77 void* AllocateUninitialized(size_t length) override;
78 void Free(void* data, size_t length) override;
79};
80
Tom Sepez33420902015-10-13 15:00:10 -070081using FXJS_CONSTRUCTOR = void (*)(IJS_Runtime* cc, v8::Local<v8::Object> obj);
Tom Sepez39bfe122015-09-17 15:25:23 -070082using FXJS_DESTRUCTOR = void (*)(v8::Local<v8::Object> obj);
83
84// Call before making FXJS_PrepareIsolate call.
Tom Sepeza72e8e22015-10-07 10:17:53 -070085void FXJS_Initialize(unsigned int embedderDataSlot, v8::Isolate* pIsolate);
Tom Sepez39bfe122015-09-17 15:25:23 -070086void FXJS_Release();
87
Tom Sepeza72e8e22015-10-07 10:17:53 -070088// Gets the global isolate set by FXJS_Initialize(), or makes a new one each
89// time if there is no such isolate. Returns true if a new isolate had to be
90// created.
91bool FXJS_GetIsolate(v8::Isolate** pResultIsolate);
92
Lei Zhang3fa115b2015-10-08 12:04:47 -070093// Get the global isolate's ref count.
94size_t FXJS_GlobalIsolateRefCount();
95
Tom Sepez39bfe122015-09-17 15:25:23 -070096// Call before making FXJS_Define* calls. Resources allocated here are cleared
97// as part of FXJS_ReleaseRuntime().
98void FXJS_PrepareIsolate(v8::Isolate* pIsolate);
John Abd-El-Malek5110c472014-05-17 22:33:34 -070099
Tom Sepez7d0fcbf2015-09-15 15:30:34 -0700100// Call before making JS_Define* calls. Resources allocated here are cleared
101// as part of JS_ReleaseRuntime().
102void JS_PrepareIsolate(v8::Isolate* pIsolate);
103
Tom Sepez142165e2015-09-11 13:21:50 -0700104// Always returns a valid, newly-created objDefnID.
Tom Sepez39bfe122015-09-17 15:25:23 -0700105int FXJS_DefineObj(v8::Isolate* pIsolate,
106 const wchar_t* sObjName,
107 FXJSOBJTYPE eObjType,
108 FXJS_CONSTRUCTOR pConstructor,
109 FXJS_DESTRUCTOR pDestructor);
Tom Sepez142165e2015-09-11 13:21:50 -0700110
Tom Sepez39bfe122015-09-17 15:25:23 -0700111void FXJS_DefineObjMethod(v8::Isolate* pIsolate,
Tom Sepez142165e2015-09-11 13:21:50 -0700112 int nObjDefnID,
Tom Sepez39bfe122015-09-17 15:25:23 -0700113 const wchar_t* sMethodName,
114 v8::FunctionCallback pMethodCall);
115void FXJS_DefineObjProperty(v8::Isolate* pIsolate,
116 int nObjDefnID,
117 const wchar_t* sPropName,
118 v8::AccessorGetterCallback pPropGet,
119 v8::AccessorSetterCallback pPropPut);
120void FXJS_DefineObjAllProperties(v8::Isolate* pIsolate,
121 int nObjDefnID,
122 v8::NamedPropertyQueryCallback pPropQurey,
123 v8::NamedPropertyGetterCallback pPropGet,
124 v8::NamedPropertySetterCallback pPropPut,
125 v8::NamedPropertyDeleterCallback pPropDel);
126void FXJS_DefineObjConst(v8::Isolate* pIsolate,
127 int nObjDefnID,
128 const wchar_t* sConstName,
129 v8::Local<v8::Value> pDefault);
130void FXJS_DefineGlobalMethod(v8::Isolate* pIsolate,
131 const wchar_t* sMethodName,
132 v8::FunctionCallback pMethodCall);
133void FXJS_DefineGlobalConst(v8::Isolate* pIsolate,
134 const wchar_t* sConstName,
135 v8::Local<v8::Value> pDefault);
John Abd-El-Malek5110c472014-05-17 22:33:34 -0700136
Tom Sepez39bfe122015-09-17 15:25:23 -0700137// Called after FXJS_Define* calls made.
Tom Sepez4237aed2015-11-10 15:19:17 -0800138void FXJS_InitializeRuntime(
139 v8::Isolate* pIsolate,
140 IJS_Runtime* pIRuntime,
141 v8::Global<v8::Context>* pV8PersistentContext,
142 std::vector<v8::Global<v8::Object>*>* pStaticObjects);
Tom Sepez39bfe122015-09-17 15:25:23 -0700143void FXJS_ReleaseRuntime(v8::Isolate* pIsolate,
Tom Sepez4237aed2015-11-10 15:19:17 -0800144 v8::Global<v8::Context>* pV8PersistentContext,
145 std::vector<v8::Global<v8::Object>*>* pStaticObjects);
Tom Sepezb8ec0a32015-11-20 14:23:02 -0800146IJS_Runtime* FXJS_GetRuntimeFromIsolate(v8::Isolate* pIsolate);
147
Tom Sepez51da0932015-11-25 16:05:49 -0800148#ifdef PDF_ENABLE_XFA
Tom Sepez4f4603c2015-11-10 15:03:12 -0800149// Called as part of FXJS_InitializeRuntime, exposed so PDF can make its
150// own contexts compatible with XFA or vice versa.
151void FXJS_SetRuntimeForV8Context(v8::Local<v8::Context> v8Context,
152 IJS_Runtime* pIRuntime);
153
Tom Sepez51da0932015-11-25 16:05:49 -0800154#endif
Tom Sepez39bfe122015-09-17 15:25:23 -0700155// Called after FXJS_InitializeRuntime call made.
156int FXJS_Execute(v8::Isolate* pIsolate,
Tom Sepezba038bc2015-10-08 12:03:00 -0700157 IJS_Context* pJSContext,
Tom Sepez39bfe122015-09-17 15:25:23 -0700158 const wchar_t* script,
Tom Sepez39bfe122015-09-17 15:25:23 -0700159 FXJSErr* perror);
Tom Sepez7d0fcbf2015-09-15 15:30:34 -0700160
Tom Sepez39bfe122015-09-17 15:25:23 -0700161v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate,
Tom Sepez33420902015-10-13 15:00:10 -0700162 IJS_Runtime* pJSContext,
Tom Sepez39bfe122015-09-17 15:25:23 -0700163 int nObjDefnID);
164v8::Local<v8::Object> FXJS_GetThisObj(v8::Isolate* pIsolate);
165int FXJS_GetObjDefnID(v8::Local<v8::Object> pObj);
Tom Sepez39bfe122015-09-17 15:25:23 -0700166const wchar_t* FXJS_GetTypeof(v8::Local<v8::Value> pObj);
John Abd-El-Malek5110c472014-05-17 22:33:34 -0700167
Tom Sepez39bfe122015-09-17 15:25:23 -0700168void FXJS_SetPrivate(v8::Isolate* pIsolate,
169 v8::Local<v8::Object> pObj,
170 void* p);
Tom Sepez39bfe122015-09-17 15:25:23 -0700171void* FXJS_GetPrivate(v8::Isolate* pIsolate, v8::Local<v8::Object> pObj);
Tom Sepez39bfe122015-09-17 15:25:23 -0700172void FXJS_FreePrivate(void* p);
173void FXJS_FreePrivate(v8::Local<v8::Object> pObj);
John Abd-El-Malek5110c472014-05-17 22:33:34 -0700174
Tom Sepez39bfe122015-09-17 15:25:23 -0700175void FXJS_Error(v8::Isolate* isolate, const CFX_WideString& message);
176v8::Local<v8::String> FXJS_WSToJSString(v8::Isolate* pIsolate,
177 const wchar_t* PropertyName,
178 int Len = -1);
179
180v8::Local<v8::Value> FXJS_GetObjectElement(v8::Isolate* pIsolate,
181 v8::Local<v8::Object> pObj,
182 const wchar_t* PropertyName);
183v8::Local<v8::Array> FXJS_GetObjectElementNames(v8::Isolate* pIsolate,
184 v8::Local<v8::Object> pObj);
185
186v8::Local<v8::Value> FXJS_GetArrayElement(v8::Isolate* pIsolate,
187 v8::Local<v8::Array> pArray,
188 unsigned index);
189unsigned FXJS_GetArrayLength(v8::Local<v8::Array> pArray);
190
191void FXJS_PutObjectString(v8::Isolate* pIsolate,
192 v8::Local<v8::Object> pObj,
193 const wchar_t* PropertyName,
194 const wchar_t* sValue);
195void FXJS_PutObjectNumber(v8::Isolate* pIsolate,
196 v8::Local<v8::Object> pObj,
197 const wchar_t* PropertyName,
198 int nValue);
199void FXJS_PutObjectNumber(v8::Isolate* pIsolate,
200 v8::Local<v8::Object> pObj,
201 const wchar_t* PropertyName,
202 float fValue);
203void FXJS_PutObjectNumber(v8::Isolate* pIsolate,
204 v8::Local<v8::Object> pObj,
205 const wchar_t* PropertyName,
206 double dValue);
207void FXJS_PutObjectBoolean(v8::Isolate* pIsolate,
208 v8::Local<v8::Object> pObj,
209 const wchar_t* PropertyName,
210 bool bValue);
211void FXJS_PutObjectObject(v8::Isolate* pIsolate,
212 v8::Local<v8::Object> pObj,
213 const wchar_t* PropertyName,
214 v8::Local<v8::Object> pPut);
215void FXJS_PutObjectNull(v8::Isolate* pIsolate,
216 v8::Local<v8::Object> pObj,
217 const wchar_t* PropertyName);
218unsigned FXJS_PutArrayElement(v8::Isolate* pIsolate,
219 v8::Local<v8::Array> pArray,
220 unsigned index,
221 v8::Local<v8::Value> pValue);
222
223v8::Local<v8::Array> FXJS_NewArray(v8::Isolate* pIsolate);
224v8::Local<v8::Value> FXJS_NewNumber(v8::Isolate* pIsolate, int number);
225v8::Local<v8::Value> FXJS_NewNumber(v8::Isolate* pIsolate, double number);
226v8::Local<v8::Value> FXJS_NewNumber(v8::Isolate* pIsolate, float number);
227v8::Local<v8::Value> FXJS_NewBoolean(v8::Isolate* pIsolate, bool b);
228v8::Local<v8::Value> FXJS_NewObject(v8::Isolate* pIsolate,
229 v8::Local<v8::Object> pObj);
230v8::Local<v8::Value> FXJS_NewObject2(v8::Isolate* pIsolate,
231 v8::Local<v8::Array> pObj);
232v8::Local<v8::Value> FXJS_NewString(v8::Isolate* pIsolate,
233 const wchar_t* string);
234v8::Local<v8::Value> FXJS_NewNull();
235v8::Local<v8::Value> FXJS_NewDate(v8::Isolate* pIsolate, double d);
236
237int FXJS_ToInt32(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue);
238bool FXJS_ToBoolean(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue);
239double FXJS_ToNumber(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue);
240v8::Local<v8::Object> FXJS_ToObject(v8::Isolate* pIsolate,
241 v8::Local<v8::Value> pValue);
242CFX_WideString FXJS_ToString(v8::Isolate* pIsolate,
243 v8::Local<v8::Value> pValue);
244v8::Local<v8::Array> FXJS_ToArray(v8::Isolate* pIsolate,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700245 v8::Local<v8::Value> pValue);
Tom Sepez39bfe122015-09-17 15:25:23 -0700246void FXJS_ValueCopy(v8::Local<v8::Value>& pTo, v8::Local<v8::Value> pFrom);
John Abd-El-Malek5110c472014-05-17 22:33:34 -0700247
Tom Sepez19922bb2015-05-28 13:23:12 -0700248#endif // FPDFSDK_INCLUDE_JSAPI_FXJS_V8_H_