OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "../../../core/include/fxcrt/fx_basic.h" | 7 #include <time.h> |
8 #include "../../../core/include/fxcrt/fx_ext.h" | |
9 #include "../../include/jsapi/fxjs_v8.h" | |
10 #include "../../include/fsdk_define.h" | |
11 #include "time.h" | |
12 #include <cmath> | 8 #include <cmath> |
13 #include <limits> | 9 #include <limits> |
14 | 10 |
| 11 #include "../../../core/include/fxcrt/fx_basic.h" |
| 12 #include "../../include/fsdk_define.h" |
| 13 #include "../../include/jsapi/fxjs_v8.h" |
| 14 |
15 const wchar_t kFXJSValueNameString[] = L"string"; | 15 const wchar_t kFXJSValueNameString[] = L"string"; |
16 const wchar_t kFXJSValueNameNumber[] = L"number"; | 16 const wchar_t kFXJSValueNameNumber[] = L"number"; |
17 const wchar_t kFXJSValueNameBoolean[] = L"boolean"; | 17 const wchar_t kFXJSValueNameBoolean[] = L"boolean"; |
18 const wchar_t kFXJSValueNameDate[] = L"date"; | 18 const wchar_t kFXJSValueNameDate[] = L"date"; |
19 const wchar_t kFXJSValueNameObject[] = L"object"; | 19 const wchar_t kFXJSValueNameObject[] = L"object"; |
20 const wchar_t kFXJSValueNameFxobj[] = L"fxobj"; | 20 const wchar_t kFXJSValueNameFxobj[] = L"fxobj"; |
21 const wchar_t kFXJSValueNameNull[] = L"null"; | 21 const wchar_t kFXJSValueNameNull[] = L"null"; |
22 const wchar_t kFXJSValueNameUndefined[] = L"undefined"; | 22 const wchar_t kFXJSValueNameUndefined[] = L"undefined"; |
23 | 23 |
24 const static FX_DWORD g_nan[2] = {0, 0x7FF80000}; | |
25 static double GetNan() { | |
26 return *(double*)g_nan; | |
27 } | |
28 static unsigned int g_embedderDataSlot = 0u; | 24 static unsigned int g_embedderDataSlot = 0u; |
29 | 25 |
30 class CJS_PrivateData { | 26 class CFXJS_PrivateData { |
31 public: | 27 public: |
32 CJS_PrivateData() : ObjDefID(-1), pPrivate(NULL) {} | 28 CFXJS_PrivateData() : ObjDefID(-1), pPrivate(NULL) {} |
33 int ObjDefID; | 29 int ObjDefID; |
34 void* pPrivate; | 30 void* pPrivate; |
35 }; | 31 }; |
36 | 32 |
37 class CJS_ObjDefintion { | 33 class CFXJS_ObjDefintion { |
38 public: | 34 public: |
39 CJS_ObjDefintion(v8::Isolate* isolate, | 35 CFXJS_ObjDefintion(v8::Isolate* isolate, |
40 const wchar_t* sObjName, | 36 const wchar_t* sObjName, |
41 FXJSOBJTYPE eObjType, | 37 FXJSOBJTYPE eObjType, |
42 LP_CONSTRUCTOR pConstructor, | 38 FXJS_CONSTRUCTOR pConstructor, |
43 LP_DESTRUCTOR pDestructor) | 39 FXJS_DESTRUCTOR pDestructor) |
44 : objName(sObjName), | 40 : objName(sObjName), |
45 objType(eObjType), | 41 objType(eObjType), |
46 m_pConstructor(pConstructor), | 42 m_pConstructor(pConstructor), |
47 m_pDestructor(pDestructor), | 43 m_pDestructor(pDestructor), |
48 m_bSetAsGlobalObject(FALSE) { | 44 m_bSetAsGlobalObject(FALSE) { |
49 v8::Isolate::Scope isolate_scope(isolate); | 45 v8::Isolate::Scope isolate_scope(isolate); |
50 v8::HandleScope handle_scope(isolate); | 46 v8::HandleScope handle_scope(isolate); |
51 | 47 |
52 v8::Local<v8::ObjectTemplate> objTemplate = | 48 v8::Local<v8::ObjectTemplate> objTemplate = |
53 v8::ObjectTemplate::New(isolate); | 49 v8::ObjectTemplate::New(isolate); |
54 objTemplate->SetInternalFieldCount(2); | 50 objTemplate->SetInternalFieldCount(2); |
55 m_objTemplate.Reset(isolate, objTemplate); | 51 m_objTemplate.Reset(isolate, objTemplate); |
56 | 52 |
57 // Document as the global object. | 53 // Document as the global object. |
58 if (FXSYS_wcscmp(sObjName, L"Document") == 0) { | 54 if (FXSYS_wcscmp(sObjName, L"Document") == 0) { |
59 m_bSetAsGlobalObject = TRUE; | 55 m_bSetAsGlobalObject = TRUE; |
60 } | 56 } |
61 } | 57 } |
62 ~CJS_ObjDefintion() { | 58 ~CFXJS_ObjDefintion() { |
63 m_objTemplate.Reset(); | 59 m_objTemplate.Reset(); |
64 m_StaticObj.Reset(); | 60 m_StaticObj.Reset(); |
65 } | 61 } |
66 | 62 |
67 public: | 63 public: |
68 const wchar_t* objName; | 64 const wchar_t* objName; |
69 FXJSOBJTYPE objType; | 65 FXJSOBJTYPE objType; |
70 LP_CONSTRUCTOR m_pConstructor; | 66 FXJS_CONSTRUCTOR m_pConstructor; |
71 LP_DESTRUCTOR m_pDestructor; | 67 FXJS_DESTRUCTOR m_pDestructor; |
72 FX_BOOL m_bSetAsGlobalObject; | 68 FX_BOOL m_bSetAsGlobalObject; |
73 | 69 |
74 v8::Global<v8::ObjectTemplate> m_objTemplate; | 70 v8::Global<v8::ObjectTemplate> m_objTemplate; |
75 v8::Global<v8::Object> m_StaticObj; | 71 v8::Global<v8::Object> m_StaticObj; |
76 }; | 72 }; |
77 | 73 |
78 void* JS_ArrayBufferAllocator::Allocate(size_t length) { | 74 void* FXJS_ArrayBufferAllocator::Allocate(size_t length) { |
79 return calloc(1, length); | 75 return calloc(1, length); |
80 } | 76 } |
81 | 77 |
82 void* JS_ArrayBufferAllocator::AllocateUninitialized(size_t length) { | 78 void* FXJS_ArrayBufferAllocator::AllocateUninitialized(size_t length) { |
83 return malloc(length); | 79 return malloc(length); |
84 } | 80 } |
85 | 81 |
86 void JS_ArrayBufferAllocator::Free(void* data, size_t length) { | 82 void FXJS_ArrayBufferAllocator::Free(void* data, size_t length) { |
87 free(data); | 83 free(data); |
88 } | 84 } |
89 | 85 |
90 void JS_PrepareIsolate(v8::Isolate* pIsolate) { | 86 void FXJS_PrepareIsolate(v8::Isolate* pIsolate) { |
91 if (!pIsolate->GetData(g_embedderDataSlot)) | 87 if (!pIsolate->GetData(g_embedderDataSlot)) |
92 pIsolate->SetData(g_embedderDataSlot, new CFX_PtrArray()); | 88 pIsolate->SetData(g_embedderDataSlot, new CFX_PtrArray()); |
93 } | 89 } |
94 | 90 |
95 int JS_DefineObj(v8::Isolate* pIsolate, | 91 int FXJS_DefineObj(v8::Isolate* pIsolate, |
96 const wchar_t* sObjName, | 92 const wchar_t* sObjName, |
97 FXJSOBJTYPE eObjType, | 93 FXJSOBJTYPE eObjType, |
98 LP_CONSTRUCTOR pConstructor, | 94 FXJS_CONSTRUCTOR pConstructor, |
99 LP_DESTRUCTOR pDestructor) { | 95 FXJS_DESTRUCTOR pDestructor) { |
100 v8::Isolate::Scope isolate_scope(pIsolate); | 96 v8::Isolate::Scope isolate_scope(pIsolate); |
101 v8::HandleScope handle_scope(pIsolate); | 97 v8::HandleScope handle_scope(pIsolate); |
102 | 98 |
103 JS_PrepareIsolate(pIsolate); | 99 FXJS_PrepareIsolate(pIsolate); |
104 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 100 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
105 CJS_ObjDefintion* pObjDef = new CJS_ObjDefintion(pIsolate, sObjName, eObjType, | 101 CFXJS_ObjDefintion* pObjDef = new CFXJS_ObjDefintion( |
106 pConstructor, pDestructor); | 102 pIsolate, sObjName, eObjType, pConstructor, pDestructor); |
107 pArray->Add(pObjDef); | 103 pArray->Add(pObjDef); |
108 return pArray->GetSize() - 1; | 104 return pArray->GetSize() - 1; |
109 } | 105 } |
110 | 106 |
111 void JS_DefineObjMethod(v8::Isolate* pIsolate, | 107 void FXJS_DefineObjMethod(v8::Isolate* pIsolate, |
112 int nObjDefnID, | 108 int nObjDefnID, |
113 const wchar_t* sMethodName, | 109 const wchar_t* sMethodName, |
114 v8::FunctionCallback pMethodCall) { | 110 v8::FunctionCallback pMethodCall) { |
115 v8::Isolate::Scope isolate_scope(pIsolate); | 111 v8::Isolate::Scope isolate_scope(pIsolate); |
116 v8::HandleScope handle_scope(pIsolate); | 112 v8::HandleScope handle_scope(pIsolate); |
117 | 113 |
118 CFX_WideString ws = CFX_WideString(sMethodName); | 114 CFX_WideString ws = CFX_WideString(sMethodName); |
119 CFX_ByteString bsMethodName = ws.UTF8Encode(); | 115 CFX_ByteString bsMethodName = ws.UTF8Encode(); |
120 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 116 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
121 | 117 |
122 // Note: GetAt() halts if out-of-range even in release builds. | 118 // Note: GetAt() halts if out-of-range even in release builds. |
123 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID); | 119 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID); |
124 v8::Local<v8::ObjectTemplate> objTemp = | 120 v8::Local<v8::ObjectTemplate> objTemp = |
125 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); | 121 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); |
126 objTemp->Set( | 122 objTemp->Set( |
127 v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(), | 123 v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(), |
128 v8::NewStringType::kNormal).ToLocalChecked(), | 124 v8::NewStringType::kNormal).ToLocalChecked(), |
129 v8::FunctionTemplate::New(pIsolate, pMethodCall), v8::ReadOnly); | 125 v8::FunctionTemplate::New(pIsolate, pMethodCall), v8::ReadOnly); |
130 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); | 126 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); |
131 } | 127 } |
132 | 128 |
133 void JS_DefineObjProperty(v8::Isolate* pIsolate, | 129 void FXJS_DefineObjProperty(v8::Isolate* pIsolate, |
134 int nObjDefnID, | 130 int nObjDefnID, |
135 const wchar_t* sPropName, | 131 const wchar_t* sPropName, |
136 v8::AccessorGetterCallback pPropGet, | 132 v8::AccessorGetterCallback pPropGet, |
137 v8::AccessorSetterCallback pPropPut) { | 133 v8::AccessorSetterCallback pPropPut) { |
138 v8::Isolate::Scope isolate_scope(pIsolate); | 134 v8::Isolate::Scope isolate_scope(pIsolate); |
139 v8::HandleScope handle_scope(pIsolate); | 135 v8::HandleScope handle_scope(pIsolate); |
140 | 136 |
141 CFX_WideString ws = CFX_WideString(sPropName); | 137 CFX_WideString ws = CFX_WideString(sPropName); |
142 CFX_ByteString bsPropertyName = ws.UTF8Encode(); | 138 CFX_ByteString bsPropertyName = ws.UTF8Encode(); |
143 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 139 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
144 | 140 |
145 // Note: GetAt() halts if out-of-range even in release builds. | 141 // Note: GetAt() halts if out-of-range even in release builds. |
146 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID); | 142 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID); |
147 v8::Local<v8::ObjectTemplate> objTemp = | 143 v8::Local<v8::ObjectTemplate> objTemp = |
148 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); | 144 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); |
149 objTemp->SetAccessor( | 145 objTemp->SetAccessor( |
150 v8::String::NewFromUtf8(pIsolate, bsPropertyName.c_str(), | 146 v8::String::NewFromUtf8(pIsolate, bsPropertyName.c_str(), |
151 v8::NewStringType::kNormal).ToLocalChecked(), | 147 v8::NewStringType::kNormal).ToLocalChecked(), |
152 pPropGet, pPropPut); | 148 pPropGet, pPropPut); |
153 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); | 149 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); |
154 } | 150 } |
155 | 151 |
156 void JS_DefineObjAllProperties(v8::Isolate* pIsolate, | 152 void FXJS_DefineObjAllProperties(v8::Isolate* pIsolate, |
157 int nObjDefnID, | 153 int nObjDefnID, |
158 v8::NamedPropertyQueryCallback pPropQurey, | 154 v8::NamedPropertyQueryCallback pPropQurey, |
159 v8::NamedPropertyGetterCallback pPropGet, | 155 v8::NamedPropertyGetterCallback pPropGet, |
160 v8::NamedPropertySetterCallback pPropPut, | 156 v8::NamedPropertySetterCallback pPropPut, |
161 v8::NamedPropertyDeleterCallback pPropDel) { | 157 v8::NamedPropertyDeleterCallback pPropDel) { |
162 v8::Isolate::Scope isolate_scope(pIsolate); | 158 v8::Isolate::Scope isolate_scope(pIsolate); |
163 v8::HandleScope handle_scope(pIsolate); | 159 v8::HandleScope handle_scope(pIsolate); |
164 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 160 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
165 | 161 |
166 // Note: GetAt() halts if out-of-range even in release builds. | 162 // Note: GetAt() halts if out-of-range even in release builds. |
167 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID); | 163 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID); |
168 v8::Local<v8::ObjectTemplate> objTemp = | 164 v8::Local<v8::ObjectTemplate> objTemp = |
169 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); | 165 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); |
170 objTemp->SetNamedPropertyHandler(pPropGet, pPropPut, pPropQurey, pPropDel); | 166 objTemp->SetNamedPropertyHandler(pPropGet, pPropPut, pPropQurey, pPropDel); |
171 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); | 167 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); |
172 } | 168 } |
173 | 169 |
174 void JS_DefineObjConst(v8::Isolate* pIsolate, | 170 void FXJS_DefineObjConst(v8::Isolate* pIsolate, |
175 int nObjDefnID, | 171 int nObjDefnID, |
176 const wchar_t* sConstName, | 172 const wchar_t* sConstName, |
177 v8::Local<v8::Value> pDefault) { | 173 v8::Local<v8::Value> pDefault) { |
178 v8::Isolate::Scope isolate_scope(pIsolate); | 174 v8::Isolate::Scope isolate_scope(pIsolate); |
179 v8::HandleScope handle_scope(pIsolate); | 175 v8::HandleScope handle_scope(pIsolate); |
180 | 176 |
181 CFX_WideString ws = CFX_WideString(sConstName); | 177 CFX_WideString ws = CFX_WideString(sConstName); |
182 CFX_ByteString bsConstName = ws.UTF8Encode(); | 178 CFX_ByteString bsConstName = ws.UTF8Encode(); |
183 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 179 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
184 | 180 |
185 // Note: GetAt() halts if out-of-range even in release builds. | 181 // Note: GetAt() halts if out-of-range even in release builds. |
186 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID); | 182 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID); |
187 v8::Local<v8::ObjectTemplate> objTemp = | 183 v8::Local<v8::ObjectTemplate> objTemp = |
188 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); | 184 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); |
189 objTemp->Set(pIsolate, bsConstName.c_str(), pDefault); | 185 objTemp->Set(pIsolate, bsConstName.c_str(), pDefault); |
190 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); | 186 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); |
191 } | 187 } |
192 | 188 |
193 static v8::Global<v8::ObjectTemplate>& _getGlobalObjectTemplate( | 189 static v8::Global<v8::ObjectTemplate>& _getGlobalObjectTemplate( |
194 v8::Isolate* pIsolate) { | 190 v8::Isolate* pIsolate) { |
195 v8::Isolate::Scope isolate_scope(pIsolate); | 191 v8::Isolate::Scope isolate_scope(pIsolate); |
196 v8::HandleScope handle_scope(pIsolate); | 192 v8::HandleScope handle_scope(pIsolate); |
197 | 193 |
198 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 194 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
199 ASSERT(pArray != NULL); | 195 ASSERT(pArray != NULL); |
200 for (int i = 0; i < pArray->GetSize(); i++) { | 196 for (int i = 0; i < pArray->GetSize(); i++) { |
201 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i); | 197 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i); |
202 if (pObjDef->m_bSetAsGlobalObject) | 198 if (pObjDef->m_bSetAsGlobalObject) |
203 return pObjDef->m_objTemplate; | 199 return pObjDef->m_objTemplate; |
204 } | 200 } |
205 static v8::Global<v8::ObjectTemplate> gloabalObjectTemplate; | 201 static v8::Global<v8::ObjectTemplate> gloabalObjectTemplate; |
206 return gloabalObjectTemplate; | 202 return gloabalObjectTemplate; |
207 } | 203 } |
208 | 204 |
209 void JS_DefineGlobalMethod(v8::Isolate* pIsolate, | 205 void FXJS_DefineGlobalMethod(v8::Isolate* pIsolate, |
210 const wchar_t* sMethodName, | 206 const wchar_t* sMethodName, |
211 v8::FunctionCallback pMethodCall) { | 207 v8::FunctionCallback pMethodCall) { |
212 v8::Isolate::Scope isolate_scope(pIsolate); | 208 v8::Isolate::Scope isolate_scope(pIsolate); |
213 v8::HandleScope handle_scope(pIsolate); | 209 v8::HandleScope handle_scope(pIsolate); |
214 | 210 |
215 CFX_WideString ws = CFX_WideString(sMethodName); | 211 CFX_WideString ws = CFX_WideString(sMethodName); |
216 CFX_ByteString bsMethodName = ws.UTF8Encode(); | 212 CFX_ByteString bsMethodName = ws.UTF8Encode(); |
217 | 213 |
218 v8::Local<v8::FunctionTemplate> funTempl = | 214 v8::Local<v8::FunctionTemplate> funTempl = |
219 v8::FunctionTemplate::New(pIsolate, pMethodCall); | 215 v8::FunctionTemplate::New(pIsolate, pMethodCall); |
220 v8::Local<v8::ObjectTemplate> objTemp; | 216 v8::Local<v8::ObjectTemplate> objTemp; |
221 | 217 |
222 v8::Global<v8::ObjectTemplate>& globalObjTemp = | 218 v8::Global<v8::ObjectTemplate>& globalObjTemp = |
223 _getGlobalObjectTemplate(pIsolate); | 219 _getGlobalObjectTemplate(pIsolate); |
224 if (globalObjTemp.IsEmpty()) | 220 if (globalObjTemp.IsEmpty()) |
225 objTemp = v8::ObjectTemplate::New(pIsolate); | 221 objTemp = v8::ObjectTemplate::New(pIsolate); |
226 else | 222 else |
227 objTemp = v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp); | 223 objTemp = v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp); |
228 objTemp->Set( | 224 objTemp->Set( |
229 v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(), | 225 v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(), |
230 v8::NewStringType::kNormal).ToLocalChecked(), | 226 v8::NewStringType::kNormal).ToLocalChecked(), |
231 funTempl, v8::ReadOnly); | 227 funTempl, v8::ReadOnly); |
232 | 228 |
233 globalObjTemp.Reset(pIsolate, objTemp); | 229 globalObjTemp.Reset(pIsolate, objTemp); |
234 } | 230 } |
235 | 231 |
236 void JS_DefineGlobalConst(v8::Isolate* pIsolate, | 232 void FXJS_DefineGlobalConst(v8::Isolate* pIsolate, |
237 const wchar_t* sConstName, | 233 const wchar_t* sConstName, |
238 v8::Local<v8::Value> pDefault) { | 234 v8::Local<v8::Value> pDefault) { |
239 v8::Isolate::Scope isolate_scope(pIsolate); | 235 v8::Isolate::Scope isolate_scope(pIsolate); |
240 v8::HandleScope handle_scope(pIsolate); | 236 v8::HandleScope handle_scope(pIsolate); |
241 | 237 |
242 CFX_WideString ws = CFX_WideString(sConstName); | 238 CFX_WideString ws = CFX_WideString(sConstName); |
243 CFX_ByteString bsConst = ws.UTF8Encode(); | 239 CFX_ByteString bsConst = ws.UTF8Encode(); |
244 | 240 |
245 v8::Local<v8::ObjectTemplate> objTemp; | 241 v8::Local<v8::ObjectTemplate> objTemp; |
246 | 242 |
247 v8::Global<v8::ObjectTemplate>& globalObjTemp = | 243 v8::Global<v8::ObjectTemplate>& globalObjTemp = |
248 _getGlobalObjectTemplate(pIsolate); | 244 _getGlobalObjectTemplate(pIsolate); |
249 if (globalObjTemp.IsEmpty()) | 245 if (globalObjTemp.IsEmpty()) |
250 objTemp = v8::ObjectTemplate::New(pIsolate); | 246 objTemp = v8::ObjectTemplate::New(pIsolate); |
251 else | 247 else |
252 objTemp = v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp); | 248 objTemp = v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp); |
253 objTemp->Set( | 249 objTemp->Set( |
254 v8::String::NewFromUtf8(pIsolate, bsConst.c_str(), | 250 v8::String::NewFromUtf8(pIsolate, bsConst.c_str(), |
255 v8::NewStringType::kNormal).ToLocalChecked(), | 251 v8::NewStringType::kNormal).ToLocalChecked(), |
256 pDefault, v8::ReadOnly); | 252 pDefault, v8::ReadOnly); |
257 | 253 |
258 globalObjTemp.Reset(pIsolate, objTemp); | 254 globalObjTemp.Reset(pIsolate, objTemp); |
259 } | 255 } |
260 | 256 |
261 void JS_InitializeRuntime(v8::Isolate* pIsolate, | 257 void FXJS_InitializeRuntime(v8::Isolate* pIsolate, |
262 IFXJS_Runtime* pFXRuntime, | 258 IFXJS_Runtime* pFXRuntime, |
263 IFXJS_Context* context, | 259 IFXJS_Context* context, |
264 v8::Global<v8::Context>& v8PersistentContext) { | 260 v8::Global<v8::Context>& v8PersistentContext) { |
265 v8::Isolate::Scope isolate_scope(pIsolate); | 261 v8::Isolate::Scope isolate_scope(pIsolate); |
266 v8::HandleScope handle_scope(pIsolate); | 262 v8::HandleScope handle_scope(pIsolate); |
267 | 263 |
268 v8::Global<v8::ObjectTemplate>& globalObjTemp = | 264 v8::Global<v8::ObjectTemplate>& globalObjTemp = |
269 _getGlobalObjectTemplate(pIsolate); | 265 _getGlobalObjectTemplate(pIsolate); |
270 v8::Local<v8::Context> v8Context = v8::Context::New( | 266 v8::Local<v8::Context> v8Context = v8::Context::New( |
271 pIsolate, NULL, | 267 pIsolate, NULL, |
272 v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp)); | 268 v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp)); |
273 v8::Context::Scope context_scope(v8Context); | 269 v8::Context::Scope context_scope(v8Context); |
274 | 270 |
275 v8::Local<v8::External> ptr = v8::External::New(pIsolate, pFXRuntime); | 271 v8::Local<v8::External> ptr = v8::External::New(pIsolate, pFXRuntime); |
276 v8Context->SetEmbedderData(1, ptr); | 272 v8Context->SetEmbedderData(1, ptr); |
277 | 273 |
278 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 274 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
279 if (!pArray) | 275 if (!pArray) |
280 return; | 276 return; |
281 | 277 |
282 for (int i = 0; i < pArray->GetSize(); i++) { | 278 for (int i = 0; i < pArray->GetSize(); i++) { |
283 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i); | 279 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i); |
284 CFX_WideString ws = CFX_WideString(pObjDef->objName); | 280 CFX_WideString ws = CFX_WideString(pObjDef->objName); |
285 CFX_ByteString bs = ws.UTF8Encode(); | 281 CFX_ByteString bs = ws.UTF8Encode(); |
286 v8::Local<v8::String> objName = | 282 v8::Local<v8::String> objName = |
287 v8::String::NewFromUtf8(pIsolate, bs.c_str(), | 283 v8::String::NewFromUtf8(pIsolate, bs.c_str(), |
288 v8::NewStringType::kNormal, | 284 v8::NewStringType::kNormal, |
289 bs.GetLength()).ToLocalChecked(); | 285 bs.GetLength()).ToLocalChecked(); |
290 | 286 |
291 if (pObjDef->objType == JS_DYNAMIC) { | 287 if (pObjDef->objType == FXJS_DYNAMIC) { |
292 // Document is set as global object, need to construct it first. | 288 // Document is set as global object, need to construct it first. |
293 if (ws.Equal(L"Document")) { | 289 if (ws.Equal(L"Document")) { |
294 CJS_PrivateData* pPrivateData = new CJS_PrivateData; | 290 CFXJS_PrivateData* pPrivateData = new CFXJS_PrivateData; |
295 pPrivateData->ObjDefID = i; | 291 pPrivateData->ObjDefID = i; |
296 | 292 |
297 v8Context->Global() | 293 v8Context->Global() |
298 ->GetPrototype() | 294 ->GetPrototype() |
299 ->ToObject(v8Context) | 295 ->ToObject(v8Context) |
300 .ToLocalChecked() | 296 .ToLocalChecked() |
301 ->SetAlignedPointerInInternalField(0, pPrivateData); | 297 ->SetAlignedPointerInInternalField(0, pPrivateData); |
302 | 298 |
303 if (pObjDef->m_pConstructor) | 299 if (pObjDef->m_pConstructor) |
304 pObjDef->m_pConstructor(context, v8Context->Global() | 300 pObjDef->m_pConstructor(context, v8Context->Global() |
305 ->GetPrototype() | 301 ->GetPrototype() |
306 ->ToObject(v8Context) | 302 ->ToObject(v8Context) |
307 .ToLocalChecked(), | 303 .ToLocalChecked(), |
308 v8Context->Global() | 304 v8Context->Global() |
309 ->GetPrototype() | 305 ->GetPrototype() |
310 ->ToObject(v8Context) | 306 ->ToObject(v8Context) |
311 .ToLocalChecked()); | 307 .ToLocalChecked()); |
312 } | 308 } |
313 } else { | 309 } else { |
314 v8::Local<v8::Object> obj = JS_NewFxDynamicObj(pIsolate, context, i); | 310 v8::Local<v8::Object> obj = FXJS_NewFxDynamicObj(pIsolate, context, i); |
315 v8Context->Global()->Set(v8Context, objName, obj).FromJust(); | 311 v8Context->Global()->Set(v8Context, objName, obj).FromJust(); |
316 pObjDef->m_StaticObj.Reset(pIsolate, obj); | 312 pObjDef->m_StaticObj.Reset(pIsolate, obj); |
317 } | 313 } |
318 } | 314 } |
319 v8PersistentContext.Reset(pIsolate, v8Context); | 315 v8PersistentContext.Reset(pIsolate, v8Context); |
320 } | 316 } |
321 | 317 |
322 void JS_ReleaseRuntime(v8::Isolate* pIsolate, | 318 void FXJS_ReleaseRuntime(v8::Isolate* pIsolate, |
323 v8::Global<v8::Context>& v8PersistentContext) { | 319 v8::Global<v8::Context>& v8PersistentContext) { |
324 v8::Isolate::Scope isolate_scope(pIsolate); | 320 v8::Isolate::Scope isolate_scope(pIsolate); |
325 v8::HandleScope handle_scope(pIsolate); | 321 v8::HandleScope handle_scope(pIsolate); |
326 v8::Local<v8::Context> context = | 322 v8::Local<v8::Context> context = |
327 v8::Local<v8::Context>::New(pIsolate, v8PersistentContext); | 323 v8::Local<v8::Context>::New(pIsolate, v8PersistentContext); |
328 v8::Context::Scope context_scope(context); | 324 v8::Context::Scope context_scope(context); |
329 | 325 |
330 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 326 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
331 if (!pArray) | 327 if (!pArray) |
332 return; | 328 return; |
333 | 329 |
334 for (int i = 0; i < pArray->GetSize(); i++) { | 330 for (int i = 0; i < pArray->GetSize(); i++) { |
335 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i); | 331 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i); |
336 if (!pObjDef->m_StaticObj.IsEmpty()) { | 332 if (!pObjDef->m_StaticObj.IsEmpty()) { |
337 v8::Local<v8::Object> pObj = | 333 v8::Local<v8::Object> pObj = |
338 v8::Local<v8::Object>::New(pIsolate, pObjDef->m_StaticObj); | 334 v8::Local<v8::Object>::New(pIsolate, pObjDef->m_StaticObj); |
339 if (pObjDef->m_pDestructor) | 335 if (pObjDef->m_pDestructor) |
340 pObjDef->m_pDestructor(pObj); | 336 pObjDef->m_pDestructor(pObj); |
341 JS_FreePrivate(pObj); | 337 FXJS_FreePrivate(pObj); |
342 } | 338 } |
343 delete pObjDef; | 339 delete pObjDef; |
344 } | 340 } |
345 delete pArray; | 341 delete pArray; |
346 pIsolate->SetData(g_embedderDataSlot, NULL); | 342 pIsolate->SetData(g_embedderDataSlot, NULL); |
347 } | 343 } |
348 | 344 |
349 void JS_Initialize(unsigned int embedderDataSlot) { | 345 void FXJS_Initialize(unsigned int embedderDataSlot) { |
350 g_embedderDataSlot = embedderDataSlot; | 346 g_embedderDataSlot = embedderDataSlot; |
351 } | 347 } |
352 | 348 |
353 void JS_Release() { | 349 void FXJS_Release() { |
354 } | 350 } |
355 | 351 |
356 int JS_Execute(v8::Isolate* pIsolate, | 352 int FXJS_Execute(v8::Isolate* pIsolate, |
357 IFXJS_Context* pJSContext, | 353 IFXJS_Context* pJSContext, |
358 const wchar_t* script, | 354 const wchar_t* script, |
359 long length, | 355 long length, |
360 FXJSErr* perror) { | 356 FXJSErr* pError) { |
361 v8::Isolate::Scope isolate_scope(pIsolate); | 357 v8::Isolate::Scope isolate_scope(pIsolate); |
362 v8::TryCatch try_catch(pIsolate); | 358 v8::TryCatch try_catch(pIsolate); |
363 | 359 |
364 CFX_WideString wsScript(script); | 360 CFX_WideString wsScript(script); |
365 CFX_ByteString bsScript = wsScript.UTF8Encode(); | 361 CFX_ByteString bsScript = wsScript.UTF8Encode(); |
366 | 362 |
367 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 363 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
368 v8::Local<v8::Script> compiled_script; | 364 v8::Local<v8::Script> compiled_script; |
369 if (!v8::Script::Compile( | 365 if (!v8::Script::Compile( |
370 context, v8::String::NewFromUtf8( | 366 context, v8::String::NewFromUtf8( |
371 pIsolate, bsScript.c_str(), v8::NewStringType::kNormal, | 367 pIsolate, bsScript.c_str(), v8::NewStringType::kNormal, |
372 bsScript.GetLength()).ToLocalChecked()) | 368 bsScript.GetLength()).ToLocalChecked()) |
373 .ToLocal(&compiled_script)) { | 369 .ToLocal(&compiled_script)) { |
374 v8::String::Utf8Value error(try_catch.Exception()); | 370 v8::String::Utf8Value error(try_catch.Exception()); |
| 371 // TODO(tsepez): return error via pError->message. |
375 return -1; | 372 return -1; |
376 } | 373 } |
377 | 374 |
378 v8::Local<v8::Value> result; | 375 v8::Local<v8::Value> result; |
379 if (!compiled_script->Run(context).ToLocal(&result)) { | 376 if (!compiled_script->Run(context).ToLocal(&result)) { |
380 v8::String::Utf8Value error(try_catch.Exception()); | 377 v8::String::Utf8Value error(try_catch.Exception()); |
| 378 // TODO(tsepez): return error via pError->message. |
381 return -1; | 379 return -1; |
382 } | 380 } |
383 return 0; | 381 return 0; |
384 } | 382 } |
385 | 383 |
386 v8::Local<v8::Object> JS_NewFxDynamicObj(v8::Isolate* pIsolate, | 384 v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate, |
387 IFXJS_Context* pJSContext, | 385 IFXJS_Context* pJSContext, |
388 int nObjDefnID) { | 386 int nObjDefnID) { |
389 v8::Isolate::Scope isolate_scope(pIsolate); | 387 v8::Isolate::Scope isolate_scope(pIsolate); |
390 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 388 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
391 if (-1 == nObjDefnID) { | 389 if (-1 == nObjDefnID) { |
392 v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(pIsolate); | 390 v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(pIsolate); |
393 v8::Local<v8::Object> obj; | 391 v8::Local<v8::Object> obj; |
394 if (objTempl->NewInstance(context).ToLocal(&obj)) | 392 if (objTempl->NewInstance(context).ToLocal(&obj)) |
395 return obj; | 393 return obj; |
396 return v8::Local<v8::Object>(); | 394 return v8::Local<v8::Object>(); |
397 } | 395 } |
398 | 396 |
399 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 397 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
400 if (!pArray) | 398 if (!pArray) |
401 return v8::Local<v8::Object>(); | 399 return v8::Local<v8::Object>(); |
402 | 400 |
403 if (nObjDefnID < 0 || nObjDefnID >= pArray->GetSize()) | 401 if (nObjDefnID < 0 || nObjDefnID >= pArray->GetSize()) |
404 return v8::Local<v8::Object>(); | 402 return v8::Local<v8::Object>(); |
405 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID); | 403 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID); |
406 | 404 |
407 v8::Local<v8::ObjectTemplate> objTemp = | 405 v8::Local<v8::ObjectTemplate> objTemp = |
408 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); | 406 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); |
409 v8::Local<v8::Object> obj; | 407 v8::Local<v8::Object> obj; |
410 if (!objTemp->NewInstance(context).ToLocal(&obj)) | 408 if (!objTemp->NewInstance(context).ToLocal(&obj)) |
411 return v8::Local<v8::Object>(); | 409 return v8::Local<v8::Object>(); |
412 | 410 |
413 CJS_PrivateData* pPrivateData = new CJS_PrivateData; | 411 CFXJS_PrivateData* pPrivateData = new CFXJS_PrivateData; |
414 pPrivateData->ObjDefID = nObjDefnID; | 412 pPrivateData->ObjDefID = nObjDefnID; |
415 | 413 |
416 obj->SetAlignedPointerInInternalField(0, pPrivateData); | 414 obj->SetAlignedPointerInInternalField(0, pPrivateData); |
417 if (pObjDef->m_pConstructor) | 415 if (pObjDef->m_pConstructor) |
418 pObjDef->m_pConstructor( | 416 pObjDef->m_pConstructor( |
419 pJSContext, obj, | 417 pJSContext, obj, |
420 context->Global()->GetPrototype()->ToObject(context).ToLocalChecked()); | 418 context->Global()->GetPrototype()->ToObject(context).ToLocalChecked()); |
421 | 419 |
422 return obj; | 420 return obj; |
423 } | 421 } |
424 | 422 |
425 v8::Local<v8::Object> JS_GetStaticObj(v8::Isolate* pIsolate, int nObjDefnID) { | 423 v8::Local<v8::Object> FXJS_GetStaticObj(v8::Isolate* pIsolate, int nObjDefnID) { |
426 v8::Isolate::Scope isolate_scope(pIsolate); | 424 v8::Isolate::Scope isolate_scope(pIsolate); |
427 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 425 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
428 if (!pArray) | 426 if (!pArray) |
429 return v8::Local<v8::Object>(); | 427 return v8::Local<v8::Object>(); |
430 | 428 |
431 if (nObjDefnID < 0 || nObjDefnID >= pArray->GetSize()) | 429 if (nObjDefnID < 0 || nObjDefnID >= pArray->GetSize()) |
432 return v8::Local<v8::Object>(); | 430 return v8::Local<v8::Object>(); |
433 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID); | 431 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID); |
434 v8::Local<v8::Object> obj = | 432 v8::Local<v8::Object> obj = |
435 v8::Local<v8::Object>::New(pIsolate, pObjDef->m_StaticObj); | 433 v8::Local<v8::Object>::New(pIsolate, pObjDef->m_StaticObj); |
436 return obj; | 434 return obj; |
437 } | 435 } |
438 | 436 |
439 v8::Local<v8::Object> JS_GetThisObj(v8::Isolate* pIsolate) { | 437 v8::Local<v8::Object> FXJS_GetThisObj(v8::Isolate* pIsolate) { |
440 // Return the global object. | 438 // Return the global object. |
441 v8::Isolate::Scope isolate_scope(pIsolate); | 439 v8::Isolate::Scope isolate_scope(pIsolate); |
442 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 440 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
443 if (!pArray) | 441 if (!pArray) |
444 return v8::Local<v8::Object>(); | 442 return v8::Local<v8::Object>(); |
445 | 443 |
446 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 444 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
447 return context->Global()->GetPrototype()->ToObject(context).ToLocalChecked(); | 445 return context->Global()->GetPrototype()->ToObject(context).ToLocalChecked(); |
448 } | 446 } |
449 | 447 |
450 int JS_GetObjDefnID(v8::Local<v8::Object> pObj) { | 448 int FXJS_GetObjDefnID(v8::Local<v8::Object> pObj) { |
451 if (pObj.IsEmpty() || !pObj->InternalFieldCount()) | 449 if (pObj.IsEmpty() || !pObj->InternalFieldCount()) |
452 return -1; | 450 return -1; |
453 CJS_PrivateData* pPrivateData = | 451 CFXJS_PrivateData* pPrivateData = |
454 (CJS_PrivateData*)pObj->GetAlignedPointerFromInternalField(0); | 452 (CFXJS_PrivateData*)pObj->GetAlignedPointerFromInternalField(0); |
455 if (pPrivateData) | 453 if (pPrivateData) |
456 return pPrivateData->ObjDefID; | 454 return pPrivateData->ObjDefID; |
457 return -1; | 455 return -1; |
458 } | 456 } |
459 | 457 |
460 v8::Isolate* JS_GetRuntime(v8::Local<v8::Object> pObj) { | 458 v8::Isolate* FXJS_GetRuntime(v8::Local<v8::Object> pObj) { |
461 if (pObj.IsEmpty()) | 459 if (pObj.IsEmpty()) |
462 return NULL; | 460 return NULL; |
463 v8::Local<v8::Context> context = pObj->CreationContext(); | 461 v8::Local<v8::Context> context = pObj->CreationContext(); |
464 if (context.IsEmpty()) | 462 if (context.IsEmpty()) |
465 return NULL; | 463 return NULL; |
466 return context->GetIsolate(); | 464 return context->GetIsolate(); |
467 } | 465 } |
468 | 466 |
469 int JS_GetObjDefnID(v8::Isolate* pIsolate, const wchar_t* pObjName) { | 467 int FXJS_GetObjDefnID(v8::Isolate* pIsolate, const wchar_t* pObjName) { |
470 v8::Isolate::Scope isolate_scope(pIsolate); | 468 v8::Isolate::Scope isolate_scope(pIsolate); |
471 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 469 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
472 if (!pArray) | 470 if (!pArray) |
473 return -1; | 471 return -1; |
474 | 472 |
475 for (int i = 0; i < pArray->GetSize(); i++) { | 473 for (int i = 0; i < pArray->GetSize(); i++) { |
476 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i); | 474 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i); |
477 if (FXSYS_wcscmp(pObjDef->objName, pObjName) == 0) | 475 if (FXSYS_wcscmp(pObjDef->objName, pObjName) == 0) |
478 return i; | 476 return i; |
479 } | 477 } |
480 return -1; | 478 return -1; |
481 } | 479 } |
482 | 480 |
483 void JS_Error(v8::Isolate* pIsolate, const CFX_WideString& message) { | 481 void FXJS_Error(v8::Isolate* pIsolate, const CFX_WideString& message) { |
484 // Conversion from pdfium's wchar_t wide-strings to v8's uint16_t | 482 // Conversion from pdfium's wchar_t wide-strings to v8's uint16_t |
485 // wide-strings isn't handled by v8, so use UTF8 as a common | 483 // wide-strings isn't handled by v8, so use UTF8 as a common |
486 // intermediate format. | 484 // intermediate format. |
487 CFX_ByteString utf8_message = message.UTF8Encode(); | 485 CFX_ByteString utf8_message = message.UTF8Encode(); |
488 pIsolate->ThrowException( | 486 pIsolate->ThrowException( |
489 v8::String::NewFromUtf8(pIsolate, utf8_message.c_str(), | 487 v8::String::NewFromUtf8(pIsolate, utf8_message.c_str(), |
490 v8::NewStringType::kNormal).ToLocalChecked()); | 488 v8::NewStringType::kNormal).ToLocalChecked()); |
491 } | 489 } |
492 | 490 |
493 unsigned JS_CalcHash(const wchar_t* main, unsigned nLen) { | 491 const wchar_t* FXJS_GetTypeof(v8::Local<v8::Value> pObj) { |
494 return (unsigned)FX_HashCode_String_GetW(main, nLen); | |
495 } | |
496 | |
497 unsigned JS_CalcHash(const wchar_t* main) { | |
498 return (unsigned)FX_HashCode_String_GetW(main, FXSYS_wcslen(main)); | |
499 } | |
500 const wchar_t* JS_GetTypeof(v8::Local<v8::Value> pObj) { | |
501 if (pObj.IsEmpty()) | 492 if (pObj.IsEmpty()) |
502 return NULL; | 493 return NULL; |
503 if (pObj->IsString()) | 494 if (pObj->IsString()) |
504 return kFXJSValueNameString; | 495 return kFXJSValueNameString; |
505 if (pObj->IsNumber()) | 496 if (pObj->IsNumber()) |
506 return kFXJSValueNameNumber; | 497 return kFXJSValueNameNumber; |
507 if (pObj->IsBoolean()) | 498 if (pObj->IsBoolean()) |
508 return kFXJSValueNameBoolean; | 499 return kFXJSValueNameBoolean; |
509 if (pObj->IsDate()) | 500 if (pObj->IsDate()) |
510 return kFXJSValueNameDate; | 501 return kFXJSValueNameDate; |
511 if (pObj->IsObject()) | 502 if (pObj->IsObject()) |
512 return kFXJSValueNameObject; | 503 return kFXJSValueNameObject; |
513 if (pObj->IsNull()) | 504 if (pObj->IsNull()) |
514 return kFXJSValueNameNull; | 505 return kFXJSValueNameNull; |
515 if (pObj->IsUndefined()) | 506 if (pObj->IsUndefined()) |
516 return kFXJSValueNameUndefined; | 507 return kFXJSValueNameUndefined; |
517 return NULL; | 508 return NULL; |
518 } | 509 } |
519 void JS_SetPrivate(v8::Local<v8::Object> pObj, void* p) { | 510 void FXJS_SetPrivate(v8::Local<v8::Object> pObj, void* p) { |
520 JS_SetPrivate(NULL, pObj, p); | 511 FXJS_SetPrivate(NULL, pObj, p); |
521 } | 512 } |
522 | 513 |
523 void* JS_GetPrivate(v8::Local<v8::Object> pObj) { | 514 void* FXJS_GetPrivate(v8::Local<v8::Object> pObj) { |
524 return JS_GetPrivate(NULL, pObj); | 515 return FXJS_GetPrivate(NULL, pObj); |
525 } | 516 } |
526 | 517 |
527 void JS_SetPrivate(v8::Isolate* pIsolate, v8::Local<v8::Object> pObj, void* p) { | 518 void FXJS_SetPrivate(v8::Isolate* pIsolate, |
| 519 v8::Local<v8::Object> pObj, |
| 520 void* p) { |
528 if (pObj.IsEmpty() || !pObj->InternalFieldCount()) | 521 if (pObj.IsEmpty() || !pObj->InternalFieldCount()) |
529 return; | 522 return; |
530 CJS_PrivateData* pPrivateData = | 523 CFXJS_PrivateData* pPrivateData = |
531 (CJS_PrivateData*)pObj->GetAlignedPointerFromInternalField(0); | 524 (CFXJS_PrivateData*)pObj->GetAlignedPointerFromInternalField(0); |
532 if (!pPrivateData) | 525 if (!pPrivateData) |
533 return; | 526 return; |
534 pPrivateData->pPrivate = p; | 527 pPrivateData->pPrivate = p; |
535 } | 528 } |
536 | 529 |
537 void* JS_GetPrivate(v8::Isolate* pIsolate, v8::Local<v8::Object> pObj) { | 530 void* FXJS_GetPrivate(v8::Isolate* pIsolate, v8::Local<v8::Object> pObj) { |
538 if (pObj.IsEmpty()) | 531 if (pObj.IsEmpty()) |
539 return NULL; | 532 return NULL; |
540 CJS_PrivateData* pPrivateData = NULL; | 533 CFXJS_PrivateData* pPrivateData = NULL; |
541 if (pObj->InternalFieldCount()) | 534 if (pObj->InternalFieldCount()) |
542 pPrivateData = | 535 pPrivateData = |
543 (CJS_PrivateData*)pObj->GetAlignedPointerFromInternalField(0); | 536 (CFXJS_PrivateData*)pObj->GetAlignedPointerFromInternalField(0); |
544 else { | 537 else { |
545 // It could be a global proxy object. | 538 // It could be a global proxy object. |
546 v8::Local<v8::Value> v = pObj->GetPrototype(); | 539 v8::Local<v8::Value> v = pObj->GetPrototype(); |
547 v8::Isolate* isolate = (v8::Isolate*)pIsolate; | 540 v8::Isolate* isolate = (v8::Isolate*)pIsolate; |
548 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | 541 v8::Local<v8::Context> context = isolate->GetCurrentContext(); |
549 if (v->IsObject()) | 542 if (v->IsObject()) |
550 pPrivateData = (CJS_PrivateData*)v->ToObject(context) | 543 pPrivateData = (CFXJS_PrivateData*)v->ToObject(context) |
551 .ToLocalChecked() | 544 .ToLocalChecked() |
552 ->GetAlignedPointerFromInternalField(0); | 545 ->GetAlignedPointerFromInternalField(0); |
553 } | 546 } |
554 if (!pPrivateData) | 547 if (!pPrivateData) |
555 return NULL; | 548 return NULL; |
556 return pPrivateData->pPrivate; | 549 return pPrivateData->pPrivate; |
557 } | 550 } |
558 | 551 |
559 void JS_FreePrivate(void* pPrivateData) { | 552 void FXJS_FreePrivate(void* pPrivateData) { |
560 delete (CJS_PrivateData*)pPrivateData; | 553 delete (CFXJS_PrivateData*)pPrivateData; |
561 } | 554 } |
562 | 555 |
563 void JS_FreePrivate(v8::Local<v8::Object> pObj) { | 556 void FXJS_FreePrivate(v8::Local<v8::Object> pObj) { |
564 if (pObj.IsEmpty() || !pObj->InternalFieldCount()) | 557 if (pObj.IsEmpty() || !pObj->InternalFieldCount()) |
565 return; | 558 return; |
566 JS_FreePrivate(pObj->GetAlignedPointerFromInternalField(0)); | 559 FXJS_FreePrivate(pObj->GetAlignedPointerFromInternalField(0)); |
567 pObj->SetAlignedPointerInInternalField(0, NULL); | 560 pObj->SetAlignedPointerInInternalField(0, NULL); |
568 } | 561 } |
569 | 562 |
570 v8::Local<v8::Value> JS_GetObjectValue(v8::Local<v8::Object> pObj) { | 563 v8::Local<v8::String> FXJS_WSToJSString(v8::Isolate* pIsolate, |
571 return pObj; | 564 const wchar_t* PropertyName, |
572 } | 565 int Len) { |
573 | |
574 v8::Local<v8::String> WSToJSString(v8::Isolate* pIsolate, | |
575 const wchar_t* PropertyName, | |
576 int Len = -1) { | |
577 CFX_WideString ws = CFX_WideString(PropertyName, Len); | 566 CFX_WideString ws = CFX_WideString(PropertyName, Len); |
578 CFX_ByteString bs = ws.UTF8Encode(); | 567 CFX_ByteString bs = ws.UTF8Encode(); |
579 if (!pIsolate) | 568 if (!pIsolate) |
580 pIsolate = v8::Isolate::GetCurrent(); | 569 pIsolate = v8::Isolate::GetCurrent(); |
581 return v8::String::NewFromUtf8(pIsolate, bs.c_str(), | 570 return v8::String::NewFromUtf8(pIsolate, bs.c_str(), |
582 v8::NewStringType::kNormal).ToLocalChecked(); | 571 v8::NewStringType::kNormal).ToLocalChecked(); |
583 } | 572 } |
584 | 573 |
585 v8::Local<v8::Value> JS_GetObjectElement(v8::Isolate* pIsolate, | 574 v8::Local<v8::Value> FXJS_GetObjectValue(v8::Local<v8::Object> pObj) { |
586 v8::Local<v8::Object> pObj, | 575 return pObj; |
587 const wchar_t* PropertyName) { | 576 } |
| 577 |
| 578 v8::Local<v8::Value> FXJS_GetObjectElement(v8::Isolate* pIsolate, |
| 579 v8::Local<v8::Object> pObj, |
| 580 const wchar_t* PropertyName) { |
588 if (pObj.IsEmpty()) | 581 if (pObj.IsEmpty()) |
589 return v8::Local<v8::Value>(); | 582 return v8::Local<v8::Value>(); |
590 v8::Local<v8::Value> val; | 583 v8::Local<v8::Value> val; |
591 if (!pObj->Get(pIsolate->GetCurrentContext(), | 584 if (!pObj->Get(pIsolate->GetCurrentContext(), |
592 WSToJSString(pIsolate, PropertyName)).ToLocal(&val)) | 585 FXJS_WSToJSString(pIsolate, PropertyName)).ToLocal(&val)) |
593 return v8::Local<v8::Value>(); | 586 return v8::Local<v8::Value>(); |
594 return val; | 587 return val; |
595 } | 588 } |
596 | 589 |
597 v8::Local<v8::Array> JS_GetObjectElementNames(v8::Isolate* pIsolate, | 590 v8::Local<v8::Array> FXJS_GetObjectElementNames(v8::Isolate* pIsolate, |
598 v8::Local<v8::Object> pObj) { | 591 v8::Local<v8::Object> pObj) { |
599 if (pObj.IsEmpty()) | 592 if (pObj.IsEmpty()) |
600 return v8::Local<v8::Array>(); | 593 return v8::Local<v8::Array>(); |
601 v8::Local<v8::Array> val; | 594 v8::Local<v8::Array> val; |
602 if (!pObj->GetPropertyNames(pIsolate->GetCurrentContext()).ToLocal(&val)) | 595 if (!pObj->GetPropertyNames(pIsolate->GetCurrentContext()).ToLocal(&val)) |
603 return v8::Local<v8::Array>(); | 596 return v8::Local<v8::Array>(); |
604 return val; | 597 return val; |
605 } | 598 } |
606 | 599 |
607 void JS_PutObjectString(v8::Isolate* pIsolate, | 600 void FXJS_PutObjectString(v8::Isolate* pIsolate, |
608 v8::Local<v8::Object> pObj, | 601 v8::Local<v8::Object> pObj, |
609 const wchar_t* PropertyName, | 602 const wchar_t* PropertyName, |
610 const wchar_t* sValue) // VT_string | 603 const wchar_t* sValue) // VT_string |
611 { | 604 { |
612 if (pObj.IsEmpty()) | 605 if (pObj.IsEmpty()) |
613 return; | 606 return; |
614 pObj->Set(pIsolate->GetCurrentContext(), WSToJSString(pIsolate, PropertyName), | 607 pObj->Set(pIsolate->GetCurrentContext(), |
615 WSToJSString(pIsolate, sValue)).FromJust(); | 608 FXJS_WSToJSString(pIsolate, PropertyName), |
| 609 FXJS_WSToJSString(pIsolate, sValue)).FromJust(); |
616 } | 610 } |
617 | 611 |
618 void JS_PutObjectNumber(v8::Isolate* pIsolate, | 612 void FXJS_PutObjectNumber(v8::Isolate* pIsolate, |
619 v8::Local<v8::Object> pObj, | 613 v8::Local<v8::Object> pObj, |
620 const wchar_t* PropertyName, | 614 const wchar_t* PropertyName, |
621 int nValue) { | 615 int nValue) { |
622 if (pObj.IsEmpty()) | 616 if (pObj.IsEmpty()) |
623 return; | 617 return; |
624 pObj->Set(pIsolate->GetCurrentContext(), WSToJSString(pIsolate, PropertyName), | 618 pObj->Set(pIsolate->GetCurrentContext(), |
| 619 FXJS_WSToJSString(pIsolate, PropertyName), |
625 v8::Int32::New(pIsolate, nValue)).FromJust(); | 620 v8::Int32::New(pIsolate, nValue)).FromJust(); |
626 } | 621 } |
627 | 622 |
628 void JS_PutObjectNumber(v8::Isolate* pIsolate, | 623 void FXJS_PutObjectNumber(v8::Isolate* pIsolate, |
629 v8::Local<v8::Object> pObj, | 624 v8::Local<v8::Object> pObj, |
630 const wchar_t* PropertyName, | 625 const wchar_t* PropertyName, |
631 float fValue) { | 626 float fValue) { |
632 if (pObj.IsEmpty()) | 627 if (pObj.IsEmpty()) |
633 return; | 628 return; |
634 pObj->Set(pIsolate->GetCurrentContext(), WSToJSString(pIsolate, PropertyName), | 629 pObj->Set(pIsolate->GetCurrentContext(), |
| 630 FXJS_WSToJSString(pIsolate, PropertyName), |
635 v8::Number::New(pIsolate, (double)fValue)).FromJust(); | 631 v8::Number::New(pIsolate, (double)fValue)).FromJust(); |
636 } | 632 } |
637 | 633 |
638 void JS_PutObjectNumber(v8::Isolate* pIsolate, | 634 void FXJS_PutObjectNumber(v8::Isolate* pIsolate, |
639 v8::Local<v8::Object> pObj, | 635 v8::Local<v8::Object> pObj, |
640 const wchar_t* PropertyName, | 636 const wchar_t* PropertyName, |
641 double dValue) { | 637 double dValue) { |
642 if (pObj.IsEmpty()) | 638 if (pObj.IsEmpty()) |
643 return; | 639 return; |
644 pObj->Set(pIsolate->GetCurrentContext(), WSToJSString(pIsolate, PropertyName), | 640 pObj->Set(pIsolate->GetCurrentContext(), |
| 641 FXJS_WSToJSString(pIsolate, PropertyName), |
645 v8::Number::New(pIsolate, (double)dValue)).FromJust(); | 642 v8::Number::New(pIsolate, (double)dValue)).FromJust(); |
646 } | 643 } |
647 | 644 |
648 void JS_PutObjectBoolean(v8::Isolate* pIsolate, | 645 void FXJS_PutObjectBoolean(v8::Isolate* pIsolate, |
649 v8::Local<v8::Object> pObj, | 646 v8::Local<v8::Object> pObj, |
650 const wchar_t* PropertyName, | 647 const wchar_t* PropertyName, |
651 bool bValue) { | 648 bool bValue) { |
652 if (pObj.IsEmpty()) | 649 if (pObj.IsEmpty()) |
653 return; | 650 return; |
654 pObj->Set(pIsolate->GetCurrentContext(), WSToJSString(pIsolate, PropertyName), | 651 pObj->Set(pIsolate->GetCurrentContext(), |
| 652 FXJS_WSToJSString(pIsolate, PropertyName), |
655 v8::Boolean::New(pIsolate, bValue)).FromJust(); | 653 v8::Boolean::New(pIsolate, bValue)).FromJust(); |
656 } | 654 } |
657 | 655 |
658 void JS_PutObjectObject(v8::Isolate* pIsolate, | 656 void FXJS_PutObjectObject(v8::Isolate* pIsolate, |
659 v8::Local<v8::Object> pObj, | 657 v8::Local<v8::Object> pObj, |
660 const wchar_t* PropertyName, | 658 const wchar_t* PropertyName, |
661 v8::Local<v8::Object> pPut) { | 659 v8::Local<v8::Object> pPut) { |
662 if (pObj.IsEmpty()) | 660 if (pObj.IsEmpty()) |
663 return; | 661 return; |
664 pObj->Set(pIsolate->GetCurrentContext(), WSToJSString(pIsolate, PropertyName), | 662 pObj->Set(pIsolate->GetCurrentContext(), |
665 pPut).FromJust(); | 663 FXJS_WSToJSString(pIsolate, PropertyName), pPut).FromJust(); |
666 } | 664 } |
667 | 665 |
668 void JS_PutObjectNull(v8::Isolate* pIsolate, | 666 void FXJS_PutObjectNull(v8::Isolate* pIsolate, |
669 v8::Local<v8::Object> pObj, | 667 v8::Local<v8::Object> pObj, |
670 const wchar_t* PropertyName) { | 668 const wchar_t* PropertyName) { |
671 if (pObj.IsEmpty()) | 669 if (pObj.IsEmpty()) |
672 return; | 670 return; |
673 pObj->Set(pIsolate->GetCurrentContext(), WSToJSString(pIsolate, PropertyName), | 671 pObj->Set(pIsolate->GetCurrentContext(), |
| 672 FXJS_WSToJSString(pIsolate, PropertyName), |
674 v8::Local<v8::Object>()).FromJust(); | 673 v8::Local<v8::Object>()).FromJust(); |
675 } | 674 } |
676 | 675 |
677 v8::Local<v8::Array> JS_NewArray(v8::Isolate* pIsolate) { | 676 v8::Local<v8::Array> FXJS_NewArray(v8::Isolate* pIsolate) { |
678 return v8::Array::New(pIsolate); | 677 return v8::Array::New(pIsolate); |
679 } | 678 } |
680 | 679 |
681 unsigned JS_PutArrayElement(v8::Isolate* pIsolate, | 680 unsigned FXJS_PutArrayElement(v8::Isolate* pIsolate, |
682 v8::Local<v8::Array> pArray, | 681 v8::Local<v8::Array> pArray, |
683 unsigned index, | 682 unsigned index, |
684 v8::Local<v8::Value> pValue, | 683 v8::Local<v8::Value> pValue) { |
685 FXJSVALUETYPE eType) { | |
686 if (pArray.IsEmpty()) | 684 if (pArray.IsEmpty()) |
687 return 0; | 685 return 0; |
688 if (pArray->Set(pIsolate->GetCurrentContext(), index, pValue).IsNothing()) | 686 if (pArray->Set(pIsolate->GetCurrentContext(), index, pValue).IsNothing()) |
689 return 0; | 687 return 0; |
690 return 1; | 688 return 1; |
691 } | 689 } |
692 | 690 |
693 v8::Local<v8::Value> JS_GetArrayElement(v8::Isolate* pIsolate, | 691 v8::Local<v8::Value> FXJS_GetArrayElement(v8::Isolate* pIsolate, |
694 v8::Local<v8::Array> pArray, | 692 v8::Local<v8::Array> pArray, |
695 unsigned index) { | 693 unsigned index) { |
696 if (pArray.IsEmpty()) | 694 if (pArray.IsEmpty()) |
697 return v8::Local<v8::Value>(); | 695 return v8::Local<v8::Value>(); |
698 v8::Local<v8::Value> val; | 696 v8::Local<v8::Value> val; |
699 if (!pArray->Get(pIsolate->GetCurrentContext(), index).ToLocal(&val)) | 697 if (!pArray->Get(pIsolate->GetCurrentContext(), index).ToLocal(&val)) |
700 return v8::Local<v8::Value>(); | 698 return v8::Local<v8::Value>(); |
701 return val; | 699 return val; |
702 } | 700 } |
703 | 701 |
704 unsigned JS_GetArrayLength(v8::Local<v8::Array> pArray) { | 702 unsigned FXJS_GetArrayLength(v8::Local<v8::Array> pArray) { |
705 if (pArray.IsEmpty()) | 703 if (pArray.IsEmpty()) |
706 return 0; | 704 return 0; |
707 return pArray->Length(); | 705 return pArray->Length(); |
708 } | 706 } |
709 | 707 |
710 v8::Local<v8::Value> JS_NewNumber(v8::Isolate* pIsolate, int number) { | 708 v8::Local<v8::Value> FXJS_NewNumber(v8::Isolate* pIsolate, int number) { |
711 return v8::Int32::New(pIsolate, number); | 709 return v8::Int32::New(pIsolate, number); |
712 } | 710 } |
713 | 711 |
714 v8::Local<v8::Value> JS_NewNumber(v8::Isolate* pIsolate, double number) { | 712 v8::Local<v8::Value> FXJS_NewNumber(v8::Isolate* pIsolate, double number) { |
715 return v8::Number::New(pIsolate, number); | 713 return v8::Number::New(pIsolate, number); |
716 } | 714 } |
717 | 715 |
718 v8::Local<v8::Value> JS_NewNumber(v8::Isolate* pIsolate, float number) { | 716 v8::Local<v8::Value> FXJS_NewNumber(v8::Isolate* pIsolate, float number) { |
719 return v8::Number::New(pIsolate, (float)number); | 717 return v8::Number::New(pIsolate, (float)number); |
720 } | 718 } |
721 | 719 |
722 v8::Local<v8::Value> JS_NewBoolean(v8::Isolate* pIsolate, bool b) { | 720 v8::Local<v8::Value> FXJS_NewBoolean(v8::Isolate* pIsolate, bool b) { |
723 return v8::Boolean::New(pIsolate, b); | 721 return v8::Boolean::New(pIsolate, b); |
724 } | 722 } |
725 | 723 |
726 v8::Local<v8::Value> JS_NewObject(v8::Isolate* pIsolate, | 724 v8::Local<v8::Value> FXJS_NewObject(v8::Isolate* pIsolate, |
727 v8::Local<v8::Object> pObj) { | 725 v8::Local<v8::Object> pObj) { |
728 if (pObj.IsEmpty()) | 726 if (pObj.IsEmpty()) |
729 return v8::Local<v8::Value>(); | 727 return v8::Local<v8::Value>(); |
730 return pObj->Clone(); | 728 return pObj->Clone(); |
731 } | 729 } |
732 | 730 |
733 v8::Local<v8::Value> JS_NewObject2(v8::Isolate* pIsolate, | 731 v8::Local<v8::Value> FXJS_NewObject2(v8::Isolate* pIsolate, |
734 v8::Local<v8::Array> pObj) { | 732 v8::Local<v8::Array> pObj) { |
735 if (pObj.IsEmpty()) | 733 if (pObj.IsEmpty()) |
736 return v8::Local<v8::Value>(); | 734 return v8::Local<v8::Value>(); |
737 return pObj->Clone(); | 735 return pObj->Clone(); |
738 } | 736 } |
739 | 737 |
740 v8::Local<v8::Value> JS_NewString(v8::Isolate* pIsolate, | 738 v8::Local<v8::Value> FXJS_NewString(v8::Isolate* pIsolate, |
741 const wchar_t* string) { | 739 const wchar_t* string) { |
742 return WSToJSString(pIsolate, string); | 740 return FXJS_WSToJSString(pIsolate, string); |
743 } | 741 } |
744 | 742 |
745 v8::Local<v8::Value> JS_NewString(v8::Isolate* pIsolate, | 743 v8::Local<v8::Value> FXJS_NewString(v8::Isolate* pIsolate, |
746 const wchar_t* string, | 744 const wchar_t* string, |
747 unsigned nLen) { | 745 unsigned nLen) { |
748 return WSToJSString(pIsolate, string, nLen); | 746 return FXJS_WSToJSString(pIsolate, string, nLen); |
749 } | 747 } |
750 | 748 |
751 v8::Local<v8::Value> JS_NewNull() { | 749 v8::Local<v8::Value> FXJS_NewNull() { |
752 return v8::Local<v8::Value>(); | 750 return v8::Local<v8::Value>(); |
753 } | 751 } |
754 | 752 |
755 v8::Local<v8::Value> JS_NewDate(v8::Isolate* pIsolate, double d) { | 753 v8::Local<v8::Value> FXJS_NewDate(v8::Isolate* pIsolate, double d) { |
756 return v8::Date::New(pIsolate->GetCurrentContext(), d).ToLocalChecked(); | 754 return v8::Date::New(pIsolate->GetCurrentContext(), d).ToLocalChecked(); |
757 } | 755 } |
758 | 756 |
759 v8::Local<v8::Value> JS_NewValue(v8::Isolate* pIsolate) { | 757 v8::Local<v8::Value> FXJS_NewValue(v8::Isolate* pIsolate) { |
760 return v8::Local<v8::Value>(); | 758 return v8::Local<v8::Value>(); |
761 } | 759 } |
762 | 760 |
763 v8::Local<v8::Value> JS_GetListValue(v8::Isolate* pIsolate, | 761 v8::Local<v8::Value> FXJS_GetListValue(v8::Isolate* pIsolate, |
764 v8::Local<v8::Value> pList, | 762 v8::Local<v8::Value> pList, |
765 int index) { | 763 int index) { |
766 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 764 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
767 if (!pList.IsEmpty() && pList->IsObject()) { | 765 if (!pList.IsEmpty() && pList->IsObject()) { |
768 v8::Local<v8::Object> obj; | 766 v8::Local<v8::Object> obj; |
769 if (pList->ToObject(context).ToLocal(&obj)) { | 767 if (pList->ToObject(context).ToLocal(&obj)) { |
770 v8::Local<v8::Value> val; | 768 v8::Local<v8::Value> val; |
771 if (obj->Get(context, index).ToLocal(&val)) | 769 if (obj->Get(context, index).ToLocal(&val)) |
772 return val; | 770 return val; |
773 } | 771 } |
774 } | 772 } |
775 return v8::Local<v8::Value>(); | 773 return v8::Local<v8::Value>(); |
776 } | 774 } |
777 | 775 |
778 int JS_ToInt32(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue) { | 776 int FXJS_ToInt32(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue) { |
779 if (pValue.IsEmpty()) | 777 if (pValue.IsEmpty()) |
780 return 0; | 778 return 0; |
781 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 779 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
782 return pValue->ToInt32(context).ToLocalChecked()->Value(); | 780 return pValue->ToInt32(context).ToLocalChecked()->Value(); |
783 } | 781 } |
784 | 782 |
785 bool JS_ToBoolean(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue) { | 783 bool FXJS_ToBoolean(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue) { |
786 if (pValue.IsEmpty()) | 784 if (pValue.IsEmpty()) |
787 return false; | 785 return false; |
788 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 786 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
789 return pValue->ToBoolean(context).ToLocalChecked()->Value(); | 787 return pValue->ToBoolean(context).ToLocalChecked()->Value(); |
790 } | 788 } |
791 | 789 |
792 double JS_ToNumber(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue) { | 790 double FXJS_ToNumber(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue) { |
793 if (pValue.IsEmpty()) | 791 if (pValue.IsEmpty()) |
794 return 0.0; | 792 return 0.0; |
795 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 793 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
796 return pValue->ToNumber(context).ToLocalChecked()->Value(); | 794 return pValue->ToNumber(context).ToLocalChecked()->Value(); |
797 } | 795 } |
798 | 796 |
799 v8::Local<v8::Object> JS_ToObject(v8::Isolate* pIsolate, | 797 v8::Local<v8::Object> FXJS_ToObject(v8::Isolate* pIsolate, |
800 v8::Local<v8::Value> pValue) { | 798 v8::Local<v8::Value> pValue) { |
801 if (pValue.IsEmpty()) | 799 if (pValue.IsEmpty()) |
802 return v8::Local<v8::Object>(); | 800 return v8::Local<v8::Object>(); |
803 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 801 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
804 return pValue->ToObject(context).ToLocalChecked(); | 802 return pValue->ToObject(context).ToLocalChecked(); |
805 } | 803 } |
806 | 804 |
807 CFX_WideString JS_ToString(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue) { | 805 CFX_WideString FXJS_ToString(v8::Isolate* pIsolate, |
| 806 v8::Local<v8::Value> pValue) { |
808 if (pValue.IsEmpty()) | 807 if (pValue.IsEmpty()) |
809 return L""; | 808 return L""; |
810 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 809 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
811 v8::String::Utf8Value s(pValue->ToString(context).ToLocalChecked()); | 810 v8::String::Utf8Value s(pValue->ToString(context).ToLocalChecked()); |
812 return CFX_WideString::FromUTF8(*s, s.length()); | 811 return CFX_WideString::FromUTF8(*s, s.length()); |
813 } | 812 } |
814 | 813 |
815 v8::Local<v8::Array> JS_ToArray(v8::Isolate* pIsolate, | 814 v8::Local<v8::Array> FXJS_ToArray(v8::Isolate* pIsolate, |
816 v8::Local<v8::Value> pValue) { | 815 v8::Local<v8::Value> pValue) { |
817 if (pValue.IsEmpty()) | 816 if (pValue.IsEmpty()) |
818 return v8::Local<v8::Array>(); | 817 return v8::Local<v8::Array>(); |
819 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 818 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
820 return v8::Local<v8::Array>::Cast(pValue->ToObject(context).ToLocalChecked()); | 819 return v8::Local<v8::Array>::Cast(pValue->ToObject(context).ToLocalChecked()); |
821 } | 820 } |
822 | 821 |
823 void JS_ValueCopy(v8::Local<v8::Value>& pTo, v8::Local<v8::Value> pFrom) { | 822 void FXJS_ValueCopy(v8::Local<v8::Value>& pTo, v8::Local<v8::Value> pFrom) { |
824 pTo = pFrom; | 823 pTo = pFrom; |
825 } | 824 } |
826 | 825 |
827 // JavaScript time implement begin. | |
828 | 826 |
829 double _getLocalTZA() { | |
830 if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) | |
831 return 0; | |
832 time_t t = 0; | |
833 time(&t); | |
834 localtime(&t); | |
835 #if _MSC_VER >= 1900 | |
836 // In gcc and in Visual Studio prior to VS 2015 'timezone' is a global | |
837 // variable declared in time.h. That variable was deprecated and in VS 2015 | |
838 // is removed, with _get_timezone replacing it. | |
839 long timezone = 0; | |
840 _get_timezone(&timezone); | |
841 #endif | |
842 return (double)(-(timezone * 1000)); | |
843 } | |
844 | |
845 int _getDaylightSavingTA(double d) { | |
846 if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) | |
847 return 0; | |
848 time_t t = (time_t)(d / 1000); | |
849 struct tm* tmp = localtime(&t); | |
850 if (tmp == NULL) | |
851 return 0; | |
852 if (tmp->tm_isdst > 0) | |
853 // One hour. | |
854 return (int)60 * 60 * 1000; | |
855 return 0; | |
856 } | |
857 | |
858 double _Mod(double x, double y) { | |
859 double r = fmod(x, y); | |
860 if (r < 0) | |
861 r += y; | |
862 return r; | |
863 } | |
864 | |
865 int _isfinite(double v) { | |
866 #if _MSC_VER | |
867 return ::_finite(v); | |
868 #else | |
869 return std::fabs(v) < std::numeric_limits<double>::max(); | |
870 #endif | |
871 } | |
872 | |
873 double _toInteger(double n) { | |
874 return (n >= 0) ? FXSYS_floor(n) : -FXSYS_floor(-n); | |
875 } | |
876 | |
877 bool _isLeapYear(int year) { | |
878 return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 != 0)); | |
879 } | |
880 | |
881 int _DayFromYear(int y) { | |
882 return (int)(365 * (y - 1970.0) + FXSYS_floor((y - 1969.0) / 4) - | |
883 FXSYS_floor((y - 1901.0) / 100) + | |
884 FXSYS_floor((y - 1601.0) / 400)); | |
885 } | |
886 | |
887 double _TimeFromYear(int y) { | |
888 return ((double)86400000) * _DayFromYear(y); | |
889 } | |
890 | |
891 double _TimeFromYearMonth(int y, int m) { | |
892 static int daysMonth[12] = {0, 31, 59, 90, 120, 151, | |
893 181, 212, 243, 273, 304, 334}; | |
894 static int leapDaysMonth[12] = {0, 31, 60, 91, 121, 152, | |
895 182, 213, 244, 274, 305, 335}; | |
896 int* pMonth = daysMonth; | |
897 if (_isLeapYear(y)) | |
898 pMonth = leapDaysMonth; | |
899 return _TimeFromYear(y) + ((double)pMonth[m]) * 86400000; | |
900 } | |
901 | |
902 int _Day(double t) { | |
903 return (int)FXSYS_floor(t / 86400000); | |
904 } | |
905 | |
906 int _YearFromTime(double t) { | |
907 // estimate the time. | |
908 int y = 1970 + (int)(t / (365.0 * 86400000)); | |
909 if (_TimeFromYear(y) <= t) { | |
910 while (_TimeFromYear(y + 1) <= t) | |
911 y++; | |
912 } else | |
913 while (_TimeFromYear(y - 1) > t) | |
914 y--; | |
915 return y; | |
916 } | |
917 | |
918 int _DayWithinYear(double t) { | |
919 int year = _YearFromTime(t); | |
920 int day = _Day(t); | |
921 return day - _DayFromYear(year); | |
922 } | |
923 | |
924 int _MonthFromTime(double t) { | |
925 int day = _DayWithinYear(t); | |
926 int year = _YearFromTime(t); | |
927 if (0 <= day && day < 31) | |
928 return 0; | |
929 if (31 <= day && day < 59 + _isLeapYear(year)) | |
930 return 1; | |
931 if ((59 + _isLeapYear(year)) <= day && day < (90 + _isLeapYear(year))) | |
932 return 2; | |
933 if ((90 + _isLeapYear(year)) <= day && day < (120 + _isLeapYear(year))) | |
934 return 3; | |
935 if ((120 + _isLeapYear(year)) <= day && day < (151 + _isLeapYear(year))) | |
936 return 4; | |
937 if ((151 + _isLeapYear(year)) <= day && day < (181 + _isLeapYear(year))) | |
938 return 5; | |
939 if ((181 + _isLeapYear(year)) <= day && day < (212 + _isLeapYear(year))) | |
940 return 6; | |
941 if ((212 + _isLeapYear(year)) <= day && day < (243 + _isLeapYear(year))) | |
942 return 7; | |
943 if ((243 + _isLeapYear(year)) <= day && day < (273 + _isLeapYear(year))) | |
944 return 8; | |
945 if ((273 + _isLeapYear(year)) <= day && day < (304 + _isLeapYear(year))) | |
946 return 9; | |
947 if ((304 + _isLeapYear(year)) <= day && day < (334 + _isLeapYear(year))) | |
948 return 10; | |
949 if ((334 + _isLeapYear(year)) <= day && day < (365 + _isLeapYear(year))) | |
950 return 11; | |
951 | |
952 return -1; | |
953 } | |
954 | |
955 int _DateFromTime(double t) { | |
956 int day = _DayWithinYear(t); | |
957 int year = _YearFromTime(t); | |
958 bool leap = _isLeapYear(year); | |
959 int month = _MonthFromTime(t); | |
960 switch (month) { | |
961 case 0: | |
962 return day + 1; | |
963 case 1: | |
964 return day - 30; | |
965 case 2: | |
966 return day - 58 - leap; | |
967 case 3: | |
968 return day - 89 - leap; | |
969 case 4: | |
970 return day - 119 - leap; | |
971 case 5: | |
972 return day - 150 - leap; | |
973 case 6: | |
974 return day - 180 - leap; | |
975 case 7: | |
976 return day - 211 - leap; | |
977 case 8: | |
978 return day - 242 - leap; | |
979 case 9: | |
980 return day - 272 - leap; | |
981 case 10: | |
982 return day - 303 - leap; | |
983 case 11: | |
984 return day - 333 - leap; | |
985 default: | |
986 return 0; | |
987 } | |
988 } | |
989 | |
990 double JS_GetDateTime() { | |
991 if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) | |
992 return 0; | |
993 time_t t = time(NULL); | |
994 struct tm* pTm = localtime(&t); | |
995 | |
996 int year = pTm->tm_year + 1900; | |
997 double t1 = _TimeFromYear(year); | |
998 | |
999 return t1 + pTm->tm_yday * 86400000.0 + pTm->tm_hour * 3600000.0 + | |
1000 pTm->tm_min * 60000.0 + pTm->tm_sec * 1000.0; | |
1001 } | |
1002 | |
1003 int JS_GetYearFromTime(double dt) { | |
1004 return _YearFromTime(dt); | |
1005 } | |
1006 | |
1007 int JS_GetMonthFromTime(double dt) { | |
1008 return _MonthFromTime(dt); | |
1009 } | |
1010 | |
1011 int JS_GetDayFromTime(double dt) { | |
1012 return _DateFromTime(dt); | |
1013 } | |
1014 | |
1015 int JS_GetHourFromTime(double dt) { | |
1016 return (int)_Mod(FXSYS_floor((double)(dt / (60 * 60 * 1000))), 24); | |
1017 } | |
1018 | |
1019 int JS_GetMinFromTime(double dt) { | |
1020 return (int)_Mod(FXSYS_floor((double)(dt / (60 * 1000))), 60); | |
1021 } | |
1022 | |
1023 int JS_GetSecFromTime(double dt) { | |
1024 return (int)_Mod(FXSYS_floor((double)(dt / 1000)), 60); | |
1025 } | |
1026 | |
1027 double JS_DateParse(const wchar_t* string) { | |
1028 v8::Isolate* pIsolate = v8::Isolate::GetCurrent(); | |
1029 v8::Isolate::Scope isolate_scope(pIsolate); | |
1030 v8::HandleScope scope(pIsolate); | |
1031 | |
1032 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | |
1033 | |
1034 // Use the built-in object method. | |
1035 v8::Local<v8::Value> v = | |
1036 context->Global() | |
1037 ->Get(context, v8::String::NewFromUtf8(pIsolate, "Date", | |
1038 v8::NewStringType::kNormal) | |
1039 .ToLocalChecked()) | |
1040 .ToLocalChecked(); | |
1041 if (v->IsObject()) { | |
1042 v8::Local<v8::Object> o = v->ToObject(context).ToLocalChecked(); | |
1043 v = o->Get(context, v8::String::NewFromUtf8(pIsolate, "parse", | |
1044 v8::NewStringType::kNormal) | |
1045 .ToLocalChecked()) | |
1046 .ToLocalChecked(); | |
1047 if (v->IsFunction()) { | |
1048 v8::Local<v8::Function> funC = v8::Local<v8::Function>::Cast(v); | |
1049 | |
1050 const int argc = 1; | |
1051 v8::Local<v8::String> timeStr = WSToJSString(pIsolate, string); | |
1052 v8::Local<v8::Value> argv[argc] = {timeStr}; | |
1053 v = funC->Call(context, context->Global(), argc, argv).ToLocalChecked(); | |
1054 if (v->IsNumber()) { | |
1055 double date = v->ToNumber(context).ToLocalChecked()->Value(); | |
1056 if (!_isfinite(date)) | |
1057 return date; | |
1058 return date + _getLocalTZA() + _getDaylightSavingTA(date); | |
1059 } | |
1060 } | |
1061 } | |
1062 return 0; | |
1063 } | |
1064 | |
1065 double JS_MakeDay(int nYear, int nMonth, int nDate) { | |
1066 if (!_isfinite(nYear) || !_isfinite(nMonth) || !_isfinite(nDate)) | |
1067 return GetNan(); | |
1068 double y = _toInteger(nYear); | |
1069 double m = _toInteger(nMonth); | |
1070 double dt = _toInteger(nDate); | |
1071 double ym = y + FXSYS_floor((double)m / 12); | |
1072 double mn = _Mod(m, 12); | |
1073 | |
1074 double t = _TimeFromYearMonth((int)ym, (int)mn); | |
1075 | |
1076 if (_YearFromTime(t) != ym || _MonthFromTime(t) != mn || | |
1077 _DateFromTime(t) != 1) | |
1078 return GetNan(); | |
1079 return _Day(t) + dt - 1; | |
1080 } | |
1081 | |
1082 double JS_MakeTime(int nHour, int nMin, int nSec, int nMs) { | |
1083 if (!_isfinite(nHour) || !_isfinite(nMin) || !_isfinite(nSec) || | |
1084 !_isfinite(nMs)) | |
1085 return GetNan(); | |
1086 | |
1087 double h = _toInteger(nHour); | |
1088 double m = _toInteger(nMin); | |
1089 double s = _toInteger(nSec); | |
1090 double milli = _toInteger(nMs); | |
1091 | |
1092 return h * 3600000 + m * 60000 + s * 1000 + milli; | |
1093 } | |
1094 | |
1095 double JS_MakeDate(double day, double time) { | |
1096 if (!_isfinite(day) || !_isfinite(time)) | |
1097 return GetNan(); | |
1098 | |
1099 return day * 86400000 + time; | |
1100 } | |
1101 | |
1102 bool JS_PortIsNan(double d) { | |
1103 return d != d; | |
1104 } | |
1105 | |
1106 double JS_LocalTime(double d) { | |
1107 return JS_GetDateTime() + _getDaylightSavingTA(d); | |
1108 } | |
1109 | |
1110 // JavaScript time implement End. | |
OLD | NEW |