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

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

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