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

Side by Side Diff: fpdfsdk/javascript/global.cpp

Issue 2245863002: Push v8::Isolate into CFXJS_Engine class (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Null isolate before letting CFXJS_Engine dtor invoked Created 4 years, 4 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/javascript/color.cpp ('k') | fpdfsdk/javascript/ijs_runtime.h » ('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 "fpdfsdk/javascript/global.h" 7 #include "fpdfsdk/javascript/global.h"
8 8
9 #include <vector> 9 #include <vector>
10 10
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 const std::vector<CJS_Value>& params, 161 const std::vector<CJS_Value>& params,
162 CJS_Value& vRet, 162 CJS_Value& vRet,
163 CFX_WideString& sError) { 163 CFX_WideString& sError) {
164 CJS_Context* pContext = static_cast<CJS_Context*>(cc); 164 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
165 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); 165 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
166 if (params.size() != 2) { 166 if (params.size() != 2) {
167 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); 167 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
168 return FALSE; 168 return FALSE;
169 } 169 }
170 170
171 auto it = m_mapGlobal.find(params[0].ToCFXByteString(pRuntime->GetIsolate())); 171 auto it = m_mapGlobal.find(params[0].ToCFXByteString(pRuntime));
172 if (it != m_mapGlobal.end()) { 172 if (it != m_mapGlobal.end()) {
173 JSGlobalData* pData = it->second; 173 JSGlobalData* pData = it->second;
174 if (!pData->bDeleted) { 174 if (!pData->bDeleted) {
175 pData->bPersistent = params[1].ToBool(pRuntime->GetIsolate()); 175 pData->bPersistent = params[1].ToBool(pRuntime);
176 return TRUE; 176 return TRUE;
177 } 177 }
178 } 178 }
179 179
180 sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL); 180 sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL);
181 return FALSE; 181 return FALSE;
182 } 182 }
183 183
184 void JSGlobalAlternate::UpdateGlobalPersistentVariables() { 184 void JSGlobalAlternate::UpdateGlobalPersistentVariables() {
185 CJS_Runtime* pRuntime =
186 static_cast<CJS_Runtime*>(CFXJS_Engine::CurrentEngineFromIsolate(
187 m_pJSObject->ToV8Object()->GetIsolate()));
188
185 for (int i = 0, sz = m_pGlobalData->GetSize(); i < sz; i++) { 189 for (int i = 0, sz = m_pGlobalData->GetSize(); i < sz; i++) {
186 CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i); 190 CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i);
187 switch (pData->data.nType) { 191 switch (pData->data.nType) {
188 case JS_GlobalDataType::NUMBER: 192 case JS_GlobalDataType::NUMBER:
189 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::NUMBER, 193 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::NUMBER,
190 pData->data.dData, false, "", 194 pData->data.dData, false, "",
191 v8::Local<v8::Object>(), pData->bPersistent == 1); 195 v8::Local<v8::Object>(), pData->bPersistent == 1);
192 FXJS_PutObjectNumber(nullptr, m_pJSObject->ToV8Object(), 196 pRuntime->PutObjectNumber(m_pJSObject->ToV8Object(),
193 pData->data.sKey.UTF8Decode(), pData->data.dData); 197 pData->data.sKey.UTF8Decode(),
198 pData->data.dData);
194 break; 199 break;
195 case JS_GlobalDataType::BOOLEAN: 200 case JS_GlobalDataType::BOOLEAN:
196 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::BOOLEAN, 0, 201 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::BOOLEAN, 0,
197 (bool)(pData->data.bData == 1), "", 202 (bool)(pData->data.bData == 1), "",
198 v8::Local<v8::Object>(), pData->bPersistent == 1); 203 v8::Local<v8::Object>(), pData->bPersistent == 1);
199 FXJS_PutObjectBoolean(nullptr, m_pJSObject->ToV8Object(), 204 pRuntime->PutObjectBoolean(m_pJSObject->ToV8Object(),
200 pData->data.sKey.UTF8Decode(), 205 pData->data.sKey.UTF8Decode(),
201 (bool)(pData->data.bData == 1)); 206 (bool)(pData->data.bData == 1));
202 break; 207 break;
203 case JS_GlobalDataType::STRING: 208 case JS_GlobalDataType::STRING:
204 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::STRING, 0, 209 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::STRING, 0,
205 false, pData->data.sData, v8::Local<v8::Object>(), 210 false, pData->data.sData, v8::Local<v8::Object>(),
206 pData->bPersistent == 1); 211 pData->bPersistent == 1);
207 FXJS_PutObjectString(nullptr, m_pJSObject->ToV8Object(), 212 pRuntime->PutObjectString(m_pJSObject->ToV8Object(),
208 pData->data.sKey.UTF8Decode(), 213 pData->data.sKey.UTF8Decode(),
209 pData->data.sData.UTF8Decode()); 214 pData->data.sData.UTF8Decode());
210 break; 215 break;
211 case JS_GlobalDataType::OBJECT: { 216 case JS_GlobalDataType::OBJECT: {
212 v8::Isolate* pRuntime = m_pJSObject->ToV8Object()->GetIsolate(); 217 v8::Local<v8::Object> pObj = pRuntime->NewFxDynamicObj(-1);
213 v8::Local<v8::Object> pObj =
214 FXJS_NewFxDynamicObj(pRuntime, nullptr, -1);
215 218
216 PutObjectProperty(pObj, &pData->data); 219 PutObjectProperty(pObj, &pData->data);
217
218 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::OBJECT, 0, 220 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::OBJECT, 0,
219 false, "", pObj, pData->bPersistent == 1); 221 false, "", pObj, pData->bPersistent == 1);
220 FXJS_PutObjectObject(nullptr, m_pJSObject->ToV8Object(), 222 pRuntime->PutObjectObject(m_pJSObject->ToV8Object(),
221 pData->data.sKey.UTF8Decode(), pObj); 223 pData->data.sKey.UTF8Decode(), pObj);
222 } break; 224 } break;
223 case JS_GlobalDataType::NULLOBJ: 225 case JS_GlobalDataType::NULLOBJ:
224 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::NULLOBJ, 0, 226 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::NULLOBJ, 0,
225 false, "", v8::Local<v8::Object>(), 227 false, "", v8::Local<v8::Object>(),
226 pData->bPersistent == 1); 228 pData->bPersistent == 1);
227 FXJS_PutObjectNull(nullptr, m_pJSObject->ToV8Object(), 229 pRuntime->PutObjectNull(m_pJSObject->ToV8Object(),
228 pData->data.sKey.UTF8Decode()); 230 pData->data.sKey.UTF8Decode());
229 break; 231 break;
230 } 232 }
231 } 233 }
232 } 234 }
233 235
234 void JSGlobalAlternate::CommitGlobalPersisitentVariables(IJS_Context* cc) { 236 void JSGlobalAlternate::CommitGlobalPersisitentVariables(IJS_Context* cc) {
235 for (auto it = m_mapGlobal.begin(); it != m_mapGlobal.end(); ++it) { 237 for (auto it = m_mapGlobal.begin(); it != m_mapGlobal.end(); ++it) {
236 CFX_ByteString name = it->first; 238 CFX_ByteString name = it->first;
237 JSGlobalData* pData = it->second; 239 JSGlobalData* pData = it->second;
238 if (pData->bDeleted) { 240 if (pData->bDeleted) {
(...skipping 25 matching lines...) Expand all
264 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); 266 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
265 break; 267 break;
266 } 268 }
267 } 269 }
268 } 270 }
269 } 271 }
270 272
271 void JSGlobalAlternate::ObjectToArray(IJS_Context* cc, 273 void JSGlobalAlternate::ObjectToArray(IJS_Context* cc,
272 v8::Local<v8::Object> pObj, 274 v8::Local<v8::Object> pObj,
273 CJS_GlobalVariableArray& array) { 275 CJS_GlobalVariableArray& array) {
274 v8::Isolate* isolate = pObj->GetIsolate();
275 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); 276 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
276 std::vector<CFX_WideString> pKeyList = 277 std::vector<CFX_WideString> pKeyList = pRuntime->GetObjectPropertyNames(pObj);
277 FXJS_GetObjectPropertyNames(isolate, pObj);
278 for (const auto& ws : pKeyList) { 278 for (const auto& ws : pKeyList) {
279 CFX_ByteString sKey = ws.UTF8Encode(); 279 CFX_ByteString sKey = ws.UTF8Encode();
280 v8::Local<v8::Value> v = FXJS_GetObjectProperty(isolate, pObj, ws); 280 v8::Local<v8::Value> v = pRuntime->GetObjectProperty(pObj, ws);
281 switch (CJS_Value::GetValueType(v)) { 281 switch (CJS_Value::GetValueType(v)) {
282 case CJS_Value::VT_number: { 282 case CJS_Value::VT_number: {
283 CJS_KeyValue* pObjElement = new CJS_KeyValue; 283 CJS_KeyValue* pObjElement = new CJS_KeyValue;
284 pObjElement->nType = JS_GlobalDataType::NUMBER; 284 pObjElement->nType = JS_GlobalDataType::NUMBER;
285 pObjElement->sKey = sKey; 285 pObjElement->sKey = sKey;
286 pObjElement->dData = FXJS_ToNumber(isolate, v); 286 pObjElement->dData = pRuntime->ToNumber(v);
287 array.Add(pObjElement); 287 array.Add(pObjElement);
288 } break; 288 } break;
289 case CJS_Value::VT_boolean: { 289 case CJS_Value::VT_boolean: {
290 CJS_KeyValue* pObjElement = new CJS_KeyValue; 290 CJS_KeyValue* pObjElement = new CJS_KeyValue;
291 pObjElement->nType = JS_GlobalDataType::BOOLEAN; 291 pObjElement->nType = JS_GlobalDataType::BOOLEAN;
292 pObjElement->sKey = sKey; 292 pObjElement->sKey = sKey;
293 pObjElement->dData = FXJS_ToBoolean(isolate, v); 293 pObjElement->dData = pRuntime->ToBoolean(v);
294 array.Add(pObjElement); 294 array.Add(pObjElement);
295 } break; 295 } break;
296 case CJS_Value::VT_string: { 296 case CJS_Value::VT_string: {
297 CFX_ByteString sValue = 297 CFX_ByteString sValue =
298 CJS_Value(pRuntime, v).ToCFXByteString(pRuntime->GetIsolate()); 298 CJS_Value(pRuntime, v).ToCFXByteString(pRuntime);
299 CJS_KeyValue* pObjElement = new CJS_KeyValue; 299 CJS_KeyValue* pObjElement = new CJS_KeyValue;
300 pObjElement->nType = JS_GlobalDataType::STRING; 300 pObjElement->nType = JS_GlobalDataType::STRING;
301 pObjElement->sKey = sKey; 301 pObjElement->sKey = sKey;
302 pObjElement->sData = sValue; 302 pObjElement->sData = sValue;
303 array.Add(pObjElement); 303 array.Add(pObjElement);
304 } break; 304 } break;
305 case CJS_Value::VT_object: { 305 case CJS_Value::VT_object: {
306 CJS_KeyValue* pObjElement = new CJS_KeyValue; 306 CJS_KeyValue* pObjElement = new CJS_KeyValue;
307 pObjElement->nType = JS_GlobalDataType::OBJECT; 307 pObjElement->nType = JS_GlobalDataType::OBJECT;
308 pObjElement->sKey = sKey; 308 pObjElement->sKey = sKey;
309 ObjectToArray(cc, FXJS_ToObject(isolate, v), pObjElement->objData); 309 ObjectToArray(cc, pRuntime->ToObject(v), pObjElement->objData);
310 array.Add(pObjElement); 310 array.Add(pObjElement);
311 } break; 311 } break;
312 case CJS_Value::VT_null: { 312 case CJS_Value::VT_null: {
313 CJS_KeyValue* pObjElement = new CJS_KeyValue; 313 CJS_KeyValue* pObjElement = new CJS_KeyValue;
314 pObjElement->nType = JS_GlobalDataType::NULLOBJ; 314 pObjElement->nType = JS_GlobalDataType::NULLOBJ;
315 pObjElement->sKey = sKey; 315 pObjElement->sKey = sKey;
316 array.Add(pObjElement); 316 array.Add(pObjElement);
317 } break; 317 } break;
318 default: 318 default:
319 break; 319 break;
320 } 320 }
321 } 321 }
322 } 322 }
323 323
324 void JSGlobalAlternate::PutObjectProperty(v8::Local<v8::Object> pObj, 324 void JSGlobalAlternate::PutObjectProperty(v8::Local<v8::Object> pObj,
325 CJS_KeyValue* pData) { 325 CJS_KeyValue* pData) {
326 CJS_Runtime* pRuntime = CJS_Runtime::CurrentRuntimeFromIsolate(
327 m_pJSObject->ToV8Object()->GetIsolate());
328
326 for (int i = 0, sz = pData->objData.Count(); i < sz; i++) { 329 for (int i = 0, sz = pData->objData.Count(); i < sz; i++) {
327 CJS_KeyValue* pObjData = pData->objData.GetAt(i); 330 CJS_KeyValue* pObjData = pData->objData.GetAt(i);
328 switch (pObjData->nType) { 331 switch (pObjData->nType) {
329 case JS_GlobalDataType::NUMBER: 332 case JS_GlobalDataType::NUMBER:
330 FXJS_PutObjectNumber(nullptr, pObj, pObjData->sKey.UTF8Decode(), 333 pRuntime->PutObjectNumber(pObj, pObjData->sKey.UTF8Decode(),
331 pObjData->dData); 334 pObjData->dData);
332 break; 335 break;
333 case JS_GlobalDataType::BOOLEAN: 336 case JS_GlobalDataType::BOOLEAN:
334 FXJS_PutObjectBoolean(nullptr, pObj, pObjData->sKey.UTF8Decode(), 337 pRuntime->PutObjectBoolean(pObj, pObjData->sKey.UTF8Decode(),
335 pObjData->bData == 1); 338 pObjData->bData == 1);
336 break; 339 break;
337 case JS_GlobalDataType::STRING: 340 case JS_GlobalDataType::STRING:
338 FXJS_PutObjectString(nullptr, pObj, pObjData->sKey.UTF8Decode(), 341 pRuntime->PutObjectString(pObj, pObjData->sKey.UTF8Decode(),
339 pObjData->sData.UTF8Decode()); 342 pObjData->sData.UTF8Decode());
340 break; 343 break;
341 case JS_GlobalDataType::OBJECT: { 344 case JS_GlobalDataType::OBJECT: {
342 v8::Isolate* pRuntime = m_pJSObject->ToV8Object()->GetIsolate(); 345 v8::Local<v8::Object> pNewObj = pRuntime->NewFxDynamicObj(-1);
343 v8::Local<v8::Object> pNewObj =
344 FXJS_NewFxDynamicObj(pRuntime, nullptr, -1);
345 PutObjectProperty(pNewObj, pObjData); 346 PutObjectProperty(pNewObj, pObjData);
346 FXJS_PutObjectObject(nullptr, pObj, pObjData->sKey.UTF8Decode(), 347 pRuntime->PutObjectObject(pObj, pObjData->sKey.UTF8Decode(), pNewObj);
347 pNewObj);
348 } break; 348 } break;
349 case JS_GlobalDataType::NULLOBJ: 349 case JS_GlobalDataType::NULLOBJ:
350 FXJS_PutObjectNull(nullptr, pObj, pObjData->sKey.UTF8Decode()); 350 pRuntime->PutObjectNull(pObj, pObjData->sKey.UTF8Decode());
351 break; 351 break;
352 } 352 }
353 } 353 }
354 } 354 }
355 355
356 void JSGlobalAlternate::DestroyGlobalPersisitentVariables() { 356 void JSGlobalAlternate::DestroyGlobalPersisitentVariables() {
357 for (const auto& pair : m_mapGlobal) { 357 for (const auto& pair : m_mapGlobal) {
358 delete pair.second; 358 delete pair.second;
359 } 359 }
360 m_mapGlobal.clear(); 360 m_mapGlobal.clear();
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 pNewData->nType = JS_GlobalDataType::NULLOBJ; 434 pNewData->nType = JS_GlobalDataType::NULLOBJ;
435 pNewData->bPersistent = bDefaultPersistent; 435 pNewData->bPersistent = bDefaultPersistent;
436 } break; 436 } break;
437 default: 437 default:
438 return FALSE; 438 return FALSE;
439 } 439 }
440 440
441 m_mapGlobal[propname] = pNewData; 441 m_mapGlobal[propname] = pNewData;
442 return TRUE; 442 return TRUE;
443 } 443 }
OLDNEW
« no previous file with comments | « fpdfsdk/javascript/color.cpp ('k') | fpdfsdk/javascript/ijs_runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698