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

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

Issue 1354593004: Merge to master: contention over isolate data slots (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Remove stray whitespace-only change. Created 5 years, 2 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/include/jsapi/fxjs_v8.h ('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 "../../../core/include/fxcrt/fx_basic.h"
8 #include "../../include/fsdk_define.h" 8 #include "../../include/fsdk_define.h"
9 #include "../../include/jsapi/fxjs_v8.h" 9 #include "../../include/jsapi/fxjs_v8.h"
10 10
11 const wchar_t kFXJSValueNameString[] = L"string"; 11 const wchar_t kFXJSValueNameString[] = L"string";
12 const wchar_t kFXJSValueNameNumber[] = L"number"; 12 const wchar_t kFXJSValueNameNumber[] = L"number";
13 const wchar_t kFXJSValueNameBoolean[] = L"boolean"; 13 const wchar_t kFXJSValueNameBoolean[] = L"boolean";
14 const wchar_t kFXJSValueNameDate[] = L"date"; 14 const wchar_t kFXJSValueNameDate[] = L"date";
15 const wchar_t kFXJSValueNameObject[] = L"object"; 15 const wchar_t kFXJSValueNameObject[] = L"object";
16 const wchar_t kFXJSValueNameFxobj[] = L"fxobj"; 16 const wchar_t kFXJSValueNameFxobj[] = L"fxobj";
17 const wchar_t kFXJSValueNameNull[] = L"null"; 17 const wchar_t kFXJSValueNameNull[] = L"null";
18 const wchar_t kFXJSValueNameUndefined[] = L"undefined"; 18 const wchar_t kFXJSValueNameUndefined[] = L"undefined";
19 19
20 static unsigned int g_embedderDataSlot = 0u; 20 static unsigned int g_embedderDataSlot = 1u;
21 21
22 class CFXJS_PrivateData { 22 class CFXJS_PrivateData {
23 public: 23 public:
24 CFXJS_PrivateData() : ObjDefID(-1), pPrivate(NULL) {} 24 CFXJS_PrivateData(int nObjDefID) : ObjDefID(nObjDefID), pPrivate(NULL) {}
25
25 int ObjDefID; 26 int ObjDefID;
26 void* pPrivate; 27 void* pPrivate;
27 }; 28 };
28 29
29 class CFXJS_ObjDefintion { 30 class CFXJS_ObjDefinition {
30 public: 31 public:
31 CFXJS_ObjDefintion(v8::Isolate* isolate, 32 static int MaxID(v8::Isolate* pIsolate) {
32 const wchar_t* sObjName, 33 return static_cast<int>(
33 FXJSOBJTYPE eObjType, 34 FXJS_PerIsolateData::Get(pIsolate)->m_ObjectDefnArray.GetSize());
34 FXJS_CONSTRUCTOR pConstructor, 35 }
35 FXJS_DESTRUCTOR pDestructor) 36 static CFXJS_ObjDefinition* ForID(v8::Isolate* pIsolate, int id) {
37 // Note: GetAt() halts if out-of-range even in release builds.
38 return static_cast<CFXJS_ObjDefinition*>(
39 FXJS_PerIsolateData::Get(pIsolate)->m_ObjectDefnArray.GetAt(id));
40 }
41 CFXJS_ObjDefinition(v8::Isolate* isolate,
42 const wchar_t* sObjName,
43 FXJSOBJTYPE eObjType,
44 FXJS_CONSTRUCTOR pConstructor,
45 FXJS_DESTRUCTOR pDestructor)
36 : objName(sObjName), 46 : objName(sObjName),
37 objType(eObjType), 47 objType(eObjType),
38 m_pConstructor(pConstructor), 48 m_pConstructor(pConstructor),
39 m_pDestructor(pDestructor), 49 m_pDestructor(pDestructor),
40 m_bSetAsGlobalObject(FALSE) { 50 m_bSetAsGlobalObject(FALSE) {
41 v8::Isolate::Scope isolate_scope(isolate); 51 v8::Isolate::Scope isolate_scope(isolate);
42 v8::HandleScope handle_scope(isolate); 52 v8::HandleScope handle_scope(isolate);
43 53
44 v8::Local<v8::ObjectTemplate> objTemplate = 54 v8::Local<v8::ObjectTemplate> objTemplate =
45 v8::ObjectTemplate::New(isolate); 55 v8::ObjectTemplate::New(isolate);
46 objTemplate->SetInternalFieldCount(2); 56 objTemplate->SetInternalFieldCount(2);
47 m_objTemplate.Reset(isolate, objTemplate); 57 m_objTemplate.Reset(isolate, objTemplate);
48 58
49 // Document as the global object. 59 // Document as the global object.
50 if (FXSYS_wcscmp(sObjName, L"Document") == 0) { 60 if (FXSYS_wcscmp(sObjName, L"Document") == 0) {
51 m_bSetAsGlobalObject = TRUE; 61 m_bSetAsGlobalObject = TRUE;
52 } 62 }
53 } 63 }
54 ~CFXJS_ObjDefintion() { 64 ~CFXJS_ObjDefinition() {
55 m_objTemplate.Reset(); 65 m_objTemplate.Reset();
56 m_StaticObj.Reset(); 66 m_StaticObj.Reset();
57 } 67 }
58 68
59 public:
60 const wchar_t* objName; 69 const wchar_t* objName;
61 FXJSOBJTYPE objType; 70 FXJSOBJTYPE objType;
62 FXJS_CONSTRUCTOR m_pConstructor; 71 FXJS_CONSTRUCTOR m_pConstructor;
63 FXJS_DESTRUCTOR m_pDestructor; 72 FXJS_DESTRUCTOR m_pDestructor;
64 FX_BOOL m_bSetAsGlobalObject; 73 FX_BOOL m_bSetAsGlobalObject;
65 74
66 v8::Global<v8::ObjectTemplate> m_objTemplate; 75 v8::Global<v8::ObjectTemplate> m_objTemplate;
67 v8::Global<v8::Object> m_StaticObj; 76 v8::Global<v8::Object> m_StaticObj;
68 }; 77 };
69 78
70 void* FXJS_ArrayBufferAllocator::Allocate(size_t length) { 79 void* FXJS_ArrayBufferAllocator::Allocate(size_t length) {
71 return calloc(1, length); 80 return calloc(1, length);
72 } 81 }
73 82
74 void* FXJS_ArrayBufferAllocator::AllocateUninitialized(size_t length) { 83 void* FXJS_ArrayBufferAllocator::AllocateUninitialized(size_t length) {
75 return malloc(length); 84 return malloc(length);
76 } 85 }
77 86
78 void FXJS_ArrayBufferAllocator::Free(void* data, size_t length) { 87 void FXJS_ArrayBufferAllocator::Free(void* data, size_t length) {
79 free(data); 88 free(data);
80 } 89 }
81 90
82 void FXJS_PrepareIsolate(v8::Isolate* pIsolate) { 91 // static
92 void FXJS_PerIsolateData::SetUp(v8::Isolate* pIsolate) {
83 if (!pIsolate->GetData(g_embedderDataSlot)) 93 if (!pIsolate->GetData(g_embedderDataSlot))
84 pIsolate->SetData(g_embedderDataSlot, new CFX_PtrArray()); 94 pIsolate->SetData(g_embedderDataSlot, new FXJS_PerIsolateData());
95 }
96
97 // static
98 FXJS_PerIsolateData* FXJS_PerIsolateData::Get(v8::Isolate* pIsolate) {
99 return static_cast<FXJS_PerIsolateData*>(
100 pIsolate->GetData(g_embedderDataSlot));
85 } 101 }
86 102
87 int FXJS_DefineObj(v8::Isolate* pIsolate, 103 int FXJS_DefineObj(v8::Isolate* pIsolate,
88 const wchar_t* sObjName, 104 const wchar_t* sObjName,
89 FXJSOBJTYPE eObjType, 105 FXJSOBJTYPE eObjType,
90 FXJS_CONSTRUCTOR pConstructor, 106 FXJS_CONSTRUCTOR pConstructor,
91 FXJS_DESTRUCTOR pDestructor) { 107 FXJS_DESTRUCTOR pDestructor) {
92 v8::Isolate::Scope isolate_scope(pIsolate); 108 v8::Isolate::Scope isolate_scope(pIsolate);
93 v8::HandleScope handle_scope(pIsolate); 109 v8::HandleScope handle_scope(pIsolate);
94 110
95 FXJS_PrepareIsolate(pIsolate); 111 FXJS_PerIsolateData::SetUp(pIsolate);
96 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); 112 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate);
97 CFXJS_ObjDefintion* pObjDef = new CFXJS_ObjDefintion( 113 pData->m_ObjectDefnArray.Add(new CFXJS_ObjDefinition(
98 pIsolate, sObjName, eObjType, pConstructor, pDestructor); 114 pIsolate, sObjName, eObjType, pConstructor, pDestructor));
99 pArray->Add(pObjDef); 115 return pData->m_ObjectDefnArray.GetSize() - 1;
100 return pArray->GetSize() - 1;
101 } 116 }
102 117
103 void FXJS_DefineObjMethod(v8::Isolate* pIsolate, 118 void FXJS_DefineObjMethod(v8::Isolate* pIsolate,
104 int nObjDefnID, 119 int nObjDefnID,
105 const wchar_t* sMethodName, 120 const wchar_t* sMethodName,
106 v8::FunctionCallback pMethodCall) { 121 v8::FunctionCallback pMethodCall) {
107 v8::Isolate::Scope isolate_scope(pIsolate); 122 v8::Isolate::Scope isolate_scope(pIsolate);
108 v8::HandleScope handle_scope(pIsolate); 123 v8::HandleScope handle_scope(pIsolate);
109 124
110 CFX_WideString ws = CFX_WideString(sMethodName); 125 CFX_ByteString bsMethodName = CFX_WideString(sMethodName).UTF8Encode();
111 CFX_ByteString bsMethodName = ws.UTF8Encode(); 126 CFXJS_ObjDefinition* pObjDef =
112 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); 127 CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID);
113
114 // Note: GetAt() halts if out-of-range even in release builds.
115 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
116 v8::Local<v8::ObjectTemplate> objTemp = 128 v8::Local<v8::ObjectTemplate> objTemp =
117 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); 129 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate);
130
118 objTemp->Set( 131 objTemp->Set(
119 v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(), 132 v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(),
120 v8::NewStringType::kNormal).ToLocalChecked(), 133 v8::NewStringType::kNormal).ToLocalChecked(),
121 v8::FunctionTemplate::New(pIsolate, pMethodCall), v8::ReadOnly); 134 v8::FunctionTemplate::New(pIsolate, pMethodCall), v8::ReadOnly);
122 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); 135 pObjDef->m_objTemplate.Reset(pIsolate, objTemp);
123 } 136 }
124 137
125 void FXJS_DefineObjProperty(v8::Isolate* pIsolate, 138 void FXJS_DefineObjProperty(v8::Isolate* pIsolate,
126 int nObjDefnID, 139 int nObjDefnID,
127 const wchar_t* sPropName, 140 const wchar_t* sPropName,
128 v8::AccessorGetterCallback pPropGet, 141 v8::AccessorGetterCallback pPropGet,
129 v8::AccessorSetterCallback pPropPut) { 142 v8::AccessorSetterCallback pPropPut) {
130 v8::Isolate::Scope isolate_scope(pIsolate); 143 v8::Isolate::Scope isolate_scope(pIsolate);
131 v8::HandleScope handle_scope(pIsolate); 144 v8::HandleScope handle_scope(pIsolate);
132 145
133 CFX_WideString ws = CFX_WideString(sPropName); 146 CFX_ByteString bsPropertyName = CFX_WideString(sPropName).UTF8Encode();
134 CFX_ByteString bsPropertyName = ws.UTF8Encode(); 147 CFXJS_ObjDefinition* pObjDef =
135 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); 148 CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID);
136
137 // Note: GetAt() halts if out-of-range even in release builds.
138 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
139 v8::Local<v8::ObjectTemplate> objTemp = 149 v8::Local<v8::ObjectTemplate> objTemp =
140 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); 150 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate);
141 objTemp->SetAccessor( 151 objTemp->SetAccessor(
142 v8::String::NewFromUtf8(pIsolate, bsPropertyName.c_str(), 152 v8::String::NewFromUtf8(pIsolate, bsPropertyName.c_str(),
143 v8::NewStringType::kNormal).ToLocalChecked(), 153 v8::NewStringType::kNormal).ToLocalChecked(),
144 pPropGet, pPropPut); 154 pPropGet, pPropPut);
145 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); 155 pObjDef->m_objTemplate.Reset(pIsolate, objTemp);
146 } 156 }
147 157
148 void FXJS_DefineObjAllProperties(v8::Isolate* pIsolate, 158 void FXJS_DefineObjAllProperties(v8::Isolate* pIsolate,
149 int nObjDefnID, 159 int nObjDefnID,
150 v8::NamedPropertyQueryCallback pPropQurey, 160 v8::NamedPropertyQueryCallback pPropQurey,
151 v8::NamedPropertyGetterCallback pPropGet, 161 v8::NamedPropertyGetterCallback pPropGet,
152 v8::NamedPropertySetterCallback pPropPut, 162 v8::NamedPropertySetterCallback pPropPut,
153 v8::NamedPropertyDeleterCallback pPropDel) { 163 v8::NamedPropertyDeleterCallback pPropDel) {
154 v8::Isolate::Scope isolate_scope(pIsolate); 164 v8::Isolate::Scope isolate_scope(pIsolate);
155 v8::HandleScope handle_scope(pIsolate); 165 v8::HandleScope handle_scope(pIsolate);
156 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot);
157 166
158 // Note: GetAt() halts if out-of-range even in release builds. 167 CFXJS_ObjDefinition* pObjDef =
159 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID); 168 CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID);
160 v8::Local<v8::ObjectTemplate> objTemp = 169 v8::Local<v8::ObjectTemplate> objTemp =
161 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); 170 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate);
162 objTemp->SetNamedPropertyHandler(pPropGet, pPropPut, pPropQurey, pPropDel); 171 objTemp->SetNamedPropertyHandler(pPropGet, pPropPut, pPropQurey, pPropDel);
163 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); 172 pObjDef->m_objTemplate.Reset(pIsolate, objTemp);
164 } 173 }
165 174
166 void FXJS_DefineObjConst(v8::Isolate* pIsolate, 175 void FXJS_DefineObjConst(v8::Isolate* pIsolate,
167 int nObjDefnID, 176 int nObjDefnID,
168 const wchar_t* sConstName, 177 const wchar_t* sConstName,
169 v8::Local<v8::Value> pDefault) { 178 v8::Local<v8::Value> pDefault) {
170 v8::Isolate::Scope isolate_scope(pIsolate); 179 v8::Isolate::Scope isolate_scope(pIsolate);
171 v8::HandleScope handle_scope(pIsolate); 180 v8::HandleScope handle_scope(pIsolate);
172 181
173 CFX_WideString ws = CFX_WideString(sConstName); 182 CFX_ByteString bsConstName = CFX_WideString(sConstName).UTF8Encode();
174 CFX_ByteString bsConstName = ws.UTF8Encode(); 183 CFXJS_ObjDefinition* pObjDef =
175 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); 184 CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID);
176
177 // Note: GetAt() halts if out-of-range even in release builds.
178 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
179 v8::Local<v8::ObjectTemplate> objTemp = 185 v8::Local<v8::ObjectTemplate> objTemp =
180 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); 186 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate);
181 objTemp->Set(pIsolate, bsConstName.c_str(), pDefault); 187 objTemp->Set(pIsolate, bsConstName.c_str(), pDefault);
182 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); 188 pObjDef->m_objTemplate.Reset(pIsolate, objTemp);
183 } 189 }
184 190
185 static v8::Global<v8::ObjectTemplate>& _getGlobalObjectTemplate( 191 static v8::Global<v8::ObjectTemplate>& _getGlobalObjectTemplate(
186 v8::Isolate* pIsolate) { 192 v8::Isolate* pIsolate) {
187 v8::Isolate::Scope isolate_scope(pIsolate); 193 v8::Isolate::Scope isolate_scope(pIsolate);
188 v8::HandleScope handle_scope(pIsolate); 194 v8::HandleScope handle_scope(pIsolate);
189 195
190 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); 196 int maxID = CFXJS_ObjDefinition::MaxID(pIsolate);
191 ASSERT(pArray != NULL); 197 for (int i = 0; i < maxID; ++i) {
192 for (int i = 0; i < pArray->GetSize(); i++) { 198 CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i);
193 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i);
194 if (pObjDef->m_bSetAsGlobalObject) 199 if (pObjDef->m_bSetAsGlobalObject)
195 return pObjDef->m_objTemplate; 200 return pObjDef->m_objTemplate;
196 } 201 }
197 static v8::Global<v8::ObjectTemplate> gloabalObjectTemplate; 202 static v8::Global<v8::ObjectTemplate> gloabalObjectTemplate;
198 return gloabalObjectTemplate; 203 return gloabalObjectTemplate;
199 } 204 }
200 205
201 void FXJS_DefineGlobalMethod(v8::Isolate* pIsolate, 206 void FXJS_DefineGlobalMethod(v8::Isolate* pIsolate,
202 const wchar_t* sMethodName, 207 const wchar_t* sMethodName,
203 v8::FunctionCallback pMethodCall) { 208 v8::FunctionCallback pMethodCall) {
204 v8::Isolate::Scope isolate_scope(pIsolate); 209 v8::Isolate::Scope isolate_scope(pIsolate);
205 v8::HandleScope handle_scope(pIsolate); 210 v8::HandleScope handle_scope(pIsolate);
206 211
207 CFX_WideString ws = CFX_WideString(sMethodName); 212 CFX_ByteString bsMethodName = CFX_WideString(sMethodName).UTF8Encode();
208 CFX_ByteString bsMethodName = ws.UTF8Encode();
209
210 v8::Local<v8::FunctionTemplate> funTempl = 213 v8::Local<v8::FunctionTemplate> funTempl =
211 v8::FunctionTemplate::New(pIsolate, pMethodCall); 214 v8::FunctionTemplate::New(pIsolate, pMethodCall);
212 v8::Local<v8::ObjectTemplate> objTemp; 215 v8::Local<v8::ObjectTemplate> objTemp;
213 216
214 v8::Global<v8::ObjectTemplate>& globalObjTemp = 217 v8::Global<v8::ObjectTemplate>& globalObjTemp =
215 _getGlobalObjectTemplate(pIsolate); 218 _getGlobalObjectTemplate(pIsolate);
216 if (globalObjTemp.IsEmpty()) 219 if (globalObjTemp.IsEmpty())
217 objTemp = v8::ObjectTemplate::New(pIsolate); 220 objTemp = v8::ObjectTemplate::New(pIsolate);
218 else 221 else
219 objTemp = v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp); 222 objTemp = v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 v8::Isolate::Scope isolate_scope(pIsolate); 260 v8::Isolate::Scope isolate_scope(pIsolate);
258 v8::HandleScope handle_scope(pIsolate); 261 v8::HandleScope handle_scope(pIsolate);
259 262
260 v8::Global<v8::ObjectTemplate>& globalObjTemp = 263 v8::Global<v8::ObjectTemplate>& globalObjTemp =
261 _getGlobalObjectTemplate(pIsolate); 264 _getGlobalObjectTemplate(pIsolate);
262 v8::Local<v8::Context> v8Context = v8::Context::New( 265 v8::Local<v8::Context> v8Context = v8::Context::New(
263 pIsolate, NULL, 266 pIsolate, NULL,
264 v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp)); 267 v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp));
265 v8::Context::Scope context_scope(v8Context); 268 v8::Context::Scope context_scope(v8Context);
266 269
267 v8::Local<v8::External> ptr = v8::External::New(pIsolate, pFXRuntime); 270 FXJS_PerIsolateData::SetUp(pIsolate);
268 v8Context->SetEmbedderData(1, ptr); 271 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate);
272 pData->m_pFXJSRuntime = pFXRuntime;
269 273
270 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); 274 int maxID = CFXJS_ObjDefinition::MaxID(pIsolate);
271 if (!pArray) 275 for (int i = 0; i < maxID; ++i) {
272 return; 276 CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i);
273
274 for (int i = 0; i < pArray->GetSize(); i++) {
275 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i);
276 CFX_WideString ws = CFX_WideString(pObjDef->objName); 277 CFX_WideString ws = CFX_WideString(pObjDef->objName);
277 CFX_ByteString bs = ws.UTF8Encode(); 278 CFX_ByteString bs = ws.UTF8Encode();
278 v8::Local<v8::String> objName = 279 v8::Local<v8::String> objName =
279 v8::String::NewFromUtf8(pIsolate, bs.c_str(), 280 v8::String::NewFromUtf8(pIsolate, bs.c_str(),
280 v8::NewStringType::kNormal, 281 v8::NewStringType::kNormal,
281 bs.GetLength()).ToLocalChecked(); 282 bs.GetLength()).ToLocalChecked();
282 283
283 if (pObjDef->objType == FXJS_DYNAMIC) { 284 if (pObjDef->objType == FXJS_DYNAMIC) {
284 // Document is set as global object, need to construct it first. 285 // Document is set as global object, need to construct it first.
285 if (ws.Equal(L"Document")) { 286 if (ws.Equal(L"Document")) {
286 CFXJS_PrivateData* pPrivateData = new CFXJS_PrivateData;
287 pPrivateData->ObjDefID = i;
288
289 v8Context->Global() 287 v8Context->Global()
290 ->GetPrototype() 288 ->GetPrototype()
291 ->ToObject(v8Context) 289 ->ToObject(v8Context)
292 .ToLocalChecked() 290 .ToLocalChecked()
293 ->SetAlignedPointerInInternalField(0, pPrivateData); 291 ->SetAlignedPointerInInternalField(0, new CFXJS_PrivateData(i));
294 292
295 if (pObjDef->m_pConstructor) 293 if (pObjDef->m_pConstructor)
296 pObjDef->m_pConstructor(context, v8Context->Global() 294 pObjDef->m_pConstructor(context, v8Context->Global()
297 ->GetPrototype() 295 ->GetPrototype()
298 ->ToObject(v8Context) 296 ->ToObject(v8Context)
299 .ToLocalChecked(), 297 .ToLocalChecked(),
300 v8Context->Global() 298 v8Context->Global()
301 ->GetPrototype() 299 ->GetPrototype()
302 ->ToObject(v8Context) 300 ->ToObject(v8Context)
303 .ToLocalChecked()); 301 .ToLocalChecked());
304 } 302 }
305 } else { 303 } else {
306 v8::Local<v8::Object> obj = FXJS_NewFxDynamicObj(pIsolate, context, i); 304 v8::Local<v8::Object> obj = FXJS_NewFxDynamicObj(pIsolate, context, i);
307 v8Context->Global()->Set(v8Context, objName, obj).FromJust(); 305 v8Context->Global()->Set(v8Context, objName, obj).FromJust();
308 pObjDef->m_StaticObj.Reset(pIsolate, obj); 306 pObjDef->m_StaticObj.Reset(pIsolate, obj);
309 } 307 }
310 } 308 }
311 v8PersistentContext.Reset(pIsolate, v8Context); 309 v8PersistentContext.Reset(pIsolate, v8Context);
312 } 310 }
313 311
314 void FXJS_ReleaseRuntime(v8::Isolate* pIsolate, 312 void FXJS_ReleaseRuntime(v8::Isolate* pIsolate,
315 v8::Global<v8::Context>& v8PersistentContext) { 313 v8::Global<v8::Context>& v8PersistentContext) {
316 v8::Isolate::Scope isolate_scope(pIsolate); 314 v8::Isolate::Scope isolate_scope(pIsolate);
317 v8::HandleScope handle_scope(pIsolate); 315 v8::HandleScope handle_scope(pIsolate);
318 v8::Local<v8::Context> context = 316 v8::Local<v8::Context> context =
319 v8::Local<v8::Context>::New(pIsolate, v8PersistentContext); 317 v8::Local<v8::Context>::New(pIsolate, v8PersistentContext);
320 v8::Context::Scope context_scope(context); 318 v8::Context::Scope context_scope(context);
321 319
322 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); 320 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate);
323 if (!pArray) 321 if (!pData)
324 return; 322 return;
325 323
326 for (int i = 0; i < pArray->GetSize(); i++) { 324 int maxID = CFXJS_ObjDefinition::MaxID(pIsolate);
327 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i); 325 for (int i = 0; i < maxID; ++i) {
326 CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i);
328 if (!pObjDef->m_StaticObj.IsEmpty()) { 327 if (!pObjDef->m_StaticObj.IsEmpty()) {
329 v8::Local<v8::Object> pObj = 328 v8::Local<v8::Object> pObj =
330 v8::Local<v8::Object>::New(pIsolate, pObjDef->m_StaticObj); 329 v8::Local<v8::Object>::New(pIsolate, pObjDef->m_StaticObj);
331 if (pObjDef->m_pDestructor) 330 if (pObjDef->m_pDestructor)
332 pObjDef->m_pDestructor(pObj); 331 pObjDef->m_pDestructor(pObj);
333 FXJS_FreePrivate(pObj); 332 FXJS_FreePrivate(pObj);
334 } 333 }
335 delete pObjDef; 334 delete pObjDef;
336 } 335 }
337 delete pArray; 336
338 pIsolate->SetData(g_embedderDataSlot, NULL); 337 pIsolate->SetData(g_embedderDataSlot, nullptr);
338 delete pData;
339 } 339 }
340 340
341 void FXJS_Initialize(unsigned int embedderDataSlot) { 341 void FXJS_Initialize(unsigned int embedderDataSlot) {
342 g_embedderDataSlot = embedderDataSlot; 342 g_embedderDataSlot = embedderDataSlot;
343 } 343 }
344 344
345 void FXJS_Release() { 345 void FXJS_Release() {
346 } 346 }
347 347
348 int FXJS_Execute(v8::Isolate* pIsolate, 348 int FXJS_Execute(v8::Isolate* pIsolate,
(...skipping 26 matching lines...) Expand all
375 return -1; 375 return -1;
376 } 376 }
377 return 0; 377 return 0;
378 } 378 }
379 379
380 v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate, 380 v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate,
381 IFXJS_Context* pJSContext, 381 IFXJS_Context* pJSContext,
382 int nObjDefnID) { 382 int nObjDefnID) {
383 v8::Isolate::Scope isolate_scope(pIsolate); 383 v8::Isolate::Scope isolate_scope(pIsolate);
384 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); 384 v8::Local<v8::Context> context = pIsolate->GetCurrentContext();
385 if (-1 == nObjDefnID) { 385 if (nObjDefnID == -1) {
386 v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(pIsolate); 386 v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(pIsolate);
387 v8::Local<v8::Object> obj; 387 v8::Local<v8::Object> obj;
388 if (objTempl->NewInstance(context).ToLocal(&obj)) 388 if (objTempl->NewInstance(context).ToLocal(&obj))
389 return obj; 389 return obj;
390 return v8::Local<v8::Object>(); 390 return v8::Local<v8::Object>();
391 } 391 }
392 392
393 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); 393 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate);
394 if (!pArray) 394 if (!pData)
395 return v8::Local<v8::Object>(); 395 return v8::Local<v8::Object>();
396 396
397 if (nObjDefnID < 0 || nObjDefnID >= pArray->GetSize()) 397 if (nObjDefnID < 0 || nObjDefnID >= CFXJS_ObjDefinition::MaxID(pIsolate))
398 return v8::Local<v8::Object>(); 398 return v8::Local<v8::Object>();
399 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID); 399
400 CFXJS_ObjDefinition* pObjDef =
401 CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID);
400 402
401 v8::Local<v8::ObjectTemplate> objTemp = 403 v8::Local<v8::ObjectTemplate> objTemp =
402 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); 404 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate);
403 v8::Local<v8::Object> obj; 405 v8::Local<v8::Object> obj;
404 if (!objTemp->NewInstance(context).ToLocal(&obj)) 406 if (!objTemp->NewInstance(context).ToLocal(&obj))
405 return v8::Local<v8::Object>(); 407 return v8::Local<v8::Object>();
406 408
407 CFXJS_PrivateData* pPrivateData = new CFXJS_PrivateData; 409 obj->SetAlignedPointerInInternalField(0, new CFXJS_PrivateData(nObjDefnID));
408 pPrivateData->ObjDefID = nObjDefnID;
409
410 obj->SetAlignedPointerInInternalField(0, pPrivateData);
411 if (pObjDef->m_pConstructor) 410 if (pObjDef->m_pConstructor)
412 pObjDef->m_pConstructor( 411 pObjDef->m_pConstructor(
413 pJSContext, obj, 412 pJSContext, obj,
414 context->Global()->GetPrototype()->ToObject(context).ToLocalChecked()); 413 context->Global()->GetPrototype()->ToObject(context).ToLocalChecked());
415 414
416 return obj; 415 return obj;
417 } 416 }
418 417
419 v8::Local<v8::Object> FXJS_GetThisObj(v8::Isolate* pIsolate) { 418 v8::Local<v8::Object> FXJS_GetThisObj(v8::Isolate* pIsolate) {
420 // Return the global object.
421 v8::Isolate::Scope isolate_scope(pIsolate); 419 v8::Isolate::Scope isolate_scope(pIsolate);
422 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); 420 if (!FXJS_PerIsolateData::Get(pIsolate))
423 if (!pArray)
424 return v8::Local<v8::Object>(); 421 return v8::Local<v8::Object>();
425 422
423 // Return the global object.
426 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); 424 v8::Local<v8::Context> context = pIsolate->GetCurrentContext();
427 return context->Global()->GetPrototype()->ToObject(context).ToLocalChecked(); 425 return context->Global()->GetPrototype()->ToObject(context).ToLocalChecked();
428 } 426 }
429 427
430 int FXJS_GetObjDefnID(v8::Local<v8::Object> pObj) { 428 int FXJS_GetObjDefnID(v8::Local<v8::Object> pObj) {
431 if (pObj.IsEmpty() || !pObj->InternalFieldCount()) 429 if (pObj.IsEmpty() || !pObj->InternalFieldCount())
432 return -1; 430 return -1;
433 CFXJS_PrivateData* pPrivateData = 431 CFXJS_PrivateData* pPrivateData =
434 (CFXJS_PrivateData*)pObj->GetAlignedPointerFromInternalField(0); 432 (CFXJS_PrivateData*)pObj->GetAlignedPointerFromInternalField(0);
435 if (pPrivateData) 433 if (pPrivateData)
436 return pPrivateData->ObjDefID; 434 return pPrivateData->ObjDefID;
437 return -1; 435 return -1;
438 } 436 }
439 437
440 v8::Isolate* FXJS_GetRuntime(v8::Local<v8::Object> pObj) { 438 v8::Isolate* FXJS_GetRuntime(v8::Local<v8::Object> pObj) {
441 if (pObj.IsEmpty()) 439 if (pObj.IsEmpty())
442 return NULL; 440 return NULL;
443 v8::Local<v8::Context> context = pObj->CreationContext(); 441 v8::Local<v8::Context> context = pObj->CreationContext();
444 if (context.IsEmpty()) 442 if (context.IsEmpty())
445 return NULL; 443 return NULL;
446 return context->GetIsolate(); 444 return context->GetIsolate();
447 } 445 }
448 446
449 int FXJS_GetObjDefnID(v8::Isolate* pIsolate, const wchar_t* pObjName) { 447 int FXJS_GetObjDefnID(v8::Isolate* pIsolate, const wchar_t* pObjName) {
450 v8::Isolate::Scope isolate_scope(pIsolate); 448 v8::Isolate::Scope isolate_scope(pIsolate);
451 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); 449 if (!FXJS_PerIsolateData::Get(pIsolate))
452 if (!pArray)
453 return -1; 450 return -1;
454 451
455 for (int i = 0; i < pArray->GetSize(); i++) { 452 int maxID = CFXJS_ObjDefinition::MaxID(pIsolate);
456 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i); 453 for (int i = 0; i < maxID; ++i) {
454 CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i);
457 if (FXSYS_wcscmp(pObjDef->objName, pObjName) == 0) 455 if (FXSYS_wcscmp(pObjDef->objName, pObjName) == 0)
458 return i; 456 return i;
459 } 457 }
460 return -1; 458 return -1;
461 } 459 }
462 460
463 void FXJS_Error(v8::Isolate* pIsolate, const CFX_WideString& message) { 461 void FXJS_Error(v8::Isolate* pIsolate, const CFX_WideString& message) {
464 // Conversion from pdfium's wchar_t wide-strings to v8's uint16_t 462 // Conversion from pdfium's wchar_t wide-strings to v8's uint16_t
465 // wide-strings isn't handled by v8, so use UTF8 as a common 463 // wide-strings isn't handled by v8, so use UTF8 as a common
466 // intermediate format. 464 // intermediate format.
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
760 return v8::Local<v8::Array>(); 758 return v8::Local<v8::Array>();
761 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); 759 v8::Local<v8::Context> context = pIsolate->GetCurrentContext();
762 return v8::Local<v8::Array>::Cast(pValue->ToObject(context).ToLocalChecked()); 760 return v8::Local<v8::Array>::Cast(pValue->ToObject(context).ToLocalChecked());
763 } 761 }
764 762
765 void FXJS_ValueCopy(v8::Local<v8::Value>& pTo, v8::Local<v8::Value> pFrom) { 763 void FXJS_ValueCopy(v8::Local<v8::Value>& pTo, v8::Local<v8::Value> pFrom) {
766 pTo = pFrom; 764 pTo = pFrom;
767 } 765 }
768 766
769 767
OLDNEW
« no previous file with comments | « fpdfsdk/include/jsapi/fxjs_v8.h ('k') | fpdfsdk/src/jsapi/fxjs_v8_embeddertest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698