Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(411)

Side by Side Diff: fpdfsdk/src/jsapi/fxjs_v8.cpp

Issue 1347833002: Ensure functions in FXJS_V8 are prefixed by FXJS_. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Rebase, nits, format. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « fpdfsdk/src/javascript/util.cpp ('k') | fpdfsdk/src/jsapi/fxjs_v8_embeddertest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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.
OLDNEW
« no previous file with comments | « fpdfsdk/src/javascript/util.cpp ('k') | fpdfsdk/src/jsapi/fxjs_v8_embeddertest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698