1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker
7*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_global.h"
8*3ac0a46fSAndroid Build Coastguard Worker
9*3ac0a46fSAndroid Build Coastguard Worker #include <memory>
10*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
11*3ac0a46fSAndroid Build Coastguard Worker #include <vector>
12*3ac0a46fSAndroid Build Coastguard Worker
13*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_extension.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cfx_globaldata.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cfx_keyvalue.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_event_context.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_object.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/fxv8.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/js_define.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/js_resources.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/containers/contains.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-isolate.h"
24*3ac0a46fSAndroid Build Coastguard Worker
25*3ac0a46fSAndroid Build Coastguard Worker namespace {
26*3ac0a46fSAndroid Build Coastguard Worker
ByteStringFromV8Name(v8::Isolate * pIsolate,v8::Local<v8::Name> name)27*3ac0a46fSAndroid Build Coastguard Worker ByteString ByteStringFromV8Name(v8::Isolate* pIsolate,
28*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Name> name) {
29*3ac0a46fSAndroid Build Coastguard Worker CHECK(name->IsString());
30*3ac0a46fSAndroid Build Coastguard Worker return fxv8::ToByteString(pIsolate, name.As<v8::String>());
31*3ac0a46fSAndroid Build Coastguard Worker }
32*3ac0a46fSAndroid Build Coastguard Worker
33*3ac0a46fSAndroid Build Coastguard Worker } // namespace
34*3ac0a46fSAndroid Build Coastguard Worker
35*3ac0a46fSAndroid Build Coastguard Worker CJS_Global::JSGlobalData::JSGlobalData() = default;
36*3ac0a46fSAndroid Build Coastguard Worker
37*3ac0a46fSAndroid Build Coastguard Worker CJS_Global::JSGlobalData::~JSGlobalData() = default;
38*3ac0a46fSAndroid Build Coastguard Worker
39*3ac0a46fSAndroid Build Coastguard Worker const JSMethodSpec CJS_Global::MethodSpecs[] = {
40*3ac0a46fSAndroid Build Coastguard Worker {"setPersistent", setPersistent_static}};
41*3ac0a46fSAndroid Build Coastguard Worker
42*3ac0a46fSAndroid Build Coastguard Worker uint32_t CJS_Global::ObjDefnID = 0;
43*3ac0a46fSAndroid Build Coastguard Worker
44*3ac0a46fSAndroid Build Coastguard Worker // static
setPersistent_static(const v8::FunctionCallbackInfo<v8::Value> & info)45*3ac0a46fSAndroid Build Coastguard Worker void CJS_Global::setPersistent_static(
46*3ac0a46fSAndroid Build Coastguard Worker const v8::FunctionCallbackInfo<v8::Value>& info) {
47*3ac0a46fSAndroid Build Coastguard Worker JSMethod<CJS_Global, &CJS_Global::setPersistent>("setPersistent", "global",
48*3ac0a46fSAndroid Build Coastguard Worker info);
49*3ac0a46fSAndroid Build Coastguard Worker }
50*3ac0a46fSAndroid Build Coastguard Worker
51*3ac0a46fSAndroid Build Coastguard Worker // static
queryprop_static(v8::Local<v8::Name> property,const v8::PropertyCallbackInfo<v8::Integer> & info)52*3ac0a46fSAndroid Build Coastguard Worker void CJS_Global::queryprop_static(
53*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Name> property,
54*3ac0a46fSAndroid Build Coastguard Worker const v8::PropertyCallbackInfo<v8::Integer>& info) {
55*3ac0a46fSAndroid Build Coastguard Worker auto pObj = JSGetObject<CJS_Global>(info.GetIsolate(), info.Holder());
56*3ac0a46fSAndroid Build Coastguard Worker if (!pObj)
57*3ac0a46fSAndroid Build Coastguard Worker return;
58*3ac0a46fSAndroid Build Coastguard Worker
59*3ac0a46fSAndroid Build Coastguard Worker ByteString bsProp = ByteStringFromV8Name(info.GetIsolate(), property);
60*3ac0a46fSAndroid Build Coastguard Worker if (pObj->HasProperty(bsProp))
61*3ac0a46fSAndroid Build Coastguard Worker info.GetReturnValue().Set(static_cast<int>(v8::PropertyAttribute::None));
62*3ac0a46fSAndroid Build Coastguard Worker }
63*3ac0a46fSAndroid Build Coastguard Worker
64*3ac0a46fSAndroid Build Coastguard Worker // static
getprop_static(v8::Local<v8::Name> property,const v8::PropertyCallbackInfo<v8::Value> & info)65*3ac0a46fSAndroid Build Coastguard Worker void CJS_Global::getprop_static(
66*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Name> property,
67*3ac0a46fSAndroid Build Coastguard Worker const v8::PropertyCallbackInfo<v8::Value>& info) {
68*3ac0a46fSAndroid Build Coastguard Worker auto pObj = JSGetObject<CJS_Global>(info.GetIsolate(), info.Holder());
69*3ac0a46fSAndroid Build Coastguard Worker if (!pObj)
70*3ac0a46fSAndroid Build Coastguard Worker return;
71*3ac0a46fSAndroid Build Coastguard Worker
72*3ac0a46fSAndroid Build Coastguard Worker CJS_Runtime* pRuntime = pObj->GetRuntime();
73*3ac0a46fSAndroid Build Coastguard Worker if (!pRuntime)
74*3ac0a46fSAndroid Build Coastguard Worker return;
75*3ac0a46fSAndroid Build Coastguard Worker
76*3ac0a46fSAndroid Build Coastguard Worker ByteString bsProp = ByteStringFromV8Name(info.GetIsolate(), property);
77*3ac0a46fSAndroid Build Coastguard Worker CJS_Result result = pObj->GetProperty(pRuntime, bsProp);
78*3ac0a46fSAndroid Build Coastguard Worker if (result.HasError()) {
79*3ac0a46fSAndroid Build Coastguard Worker pRuntime->Error(
80*3ac0a46fSAndroid Build Coastguard Worker JSFormatErrorString("global", "GetProperty", result.Error()));
81*3ac0a46fSAndroid Build Coastguard Worker return;
82*3ac0a46fSAndroid Build Coastguard Worker }
83*3ac0a46fSAndroid Build Coastguard Worker if (result.HasReturn())
84*3ac0a46fSAndroid Build Coastguard Worker info.GetReturnValue().Set(result.Return());
85*3ac0a46fSAndroid Build Coastguard Worker }
86*3ac0a46fSAndroid Build Coastguard Worker
87*3ac0a46fSAndroid Build Coastguard Worker // static
putprop_static(v8::Local<v8::Name> property,v8::Local<v8::Value> value,const v8::PropertyCallbackInfo<v8::Value> & info)88*3ac0a46fSAndroid Build Coastguard Worker void CJS_Global::putprop_static(
89*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Name> property,
90*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Value> value,
91*3ac0a46fSAndroid Build Coastguard Worker const v8::PropertyCallbackInfo<v8::Value>& info) {
92*3ac0a46fSAndroid Build Coastguard Worker auto pObj = JSGetObject<CJS_Global>(info.GetIsolate(), info.Holder());
93*3ac0a46fSAndroid Build Coastguard Worker if (!pObj)
94*3ac0a46fSAndroid Build Coastguard Worker return;
95*3ac0a46fSAndroid Build Coastguard Worker
96*3ac0a46fSAndroid Build Coastguard Worker CJS_Runtime* pRuntime = pObj->GetRuntime();
97*3ac0a46fSAndroid Build Coastguard Worker if (!pRuntime)
98*3ac0a46fSAndroid Build Coastguard Worker return;
99*3ac0a46fSAndroid Build Coastguard Worker
100*3ac0a46fSAndroid Build Coastguard Worker ByteString bsProp = ByteStringFromV8Name(info.GetIsolate(), property);
101*3ac0a46fSAndroid Build Coastguard Worker CJS_Result result = pObj->SetProperty(pRuntime, bsProp, value);
102*3ac0a46fSAndroid Build Coastguard Worker if (result.HasError()) {
103*3ac0a46fSAndroid Build Coastguard Worker pRuntime->Error(
104*3ac0a46fSAndroid Build Coastguard Worker JSFormatErrorString("global", "PutProperty", result.Error()));
105*3ac0a46fSAndroid Build Coastguard Worker return;
106*3ac0a46fSAndroid Build Coastguard Worker }
107*3ac0a46fSAndroid Build Coastguard Worker info.GetReturnValue().Set(value);
108*3ac0a46fSAndroid Build Coastguard Worker }
109*3ac0a46fSAndroid Build Coastguard Worker
110*3ac0a46fSAndroid Build Coastguard Worker // static
delprop_static(v8::Local<v8::Name> property,const v8::PropertyCallbackInfo<v8::Boolean> & info)111*3ac0a46fSAndroid Build Coastguard Worker void CJS_Global::delprop_static(
112*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Name> property,
113*3ac0a46fSAndroid Build Coastguard Worker const v8::PropertyCallbackInfo<v8::Boolean>& info) {
114*3ac0a46fSAndroid Build Coastguard Worker auto pObj = JSGetObject<CJS_Global>(info.GetIsolate(), info.Holder());
115*3ac0a46fSAndroid Build Coastguard Worker if (!pObj)
116*3ac0a46fSAndroid Build Coastguard Worker return;
117*3ac0a46fSAndroid Build Coastguard Worker
118*3ac0a46fSAndroid Build Coastguard Worker ByteString bsProp = ByteStringFromV8Name(info.GetIsolate(), property);
119*3ac0a46fSAndroid Build Coastguard Worker if (pObj->DelProperty(bsProp))
120*3ac0a46fSAndroid Build Coastguard Worker info.GetReturnValue().Set(true);
121*3ac0a46fSAndroid Build Coastguard Worker }
122*3ac0a46fSAndroid Build Coastguard Worker
enumprop_static(const v8::PropertyCallbackInfo<v8::Array> & info)123*3ac0a46fSAndroid Build Coastguard Worker void CJS_Global::enumprop_static(
124*3ac0a46fSAndroid Build Coastguard Worker const v8::PropertyCallbackInfo<v8::Array>& info) {
125*3ac0a46fSAndroid Build Coastguard Worker auto pObj = JSGetObject<CJS_Global>(info.GetIsolate(), info.Holder());
126*3ac0a46fSAndroid Build Coastguard Worker if (!pObj)
127*3ac0a46fSAndroid Build Coastguard Worker return;
128*3ac0a46fSAndroid Build Coastguard Worker
129*3ac0a46fSAndroid Build Coastguard Worker CJS_Runtime* pRuntime = pObj->GetRuntime();
130*3ac0a46fSAndroid Build Coastguard Worker if (!pRuntime)
131*3ac0a46fSAndroid Build Coastguard Worker return;
132*3ac0a46fSAndroid Build Coastguard Worker
133*3ac0a46fSAndroid Build Coastguard Worker pObj->EnumProperties(pRuntime, info);
134*3ac0a46fSAndroid Build Coastguard Worker }
135*3ac0a46fSAndroid Build Coastguard Worker
136*3ac0a46fSAndroid Build Coastguard Worker // static
DefineAllProperties(CFXJS_Engine * pEngine)137*3ac0a46fSAndroid Build Coastguard Worker void CJS_Global::DefineAllProperties(CFXJS_Engine* pEngine) {
138*3ac0a46fSAndroid Build Coastguard Worker pEngine->DefineObjAllProperties(
139*3ac0a46fSAndroid Build Coastguard Worker ObjDefnID, CJS_Global::queryprop_static, CJS_Global::getprop_static,
140*3ac0a46fSAndroid Build Coastguard Worker CJS_Global::putprop_static, CJS_Global::delprop_static,
141*3ac0a46fSAndroid Build Coastguard Worker CJS_Global::enumprop_static);
142*3ac0a46fSAndroid Build Coastguard Worker }
143*3ac0a46fSAndroid Build Coastguard Worker
144*3ac0a46fSAndroid Build Coastguard Worker // static
GetObjDefnID()145*3ac0a46fSAndroid Build Coastguard Worker uint32_t CJS_Global::GetObjDefnID() {
146*3ac0a46fSAndroid Build Coastguard Worker return ObjDefnID;
147*3ac0a46fSAndroid Build Coastguard Worker }
148*3ac0a46fSAndroid Build Coastguard Worker
149*3ac0a46fSAndroid Build Coastguard Worker // static
DefineJSObjects(CFXJS_Engine * pEngine)150*3ac0a46fSAndroid Build Coastguard Worker void CJS_Global::DefineJSObjects(CFXJS_Engine* pEngine) {
151*3ac0a46fSAndroid Build Coastguard Worker ObjDefnID = pEngine->DefineObj("global", FXJSOBJTYPE_STATIC,
152*3ac0a46fSAndroid Build Coastguard Worker JSConstructor<CJS_Global>, JSDestructor);
153*3ac0a46fSAndroid Build Coastguard Worker DefineMethods(pEngine, ObjDefnID, MethodSpecs);
154*3ac0a46fSAndroid Build Coastguard Worker DefineAllProperties(pEngine);
155*3ac0a46fSAndroid Build Coastguard Worker }
156*3ac0a46fSAndroid Build Coastguard Worker
CJS_Global(v8::Local<v8::Object> pObject,CJS_Runtime * pRuntime)157*3ac0a46fSAndroid Build Coastguard Worker CJS_Global::CJS_Global(v8::Local<v8::Object> pObject, CJS_Runtime* pRuntime)
158*3ac0a46fSAndroid Build Coastguard Worker : CJS_Object(pObject, pRuntime),
159*3ac0a46fSAndroid Build Coastguard Worker m_pGlobalData(CFX_GlobalData::GetRetainedInstance(nullptr)) {
160*3ac0a46fSAndroid Build Coastguard Worker UpdateGlobalPersistentVariables();
161*3ac0a46fSAndroid Build Coastguard Worker }
162*3ac0a46fSAndroid Build Coastguard Worker
~CJS_Global()163*3ac0a46fSAndroid Build Coastguard Worker CJS_Global::~CJS_Global() {
164*3ac0a46fSAndroid Build Coastguard Worker DestroyGlobalPersisitentVariables();
165*3ac0a46fSAndroid Build Coastguard Worker m_pGlobalData.ExtractAsDangling()->Release();
166*3ac0a46fSAndroid Build Coastguard Worker }
167*3ac0a46fSAndroid Build Coastguard Worker
HasProperty(const ByteString & propname)168*3ac0a46fSAndroid Build Coastguard Worker bool CJS_Global::HasProperty(const ByteString& propname) {
169*3ac0a46fSAndroid Build Coastguard Worker return pdfium::Contains(m_MapGlobal, propname);
170*3ac0a46fSAndroid Build Coastguard Worker }
171*3ac0a46fSAndroid Build Coastguard Worker
DelProperty(const ByteString & propname)172*3ac0a46fSAndroid Build Coastguard Worker bool CJS_Global::DelProperty(const ByteString& propname) {
173*3ac0a46fSAndroid Build Coastguard Worker auto it = m_MapGlobal.find(propname);
174*3ac0a46fSAndroid Build Coastguard Worker if (it == m_MapGlobal.end())
175*3ac0a46fSAndroid Build Coastguard Worker return false;
176*3ac0a46fSAndroid Build Coastguard Worker
177*3ac0a46fSAndroid Build Coastguard Worker it->second->bDeleted = true;
178*3ac0a46fSAndroid Build Coastguard Worker return true;
179*3ac0a46fSAndroid Build Coastguard Worker }
180*3ac0a46fSAndroid Build Coastguard Worker
GetProperty(CJS_Runtime * pRuntime,const ByteString & propname)181*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Global::GetProperty(CJS_Runtime* pRuntime,
182*3ac0a46fSAndroid Build Coastguard Worker const ByteString& propname) {
183*3ac0a46fSAndroid Build Coastguard Worker auto it = m_MapGlobal.find(propname);
184*3ac0a46fSAndroid Build Coastguard Worker if (it == m_MapGlobal.end())
185*3ac0a46fSAndroid Build Coastguard Worker return CJS_Result::Success();
186*3ac0a46fSAndroid Build Coastguard Worker
187*3ac0a46fSAndroid Build Coastguard Worker JSGlobalData* pData = it->second.get();
188*3ac0a46fSAndroid Build Coastguard Worker if (pData->bDeleted)
189*3ac0a46fSAndroid Build Coastguard Worker return CJS_Result::Success();
190*3ac0a46fSAndroid Build Coastguard Worker
191*3ac0a46fSAndroid Build Coastguard Worker switch (pData->nType) {
192*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kNumber:
193*3ac0a46fSAndroid Build Coastguard Worker return CJS_Result::Success(pRuntime->NewNumber(pData->dData));
194*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kBoolean:
195*3ac0a46fSAndroid Build Coastguard Worker return CJS_Result::Success(pRuntime->NewBoolean(pData->bData));
196*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kString:
197*3ac0a46fSAndroid Build Coastguard Worker return CJS_Result::Success(
198*3ac0a46fSAndroid Build Coastguard Worker pRuntime->NewString(pData->sData.AsStringView()));
199*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kObject:
200*3ac0a46fSAndroid Build Coastguard Worker return CJS_Result::Success(
201*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Object>::New(pRuntime->GetIsolate(), pData->pData));
202*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kNull:
203*3ac0a46fSAndroid Build Coastguard Worker return CJS_Result::Success(pRuntime->NewNull());
204*3ac0a46fSAndroid Build Coastguard Worker }
205*3ac0a46fSAndroid Build Coastguard Worker }
206*3ac0a46fSAndroid Build Coastguard Worker
SetProperty(CJS_Runtime * pRuntime,const ByteString & propname,v8::Local<v8::Value> vp)207*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Global::SetProperty(CJS_Runtime* pRuntime,
208*3ac0a46fSAndroid Build Coastguard Worker const ByteString& propname,
209*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Value> vp) {
210*3ac0a46fSAndroid Build Coastguard Worker if (vp->IsNumber()) {
211*3ac0a46fSAndroid Build Coastguard Worker return SetGlobalVariables(propname, CFX_Value::DataType::kNumber,
212*3ac0a46fSAndroid Build Coastguard Worker pRuntime->ToDouble(vp), false, ByteString(),
213*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Object>(), false);
214*3ac0a46fSAndroid Build Coastguard Worker }
215*3ac0a46fSAndroid Build Coastguard Worker if (vp->IsBoolean()) {
216*3ac0a46fSAndroid Build Coastguard Worker return SetGlobalVariables(propname, CFX_Value::DataType::kBoolean, 0,
217*3ac0a46fSAndroid Build Coastguard Worker pRuntime->ToBoolean(vp), ByteString(),
218*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Object>(), false);
219*3ac0a46fSAndroid Build Coastguard Worker }
220*3ac0a46fSAndroid Build Coastguard Worker if (vp->IsString()) {
221*3ac0a46fSAndroid Build Coastguard Worker return SetGlobalVariables(propname, CFX_Value::DataType::kString, 0, false,
222*3ac0a46fSAndroid Build Coastguard Worker pRuntime->ToByteString(vp),
223*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Object>(), false);
224*3ac0a46fSAndroid Build Coastguard Worker }
225*3ac0a46fSAndroid Build Coastguard Worker if (vp->IsObject()) {
226*3ac0a46fSAndroid Build Coastguard Worker return SetGlobalVariables(propname, CFX_Value::DataType::kObject, 0, false,
227*3ac0a46fSAndroid Build Coastguard Worker ByteString(), pRuntime->ToObject(vp), false);
228*3ac0a46fSAndroid Build Coastguard Worker }
229*3ac0a46fSAndroid Build Coastguard Worker if (vp->IsNull()) {
230*3ac0a46fSAndroid Build Coastguard Worker return SetGlobalVariables(propname, CFX_Value::DataType::kNull, 0, false,
231*3ac0a46fSAndroid Build Coastguard Worker ByteString(), v8::Local<v8::Object>(), false);
232*3ac0a46fSAndroid Build Coastguard Worker }
233*3ac0a46fSAndroid Build Coastguard Worker if (vp->IsUndefined()) {
234*3ac0a46fSAndroid Build Coastguard Worker DelProperty(propname);
235*3ac0a46fSAndroid Build Coastguard Worker return CJS_Result::Success();
236*3ac0a46fSAndroid Build Coastguard Worker }
237*3ac0a46fSAndroid Build Coastguard Worker return CJS_Result::Failure(JSMessage::kObjectTypeError);
238*3ac0a46fSAndroid Build Coastguard Worker }
239*3ac0a46fSAndroid Build Coastguard Worker
EnumProperties(CJS_Runtime * pRuntime,const v8::PropertyCallbackInfo<v8::Array> & info)240*3ac0a46fSAndroid Build Coastguard Worker void CJS_Global::EnumProperties(
241*3ac0a46fSAndroid Build Coastguard Worker CJS_Runtime* pRuntime,
242*3ac0a46fSAndroid Build Coastguard Worker const v8::PropertyCallbackInfo<v8::Array>& info) {
243*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Array> result = pRuntime->NewArray();
244*3ac0a46fSAndroid Build Coastguard Worker int idx = 0;
245*3ac0a46fSAndroid Build Coastguard Worker for (const auto& it : m_MapGlobal) {
246*3ac0a46fSAndroid Build Coastguard Worker if (it.second->bDeleted)
247*3ac0a46fSAndroid Build Coastguard Worker continue;
248*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Name> name = pRuntime->NewString(it.first.AsStringView());
249*3ac0a46fSAndroid Build Coastguard Worker pRuntime->PutArrayElement(result, idx, name);
250*3ac0a46fSAndroid Build Coastguard Worker ++idx;
251*3ac0a46fSAndroid Build Coastguard Worker }
252*3ac0a46fSAndroid Build Coastguard Worker info.GetReturnValue().Set(result);
253*3ac0a46fSAndroid Build Coastguard Worker }
254*3ac0a46fSAndroid Build Coastguard Worker
setPersistent(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)255*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Global::setPersistent(
256*3ac0a46fSAndroid Build Coastguard Worker CJS_Runtime* pRuntime,
257*3ac0a46fSAndroid Build Coastguard Worker const std::vector<v8::Local<v8::Value>>& params) {
258*3ac0a46fSAndroid Build Coastguard Worker if (params.size() != 2)
259*3ac0a46fSAndroid Build Coastguard Worker return CJS_Result::Failure(JSMessage::kParamError);
260*3ac0a46fSAndroid Build Coastguard Worker
261*3ac0a46fSAndroid Build Coastguard Worker auto it = m_MapGlobal.find(pRuntime->ToByteString(params[0]));
262*3ac0a46fSAndroid Build Coastguard Worker if (it == m_MapGlobal.end() || it->second->bDeleted)
263*3ac0a46fSAndroid Build Coastguard Worker return CJS_Result::Failure(JSMessage::kGlobalNotFoundError);
264*3ac0a46fSAndroid Build Coastguard Worker
265*3ac0a46fSAndroid Build Coastguard Worker it->second->bPersistent = pRuntime->ToBoolean(params[1]);
266*3ac0a46fSAndroid Build Coastguard Worker return CJS_Result::Success();
267*3ac0a46fSAndroid Build Coastguard Worker }
268*3ac0a46fSAndroid Build Coastguard Worker
UpdateGlobalPersistentVariables()269*3ac0a46fSAndroid Build Coastguard Worker void CJS_Global::UpdateGlobalPersistentVariables() {
270*3ac0a46fSAndroid Build Coastguard Worker CJS_Runtime* pRuntime = GetRuntime();
271*3ac0a46fSAndroid Build Coastguard Worker if (!pRuntime)
272*3ac0a46fSAndroid Build Coastguard Worker return;
273*3ac0a46fSAndroid Build Coastguard Worker
274*3ac0a46fSAndroid Build Coastguard Worker for (int i = 0, sz = m_pGlobalData->GetSize(); i < sz; i++) {
275*3ac0a46fSAndroid Build Coastguard Worker CFX_GlobalData::Element* pData = m_pGlobalData->GetAt(i);
276*3ac0a46fSAndroid Build Coastguard Worker switch (pData->data.nType) {
277*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kNumber:
278*3ac0a46fSAndroid Build Coastguard Worker SetGlobalVariables(pData->data.sKey, CFX_Value::DataType::kNumber,
279*3ac0a46fSAndroid Build Coastguard Worker pData->data.dData, false, ByteString(),
280*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Object>(), pData->bPersistent);
281*3ac0a46fSAndroid Build Coastguard Worker pRuntime->PutObjectProperty(ToV8Object(),
282*3ac0a46fSAndroid Build Coastguard Worker pData->data.sKey.AsStringView(),
283*3ac0a46fSAndroid Build Coastguard Worker pRuntime->NewNumber(pData->data.dData));
284*3ac0a46fSAndroid Build Coastguard Worker break;
285*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kBoolean:
286*3ac0a46fSAndroid Build Coastguard Worker SetGlobalVariables(pData->data.sKey, CFX_Value::DataType::kBoolean, 0,
287*3ac0a46fSAndroid Build Coastguard Worker pData->data.bData == 1, ByteString(),
288*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Object>(), pData->bPersistent);
289*3ac0a46fSAndroid Build Coastguard Worker pRuntime->PutObjectProperty(
290*3ac0a46fSAndroid Build Coastguard Worker ToV8Object(), pData->data.sKey.AsStringView(),
291*3ac0a46fSAndroid Build Coastguard Worker pRuntime->NewBoolean(pData->data.bData == 1));
292*3ac0a46fSAndroid Build Coastguard Worker break;
293*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kString:
294*3ac0a46fSAndroid Build Coastguard Worker SetGlobalVariables(pData->data.sKey, CFX_Value::DataType::kString, 0,
295*3ac0a46fSAndroid Build Coastguard Worker false, pData->data.sData, v8::Local<v8::Object>(),
296*3ac0a46fSAndroid Build Coastguard Worker pData->bPersistent);
297*3ac0a46fSAndroid Build Coastguard Worker pRuntime->PutObjectProperty(
298*3ac0a46fSAndroid Build Coastguard Worker ToV8Object(), pData->data.sKey.AsStringView(),
299*3ac0a46fSAndroid Build Coastguard Worker pRuntime->NewString(pData->data.sData.AsStringView()));
300*3ac0a46fSAndroid Build Coastguard Worker break;
301*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kObject: {
302*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Object> pObj = pRuntime->NewObject();
303*3ac0a46fSAndroid Build Coastguard Worker if (!pObj.IsEmpty()) {
304*3ac0a46fSAndroid Build Coastguard Worker PutObjectProperty(pObj, &pData->data);
305*3ac0a46fSAndroid Build Coastguard Worker SetGlobalVariables(pData->data.sKey, CFX_Value::DataType::kObject, 0,
306*3ac0a46fSAndroid Build Coastguard Worker false, ByteString(), pObj, pData->bPersistent);
307*3ac0a46fSAndroid Build Coastguard Worker pRuntime->PutObjectProperty(ToV8Object(),
308*3ac0a46fSAndroid Build Coastguard Worker pData->data.sKey.AsStringView(), pObj);
309*3ac0a46fSAndroid Build Coastguard Worker }
310*3ac0a46fSAndroid Build Coastguard Worker } break;
311*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kNull:
312*3ac0a46fSAndroid Build Coastguard Worker SetGlobalVariables(pData->data.sKey, CFX_Value::DataType::kNull, 0,
313*3ac0a46fSAndroid Build Coastguard Worker false, ByteString(), v8::Local<v8::Object>(),
314*3ac0a46fSAndroid Build Coastguard Worker pData->bPersistent);
315*3ac0a46fSAndroid Build Coastguard Worker pRuntime->PutObjectProperty(
316*3ac0a46fSAndroid Build Coastguard Worker ToV8Object(), pData->data.sKey.AsStringView(), pRuntime->NewNull());
317*3ac0a46fSAndroid Build Coastguard Worker break;
318*3ac0a46fSAndroid Build Coastguard Worker }
319*3ac0a46fSAndroid Build Coastguard Worker }
320*3ac0a46fSAndroid Build Coastguard Worker }
321*3ac0a46fSAndroid Build Coastguard Worker
CommitGlobalPersisitentVariables()322*3ac0a46fSAndroid Build Coastguard Worker void CJS_Global::CommitGlobalPersisitentVariables() {
323*3ac0a46fSAndroid Build Coastguard Worker CJS_Runtime* pRuntime = GetRuntime();
324*3ac0a46fSAndroid Build Coastguard Worker if (!pRuntime)
325*3ac0a46fSAndroid Build Coastguard Worker return;
326*3ac0a46fSAndroid Build Coastguard Worker
327*3ac0a46fSAndroid Build Coastguard Worker for (const auto& iter : m_MapGlobal) {
328*3ac0a46fSAndroid Build Coastguard Worker ByteString name = iter.first;
329*3ac0a46fSAndroid Build Coastguard Worker JSGlobalData* pData = iter.second.get();
330*3ac0a46fSAndroid Build Coastguard Worker if (pData->bDeleted) {
331*3ac0a46fSAndroid Build Coastguard Worker m_pGlobalData->DeleteGlobalVariable(name);
332*3ac0a46fSAndroid Build Coastguard Worker continue;
333*3ac0a46fSAndroid Build Coastguard Worker }
334*3ac0a46fSAndroid Build Coastguard Worker switch (pData->nType) {
335*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kNumber:
336*3ac0a46fSAndroid Build Coastguard Worker m_pGlobalData->SetGlobalVariableNumber(name, pData->dData);
337*3ac0a46fSAndroid Build Coastguard Worker m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
338*3ac0a46fSAndroid Build Coastguard Worker break;
339*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kBoolean:
340*3ac0a46fSAndroid Build Coastguard Worker m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData);
341*3ac0a46fSAndroid Build Coastguard Worker m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
342*3ac0a46fSAndroid Build Coastguard Worker break;
343*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kString:
344*3ac0a46fSAndroid Build Coastguard Worker m_pGlobalData->SetGlobalVariableString(name, pData->sData);
345*3ac0a46fSAndroid Build Coastguard Worker m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
346*3ac0a46fSAndroid Build Coastguard Worker break;
347*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kObject: {
348*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Object> obj =
349*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Object>::New(pRuntime->GetIsolate(), pData->pData);
350*3ac0a46fSAndroid Build Coastguard Worker m_pGlobalData->SetGlobalVariableObject(name,
351*3ac0a46fSAndroid Build Coastguard Worker ObjectToArray(pRuntime, obj));
352*3ac0a46fSAndroid Build Coastguard Worker m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
353*3ac0a46fSAndroid Build Coastguard Worker } break;
354*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kNull:
355*3ac0a46fSAndroid Build Coastguard Worker m_pGlobalData->SetGlobalVariableNull(name);
356*3ac0a46fSAndroid Build Coastguard Worker m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
357*3ac0a46fSAndroid Build Coastguard Worker break;
358*3ac0a46fSAndroid Build Coastguard Worker }
359*3ac0a46fSAndroid Build Coastguard Worker }
360*3ac0a46fSAndroid Build Coastguard Worker }
361*3ac0a46fSAndroid Build Coastguard Worker
ObjectToArray(CJS_Runtime * pRuntime,v8::Local<v8::Object> pObj)362*3ac0a46fSAndroid Build Coastguard Worker std::vector<std::unique_ptr<CFX_KeyValue>> CJS_Global::ObjectToArray(
363*3ac0a46fSAndroid Build Coastguard Worker CJS_Runtime* pRuntime,
364*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Object> pObj) {
365*3ac0a46fSAndroid Build Coastguard Worker std::vector<std::unique_ptr<CFX_KeyValue>> array;
366*3ac0a46fSAndroid Build Coastguard Worker std::vector<WideString> pKeyList = pRuntime->GetObjectPropertyNames(pObj);
367*3ac0a46fSAndroid Build Coastguard Worker for (const auto& ws : pKeyList) {
368*3ac0a46fSAndroid Build Coastguard Worker ByteString sKey = ws.ToUTF8();
369*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Value> v =
370*3ac0a46fSAndroid Build Coastguard Worker pRuntime->GetObjectProperty(pObj, sKey.AsStringView());
371*3ac0a46fSAndroid Build Coastguard Worker if (v->IsNumber()) {
372*3ac0a46fSAndroid Build Coastguard Worker auto pObjElement = std::make_unique<CFX_KeyValue>();
373*3ac0a46fSAndroid Build Coastguard Worker pObjElement->nType = CFX_Value::DataType::kNumber;
374*3ac0a46fSAndroid Build Coastguard Worker pObjElement->sKey = sKey;
375*3ac0a46fSAndroid Build Coastguard Worker pObjElement->dData = pRuntime->ToDouble(v);
376*3ac0a46fSAndroid Build Coastguard Worker array.push_back(std::move(pObjElement));
377*3ac0a46fSAndroid Build Coastguard Worker continue;
378*3ac0a46fSAndroid Build Coastguard Worker }
379*3ac0a46fSAndroid Build Coastguard Worker if (v->IsBoolean()) {
380*3ac0a46fSAndroid Build Coastguard Worker auto pObjElement = std::make_unique<CFX_KeyValue>();
381*3ac0a46fSAndroid Build Coastguard Worker pObjElement->nType = CFX_Value::DataType::kBoolean;
382*3ac0a46fSAndroid Build Coastguard Worker pObjElement->sKey = sKey;
383*3ac0a46fSAndroid Build Coastguard Worker pObjElement->dData = pRuntime->ToBoolean(v);
384*3ac0a46fSAndroid Build Coastguard Worker array.push_back(std::move(pObjElement));
385*3ac0a46fSAndroid Build Coastguard Worker continue;
386*3ac0a46fSAndroid Build Coastguard Worker }
387*3ac0a46fSAndroid Build Coastguard Worker if (v->IsString()) {
388*3ac0a46fSAndroid Build Coastguard Worker ByteString sValue = pRuntime->ToByteString(v);
389*3ac0a46fSAndroid Build Coastguard Worker auto pObjElement = std::make_unique<CFX_KeyValue>();
390*3ac0a46fSAndroid Build Coastguard Worker pObjElement->nType = CFX_Value::DataType::kString;
391*3ac0a46fSAndroid Build Coastguard Worker pObjElement->sKey = sKey;
392*3ac0a46fSAndroid Build Coastguard Worker pObjElement->sData = sValue;
393*3ac0a46fSAndroid Build Coastguard Worker array.push_back(std::move(pObjElement));
394*3ac0a46fSAndroid Build Coastguard Worker continue;
395*3ac0a46fSAndroid Build Coastguard Worker }
396*3ac0a46fSAndroid Build Coastguard Worker if (v->IsObject()) {
397*3ac0a46fSAndroid Build Coastguard Worker auto pObjElement = std::make_unique<CFX_KeyValue>();
398*3ac0a46fSAndroid Build Coastguard Worker pObjElement->nType = CFX_Value::DataType::kObject;
399*3ac0a46fSAndroid Build Coastguard Worker pObjElement->sKey = sKey;
400*3ac0a46fSAndroid Build Coastguard Worker pObjElement->objData = ObjectToArray(pRuntime, pRuntime->ToObject(v));
401*3ac0a46fSAndroid Build Coastguard Worker array.push_back(std::move(pObjElement));
402*3ac0a46fSAndroid Build Coastguard Worker continue;
403*3ac0a46fSAndroid Build Coastguard Worker }
404*3ac0a46fSAndroid Build Coastguard Worker if (v->IsNull()) {
405*3ac0a46fSAndroid Build Coastguard Worker auto pObjElement = std::make_unique<CFX_KeyValue>();
406*3ac0a46fSAndroid Build Coastguard Worker pObjElement->nType = CFX_Value::DataType::kNull;
407*3ac0a46fSAndroid Build Coastguard Worker pObjElement->sKey = sKey;
408*3ac0a46fSAndroid Build Coastguard Worker array.push_back(std::move(pObjElement));
409*3ac0a46fSAndroid Build Coastguard Worker }
410*3ac0a46fSAndroid Build Coastguard Worker }
411*3ac0a46fSAndroid Build Coastguard Worker return array;
412*3ac0a46fSAndroid Build Coastguard Worker }
413*3ac0a46fSAndroid Build Coastguard Worker
PutObjectProperty(v8::Local<v8::Object> pObj,CFX_KeyValue * pData)414*3ac0a46fSAndroid Build Coastguard Worker void CJS_Global::PutObjectProperty(v8::Local<v8::Object> pObj,
415*3ac0a46fSAndroid Build Coastguard Worker CFX_KeyValue* pData) {
416*3ac0a46fSAndroid Build Coastguard Worker CJS_Runtime* pRuntime = GetRuntime();
417*3ac0a46fSAndroid Build Coastguard Worker if (pRuntime)
418*3ac0a46fSAndroid Build Coastguard Worker return;
419*3ac0a46fSAndroid Build Coastguard Worker
420*3ac0a46fSAndroid Build Coastguard Worker for (size_t i = 0; i < pData->objData.size(); ++i) {
421*3ac0a46fSAndroid Build Coastguard Worker CFX_KeyValue* pObjData = pData->objData.at(i).get();
422*3ac0a46fSAndroid Build Coastguard Worker switch (pObjData->nType) {
423*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kNumber:
424*3ac0a46fSAndroid Build Coastguard Worker pRuntime->PutObjectProperty(pObj, pObjData->sKey.AsStringView(),
425*3ac0a46fSAndroid Build Coastguard Worker pRuntime->NewNumber(pObjData->dData));
426*3ac0a46fSAndroid Build Coastguard Worker break;
427*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kBoolean:
428*3ac0a46fSAndroid Build Coastguard Worker pRuntime->PutObjectProperty(pObj, pObjData->sKey.AsStringView(),
429*3ac0a46fSAndroid Build Coastguard Worker pRuntime->NewBoolean(pObjData->bData == 1));
430*3ac0a46fSAndroid Build Coastguard Worker break;
431*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kString:
432*3ac0a46fSAndroid Build Coastguard Worker pRuntime->PutObjectProperty(
433*3ac0a46fSAndroid Build Coastguard Worker pObj, pObjData->sKey.AsStringView(),
434*3ac0a46fSAndroid Build Coastguard Worker pRuntime->NewString(pObjData->sData.AsStringView()));
435*3ac0a46fSAndroid Build Coastguard Worker break;
436*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kObject: {
437*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Object> pNewObj = pRuntime->NewObject();
438*3ac0a46fSAndroid Build Coastguard Worker if (!pNewObj.IsEmpty()) {
439*3ac0a46fSAndroid Build Coastguard Worker PutObjectProperty(pNewObj, pObjData);
440*3ac0a46fSAndroid Build Coastguard Worker pRuntime->PutObjectProperty(pObj, pObjData->sKey.AsStringView(),
441*3ac0a46fSAndroid Build Coastguard Worker pNewObj);
442*3ac0a46fSAndroid Build Coastguard Worker }
443*3ac0a46fSAndroid Build Coastguard Worker } break;
444*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kNull:
445*3ac0a46fSAndroid Build Coastguard Worker pRuntime->PutObjectProperty(pObj, pObjData->sKey.AsStringView(),
446*3ac0a46fSAndroid Build Coastguard Worker pRuntime->NewNull());
447*3ac0a46fSAndroid Build Coastguard Worker break;
448*3ac0a46fSAndroid Build Coastguard Worker }
449*3ac0a46fSAndroid Build Coastguard Worker }
450*3ac0a46fSAndroid Build Coastguard Worker }
451*3ac0a46fSAndroid Build Coastguard Worker
DestroyGlobalPersisitentVariables()452*3ac0a46fSAndroid Build Coastguard Worker void CJS_Global::DestroyGlobalPersisitentVariables() {
453*3ac0a46fSAndroid Build Coastguard Worker m_MapGlobal.clear();
454*3ac0a46fSAndroid Build Coastguard Worker }
455*3ac0a46fSAndroid Build Coastguard Worker
SetGlobalVariables(const ByteString & propname,CFX_Value::DataType nType,double dData,bool bData,const ByteString & sData,v8::Local<v8::Object> pData,bool bDefaultPersistent)456*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Global::SetGlobalVariables(const ByteString& propname,
457*3ac0a46fSAndroid Build Coastguard Worker CFX_Value::DataType nType,
458*3ac0a46fSAndroid Build Coastguard Worker double dData,
459*3ac0a46fSAndroid Build Coastguard Worker bool bData,
460*3ac0a46fSAndroid Build Coastguard Worker const ByteString& sData,
461*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Object> pData,
462*3ac0a46fSAndroid Build Coastguard Worker bool bDefaultPersistent) {
463*3ac0a46fSAndroid Build Coastguard Worker if (propname.IsEmpty())
464*3ac0a46fSAndroid Build Coastguard Worker return CJS_Result::Failure(JSMessage::kUnknownProperty);
465*3ac0a46fSAndroid Build Coastguard Worker
466*3ac0a46fSAndroid Build Coastguard Worker auto it = m_MapGlobal.find(propname);
467*3ac0a46fSAndroid Build Coastguard Worker if (it != m_MapGlobal.end()) {
468*3ac0a46fSAndroid Build Coastguard Worker JSGlobalData* pTemp = it->second.get();
469*3ac0a46fSAndroid Build Coastguard Worker if (pTemp->bDeleted || pTemp->nType != nType) {
470*3ac0a46fSAndroid Build Coastguard Worker pTemp->dData = 0;
471*3ac0a46fSAndroid Build Coastguard Worker pTemp->bData = false;
472*3ac0a46fSAndroid Build Coastguard Worker pTemp->sData.clear();
473*3ac0a46fSAndroid Build Coastguard Worker pTemp->nType = nType;
474*3ac0a46fSAndroid Build Coastguard Worker }
475*3ac0a46fSAndroid Build Coastguard Worker pTemp->bDeleted = false;
476*3ac0a46fSAndroid Build Coastguard Worker switch (nType) {
477*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kNumber:
478*3ac0a46fSAndroid Build Coastguard Worker pTemp->dData = dData;
479*3ac0a46fSAndroid Build Coastguard Worker break;
480*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kBoolean:
481*3ac0a46fSAndroid Build Coastguard Worker pTemp->bData = bData;
482*3ac0a46fSAndroid Build Coastguard Worker break;
483*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kString:
484*3ac0a46fSAndroid Build Coastguard Worker pTemp->sData = sData;
485*3ac0a46fSAndroid Build Coastguard Worker break;
486*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kObject:
487*3ac0a46fSAndroid Build Coastguard Worker pTemp->pData.Reset(pData->GetIsolate(), pData);
488*3ac0a46fSAndroid Build Coastguard Worker break;
489*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kNull:
490*3ac0a46fSAndroid Build Coastguard Worker break;
491*3ac0a46fSAndroid Build Coastguard Worker }
492*3ac0a46fSAndroid Build Coastguard Worker return CJS_Result::Success();
493*3ac0a46fSAndroid Build Coastguard Worker }
494*3ac0a46fSAndroid Build Coastguard Worker
495*3ac0a46fSAndroid Build Coastguard Worker auto pNewData = std::make_unique<JSGlobalData>();
496*3ac0a46fSAndroid Build Coastguard Worker switch (nType) {
497*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kNumber:
498*3ac0a46fSAndroid Build Coastguard Worker pNewData->nType = CFX_Value::DataType::kNumber;
499*3ac0a46fSAndroid Build Coastguard Worker pNewData->dData = dData;
500*3ac0a46fSAndroid Build Coastguard Worker pNewData->bPersistent = bDefaultPersistent;
501*3ac0a46fSAndroid Build Coastguard Worker break;
502*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kBoolean:
503*3ac0a46fSAndroid Build Coastguard Worker pNewData->nType = CFX_Value::DataType::kBoolean;
504*3ac0a46fSAndroid Build Coastguard Worker pNewData->bData = bData;
505*3ac0a46fSAndroid Build Coastguard Worker pNewData->bPersistent = bDefaultPersistent;
506*3ac0a46fSAndroid Build Coastguard Worker break;
507*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kString:
508*3ac0a46fSAndroid Build Coastguard Worker pNewData->nType = CFX_Value::DataType::kString;
509*3ac0a46fSAndroid Build Coastguard Worker pNewData->sData = sData;
510*3ac0a46fSAndroid Build Coastguard Worker pNewData->bPersistent = bDefaultPersistent;
511*3ac0a46fSAndroid Build Coastguard Worker break;
512*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kObject:
513*3ac0a46fSAndroid Build Coastguard Worker pNewData->nType = CFX_Value::DataType::kObject;
514*3ac0a46fSAndroid Build Coastguard Worker pNewData->pData.Reset(pData->GetIsolate(), pData);
515*3ac0a46fSAndroid Build Coastguard Worker pNewData->bPersistent = bDefaultPersistent;
516*3ac0a46fSAndroid Build Coastguard Worker break;
517*3ac0a46fSAndroid Build Coastguard Worker case CFX_Value::DataType::kNull:
518*3ac0a46fSAndroid Build Coastguard Worker pNewData->nType = CFX_Value::DataType::kNull;
519*3ac0a46fSAndroid Build Coastguard Worker pNewData->bPersistent = bDefaultPersistent;
520*3ac0a46fSAndroid Build Coastguard Worker break;
521*3ac0a46fSAndroid Build Coastguard Worker }
522*3ac0a46fSAndroid Build Coastguard Worker m_MapGlobal[propname] = std::move(pNewData);
523*3ac0a46fSAndroid Build Coastguard Worker return CJS_Result::Success();
524*3ac0a46fSAndroid Build Coastguard Worker }
525