blob: e5df5063b0375f6d1a3ac4ef6582397990298e09 [file] [log] [blame]
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07004
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07005// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
Dan Sinclaire0345a42017-10-30 20:20:42 +00007#include "fxjs/cjs_global.h"
Tom Sepez37458412015-10-06 11:33:46 -07008
Dan Sinclair4b172c42017-10-23 11:22:31 -04009#include <map>
10#include <memory>
Tom Sepeza7757232017-04-18 11:10:39 -070011#include <utility>
Dan Sinclair3ebd1212016-03-09 09:59:23 -050012#include <vector>
13
Dan Sinclaircfb19442017-04-20 13:13:04 -040014#include "core/fxcrt/fx_extension.h"
Tom Sepez41d04e12018-10-30 22:07:36 +000015#include "fxjs/cfx_globaldata.h"
16#include "fxjs/cfx_keyvalue.h"
Dan Sinclaire0345a42017-10-30 20:20:42 +000017#include "fxjs/cjs_event_context.h"
Tom Sepez7dbb85b2019-06-11 19:49:00 +000018#include "fxjs/cjs_eventrecorder.h"
Dan Sinclaire0345a42017-10-30 20:20:42 +000019#include "fxjs/cjs_object.h"
Tom Sepez221f0b32018-06-04 22:11:27 +000020#include "fxjs/js_define.h"
Dan Sinclaire0345a42017-10-30 20:20:42 +000021#include "fxjs/js_resources.h"
Lei Zhang99f5bbb2018-10-09 21:31:28 +000022#include "third_party/base/ptr_util.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070023
Dan Sinclair4b172c42017-10-23 11:22:31 -040024namespace {
25
Adam Klein4c451ba2018-01-17 21:06:27 +000026WideString PropFromV8Prop(v8::Isolate* pIsolate,
27 v8::Local<v8::String> property) {
28 v8::String::Utf8Value utf8_value(pIsolate, property);
Dan Sinclair8f524d62017-10-25 13:30:31 -040029 return WideString::FromUTF8(ByteStringView(*utf8_value, utf8_value.length()));
30}
31
Dan Sinclair4b172c42017-10-23 11:22:31 -040032void JSSpecialPropQuery(const char*,
33 v8::Local<v8::String> property,
34 const v8::PropertyCallbackInfo<v8::Integer>& info) {
Tom Sepezecd4a832020-02-06 21:04:32 +000035 auto pObj = JSGetObject<CJS_Global>(info.Holder());
Lei Zhang6aa21902018-07-12 13:15:11 +000036 if (!pObj)
Dan Sinclair4b172c42017-10-23 11:22:31 -040037 return;
38
Lei Zhang6aa21902018-07-12 13:15:11 +000039 CJS_Runtime* pRuntime = pObj->GetRuntime();
Tom Sepezddaa40f2018-06-06 18:30:15 +000040 if (!pRuntime)
41 return;
42
Tom Sepez3a6d0582018-08-17 19:28:52 +000043 CJS_Result result =
Lei Zhang6aa21902018-07-12 13:15:11 +000044 pObj->QueryProperty(PropFromV8Prop(info.GetIsolate(), property).c_str());
Tom Sepezddaa40f2018-06-06 18:30:15 +000045
Dan Sinclair8f524d62017-10-25 13:30:31 -040046 info.GetReturnValue().Set(!result.HasError() ? 4 : 0);
Dan Sinclair4b172c42017-10-23 11:22:31 -040047}
48
Dan Sinclair4b172c42017-10-23 11:22:31 -040049void JSSpecialPropGet(const char* class_name,
50 v8::Local<v8::String> property,
51 const v8::PropertyCallbackInfo<v8::Value>& info) {
Tom Sepezecd4a832020-02-06 21:04:32 +000052 auto pObj = JSGetObject<CJS_Global>(info.Holder());
Lei Zhang6aa21902018-07-12 13:15:11 +000053 if (!pObj)
Dan Sinclair4b172c42017-10-23 11:22:31 -040054 return;
55
Lei Zhang6aa21902018-07-12 13:15:11 +000056 CJS_Runtime* pRuntime = pObj->GetRuntime();
Tom Sepezddaa40f2018-06-06 18:30:15 +000057 if (!pRuntime)
58 return;
59
Tom Sepez3a6d0582018-08-17 19:28:52 +000060 CJS_Result result = pObj->GetProperty(
Adam Klein4c451ba2018-01-17 21:06:27 +000061 pRuntime, PropFromV8Prop(info.GetIsolate(), property).c_str());
Tom Sepezddaa40f2018-06-06 18:30:15 +000062
Dan Sinclair8f524d62017-10-25 13:30:31 -040063 if (result.HasError()) {
64 pRuntime->Error(
65 JSFormatErrorString(class_name, "GetProperty", result.Error()));
Dan Sinclair4b172c42017-10-23 11:22:31 -040066 return;
67 }
Dan Sinclair8f524d62017-10-25 13:30:31 -040068 if (result.HasReturn())
69 info.GetReturnValue().Set(result.Return());
Dan Sinclair4b172c42017-10-23 11:22:31 -040070}
71
Dan Sinclair4b172c42017-10-23 11:22:31 -040072void JSSpecialPropPut(const char* class_name,
73 v8::Local<v8::String> property,
74 v8::Local<v8::Value> value,
75 const v8::PropertyCallbackInfo<v8::Value>& info) {
Tom Sepezecd4a832020-02-06 21:04:32 +000076 auto pObj = JSGetObject<CJS_Global>(info.Holder());
Lei Zhang6aa21902018-07-12 13:15:11 +000077 if (!pObj)
Dan Sinclair4b172c42017-10-23 11:22:31 -040078 return;
79
Lei Zhang6aa21902018-07-12 13:15:11 +000080 CJS_Runtime* pRuntime = pObj->GetRuntime();
Tom Sepezddaa40f2018-06-06 18:30:15 +000081 if (!pRuntime)
82 return;
83
Tom Sepez3a6d0582018-08-17 19:28:52 +000084 CJS_Result result = pObj->SetProperty(
Adam Klein4c451ba2018-01-17 21:06:27 +000085 pRuntime, PropFromV8Prop(info.GetIsolate(), property).c_str(), value);
Tom Sepezddaa40f2018-06-06 18:30:15 +000086
Dan Sinclair8f524d62017-10-25 13:30:31 -040087 if (result.HasError()) {
88 pRuntime->Error(
89 JSFormatErrorString(class_name, "PutProperty", result.Error()));
90 }
Dan Sinclair4b172c42017-10-23 11:22:31 -040091}
92
Dan Sinclair4b172c42017-10-23 11:22:31 -040093void JSSpecialPropDel(const char* class_name,
94 v8::Local<v8::String> property,
95 const v8::PropertyCallbackInfo<v8::Boolean>& info) {
Tom Sepezecd4a832020-02-06 21:04:32 +000096 auto pObj = JSGetObject<CJS_Global>(info.Holder());
Lei Zhang6aa21902018-07-12 13:15:11 +000097 if (!pObj)
Dan Sinclair4b172c42017-10-23 11:22:31 -040098 return;
99
Lei Zhang6aa21902018-07-12 13:15:11 +0000100 CJS_Runtime* pRuntime = pObj->GetRuntime();
Tom Sepezddaa40f2018-06-06 18:30:15 +0000101 if (!pRuntime)
102 return;
103
Tom Sepez3a6d0582018-08-17 19:28:52 +0000104 CJS_Result result = pObj->DelProperty(
Adam Klein4c451ba2018-01-17 21:06:27 +0000105 pRuntime, PropFromV8Prop(info.GetIsolate(), property).c_str());
Dan Sinclair8f524d62017-10-25 13:30:31 -0400106 if (result.HasError()) {
107 // TODO(dsinclair): Should this set the pRuntime->Error result?
Henrique Nakashima11506302017-12-06 22:09:40 +0000108 // ByteString cbName =
109 // ByteString::Format("%s.%s", class_name, "DelProperty");
Dan Sinclair4b172c42017-10-23 11:22:31 -0400110 }
111}
112
Tom Sepezecd4a832020-02-06 21:04:32 +0000113template <typename T>
Lei Zhang5b346562018-08-28 23:36:08 +0000114v8::Local<v8::String> GetV8StringFromProperty(v8::Local<v8::Name> property,
115 const T& info) {
116 return property->ToString(info.GetIsolate()->GetCurrentContext())
117 .ToLocalChecked();
118}
119
Dan Sinclair4b172c42017-10-23 11:22:31 -0400120} // namespace
121
Tom Sepez4a463d52018-11-07 22:32:41 +0000122CJS_Global::JSGlobalData::JSGlobalData() = default;
Dan Sinclairf7435522018-02-05 22:27:22 +0000123
Tom Sepez4a463d52018-11-07 22:32:41 +0000124CJS_Global::JSGlobalData::~JSGlobalData() = default;
Dan Sinclairf7435522018-02-05 22:27:22 +0000125
Dan Sinclairc94a7932017-10-26 16:48:57 -0400126const JSMethodSpec CJS_Global::MethodSpecs[] = {
Dan Sinclair909fa2d2017-12-12 01:53:28 +0000127 {"setPersistent", setPersistent_static}};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700128
Dan Sinclairef299532017-10-26 16:48:30 -0400129int CJS_Global::ObjDefnID = -1;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700130
Dan Sinclair4b172c42017-10-23 11:22:31 -0400131// static
132void CJS_Global::setPersistent_static(
133 const v8::FunctionCallbackInfo<v8::Value>& info) {
Dan Sinclairf7435522018-02-05 22:27:22 +0000134 JSMethod<CJS_Global, &CJS_Global::setPersistent>("setPersistent", "global",
135 info);
Dan Sinclair4b172c42017-10-23 11:22:31 -0400136}
137
Dan Sinclairef299532017-10-26 16:48:30 -0400138// static
Dan Sinclair89d26c82017-10-26 12:21:28 -0400139void CJS_Global::queryprop_static(
Franziska Hinkelmann9a635e82018-03-21 12:58:25 +0000140 v8::Local<v8::Name> property,
Dan Sinclair89d26c82017-10-26 12:21:28 -0400141 const v8::PropertyCallbackInfo<v8::Integer>& info) {
Lei Zhang9bad2352018-06-28 13:29:33 +0000142 ASSERT(property->IsString());
Tom Sepezecd4a832020-02-06 21:04:32 +0000143 JSSpecialPropQuery(
Franziska Hinkelmann9a635e82018-03-21 12:58:25 +0000144 "global",
Dan Elphickfd8dfdf2018-07-26 09:57:26 +0000145 v8::Local<v8::String>::New(info.GetIsolate(),
Lei Zhang5b346562018-08-28 23:36:08 +0000146 GetV8StringFromProperty(property, info)),
Franziska Hinkelmann9a635e82018-03-21 12:58:25 +0000147 info);
Dan Sinclair89d26c82017-10-26 12:21:28 -0400148}
149
Dan Sinclairef299532017-10-26 16:48:30 -0400150// static
Dan Sinclair89d26c82017-10-26 12:21:28 -0400151void CJS_Global::getprop_static(
Franziska Hinkelmann9a635e82018-03-21 12:58:25 +0000152 v8::Local<v8::Name> property,
Dan Sinclair89d26c82017-10-26 12:21:28 -0400153 const v8::PropertyCallbackInfo<v8::Value>& info) {
Lei Zhang9bad2352018-06-28 13:29:33 +0000154 ASSERT(property->IsString());
Tom Sepezecd4a832020-02-06 21:04:32 +0000155 JSSpecialPropGet(
Franziska Hinkelmann9a635e82018-03-21 12:58:25 +0000156 "global",
Dan Elphickfd8dfdf2018-07-26 09:57:26 +0000157 v8::Local<v8::String>::New(info.GetIsolate(),
Lei Zhang5b346562018-08-28 23:36:08 +0000158 GetV8StringFromProperty(property, info)),
Franziska Hinkelmann9a635e82018-03-21 12:58:25 +0000159 info);
Dan Sinclair89d26c82017-10-26 12:21:28 -0400160}
161
Dan Sinclairef299532017-10-26 16:48:30 -0400162// static
Dan Sinclair89d26c82017-10-26 12:21:28 -0400163void CJS_Global::putprop_static(
Franziska Hinkelmann9a635e82018-03-21 12:58:25 +0000164 v8::Local<v8::Name> property,
Dan Sinclair89d26c82017-10-26 12:21:28 -0400165 v8::Local<v8::Value> value,
166 const v8::PropertyCallbackInfo<v8::Value>& info) {
Lei Zhang9bad2352018-06-28 13:29:33 +0000167 ASSERT(property->IsString());
Tom Sepezecd4a832020-02-06 21:04:32 +0000168 JSSpecialPropPut(
Franziska Hinkelmann9a635e82018-03-21 12:58:25 +0000169 "global",
Dan Elphickfd8dfdf2018-07-26 09:57:26 +0000170 v8::Local<v8::String>::New(info.GetIsolate(),
Lei Zhang5b346562018-08-28 23:36:08 +0000171 GetV8StringFromProperty(property, info)),
Franziska Hinkelmann9a635e82018-03-21 12:58:25 +0000172 value, info);
Dan Sinclair89d26c82017-10-26 12:21:28 -0400173}
174
Dan Sinclairef299532017-10-26 16:48:30 -0400175// static
Dan Sinclair89d26c82017-10-26 12:21:28 -0400176void CJS_Global::delprop_static(
Franziska Hinkelmann9a635e82018-03-21 12:58:25 +0000177 v8::Local<v8::Name> property,
Dan Sinclair89d26c82017-10-26 12:21:28 -0400178 const v8::PropertyCallbackInfo<v8::Boolean>& info) {
Lei Zhang9bad2352018-06-28 13:29:33 +0000179 ASSERT(property->IsString());
Tom Sepezecd4a832020-02-06 21:04:32 +0000180 JSSpecialPropDel(
Franziska Hinkelmann9a635e82018-03-21 12:58:25 +0000181 "global",
Dan Elphickfd8dfdf2018-07-26 09:57:26 +0000182 v8::Local<v8::String>::New(info.GetIsolate(),
Lei Zhang5b346562018-08-28 23:36:08 +0000183 GetV8StringFromProperty(property, info)),
Franziska Hinkelmann9a635e82018-03-21 12:58:25 +0000184 info);
Dan Sinclair89d26c82017-10-26 12:21:28 -0400185}
186
Dan Sinclairef299532017-10-26 16:48:30 -0400187// static
Dan Sinclair89d26c82017-10-26 12:21:28 -0400188void CJS_Global::DefineAllProperties(CFXJS_Engine* pEngine) {
189 pEngine->DefineObjAllProperties(
Dan Sinclairef299532017-10-26 16:48:30 -0400190 ObjDefnID, CJS_Global::queryprop_static, CJS_Global::getprop_static,
Dan Sinclair89d26c82017-10-26 12:21:28 -0400191 CJS_Global::putprop_static, CJS_Global::delprop_static);
192}
193
Dan Sinclairef299532017-10-26 16:48:30 -0400194// static
Lei Zhangad1f7b42018-07-11 13:04:43 +0000195int CJS_Global::GetObjDefnID() {
196 return ObjDefnID;
197}
198
199// static
Dan Sinclairbef4d3e2017-10-26 16:49:38 -0400200void CJS_Global::DefineJSObjects(CFXJS_Engine* pEngine) {
201 ObjDefnID = pEngine->DefineObj("global", FXJSOBJTYPE_STATIC,
Dan Sinclair998fee32018-02-05 21:43:19 +0000202 JSConstructor<CJS_Global>, JSDestructor);
Tom Sepez8b4ddeb2018-06-11 15:55:17 +0000203 DefineMethods(pEngine, ObjDefnID, MethodSpecs);
Dan Sinclair89d26c82017-10-26 12:21:28 -0400204 DefineAllProperties(pEngine);
205}
206
Tom Sepez36aae4f2018-06-04 19:44:37 +0000207CJS_Global::CJS_Global(v8::Local<v8::Object> pObject, CJS_Runtime* pRuntime)
Tom Sepez83b259e2018-06-08 20:43:55 +0000208 : CJS_Object(pObject, pRuntime) {
Lei Zhang5b346562018-08-28 23:36:08 +0000209 CPDFSDK_FormFillEnvironment* pFormFillEnv = GetRuntime()->GetFormFillEnv();
210 m_pFormFillEnv.Reset(pFormFillEnv);
Tom Sepezeccfe0e2018-11-01 16:34:52 +0000211 m_pGlobalData = CFX_GlobalData::GetRetainedInstance(nullptr);
Lei Zhang5b346562018-08-28 23:36:08 +0000212 UpdateGlobalPersistentVariables();
Tom Sepez83b259e2018-06-08 20:43:55 +0000213}
Dan Sinclair998fee32018-02-05 21:43:19 +0000214
Dan Sinclairf7435522018-02-05 22:27:22 +0000215CJS_Global::~CJS_Global() {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700216 DestroyGlobalPersisitentVariables();
Tom Sepezf4583622015-09-14 15:06:53 -0700217 m_pGlobalData->Release();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700218}
219
Tom Sepez3a6d0582018-08-17 19:28:52 +0000220CJS_Result CJS_Global::QueryProperty(const wchar_t* propname) {
Tom Sepez87ac6dc2018-11-30 23:10:17 +0000221 if (WideString(propname).EqualsASCII("setPersistent"))
222 return CJS_Result::Success();
223
224 return CJS_Result::Failure(JSMessage::kUnknownProperty);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700225}
226
Tom Sepez3a6d0582018-08-17 19:28:52 +0000227CJS_Result CJS_Global::DelProperty(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000228 const wchar_t* propname) {
Tom Sepez34dab072018-08-08 17:49:02 +0000229 auto it = m_MapGlobal.find(WideString(propname).ToDefANSI());
Tom Sepeza7757232017-04-18 11:10:39 -0700230 if (it == m_MapGlobal.end())
Tom Sepez3a6d0582018-08-17 19:28:52 +0000231 return CJS_Result::Failure(JSMessage::kUnknownProperty);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700232
tsepez4cf55152016-11-02 14:37:54 -0700233 it->second->bDeleted = true;
Tom Sepez3a6d0582018-08-17 19:28:52 +0000234 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700235}
236
Tom Sepez3a6d0582018-08-17 19:28:52 +0000237CJS_Result CJS_Global::GetProperty(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000238 const wchar_t* propname) {
Tom Sepez34dab072018-08-08 17:49:02 +0000239 auto it = m_MapGlobal.find(WideString(propname).ToDefANSI());
dan sinclair5daf07a2017-10-24 21:46:57 -0400240 if (it == m_MapGlobal.end())
Tom Sepez3a6d0582018-08-17 19:28:52 +0000241 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -0400242
243 JSGlobalData* pData = it->second.get();
dan sinclair5daf07a2017-10-24 21:46:57 -0400244 if (pData->bDeleted)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000245 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -0400246
247 switch (pData->nType) {
Tom Sepez4a463d52018-11-07 22:32:41 +0000248 case CFX_Value::DataType::NUMBER:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000249 return CJS_Result::Success(pRuntime->NewNumber(pData->dData));
Tom Sepez4a463d52018-11-07 22:32:41 +0000250 case CFX_Value::DataType::BOOLEAN:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000251 return CJS_Result::Success(pRuntime->NewBoolean(pData->bData));
Tom Sepez4a463d52018-11-07 22:32:41 +0000252 case CFX_Value::DataType::STRING:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000253 return CJS_Result::Success(pRuntime->NewString(
Tom Sepez40317142018-11-27 00:18:33 +0000254 WideString::FromDefANSI(pData->sData.AsStringView()).AsStringView()));
Tom Sepez4a463d52018-11-07 22:32:41 +0000255 case CFX_Value::DataType::OBJECT:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000256 return CJS_Result::Success(
Dan Sinclair8f524d62017-10-25 13:30:31 -0400257 v8::Local<v8::Object>::New(pRuntime->GetIsolate(), pData->pData));
Tom Sepez4a463d52018-11-07 22:32:41 +0000258 case CFX_Value::DataType::NULLOBJ:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000259 return CJS_Result::Success(pRuntime->NewNull());
dan sinclaircbe23db2017-10-19 14:29:33 -0400260 default:
261 break;
262 }
Tom Sepez3a6d0582018-08-17 19:28:52 +0000263 return CJS_Result::Failure(JSMessage::kObjectTypeError);
dan sinclaircbe23db2017-10-19 14:29:33 -0400264}
265
Tom Sepez3a6d0582018-08-17 19:28:52 +0000266CJS_Result CJS_Global::SetProperty(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000267 const wchar_t* propname,
268 v8::Local<v8::Value> vp) {
Tom Sepez34dab072018-08-08 17:49:02 +0000269 ByteString sPropName = WideString(propname).ToDefANSI();
dan sinclair80435cb2017-10-24 21:40:24 -0400270 if (vp->IsNumber()) {
Tom Sepez4a463d52018-11-07 22:32:41 +0000271 return SetGlobalVariables(sPropName, CFX_Value::DataType::NUMBER,
Tom Sepez306ebab2018-12-03 22:12:55 +0000272 pRuntime->ToDouble(vp), false, ByteString(),
Dan Sinclair3cac3602017-10-24 15:15:27 -0400273 v8::Local<v8::Object>(), false);
274 }
dan sinclair80435cb2017-10-24 21:40:24 -0400275 if (vp->IsBoolean()) {
Tom Sepez4a463d52018-11-07 22:32:41 +0000276 return SetGlobalVariables(sPropName, CFX_Value::DataType::BOOLEAN, 0,
Tom Sepez306ebab2018-12-03 22:12:55 +0000277 pRuntime->ToBoolean(vp), ByteString(),
Dan Sinclair3cac3602017-10-24 15:15:27 -0400278 v8::Local<v8::Object>(), false);
279 }
dan sinclair80435cb2017-10-24 21:40:24 -0400280 if (vp->IsString()) {
Tom Sepez4a463d52018-11-07 22:32:41 +0000281 return SetGlobalVariables(sPropName, CFX_Value::DataType::STRING, 0, false,
282 pRuntime->ToWideString(vp).ToDefANSI(),
Tom Sepez34dab072018-08-08 17:49:02 +0000283 v8::Local<v8::Object>(), false);
Dan Sinclair3cac3602017-10-24 15:15:27 -0400284 }
dan sinclair80435cb2017-10-24 21:40:24 -0400285 if (vp->IsObject()) {
Tom Sepez4a463d52018-11-07 22:32:41 +0000286 return SetGlobalVariables(sPropName, CFX_Value::DataType::OBJECT, 0, false,
Tom Sepez306ebab2018-12-03 22:12:55 +0000287 ByteString(), pRuntime->ToObject(vp), false);
Dan Sinclair3cac3602017-10-24 15:15:27 -0400288 }
dan sinclair80435cb2017-10-24 21:40:24 -0400289 if (vp->IsNull()) {
Tom Sepez4a463d52018-11-07 22:32:41 +0000290 return SetGlobalVariables(sPropName, CFX_Value::DataType::NULLOBJ, 0, false,
Tom Sepez306ebab2018-12-03 22:12:55 +0000291 ByteString(), v8::Local<v8::Object>(), false);
Dan Sinclair3cac3602017-10-24 15:15:27 -0400292 }
dan sinclair80435cb2017-10-24 21:40:24 -0400293 if (vp->IsUndefined()) {
Dan Sinclair3cac3602017-10-24 15:15:27 -0400294 DelProperty(pRuntime, propname);
Tom Sepez3a6d0582018-08-17 19:28:52 +0000295 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700296 }
Tom Sepez3a6d0582018-08-17 19:28:52 +0000297 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700298}
299
Tom Sepez3a6d0582018-08-17 19:28:52 +0000300CJS_Result CJS_Global::setPersistent(
dan sinclair80435cb2017-10-24 21:40:24 -0400301 CJS_Runtime* pRuntime,
Dan Sinclair8f524d62017-10-25 13:30:31 -0400302 const std::vector<v8::Local<v8::Value>>& params) {
303 if (params.size() != 2)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000304 return CJS_Result::Failure(JSMessage::kParamError);
Dan Sinclair8f524d62017-10-25 13:30:31 -0400305
Tom Sepez34dab072018-08-08 17:49:02 +0000306 auto it = m_MapGlobal.find(pRuntime->ToWideString(params[0]).ToDefANSI());
Dan Sinclair8f524d62017-10-25 13:30:31 -0400307 if (it == m_MapGlobal.end() || it->second->bDeleted)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000308 return CJS_Result::Failure(JSMessage::kGlobalNotFoundError);
Dan Sinclair8f524d62017-10-25 13:30:31 -0400309
dan sinclair80435cb2017-10-24 21:40:24 -0400310 it->second->bPersistent = pRuntime->ToBoolean(params[1]);
Tom Sepez3a6d0582018-08-17 19:28:52 +0000311 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700312}
313
Dan Sinclairf7435522018-02-05 22:27:22 +0000314void CJS_Global::UpdateGlobalPersistentVariables() {
Tom Sepez6ffd8402018-06-06 20:51:04 +0000315 CJS_Runtime* pRuntime = GetRuntime();
316 if (!pRuntime)
317 return;
tsepezb4694242016-08-15 16:44:55 -0700318
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700319 for (int i = 0, sz = m_pGlobalData->GetSize(); i < sz; i++) {
Tom Sepez41d04e12018-10-30 22:07:36 +0000320 CFX_GlobalData::Element* pData = m_pGlobalData->GetAt(i);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700321 switch (pData->data.nType) {
Tom Sepez4a463d52018-11-07 22:32:41 +0000322 case CFX_Value::DataType::NUMBER:
323 SetGlobalVariables(pData->data.sKey, CFX_Value::DataType::NUMBER,
Tom Sepez306ebab2018-12-03 22:12:55 +0000324 pData->data.dData, false, ByteString(),
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700325 v8::Local<v8::Object>(), pData->bPersistent == 1);
Tom Sepezca610782018-12-13 18:01:04 +0000326 pRuntime->PutObjectProperty(ToV8Object(),
327 pData->data.sKey.AsStringView(),
328 pRuntime->NewNumber(pData->data.dData));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700329 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000330 case CFX_Value::DataType::BOOLEAN:
331 SetGlobalVariables(pData->data.sKey, CFX_Value::DataType::BOOLEAN, 0,
Tom Sepez306ebab2018-12-03 22:12:55 +0000332 pData->data.bData == 1, ByteString(),
333 v8::Local<v8::Object>(), pData->bPersistent == 1);
tsepeze6cf0132017-01-18 14:38:18 -0800334 pRuntime->PutObjectProperty(
Tom Sepezca610782018-12-13 18:01:04 +0000335 ToV8Object(), pData->data.sKey.AsStringView(),
tsepeze6cf0132017-01-18 14:38:18 -0800336 pRuntime->NewBoolean(pData->data.bData == 1));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700337 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000338 case CFX_Value::DataType::STRING:
339 SetGlobalVariables(pData->data.sKey, CFX_Value::DataType::STRING, 0,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700340 false, pData->data.sData, v8::Local<v8::Object>(),
341 pData->bPersistent == 1);
tsepeze6cf0132017-01-18 14:38:18 -0800342 pRuntime->PutObjectProperty(
Tom Sepezca610782018-12-13 18:01:04 +0000343 ToV8Object(), pData->data.sKey.AsStringView(),
Tom Sepez3ef02422018-11-26 23:52:33 +0000344 pRuntime->NewString(
345 WideString::FromUTF8(pData->data.sData.AsStringView())
346 .AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700347 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000348 case CFX_Value::DataType::OBJECT: {
Tom Sepez9ad9a5f2018-02-07 21:07:24 +0000349 v8::Local<v8::Object> pObj = pRuntime->NewObject();
Tom Sepez63b2fc72017-08-14 16:24:29 -0700350 if (!pObj.IsEmpty()) {
351 PutObjectProperty(pObj, &pData->data);
Tom Sepez4a463d52018-11-07 22:32:41 +0000352 SetGlobalVariables(pData->data.sKey, CFX_Value::DataType::OBJECT, 0,
Tom Sepez306ebab2018-12-03 22:12:55 +0000353 false, ByteString(), pObj,
354 pData->bPersistent == 1);
Tom Sepezca610782018-12-13 18:01:04 +0000355 pRuntime->PutObjectProperty(ToV8Object(),
356 pData->data.sKey.AsStringView(), pObj);
Tom Sepez63b2fc72017-08-14 16:24:29 -0700357 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700358 } break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000359 case CFX_Value::DataType::NULLOBJ:
360 SetGlobalVariables(pData->data.sKey, CFX_Value::DataType::NULLOBJ, 0,
Tom Sepez306ebab2018-12-03 22:12:55 +0000361 false, ByteString(), v8::Local<v8::Object>(),
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700362 pData->bPersistent == 1);
Tom Sepez3ef02422018-11-26 23:52:33 +0000363 pRuntime->PutObjectProperty(
Tom Sepezca610782018-12-13 18:01:04 +0000364 ToV8Object(), pData->data.sKey.AsStringView(), pRuntime->NewNull());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700365 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700366 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700367 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700368}
369
Dan Sinclairf7435522018-02-05 22:27:22 +0000370void CJS_Global::CommitGlobalPersisitentVariables(CJS_Runtime* pRuntime) {
Tom Sepeza7757232017-04-18 11:10:39 -0700371 for (const auto& iter : m_MapGlobal) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400372 ByteString name = iter.first;
Tom Sepeza7757232017-04-18 11:10:39 -0700373 JSGlobalData* pData = iter.second.get();
Tom Sepez09d33bc2015-08-19 09:49:24 -0700374 if (pData->bDeleted) {
375 m_pGlobalData->DeleteGlobalVariable(name);
Tom Sepeza7757232017-04-18 11:10:39 -0700376 continue;
377 }
378 switch (pData->nType) {
Tom Sepez4a463d52018-11-07 22:32:41 +0000379 case CFX_Value::DataType::NUMBER:
Tom Sepeza7757232017-04-18 11:10:39 -0700380 m_pGlobalData->SetGlobalVariableNumber(name, pData->dData);
381 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
382 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000383 case CFX_Value::DataType::BOOLEAN:
Tom Sepeza7757232017-04-18 11:10:39 -0700384 m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData);
385 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
386 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000387 case CFX_Value::DataType::STRING:
Tom Sepeza7757232017-04-18 11:10:39 -0700388 m_pGlobalData->SetGlobalVariableString(name, pData->sData);
389 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
390 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000391 case CFX_Value::DataType::OBJECT: {
Tom Sepez574ee372020-01-29 17:25:43 +0000392 std::vector<std::unique_ptr<CFX_KeyValue>> array;
Dan Sinclairf7435522018-02-05 22:27:22 +0000393 v8::Local<v8::Object> obj =
394 v8::Local<v8::Object>::New(GetIsolate(), pData->pData);
Lei Zhangb1a4db52018-07-11 13:02:54 +0000395 ObjectToArray(pRuntime, obj, &array);
Tom Sepez436c9f12018-11-05 18:20:23 +0000396 m_pGlobalData->SetGlobalVariableObject(name, std::move(array));
Tom Sepeza7757232017-04-18 11:10:39 -0700397 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
398 } break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000399 case CFX_Value::DataType::NULLOBJ:
Tom Sepeza7757232017-04-18 11:10:39 -0700400 m_pGlobalData->SetGlobalVariableNull(name);
401 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
402 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700403 }
404 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700405}
406
Tom Sepez574ee372020-01-29 17:25:43 +0000407void CJS_Global::ObjectToArray(
408 CJS_Runtime* pRuntime,
409 v8::Local<v8::Object> pObj,
410 std::vector<std::unique_ptr<CFX_KeyValue>>* pArray) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400411 std::vector<WideString> pKeyList = pRuntime->GetObjectPropertyNames(pObj);
tsepezd0b6ed12016-08-11 19:50:57 -0700412 for (const auto& ws : pKeyList) {
Tom Sepezb4c95fe2018-11-27 01:09:44 +0000413 ByteString sKey = ws.ToUTF8();
Tom Sepezca610782018-12-13 18:01:04 +0000414 v8::Local<v8::Value> v =
415 pRuntime->GetObjectProperty(pObj, sKey.AsStringView());
Dan Sinclair3cac3602017-10-24 15:15:27 -0400416 if (v->IsNumber()) {
Tom Sepez41d04e12018-10-30 22:07:36 +0000417 auto pObjElement = pdfium::MakeUnique<CFX_KeyValue>();
Tom Sepez4a463d52018-11-07 22:32:41 +0000418 pObjElement->nType = CFX_Value::DataType::NUMBER;
Dan Sinclair3cac3602017-10-24 15:15:27 -0400419 pObjElement->sKey = sKey;
420 pObjElement->dData = pRuntime->ToDouble(v);
Tom Sepez574ee372020-01-29 17:25:43 +0000421 pArray->push_back(std::move(pObjElement));
Dan Sinclair3cac3602017-10-24 15:15:27 -0400422 continue;
423 }
424 if (v->IsBoolean()) {
Tom Sepez41d04e12018-10-30 22:07:36 +0000425 auto pObjElement = pdfium::MakeUnique<CFX_KeyValue>();
Tom Sepez4a463d52018-11-07 22:32:41 +0000426 pObjElement->nType = CFX_Value::DataType::BOOLEAN;
Dan Sinclair3cac3602017-10-24 15:15:27 -0400427 pObjElement->sKey = sKey;
428 pObjElement->dData = pRuntime->ToBoolean(v);
Tom Sepez574ee372020-01-29 17:25:43 +0000429 pArray->push_back(std::move(pObjElement));
Dan Sinclair3cac3602017-10-24 15:15:27 -0400430 continue;
431 }
432 if (v->IsString()) {
Tom Sepez34dab072018-08-08 17:49:02 +0000433 ByteString sValue = pRuntime->ToWideString(v).ToDefANSI();
Tom Sepez41d04e12018-10-30 22:07:36 +0000434 auto pObjElement = pdfium::MakeUnique<CFX_KeyValue>();
Tom Sepez4a463d52018-11-07 22:32:41 +0000435 pObjElement->nType = CFX_Value::DataType::STRING;
Dan Sinclair3cac3602017-10-24 15:15:27 -0400436 pObjElement->sKey = sKey;
437 pObjElement->sData = sValue;
Tom Sepez574ee372020-01-29 17:25:43 +0000438 pArray->push_back(std::move(pObjElement));
Dan Sinclair3cac3602017-10-24 15:15:27 -0400439 continue;
440 }
441 if (v->IsObject()) {
Tom Sepez41d04e12018-10-30 22:07:36 +0000442 auto pObjElement = pdfium::MakeUnique<CFX_KeyValue>();
Tom Sepez4a463d52018-11-07 22:32:41 +0000443 pObjElement->nType = CFX_Value::DataType::OBJECT;
Dan Sinclair3cac3602017-10-24 15:15:27 -0400444 pObjElement->sKey = sKey;
Lei Zhangb1a4db52018-07-11 13:02:54 +0000445 ObjectToArray(pRuntime, pRuntime->ToObject(v), &pObjElement->objData);
Tom Sepez574ee372020-01-29 17:25:43 +0000446 pArray->push_back(std::move(pObjElement));
Dan Sinclair3cac3602017-10-24 15:15:27 -0400447 continue;
448 }
449 if (v->IsNull()) {
Tom Sepez41d04e12018-10-30 22:07:36 +0000450 auto pObjElement = pdfium::MakeUnique<CFX_KeyValue>();
Tom Sepez4a463d52018-11-07 22:32:41 +0000451 pObjElement->nType = CFX_Value::DataType::NULLOBJ;
Dan Sinclair3cac3602017-10-24 15:15:27 -0400452 pObjElement->sKey = sKey;
Tom Sepez574ee372020-01-29 17:25:43 +0000453 pArray->push_back(std::move(pObjElement));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700454 }
455 }
456}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700457
Dan Sinclairf7435522018-02-05 22:27:22 +0000458void CJS_Global::PutObjectProperty(v8::Local<v8::Object> pObj,
Tom Sepez41d04e12018-10-30 22:07:36 +0000459 CFX_KeyValue* pData) {
Tom Sepez6ffd8402018-06-06 20:51:04 +0000460 CJS_Runtime* pRuntime = GetRuntime();
461 if (pRuntime)
462 return;
tsepezb4694242016-08-15 16:44:55 -0700463
Tom Sepez574ee372020-01-29 17:25:43 +0000464 for (size_t i = 0; i < pData->objData.size(); ++i) {
465 CFX_KeyValue* pObjData = pData->objData.at(i).get();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700466 switch (pObjData->nType) {
Tom Sepez4a463d52018-11-07 22:32:41 +0000467 case CFX_Value::DataType::NUMBER:
Tom Sepezca610782018-12-13 18:01:04 +0000468 pRuntime->PutObjectProperty(pObj, pObjData->sKey.AsStringView(),
469 pRuntime->NewNumber(pObjData->dData));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700470 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000471 case CFX_Value::DataType::BOOLEAN:
Tom Sepezca610782018-12-13 18:01:04 +0000472 pRuntime->PutObjectProperty(pObj, pObjData->sKey.AsStringView(),
473 pRuntime->NewBoolean(pObjData->bData == 1));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700474 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000475 case CFX_Value::DataType::STRING:
tsepeze6cf0132017-01-18 14:38:18 -0800476 pRuntime->PutObjectProperty(
Tom Sepezca610782018-12-13 18:01:04 +0000477 pObj, pObjData->sKey.AsStringView(),
Tom Sepez3ef02422018-11-26 23:52:33 +0000478 pRuntime->NewString(
479 WideString::FromUTF8(pObjData->sData.AsStringView())
480 .AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700481 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000482 case CFX_Value::DataType::OBJECT: {
Tom Sepez9ad9a5f2018-02-07 21:07:24 +0000483 v8::Local<v8::Object> pNewObj = pRuntime->NewObject();
Tom Sepez63b2fc72017-08-14 16:24:29 -0700484 if (!pNewObj.IsEmpty()) {
485 PutObjectProperty(pNewObj, pObjData);
Tom Sepezca610782018-12-13 18:01:04 +0000486 pRuntime->PutObjectProperty(pObj, pObjData->sKey.AsStringView(),
487 pNewObj);
Tom Sepez63b2fc72017-08-14 16:24:29 -0700488 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700489 } break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000490 case CFX_Value::DataType::NULLOBJ:
Tom Sepezca610782018-12-13 18:01:04 +0000491 pRuntime->PutObjectProperty(pObj, pObjData->sKey.AsStringView(),
492 pRuntime->NewNull());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700493 break;
494 }
495 }
496}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700497
Dan Sinclairf7435522018-02-05 22:27:22 +0000498void CJS_Global::DestroyGlobalPersisitentVariables() {
Tom Sepeza7757232017-04-18 11:10:39 -0700499 m_MapGlobal.clear();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700500}
501
Tom Sepez3a6d0582018-08-17 19:28:52 +0000502CJS_Result CJS_Global::SetGlobalVariables(const ByteString& propname,
Tom Sepez4a463d52018-11-07 22:32:41 +0000503 CFX_Value::DataType nType,
Dan Sinclairf7435522018-02-05 22:27:22 +0000504 double dData,
505 bool bData,
506 const ByteString& sData,
507 v8::Local<v8::Object> pData,
508 bool bDefaultPersistent) {
tsepezb4c9f3f2016-04-13 15:41:21 -0700509 if (propname.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +0000510 return CJS_Result::Failure(JSMessage::kUnknownProperty);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700511
Tom Sepeza7757232017-04-18 11:10:39 -0700512 auto it = m_MapGlobal.find(propname);
513 if (it != m_MapGlobal.end()) {
514 JSGlobalData* pTemp = it->second.get();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700515 if (pTemp->bDeleted || pTemp->nType != nType) {
516 pTemp->dData = 0;
517 pTemp->bData = 0;
Lei Zhangfe2cd4d2017-11-22 20:04:12 +0000518 pTemp->sData.clear();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700519 pTemp->nType = nType;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700520 }
tsepez4cf55152016-11-02 14:37:54 -0700521 pTemp->bDeleted = false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700522 switch (nType) {
Tom Sepez4a463d52018-11-07 22:32:41 +0000523 case CFX_Value::DataType::NUMBER:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700524 pTemp->dData = dData;
Tom Sepeza7757232017-04-18 11:10:39 -0700525 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000526 case CFX_Value::DataType::BOOLEAN:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700527 pTemp->bData = bData;
Tom Sepeza7757232017-04-18 11:10:39 -0700528 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000529 case CFX_Value::DataType::STRING:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700530 pTemp->sData = sData;
Tom Sepeza7757232017-04-18 11:10:39 -0700531 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000532 case CFX_Value::DataType::OBJECT:
Tom Sepez371379d2015-11-06 08:29:39 -0800533 pTemp->pData.Reset(pData->GetIsolate(), pData);
Tom Sepeza7757232017-04-18 11:10:39 -0700534 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000535 case CFX_Value::DataType::NULLOBJ:
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700536 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700537 default:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000538 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700539 }
Tom Sepez3a6d0582018-08-17 19:28:52 +0000540 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700541 }
542
Tom Sepeza7757232017-04-18 11:10:39 -0700543 auto pNewData = pdfium::MakeUnique<JSGlobalData>();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700544 switch (nType) {
Tom Sepez4a463d52018-11-07 22:32:41 +0000545 case CFX_Value::DataType::NUMBER:
546 pNewData->nType = CFX_Value::DataType::NUMBER;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700547 pNewData->dData = dData;
548 pNewData->bPersistent = bDefaultPersistent;
Tom Sepeza7757232017-04-18 11:10:39 -0700549 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000550 case CFX_Value::DataType::BOOLEAN:
551 pNewData->nType = CFX_Value::DataType::BOOLEAN;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700552 pNewData->bData = bData;
553 pNewData->bPersistent = bDefaultPersistent;
Tom Sepeza7757232017-04-18 11:10:39 -0700554 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000555 case CFX_Value::DataType::STRING:
556 pNewData->nType = CFX_Value::DataType::STRING;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700557 pNewData->sData = sData;
558 pNewData->bPersistent = bDefaultPersistent;
Tom Sepeza7757232017-04-18 11:10:39 -0700559 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000560 case CFX_Value::DataType::OBJECT:
561 pNewData->nType = CFX_Value::DataType::OBJECT;
Tom Sepez371379d2015-11-06 08:29:39 -0800562 pNewData->pData.Reset(pData->GetIsolate(), pData);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700563 pNewData->bPersistent = bDefaultPersistent;
Tom Sepeza7757232017-04-18 11:10:39 -0700564 break;
Tom Sepez4a463d52018-11-07 22:32:41 +0000565 case CFX_Value::DataType::NULLOBJ:
566 pNewData->nType = CFX_Value::DataType::NULLOBJ;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700567 pNewData->bPersistent = bDefaultPersistent;
Tom Sepeza7757232017-04-18 11:10:39 -0700568 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700569 default:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000570 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700571 }
Tom Sepeza7757232017-04-18 11:10:39 -0700572 m_MapGlobal[propname] = std::move(pNewData);
Tom Sepez3a6d0582018-08-17 19:28:52 +0000573 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700574}