1d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Copyright 2017 PDFium Authors. All rights reserved.
2d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
3d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// found in the LICENSE file.
4d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
5d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/xfa/cjx_object.h"
8d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <tuple>
10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/cfx_decimal.h"
12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_extension.h"
13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmltext.h"
14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/cfxjse_engine.h"
15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/cfxjse_value.h"
16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/cjs_return.h"
17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/xfa/cjx_boolean.h"
18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/xfa/cjx_draw.h"
19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/xfa/cjx_field.h"
20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/xfa/cjx_instancemanager.h"
21d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "third_party/base/ptr_util.h"
22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffnotify.h"
23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffwidget.h"
24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_widgetacc.h"
25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_border.h"
26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_datavalue.h"
27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_document.h"
28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_edge.h"
29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_fill.h"
30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_font.h"
31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_layoutprocessor.h"
32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_measurement.h"
33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_node.h"
34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_object.h"
35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_occur.h"
36d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_proto.h"
37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_subform.h"
38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_validate.h"
39d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_value.h"
40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/xfa_utils.h"
41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannnamespace {
43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid XFA_DeleteWideString(void* pData) {
45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  delete static_cast<WideString*>(pData);
46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid XFA_CopyWideString(void*& pData) {
49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pData)
50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
51d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pData = new WideString(*reinterpret_cast<WideString*>(pData));
52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannXFA_MAPDATABLOCKCALLBACKINFO deleteWideStringCallBack = {XFA_DeleteWideString,
55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                         XFA_CopyWideString};
56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannenum XFA_KEYTYPE {
58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_KEYTYPE_Custom,
59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_KEYTYPE_Element,
60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann};
61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
62d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid* GetMapKey_Custom(const WideStringView& wsKey) {
63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  uint32_t dwKey = FX_HashCode_GetW(wsKey, false);
64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return (void*)(uintptr_t)((dwKey << 1) | XFA_KEYTYPE_Custom);
65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid* GetMapKey_Element(XFA_Element eType, XFA_Attribute eAttribute) {
68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return (void*)(uintptr_t)((static_cast<uint32_t>(eType) << 16) |
69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                            (static_cast<uint32_t>(eAttribute) << 8) |
70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                            XFA_KEYTYPE_Element);
71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid XFA_DefaultFreeData(void* pData) {}
74d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannXFA_MAPDATABLOCKCALLBACKINFO gs_XFADefaultFreeData = {XFA_DefaultFreeData,
76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                      nullptr};
77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::tuple<int32_t, int32_t, int32_t> StrToRGB(const WideString& strRGB) {
79d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t r = 0;
80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t g = 0;
81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t b = 0;
82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  size_t iIndex = 0;
84d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (size_t i = 0; i < strRGB.GetLength(); ++i) {
85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wchar_t ch = strRGB[i];
86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (ch == L',')
87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      ++iIndex;
88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (iIndex > 2)
89d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t iValue = ch - L'0';
92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (iValue >= 0 && iValue <= 9) {
93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      switch (iIndex) {
94d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        case 0:
95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          r = r * 10 + iValue;
96d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
97d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        case 1:
98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          g = g * 10 + iValue;
99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        default:
101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          b = b * 10 + iValue;
102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
103d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {r, g, b};
107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}  // namespace
110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstruct XFA_MAPDATABLOCK {
112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  uint8_t* GetData() const { return (uint8_t*)this + sizeof(XFA_MAPDATABLOCK); }
113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo;
115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iBytes;
116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann};
117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstruct XFA_MAPMODULEDATA {
119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_MAPMODULEDATA() {}
120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ~XFA_MAPMODULEDATA() {}
121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::map<void*, void*> m_ValueMap;
123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::map<void*, XFA_MAPDATABLOCK*> m_BufferMap;
124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann};
125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCJX_Object::CJX_Object(CXFA_Object* obj) : object_(obj) {}
127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCJX_Object::~CJX_Object() {
129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ClearMapModuleBuffer();
130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::DefineMethods(const CJX_MethodSpec method_specs[],
133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                               size_t count) {
134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (size_t i = 0; i < count; ++i)
135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    method_specs_[method_specs[i].pName] = method_specs[i].pMethodCall;
136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
138d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Document* CJX_Object::GetDocument() const {
139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return object_->GetDocument();
140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::className(CFXJSE_Value* pValue,
143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                           bool bSetting,
144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                           XFA_Attribute eAttribute) {
145d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting) {
146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ThrowInvalidPropertyException();
147d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
149d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pValue->SetString(
150d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      FX_UTF8Encode(GetXFAObject()->GetClassName()).AsStringView());
151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CJX_Object::Subform_and_SubformSet_InstanceIndex() {
154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t index = 0;
155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = ToNode(GetXFAObject())->GetPrevSibling(); pNode;
156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pNode = pNode->GetPrevSibling()) {
157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if ((pNode->GetElementType() != XFA_Element::Subform) &&
158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        (pNode->GetElementType() != XFA_Element::SubformSet)) {
159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    index++;
162d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return index;
164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::HasMethod(const WideString& func) const {
167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pdfium::ContainsKey(method_specs_, func.UTF8Encode());
168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCJS_Return CJX_Object::RunMethod(
171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const WideString& func,
172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const std::vector<v8::Local<v8::Value>>& params) {
173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto it = method_specs_.find(func.UTF8Encode());
174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (it == method_specs_.end())
175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return CJS_Return(false);
176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return it->second(this, GetXFAObject()->GetDocument()->GetScriptContext(),
177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                    params);
178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::ThrowTooManyOccurancesException(const WideString& obj) const {
181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ThrowException(
182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      L"The element [%ls] has violated its allowable number of occurrences.",
183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      obj.c_str());
184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::ThrowInvalidPropertyException() const {
187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ThrowException(L"Invalid property set operation.");
188d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
189d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
190d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::ThrowIndexOutOfBoundsException() const {
191d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ThrowException(L"Index value is out of bounds.");
192d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
193d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::ThrowParamCountMismatchException(
195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const WideString& method) const {
196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ThrowException(L"Incorrect number of parameters calling method '%.16s'.",
197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                 method.c_str());
198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
199d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::ThrowArgumentMismatchException() const {
201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ThrowException(L"Argument mismatch in property or function argument.");
202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::ThrowException(const wchar_t* str, ...) const {
205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  va_list arg_ptr;
206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  va_start(arg_ptr, str);
207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsMessage = WideString::FormatV(str, arg_ptr);
208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  va_end(arg_ptr);
209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(!wsMessage.IsEmpty());
211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  FXJSE_ThrowMessage(wsMessage.UTF8Encode().AsStringView());
212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
214d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::HasAttribute(XFA_Attribute eAttr) {
215d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr);
216d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return HasMapModuleKey(pKey);
217d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
218d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::SetAttribute(XFA_Attribute eAttr,
220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                              const WideStringView& wsValue,
221d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                              bool bNotify) {
222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (ToNode(GetXFAObject())->GetAttributeType(eAttr)) {
223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeType::Enum: {
224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      Optional<XFA_AttributeEnum> item =
225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          CXFA_Node::NameToAttributeEnum(wsValue);
226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return SetEnum(
227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          eAttr,
228d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          item ? *item : *(ToNode(GetXFAObject())->GetDefaultEnum(eAttr)),
229d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          bNotify);
230d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
231d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeType::CData:
232d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return SetCData(eAttr, WideString(wsValue), bNotify, false);
233d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeType::Boolean:
234d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return SetBoolean(eAttr, wsValue != L"0", bNotify);
235d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeType::Integer:
236d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return SetInteger(eAttr,
237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                        FXSYS_round(FXSYS_wcstof(wsValue.unterminated_c_str(),
238d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                 wsValue.GetLength(), nullptr)),
239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                        bNotify);
240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeType::Measure:
241d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return SetMeasure(eAttr, CXFA_Measurement(wsValue), bNotify);
242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return false;
246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
247d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
248d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::SetMapModuleString(void* pKey, const WideStringView& wsValue) {
249d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  SetMapModuleBuffer(pKey, (void*)wsValue.unterminated_c_str(),
250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     wsValue.GetLength() * sizeof(wchar_t), nullptr);
251d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::SetAttribute(const WideStringView& wsAttr,
254d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                              const WideStringView& wsValue,
255d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                              bool bNotify) {
256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_Attribute attr = CXFA_Node::NameToAttribute(wsValue);
257d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (attr != XFA_Attribute::Unknown)
258d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return SetAttribute(attr, wsValue, bNotify);
259d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
260d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pKey = GetMapKey_Custom(wsAttr);
261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  SetMapModuleString(pKey, wsValue);
262d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
263d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
264d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
265d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CJX_Object::GetAttribute(const WideStringView& attr) {
266d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return TryAttribute(attr, true).value_or(WideString());
267d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
268d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
269d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CJX_Object::GetAttribute(XFA_Attribute attr) {
270d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return TryAttribute(attr, true).value_or(WideString());
271d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
272d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
273d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<WideString> CJX_Object::TryAttribute(XFA_Attribute eAttr,
274d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              bool bUseDefault) {
275d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (ToNode(GetXFAObject())->GetAttributeType(eAttr)) {
276d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeType::Enum: {
277d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      Optional<XFA_AttributeEnum> value = TryEnum(eAttr, bUseDefault);
278d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!value)
279d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return {};
280d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
281d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {CXFA_Node::AttributeEnumToName(*value)};
282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
283d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeType::CData:
284d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return TryCData(eAttr, bUseDefault);
285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
286d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeType::Boolean: {
287d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      Optional<bool> value = TryBoolean(eAttr, bUseDefault);
288d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!value)
289d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return {};
290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {*value ? L"1" : L"0"};
291d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
292d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeType::Integer: {
293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      Optional<int32_t> iValue = TryInteger(eAttr, bUseDefault);
294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!iValue)
295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return {};
296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {WideString::Format(L"%d", *iValue)};
297d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
298d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeType::Measure: {
299d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      Optional<CXFA_Measurement> value = TryMeasure(eAttr, bUseDefault);
300d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!value)
301d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return {};
302d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {value->ToString()};
304d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
305d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
306d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
308d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {};
309d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
310d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
311d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<WideString> CJX_Object::TryAttribute(const WideStringView& wsAttr,
312d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              bool bUseDefault) {
313d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_Attribute attr = CXFA_Node::NameToAttribute(wsAttr);
314d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (attr != XFA_Attribute::Unknown)
315d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return TryAttribute(attr, bUseDefault);
316d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
317d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pKey = GetMapKey_Custom(wsAttr);
318d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideStringView wsValueC;
319d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!GetMapModuleString(pKey, wsValueC))
320d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
321d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
322d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {WideString(wsValueC)};
323d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
324d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
325d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::RemoveAttribute(const WideStringView& wsAttr) {
326d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pKey = GetMapKey_Custom(wsAttr);
327d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pKey)
328d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    RemoveMapModuleKey(pKey);
329d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
330d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
331d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<bool> CJX_Object::TryBoolean(XFA_Attribute eAttr, bool bUseDefault) {
332d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pValue = nullptr;
333d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr);
334d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (GetMapModuleValue(pKey, pValue))
335d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {!!pValue};
336d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!bUseDefault)
337d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
338d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
339d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return ToNode(GetXFAObject())->GetDefaultBoolean(eAttr);
340d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
341d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
342d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::SetBoolean(XFA_Attribute eAttr, bool bValue, bool bNotify) {
343d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_XMLElement* elem = SetValue(eAttr, XFA_AttributeType::Boolean,
344d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  (void*)(uintptr_t)bValue, bNotify);
345d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (elem)
346d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    elem->SetString(CXFA_Node::AttributeToName(eAttr), bValue ? L"1" : L"0");
347d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
348d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
349d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
350d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::GetBoolean(XFA_Attribute eAttr) {
351d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return TryBoolean(eAttr, true).value_or(false);
352d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
353d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
354d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::SetInteger(XFA_Attribute eAttr, int32_t iValue, bool bNotify) {
355d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_XMLElement* elem = SetValue(eAttr, XFA_AttributeType::Integer,
356d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  (void*)(uintptr_t)iValue, bNotify);
357d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (elem) {
358d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    elem->SetString(CXFA_Node::AttributeToName(eAttr),
359d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                    WideString::Format(L"%d", iValue));
360d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
361d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
362d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
363d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
364d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CJX_Object::GetInteger(XFA_Attribute eAttr) {
365d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return TryInteger(eAttr, true).value_or(0);
366d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
367d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
368d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<int32_t> CJX_Object::TryInteger(XFA_Attribute eAttr,
369d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                         bool bUseDefault) {
370d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr);
371d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pValue = nullptr;
372d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (GetMapModuleValue(pKey, pValue))
373d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {static_cast<int32_t>(reinterpret_cast<uintptr_t>(pValue))};
374d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!bUseDefault)
375d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
376d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
377d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return ToNode(GetXFAObject())->GetDefaultInteger(eAttr);
378d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
379d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
380d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<XFA_AttributeEnum> CJX_Object::TryEnum(XFA_Attribute eAttr,
381d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                bool bUseDefault) {
382d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr);
383d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pValue = nullptr;
384d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (GetMapModuleValue(pKey, pValue)) {
385d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {
386d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        static_cast<XFA_AttributeEnum>(reinterpret_cast<uintptr_t>(pValue))};
387d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
388d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!bUseDefault)
389d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
390d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
391d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return ToNode(GetXFAObject())->GetDefaultEnum(eAttr);
392d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
393d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
394d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::SetEnum(XFA_Attribute eAttr,
395d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                         XFA_AttributeEnum eValue,
396d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                         bool bNotify) {
397d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_XMLElement* elem = SetValue(eAttr, XFA_AttributeType::Enum,
398d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  (void*)(uintptr_t)eValue, bNotify);
399d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (elem) {
400d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    elem->SetString(CXFA_Node::AttributeToName(eAttr),
401d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                    CXFA_Node::AttributeEnumToName(eValue));
402d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
403d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
404d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
405d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
406d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannXFA_AttributeEnum CJX_Object::GetEnum(XFA_Attribute eAttr) {
407d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return TryEnum(eAttr, true).value_or(XFA_AttributeEnum::Unknown);
408d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
409d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
410d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::SetMeasure(XFA_Attribute eAttr,
411d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                            CXFA_Measurement mValue,
412d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                            bool bNotify) {
413d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr);
414d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  OnChanging(eAttr, bNotify);
415d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  SetMapModuleBuffer(pKey, &mValue, sizeof(CXFA_Measurement), nullptr);
416d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  OnChanged(eAttr, bNotify, false);
417d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
418d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
419d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
420d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<CXFA_Measurement> CJX_Object::TryMeasure(XFA_Attribute eAttr,
421d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                  bool bUseDefault) const {
422d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr);
423d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pValue;
424d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iBytes;
425d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (GetMapModuleBuffer(pKey, pValue, iBytes, true) &&
426d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      iBytes == sizeof(CXFA_Measurement)) {
427d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {*reinterpret_cast<CXFA_Measurement*>(pValue)};
428d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
429d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!bUseDefault)
430d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
431d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
432d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return ToNode(GetXFAObject())->GetDefaultMeasurement(eAttr);
433d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
434d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
435d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<float> CJX_Object::TryMeasureAsFloat(XFA_Attribute attr) const {
436d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<CXFA_Measurement> measure = TryMeasure(attr, false);
437d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (measure)
438d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {measure->ToUnit(XFA_Unit::Pt)};
439d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {};
440d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
441d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
442d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Measurement CJX_Object::GetMeasure(XFA_Attribute eAttr) const {
443d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return TryMeasure(eAttr, true).value_or(CXFA_Measurement());
444d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
445d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
446d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CJX_Object::GetCData(XFA_Attribute eAttr) {
447d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return TryCData(eAttr, true).value_or(WideString());
448d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
449d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
450d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::SetCData(XFA_Attribute eAttr,
451d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                          const WideString& wsValue,
452d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                          bool bNotify,
453d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                          bool bScriptModify) {
454d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* xfaObj = ToNode(GetXFAObject());
455d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pKey = GetMapKey_Element(xfaObj->GetElementType(), eAttr);
456d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  OnChanging(eAttr, bNotify);
457d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eAttr == XFA_Attribute::Value) {
458d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString* pClone = new WideString(wsValue);
459d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    SetUserData(pKey, pClone, &deleteWideStringCallBack);
460d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else {
461d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    SetMapModuleString(pKey, wsValue.AsStringView());
462d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (eAttr == XFA_Attribute::Name)
463d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      xfaObj->UpdateNameHash();
464d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
465d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  OnChanged(eAttr, bNotify, bScriptModify);
466d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
467d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!xfaObj->IsNeedSavingXMLNode() || eAttr == XFA_Attribute::QualifiedName ||
468d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      eAttr == XFA_Attribute::BindingNode) {
469d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return true;
470d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
471d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
472d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eAttr == XFA_Attribute::Name &&
473d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      (xfaObj->GetElementType() == XFA_Element::DataValue ||
474d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       xfaObj->GetElementType() == XFA_Element::DataGroup)) {
475d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return true;
476d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
477d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
478d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto* elem = static_cast<CFX_XMLElement*>(xfaObj->GetXMLMappingNode());
479d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eAttr == XFA_Attribute::Value) {
480d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    FX_XMLNODETYPE eXMLType = elem->GetType();
481d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    switch (eXMLType) {
482d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      case FX_XMLNODE_Element:
483d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (xfaObj->IsAttributeInXML()) {
484d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          elem->SetString(WideString(GetCData(XFA_Attribute::QualifiedName)),
485d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                          wsValue);
486d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        } else {
487d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          bool bDeleteChildren = true;
488d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          if (xfaObj->GetPacketType() == XFA_PacketType::Datasets) {
489d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            for (CXFA_Node* pChildDataNode = xfaObj->GetFirstChild();
490d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                 pChildDataNode;
491d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                 pChildDataNode = pChildDataNode->GetNextSibling()) {
492d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              if (!pChildDataNode->GetBindItems()->empty()) {
493d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                bDeleteChildren = false;
494d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                break;
495d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              }
496d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            }
497d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          }
498d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          if (bDeleteChildren)
499d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            elem->DeleteChildren();
500d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
501d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          elem->SetTextData(wsValue);
502d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
503d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        break;
504d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      case FX_XMLNODE_Text:
505d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        static_cast<CFX_XMLText*>(xfaObj->GetXMLMappingNode())
506d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            ->SetText(wsValue);
507d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        break;
508d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      default:
509d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        NOTREACHED();
510d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
511d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return true;
512d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
513d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(elem->GetType() == FX_XMLNODE_Element);
514d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
515d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsAttrName = CXFA_Node::AttributeToName(eAttr);
516d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eAttr == XFA_Attribute::ContentType)
517d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wsAttrName = L"xfa:" + wsAttrName;
518d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
519d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  elem->SetString(wsAttrName, wsValue);
520d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
521d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
522d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
523d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::SetAttributeValue(const WideString& wsValue,
524d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                   const WideString& wsXMLValue,
525d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                   bool bNotify,
526d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                   bool bScriptModify) {
527d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto* xfaObj = ToNode(GetXFAObject());
528d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
529d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pKey =
530d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetMapKey_Element(xfaObj->GetElementType(), XFA_Attribute::Value);
531d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  OnChanging(XFA_Attribute::Value, bNotify);
532d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString* pClone = new WideString(wsValue);
533d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  SetUserData(pKey, pClone, &deleteWideStringCallBack);
534d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  OnChanged(XFA_Attribute::Value, bNotify, bScriptModify);
535d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!xfaObj->IsNeedSavingXMLNode())
536d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
537d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
538d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto* elem = static_cast<CFX_XMLElement*>(xfaObj->GetXMLMappingNode());
539d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  FX_XMLNODETYPE eXMLType = elem->GetType();
540d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (eXMLType) {
541d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case FX_XMLNODE_Element:
542d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (xfaObj->IsAttributeInXML()) {
543d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        elem->SetString(WideString(GetCData(XFA_Attribute::QualifiedName)),
544d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                        wsXMLValue);
545d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      } else {
546d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        bool bDeleteChildren = true;
547d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (xfaObj->GetPacketType() == XFA_PacketType::Datasets) {
548d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          for (CXFA_Node* pChildDataNode = xfaObj->GetFirstChild();
549d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann               pChildDataNode;
550d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann               pChildDataNode = pChildDataNode->GetNextSibling()) {
551d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            if (!pChildDataNode->GetBindItems()->empty()) {
552d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              bDeleteChildren = false;
553d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              break;
554d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            }
555d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          }
556d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
557d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (bDeleteChildren)
558d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          elem->DeleteChildren();
559d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
560d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        elem->SetTextData(wsXMLValue);
561d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
562d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
563d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case FX_XMLNODE_Text:
564d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      static_cast<CFX_XMLText*>(xfaObj->GetXMLMappingNode())
565d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          ->SetText(wsXMLValue);
566d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
567d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
568d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      ASSERT(0);
569d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
570d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
571d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
572d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<WideString> CJX_Object::TryCData(XFA_Attribute eAttr,
573d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          bool bUseDefault) {
574d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr);
575d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eAttr == XFA_Attribute::Value) {
576d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    void* pData;
577d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t iBytes = 0;
578d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString* pStr = nullptr;
579d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (GetMapModuleBuffer(pKey, pData, iBytes, true) &&
580d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        iBytes == sizeof(void*)) {
581d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      memcpy(&pData, pData, iBytes);
582d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pStr = reinterpret_cast<WideString*>(pData);
583d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
584d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pStr)
585d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {*pStr};
586d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else {
587d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideStringView wsValueC;
588d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (GetMapModuleString(pKey, wsValueC))
589d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {WideString(wsValueC)};
590d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
591d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!bUseDefault)
592d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
593d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
594d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return ToNode(GetXFAObject())->GetDefaultCData(eAttr);
595d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
596d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
597d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_XMLElement* CJX_Object::SetValue(XFA_Attribute eAttr,
598d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                     XFA_AttributeType eType,
599d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                     void* pValue,
600d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                     bool bNotify) {
601d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr);
602d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  OnChanging(eAttr, bNotify);
603d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  SetMapModuleValue(pKey, pValue);
604d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  OnChanged(eAttr, bNotify, false);
605d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!ToNode(GetXFAObject())->IsNeedSavingXMLNode())
606d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
607d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
608d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto* elem =
609d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      static_cast<CFX_XMLElement*>(ToNode(GetXFAObject())->GetXMLMappingNode());
610d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(elem->GetType() == FX_XMLNODE_Element);
611d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
612d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return elem;
613d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
614d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
615d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::SetContent(const WideString& wsContent,
616d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                            const WideString& wsXMLValue,
617d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                            bool bNotify,
618d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                            bool bScriptModify,
619d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                            bool bSyncData) {
620d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pNode = nullptr;
621d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pBindNode = nullptr;
622d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (ToNode(GetXFAObject())->GetObjectType()) {
623d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_ObjectType::ContainerNode: {
624d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (XFA_FieldIsMultiListBox(ToNode(GetXFAObject()))) {
625d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Value* pValue =
626d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            GetOrCreateProperty<CXFA_Value>(0, XFA_Element::Value);
627d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!pValue)
628d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
629d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
630d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pChildValue = pValue->GetFirstChild();
631d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        ASSERT(pChildValue);
632d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pChildValue->JSObject()->SetCData(XFA_Attribute::ContentType,
633d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          L"text/xml", false, false);
634d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pChildValue->JSObject()->SetContent(wsContent, wsContent, bNotify,
635d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                            bScriptModify, false);
636d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pBind = ToNode(GetXFAObject())->GetBindData();
637d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (bSyncData && pBind) {
638d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          std::vector<WideString> wsSaveTextArray;
639d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          size_t iSize = 0;
640d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          if (!wsContent.IsEmpty()) {
641d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            size_t iStart = 0;
642d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            size_t iLength = wsContent.GetLength();
643d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            auto iEnd = wsContent.Find(L'\n', iStart);
644d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            iEnd = !iEnd.has_value() ? iLength : iEnd;
645d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            while (iEnd.value() >= iStart) {
646d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              wsSaveTextArray.push_back(
647d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                  wsContent.Mid(iStart, iEnd.value() - iStart));
648d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              iStart = iEnd.value() + 1;
649d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              if (iStart >= iLength)
650d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                break;
651d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
652d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              iEnd = wsContent.Find(L'\n', iStart);
653d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              if (!iEnd.has_value()) {
654d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                wsSaveTextArray.push_back(
655d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                    wsContent.Mid(iStart, iLength - iStart));
656d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              }
657d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            }
658d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            iSize = wsSaveTextArray.size();
659d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          }
660d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          if (iSize == 0) {
661d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            while (CXFA_Node* pChildNode = pBind->GetFirstChild()) {
662d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              pBind->RemoveChild(pChildNode, true);
663d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            }
664d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          } else {
665d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            std::vector<CXFA_Node*> valueNodes = pBind->GetNodeList(
666d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                XFA_NODEFILTER_Children, XFA_Element::DataValue);
667d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            size_t iDatas = valueNodes.size();
668d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            if (iDatas < iSize) {
669d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              size_t iAddNodes = iSize - iDatas;
670d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              CXFA_Node* pValueNodes = nullptr;
671d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              while (iAddNodes-- > 0) {
672d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                pValueNodes =
673d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                    pBind->CreateSamePacketNode(XFA_Element::DataValue);
674d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                pValueNodes->JSObject()->SetCData(XFA_Attribute::Name, L"value",
675d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                  false, false);
676d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                pValueNodes->CreateXMLMappingNode();
677d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                pBind->InsertChild(pValueNodes, nullptr);
678d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              }
679d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              pValueNodes = nullptr;
680d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            } else if (iDatas > iSize) {
681d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              size_t iDelNodes = iDatas - iSize;
682d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              while (iDelNodes-- > 0) {
683d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                pBind->RemoveChild(pBind->GetFirstChild(), true);
684d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              }
685d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            }
686d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            int32_t i = 0;
687d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            for (CXFA_Node* pValueNode = pBind->GetFirstChild(); pValueNode;
688d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                 pValueNode = pValueNode->GetNextSibling()) {
689d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              pValueNode->JSObject()->SetAttributeValue(
690d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                  wsSaveTextArray[i], wsSaveTextArray[i], false, false);
691d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              i++;
692d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            }
693d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          }
694d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          for (const auto& pArrayNode : *(pBind->GetBindItems())) {
695d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            if (pArrayNode.Get() != ToNode(GetXFAObject())) {
696d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              pArrayNode->JSObject()->SetContent(wsContent, wsContent, bNotify,
697d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                 bScriptModify, false);
698d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            }
699d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          }
700d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
701d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        break;
702d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
703d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (ToNode(GetXFAObject())->GetElementType() == XFA_Element::ExclGroup) {
704d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pNode = ToNode(GetXFAObject());
705d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      } else {
706d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Value* pValue =
707d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            GetOrCreateProperty<CXFA_Value>(0, XFA_Element::Value);
708d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!pValue)
709d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
710d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
711d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pChildValue = pValue->GetFirstChild();
712d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        ASSERT(pChildValue);
713d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pChildValue->JSObject()->SetContent(wsContent, wsContent, bNotify,
714d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                            bScriptModify, false);
715d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
716d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pBindNode = ToNode(GetXFAObject())->GetBindData();
717d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pBindNode && bSyncData) {
718d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pBindNode->JSObject()->SetContent(wsContent, wsXMLValue, bNotify,
719d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          bScriptModify, false);
720d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        for (const auto& pArrayNode : *(pBindNode->GetBindItems())) {
721d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          if (pArrayNode.Get() != ToNode(GetXFAObject())) {
722d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            pArrayNode->JSObject()->SetContent(wsContent, wsContent, bNotify,
723d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                               true, false);
724d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          }
725d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
726d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
727d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pBindNode = nullptr;
728d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
729d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
730d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_ObjectType::ContentNode: {
731d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsContentType;
732d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (ToNode(GetXFAObject())->GetElementType() == XFA_Element::ExData) {
733d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        Optional<WideString> ret =
734d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            TryAttribute(XFA_Attribute::ContentType, false);
735d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (ret)
736d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          wsContentType = *ret;
737d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (wsContentType == L"text/html") {
738d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          wsContentType = L"";
739d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          SetAttribute(XFA_Attribute::ContentType, wsContentType.AsStringView(),
740d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                       false);
741d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
742d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
743d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
744d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Node* pContentRawDataNode = ToNode(GetXFAObject())->GetFirstChild();
745d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!pContentRawDataNode) {
746d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pContentRawDataNode =
747d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            ToNode(GetXFAObject())
748d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                ->CreateSamePacketNode((wsContentType == L"text/xml")
749d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                           ? XFA_Element::Sharpxml
750d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                           : XFA_Element::Sharptext);
751d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        ToNode(GetXFAObject())->InsertChild(pContentRawDataNode, nullptr);
752d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
753d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return pContentRawDataNode->JSObject()->SetContent(
754d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          wsContent, wsXMLValue, bNotify, bScriptModify, bSyncData);
755d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
756d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_ObjectType::NodeC:
757d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_ObjectType::TextNode:
758d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pNode = ToNode(GetXFAObject());
759d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
760d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_ObjectType::NodeV:
761d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pNode = ToNode(GetXFAObject());
762d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (bSyncData &&
763d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          ToNode(GetXFAObject())->GetPacketType() == XFA_PacketType::Form) {
764d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pParent = ToNode(GetXFAObject())->GetParent();
765d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (pParent) {
766d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pParent = pParent->GetParent();
767d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
768d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (pParent && pParent->GetElementType() == XFA_Element::Value) {
769d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pParent = pParent->GetParent();
770d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          if (pParent && pParent->IsContainerNode()) {
771d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            pBindNode = pParent->GetBindData();
772d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            if (pBindNode) {
773d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              pBindNode->JSObject()->SetContent(wsContent, wsXMLValue, bNotify,
774d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                bScriptModify, false);
775d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            }
776d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          }
777d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
778d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
779d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
780d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
781d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (ToNode(GetXFAObject())->GetElementType() == XFA_Element::DataValue) {
782d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pNode = ToNode(GetXFAObject());
783d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pBindNode = ToNode(GetXFAObject());
784d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
785d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
786d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
787d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pNode)
788d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
789d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
790d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  SetAttributeValue(wsContent, wsXMLValue, bNotify, bScriptModify);
791d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pBindNode && bSyncData) {
792d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (const auto& pArrayNode : *(pBindNode->GetBindItems())) {
793d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pArrayNode->JSObject()->SetContent(wsContent, wsContent, bNotify,
794d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                         bScriptModify, false);
795d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
796d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
797d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
798d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
799d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
800d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CJX_Object::GetContent(bool bScriptModify) {
801d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return TryContent(bScriptModify, true).value_or(WideString());
802d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
803d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
804d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<WideString> CJX_Object::TryContent(bool bScriptModify, bool bProto) {
805d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pNode = nullptr;
806d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (ToNode(GetXFAObject())->GetObjectType()) {
807d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_ObjectType::ContainerNode:
808d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (ToNode(GetXFAObject())->GetElementType() == XFA_Element::ExclGroup) {
809d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pNode = ToNode(GetXFAObject());
810d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      } else {
811d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Value* pValue =
812d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            ToNode(GetXFAObject())
813d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                ->GetChild<CXFA_Value>(0, XFA_Element::Value, false);
814d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!pValue)
815d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          return {};
816d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
817d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pChildValue = pValue->GetFirstChild();
818d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (pChildValue && XFA_FieldIsMultiListBox(ToNode(GetXFAObject()))) {
819d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pChildValue->JSObject()->SetAttribute(XFA_Attribute::ContentType,
820d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                L"text/xml", false);
821d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
822d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (pChildValue)
823d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          return pChildValue->JSObject()->TryContent(bScriptModify, bProto);
824d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return {};
825d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
826d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
827d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_ObjectType::ContentNode: {
828d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Node* pContentRawDataNode = ToNode(GetXFAObject())->GetFirstChild();
829d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!pContentRawDataNode) {
830d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        XFA_Element element = XFA_Element::Sharptext;
831d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (ToNode(GetXFAObject())->GetElementType() == XFA_Element::ExData) {
832d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          Optional<WideString> contentType =
833d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              TryAttribute(XFA_Attribute::ContentType, false);
834d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          if (contentType) {
835d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            if (*contentType == L"text/html")
836d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              element = XFA_Element::SharpxHTML;
837d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            else if (*contentType == L"text/xml")
838d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              element = XFA_Element::Sharpxml;
839d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          }
840d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
841d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pContentRawDataNode =
842d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            ToNode(GetXFAObject())->CreateSamePacketNode(element);
843d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        ToNode(GetXFAObject())->InsertChild(pContentRawDataNode, nullptr);
844d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
845d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return pContentRawDataNode->JSObject()->TryContent(bScriptModify, true);
846d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
847d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_ObjectType::NodeC:
848d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_ObjectType::NodeV:
849d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_ObjectType::TextNode:
850d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pNode = ToNode(GetXFAObject());
851d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
852d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (ToNode(GetXFAObject())->GetElementType() == XFA_Element::DataValue)
853d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pNode = ToNode(GetXFAObject());
854d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
855d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
856d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pNode) {
857d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (bScriptModify) {
858d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CFXJSE_Engine* pScriptContext = GetDocument()->GetScriptContext();
859d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pScriptContext)
860d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        GetDocument()->GetScriptContext()->AddNodesOfRunScript(
861d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            ToNode(GetXFAObject()));
862d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
863d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return TryCData(XFA_Attribute::Value, false);
864d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
865d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {};
866d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
867d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
868d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<WideString> CJX_Object::TryNamespace() {
869d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (ToNode(GetXFAObject())->IsModelNode() ||
870d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      ToNode(GetXFAObject())->GetElementType() == XFA_Element::Packet) {
871d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CFX_XMLNode* pXMLNode = ToNode(GetXFAObject())->GetXMLMappingNode();
872d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pXMLNode || pXMLNode->GetType() != FX_XMLNODE_Element)
873d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {};
874d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
875d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {static_cast<CFX_XMLElement*>(pXMLNode)->GetNamespaceURI()};
876d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
877d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
878d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (ToNode(GetXFAObject())->GetPacketType() != XFA_PacketType::Datasets)
879d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return ToNode(GetXFAObject())->GetModelNode()->JSObject()->TryNamespace();
880d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
881d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_XMLNode* pXMLNode = ToNode(GetXFAObject())->GetXMLMappingNode();
882d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pXMLNode || pXMLNode->GetType() != FX_XMLNODE_Element)
883d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
884d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
885d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (ToNode(GetXFAObject())->GetElementType() == XFA_Element::DataValue &&
886d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetEnum(XFA_Attribute::Contains) == XFA_AttributeEnum::MetaData) {
887d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsNamespace;
888d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    bool ret = XFA_FDEExtension_ResolveNamespaceQualifier(
889d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        static_cast<CFX_XMLElement*>(pXMLNode),
890d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        GetCData(XFA_Attribute::QualifiedName), &wsNamespace);
891d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!ret)
892d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {};
893d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {wsNamespace};
894d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
895d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {static_cast<CFX_XMLElement*>(pXMLNode)->GetNamespaceURI()};
896d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
897d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
898d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::pair<CXFA_Node*, int32_t> CJX_Object::GetPropertyInternal(
899d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t index,
900d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_Element eProperty) const {
901d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  const CXFA_Node* xfaNode = ToNode(GetXFAObject());
902d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (index < 0 || index >= xfaNode->PropertyOccuranceCount(eProperty))
903d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {nullptr, 0};
904d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
905d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iCount = 0;
906d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = xfaNode->GetFirstChild(); pNode;
907d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pNode = pNode->GetNextSibling()) {
908d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNode->GetElementType() == eProperty) {
909d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      iCount++;
910d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (iCount > index)
911d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return {pNode, iCount};
912d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
913d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
914d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {nullptr, iCount};
915d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
916d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
917d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CJX_Object::GetOrCreatePropertyInternal(int32_t index,
918d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                   XFA_Element eProperty) {
919d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* xfaNode = ToNode(GetXFAObject());
920d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (index < 0 || index >= xfaNode->PropertyOccuranceCount(eProperty))
921d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
922d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
923d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iCount = 0;
924d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* node;
925d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::tie(node, iCount) = GetPropertyInternal(index, eProperty);
926d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (node)
927d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return node;
928d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
929d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (xfaNode->HasPropertyFlags(eProperty, XFA_PROPERTYFLAG_OneOf)) {
930d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (CXFA_Node* pNode = xfaNode->GetFirstChild(); pNode;
931d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann         pNode = pNode->GetNextSibling()) {
932d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (xfaNode->HasPropertyFlags(pNode->GetElementType(),
933d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                    XFA_PROPERTYFLAG_OneOf)) {
934d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return nullptr;
935d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
936d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
937d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
938d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
939d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pNewNode = nullptr;
940d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (; iCount <= index; ++iCount) {
941d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNewNode = GetDocument()->CreateNode(xfaNode->GetPacketType(), eProperty);
942d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pNewNode)
943d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return nullptr;
944d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
945d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    xfaNode->InsertChild(pNewNode, nullptr);
946d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNewNode->SetFlag(XFA_NodeFlag_Initialized, true);
947d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
948d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pNewNode;
949d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
950d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
951d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::SetUserData(void* pKey,
952d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                             void* pData,
953d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                             XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) {
954d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  SetMapModuleBuffer(pKey, &pData, sizeof(void*),
955d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     pCallbackInfo ? pCallbackInfo : &gs_XFADefaultFreeData);
956d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
957d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
958d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
959d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannXFA_MAPMODULEDATA* CJX_Object::CreateMapModuleData() {
960d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!map_module_data_)
961d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    map_module_data_ = pdfium::MakeUnique<XFA_MAPMODULEDATA>();
962d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return map_module_data_.get();
963d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
964d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
965d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannXFA_MAPMODULEDATA* CJX_Object::GetMapModuleData() const {
966d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return map_module_data_.get();
967d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
968d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
969d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::SetMapModuleValue(void* pKey, void* pValue) {
970d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CreateMapModuleData()->m_ValueMap[pKey] = pValue;
971d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
972d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
973d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::GetMapModuleValue(void* pKey, void*& pValue) {
974d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = ToNode(GetXFAObject()); pNode;
975d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pNode = pNode->GetTemplateNodeIfExists()) {
976d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_MAPMODULEDATA* pModule = pNode->JSObject()->GetMapModuleData();
977d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pModule) {
978d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      auto it = pModule->m_ValueMap.find(pKey);
979d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (it != pModule->m_ValueMap.end()) {
980d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pValue = it->second;
981d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return true;
982d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
983d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
984d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNode->GetPacketType() == XFA_PacketType::Datasets)
985d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
986d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
987d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return false;
988d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
989d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
990d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::GetMapModuleString(void* pKey, WideStringView& wsValue) {
991d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* pValue;
992d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iBytes;
993d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!GetMapModuleBuffer(pKey, pValue, iBytes, true))
994d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
995d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
996d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  // Defensive measure: no out-of-bounds pointers even if zero length.
997d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iChars = iBytes / sizeof(wchar_t);
998d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  wsValue = WideStringView(iChars ? (const wchar_t*)pValue : nullptr, iChars);
999d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
1000d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1001d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1002d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::SetMapModuleBuffer(
1003d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    void* pKey,
1004d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    void* pValue,
1005d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t iBytes,
1006d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) {
1007d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_MAPDATABLOCK*& pBuffer = CreateMapModuleData()->m_BufferMap[pKey];
1008d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pBuffer) {
1009d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pBuffer = reinterpret_cast<XFA_MAPDATABLOCK*>(
1010d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        FX_Alloc(uint8_t, sizeof(XFA_MAPDATABLOCK) + iBytes));
1011d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else if (pBuffer->iBytes != iBytes) {
1012d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree)
1013d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
1014d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1015d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pBuffer = reinterpret_cast<XFA_MAPDATABLOCK*>(
1016d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        FX_Realloc(uint8_t, pBuffer, sizeof(XFA_MAPDATABLOCK) + iBytes));
1017d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
1018d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pBuffer->pCallbackInfo->pFree(
1019d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        *reinterpret_cast<void**>(pBuffer->GetData()));
1020d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1021d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pBuffer)
1022d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1023d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1024d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pBuffer->pCallbackInfo = pCallbackInfo;
1025d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pBuffer->iBytes = iBytes;
1026d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  memcpy(pBuffer->GetData(), pValue, iBytes);
1027d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1028d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1029d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::GetMapModuleBuffer(void* pKey,
1030d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                    void*& pValue,
1031d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                    int32_t& iBytes,
1032d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                    bool bProtoAlso) const {
1033d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_MAPDATABLOCK* pBuffer = nullptr;
1034d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (const CXFA_Node* pNode = ToNode(GetXFAObject()); pNode;
1035d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pNode = pNode->GetTemplateNodeIfExists()) {
1036d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_MAPMODULEDATA* pModule = pNode->JSObject()->GetMapModuleData();
1037d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pModule) {
1038d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      auto it = pModule->m_BufferMap.find(pKey);
1039d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (it != pModule->m_BufferMap.end()) {
1040d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pBuffer = it->second;
1041d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        break;
1042d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1043d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1044d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!bProtoAlso || pNode->GetPacketType() == XFA_PacketType::Datasets)
1045d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1046d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1047d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pBuffer)
1048d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
1049d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1050d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pValue = pBuffer->GetData();
1051d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  iBytes = pBuffer->iBytes;
1052d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
1053d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1054d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1055d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CJX_Object::HasMapModuleKey(void* pKey) {
1056d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_MAPMODULEDATA* pModule = GetMapModuleData();
1057d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pModule && (pdfium::ContainsKey(pModule->m_ValueMap, pKey) ||
1058d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     pdfium::ContainsKey(pModule->m_BufferMap, pKey));
1059d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1060d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1061d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::ClearMapModuleBuffer() {
1062d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_MAPMODULEDATA* pModule = GetMapModuleData();
1063d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pModule)
1064d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1065d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1066d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (auto& pair : pModule->m_BufferMap) {
1067d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_MAPDATABLOCK* pBuffer = pair.second;
1068d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pBuffer) {
1069d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree)
1070d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
1071d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1072d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      FX_Free(pBuffer);
1073d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1074d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1075d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pModule->m_BufferMap.clear();
1076d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pModule->m_ValueMap.clear();
1077d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1078d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1079d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::RemoveMapModuleKey(void* pKey) {
1080d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(pKey);
1081d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1082d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_MAPMODULEDATA* pModule = GetMapModuleData();
1083d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pModule)
1084d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1085d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1086d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto it = pModule->m_BufferMap.find(pKey);
1087d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (it != pModule->m_BufferMap.end()) {
1088d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_MAPDATABLOCK* pBuffer = it->second;
1089d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pBuffer) {
1090d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree)
1091d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
1092d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1093d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      FX_Free(pBuffer);
1094d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1095d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pModule->m_BufferMap.erase(it);
1096d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1097d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pModule->m_ValueMap.erase(pKey);
1098d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return;
1099d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::MergeAllData(CXFA_Object* pDstModule) {
1102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_MAPMODULEDATA* pDstModuleData =
1103d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      ToNode(pDstModule)->JSObject()->CreateMapModuleData();
1104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_MAPMODULEDATA* pSrcModuleData = GetMapModuleData();
1105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pSrcModuleData)
1106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (const auto& pair : pSrcModuleData->m_ValueMap)
1109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pDstModuleData->m_ValueMap[pair.first] = pair.second;
1110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (const auto& pair : pSrcModuleData->m_BufferMap) {
1112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_MAPDATABLOCK* pSrcBuffer = pair.second;
1113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_MAPDATABLOCK*& pDstBuffer = pDstModuleData->m_BufferMap[pair.first];
1114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pSrcBuffer->pCallbackInfo && pSrcBuffer->pCallbackInfo->pFree &&
1115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        !pSrcBuffer->pCallbackInfo->pCopy) {
1116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pDstBuffer) {
1117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pDstBuffer->pCallbackInfo->pFree(*(void**)pDstBuffer->GetData());
1118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pDstModuleData->m_BufferMap.erase(pair.first);
1119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
1121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pDstBuffer) {
1123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pDstBuffer = (XFA_MAPDATABLOCK*)FX_Alloc(
1124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          uint8_t, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes);
1125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    } else if (pDstBuffer->iBytes != pSrcBuffer->iBytes) {
1126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pDstBuffer->pCallbackInfo && pDstBuffer->pCallbackInfo->pFree) {
1127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pDstBuffer->pCallbackInfo->pFree(*(void**)pDstBuffer->GetData());
1128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pDstBuffer = (XFA_MAPDATABLOCK*)FX_Realloc(
1130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          uint8_t, pDstBuffer, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes);
1131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    } else if (pDstBuffer->pCallbackInfo && pDstBuffer->pCallbackInfo->pFree) {
1132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pDstBuffer->pCallbackInfo->pFree(*(void**)pDstBuffer->GetData());
1133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pDstBuffer)
1135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
1136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pDstBuffer->pCallbackInfo = pSrcBuffer->pCallbackInfo;
1138d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pDstBuffer->iBytes = pSrcBuffer->iBytes;
1139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    memcpy(pDstBuffer->GetData(), pSrcBuffer->GetData(), pSrcBuffer->iBytes);
1140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pDstBuffer->pCallbackInfo && pDstBuffer->pCallbackInfo->pCopy) {
1141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pDstBuffer->pCallbackInfo->pCopy(*(void**)pDstBuffer->GetData());
1142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1145d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::MoveBufferMapData(CXFA_Object* pDstModule) {
1147d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pDstModule)
1148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1149d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1150d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool bNeedMove = true;
1151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pDstModule->GetElementType() != GetXFAObject()->GetElementType())
1152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    bNeedMove = false;
1153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bNeedMove)
1155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ToNode(pDstModule)->JSObject()->SetCalcData(ReleaseCalcData());
1156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pDstModule->IsNodeV())
1157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsValue = ToNode(pDstModule)->JSObject()->GetContent(false);
1160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsFormatValue(wsValue);
1161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_WidgetAcc* pWidgetAcc = ToNode(pDstModule)->GetContainerWidgetAcc();
1162d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pWidgetAcc)
1163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wsFormatValue = pWidgetAcc->GetFormatDataValue(wsValue);
1164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ToNode(pDstModule)
1166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      ->JSObject()
1167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      ->SetContent(wsValue, wsFormatValue, true, true, true);
1168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::MoveBufferMapData(CXFA_Object* pSrcModule,
1171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                   CXFA_Object* pDstModule) {
1172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pSrcModule || !pDstModule)
1173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pSrcChild = ToNode(pSrcModule)->GetFirstChild();
1176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pDstChild = ToNode(pDstModule)->GetFirstChild();
1177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  while (pSrcChild && pDstChild) {
1178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    MoveBufferMapData(pSrcChild, pDstChild);
1179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pSrcChild = pSrcChild->GetNextSibling();
1181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pDstChild = pDstChild->GetNextSibling();
1182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ToNode(pSrcModule)->JSObject()->MoveBufferMapData(pDstModule);
1184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::OnChanging(XFA_Attribute eAttr, bool bNotify) {
1187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!bNotify || !ToNode(GetXFAObject())->IsInitialized())
1188d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1189d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1190d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_FFNotify* pNotify = GetDocument()->GetNotify();
1191d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pNotify)
1192d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNotify->OnValueChanging(ToNode(GetXFAObject()), eAttr);
1193d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::OnChanged(XFA_Attribute eAttr,
1196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                           bool bNotify,
1197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                           bool bScriptModify) {
1198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bNotify && ToNode(GetXFAObject())->IsInitialized())
1199d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ToNode(GetXFAObject())->SendAttributeChangeMessage(eAttr, bScriptModify);
1200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::SetCalcData(std::unique_ptr<CXFA_CalcData> data) {
1203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  calc_data_ = std::move(data);
1204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::unique_ptr<CXFA_CalcData> CJX_Object::ReleaseCalcData() {
1207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return std::move(calc_data_);
1208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Attribute_String(CFXJSE_Value* pValue,
1211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                         bool bSetting,
1212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                         XFA_Attribute eAttribute) {
1213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!bSetting) {
1214d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pValue->SetString(GetAttribute(eAttribute).UTF8Encode().AsStringView());
1215d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1216d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1217d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1218d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsValue = pValue->ToWideString();
1219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  SetAttribute(eAttribute, wsValue.AsStringView(), true);
1220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eAttribute != XFA_Attribute::Use ||
1221d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetXFAObject()->GetElementType() != XFA_Element::Desc) {
1222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pTemplateNode =
1226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Template));
1227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Proto* pProtoRoot =
1228d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pTemplateNode->GetFirstChildByClass<CXFA_Subform>(XFA_Element::Subform)
1229d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          ->GetFirstChildByClass<CXFA_Proto>(XFA_Element::Proto);
1230d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1231d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsID;
1232d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsSOM;
1233d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!wsValue.IsEmpty()) {
1234d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (wsValue[0] == '#')
1235d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      wsID = WideString(wsValue.c_str() + 1, wsValue.GetLength() - 1);
1236d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    else
1237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      wsSOM = wsValue;
1238d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pProtoNode = nullptr;
1241d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!wsSOM.IsEmpty()) {
1242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_RESOLVENODE_RS resolveNodeRS;
1243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    bool iRet = GetDocument()->GetScriptContext()->ResolveObjects(
1244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pProtoRoot, wsSOM.AsStringView(), &resolveNodeRS,
1245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes |
1246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent |
1247d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            XFA_RESOLVENODE_Siblings,
1248d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        nullptr);
1249d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (iRet && resolveNodeRS.objects.front()->IsNode())
1250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pProtoNode = resolveNodeRS.objects.front()->AsNode();
1251d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else if (!wsID.IsEmpty()) {
1253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pProtoNode = GetDocument()->GetNodeByID(pProtoRoot, wsID.AsStringView());
1254d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1255d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pProtoNode)
1256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1257d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1258d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pHeadChild = ToNode(GetXFAObject())->GetFirstChild();
1259d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  while (pHeadChild) {
1260d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* pSibling = pHeadChild->GetNextSibling();
1261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ToNode(GetXFAObject())->RemoveChild(pHeadChild, true);
1262d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pHeadChild = pSibling;
1263d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1264d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1265d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::unique_ptr<CXFA_Node> pProtoForm(pProtoNode->CloneTemplateToForm(true));
1266d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pHeadChild = pProtoForm->GetFirstChild();
1267d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  while (pHeadChild) {
1268d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* pSibling = pHeadChild->GetNextSibling();
1269d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pProtoForm->RemoveChild(pHeadChild, true);
1270d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ToNode(GetXFAObject())->InsertChild(pHeadChild, nullptr);
1271d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pHeadChild = pSibling;
1272d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1273d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1274d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  GetDocument()->RemovePurgeNode(pProtoForm.get());
1275d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1276d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1277d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Attribute_BOOL(CFXJSE_Value* pValue,
1278d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                       bool bSetting,
1279d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                       XFA_Attribute eAttribute) {
1280d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting) {
1281d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    SetBoolean(eAttribute, pValue->ToBoolean(), true);
1282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1283d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1284d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pValue->SetString(GetBoolean(eAttribute) ? "1" : "0");
1285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1286d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1287d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Attribute_Integer(CFXJSE_Value* pValue,
1288d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          bool bSetting,
1289d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          XFA_Attribute eAttribute) {
1290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting) {
1291d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    SetInteger(eAttribute, pValue->ToInteger(), true);
1292d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pValue->SetInteger(GetInteger(eAttribute));
1295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1297d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Som_FontColor(CFXJSE_Value* pValue,
1298d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                      bool bSetting,
1299d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                      XFA_Attribute eAttribute) {
1300d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Font* font = ToNode(object_.Get())->GetOrCreateFontIfPossible();
1301d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!font)
1302d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1304d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting) {
1305d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t r;
1306d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t g;
1307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t b;
1308d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    std::tie(r, g, b) = StrToRGB(pValue->ToWideString());
1309d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    FX_ARGB color = ArgbEncode(0xff, r, g, b);
1310d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    font->SetColor(color);
1311d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1312d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1313d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1314d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t a;
1315d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t r;
1316d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t g;
1317d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t b;
1318d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::tie(a, r, g, b) = ArgbDecode(font->GetColor());
1319d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pValue->SetString(ByteString::Format("%d,%d,%d", r, g, b).AsStringView());
1320d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1321d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1322d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Som_FillColor(CFXJSE_Value* pValue,
1323d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                      bool bSetting,
1324d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                      XFA_Attribute eAttribute) {
1325d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Border* border = ToNode(object_.Get())->GetOrCreateBorderIfPossible();
1326d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Fill* borderfill = border->GetOrCreateFillIfPossible();
1327d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!borderfill)
1328d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1329d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1330d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting) {
1331d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t r;
1332d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t g;
1333d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t b;
1334d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    std::tie(r, g, b) = StrToRGB(pValue->ToWideString());
1335d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    FX_ARGB color = ArgbEncode(0xff, r, g, b);
1336d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    borderfill->SetColor(color);
1337d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1338d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1339d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1340d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  FX_ARGB color = borderfill->GetColor(false);
1341d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t a;
1342d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t r;
1343d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t g;
1344d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t b;
1345d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::tie(a, r, g, b) = ArgbDecode(color);
1346d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pValue->SetString(
1347d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString::Format(L"%d,%d,%d", r, g, b).UTF8Encode().AsStringView());
1348d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1349d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1350d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Som_BorderColor(CFXJSE_Value* pValue,
1351d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                        bool bSetting,
1352d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                        XFA_Attribute eAttribute) {
1353d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Border* border = ToNode(object_.Get())->GetOrCreateBorderIfPossible();
1354d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iSize = border->CountEdges();
1355d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting) {
1356d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t r = 0;
1357d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t g = 0;
1358d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t b = 0;
1359d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    std::tie(r, g, b) = StrToRGB(pValue->ToWideString());
1360d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    FX_ARGB rgb = ArgbEncode(100, r, g, b);
1361d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (int32_t i = 0; i < iSize; ++i) {
1362d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Edge* edge = border->GetEdgeIfExists(i);
1363d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (edge)
1364d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        edge->SetColor(rgb);
1365d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1366d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1367d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1368d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1369d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1370d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Edge* edge = border->GetEdgeIfExists(0);
1371d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  FX_ARGB color = edge ? edge->GetColor() : CXFA_Edge::kDefaultColor;
1372d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t a;
1373d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t r;
1374d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t g;
1375d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t b;
1376d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::tie(a, r, g, b) = ArgbDecode(color);
1377d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pValue->SetString(
1378d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString::Format(L"%d,%d,%d", r, g, b).UTF8Encode().AsStringView());
1379d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1380d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1381d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Som_BorderWidth(CFXJSE_Value* pValue,
1382d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                        bool bSetting,
1383d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                        XFA_Attribute eAttribute) {
1384d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Border* border = ToNode(object_.Get())->GetOrCreateBorderIfPossible();
1385d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting) {
1386d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Edge* edge = border->GetEdgeIfExists(0);
1387d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Measurement thickness =
1388d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        edge ? edge->GetMSThickness() : CXFA_Measurement(0.5, XFA_Unit::Pt);
1389d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pValue->SetString(thickness.ToString().UTF8Encode().AsStringView());
1390d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1391d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1392d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1393d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsThickness = pValue->ToWideString();
1394d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (int32_t i = 0; i < border->CountEdges(); ++i) {
1395d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Edge* edge = border->GetEdgeIfExists(i);
1396d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (edge)
1397d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      edge->SetMSThickness(CXFA_Measurement(wsThickness.AsStringView()));
1398d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1399d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1400d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1401d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Som_Message(CFXJSE_Value* pValue,
1402d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                    bool bSetting,
1403d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                    XFA_SOM_MESSAGETYPE iMessageType) {
1404d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool bNew = false;
1405d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Validate* validate = ToNode(object_.Get())->GetValidateIfExists();
1406d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!validate) {
1407d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    validate = ToNode(object_.Get())->GetOrCreateValidateIfPossible();
1408d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    bNew = true;
1409d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1410d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1411d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting) {
1412d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (validate) {
1413d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      switch (iMessageType) {
1414d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        case XFA_SOM_ValidationMessage:
1415d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          validate->SetScriptMessageText(pValue->ToWideString());
1416d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
1417d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        case XFA_SOM_FormatMessage:
1418d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          validate->SetFormatMessageText(pValue->ToWideString());
1419d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
1420d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        case XFA_SOM_MandatoryMessage:
1421d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          validate->SetNullMessageText(pValue->ToWideString());
1422d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
1423d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        default:
1424d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
1425d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1426d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1427d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1428d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!bNew) {
1429d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_FFNotify* pNotify = GetDocument()->GetNotify();
1430d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!pNotify)
1431d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return;
1432d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1433d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pNotify->AddCalcValidate(ToNode(GetXFAObject()));
1434d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1435d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1436d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1437d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1438d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!validate) {
1439d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    // TODO(dsinclair): Better error message?
1440d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ThrowInvalidPropertyException();
1441d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1442d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1443d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1444d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsMessage;
1445d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (iMessageType) {
1446d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_SOM_ValidationMessage:
1447d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      wsMessage = validate->GetScriptMessageText();
1448d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1449d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_SOM_FormatMessage:
1450d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      wsMessage = validate->GetFormatMessageText();
1451d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1452d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_SOM_MandatoryMessage:
1453d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      wsMessage = validate->GetNullMessageText();
1454d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1455d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
1456d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1457d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1458d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pValue->SetString(wsMessage.UTF8Encode().AsStringView());
1459d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1460d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1461d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Som_ValidationMessage(CFXJSE_Value* pValue,
1462d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              bool bSetting,
1463d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              XFA_Attribute eAttribute) {
1464d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Script_Som_Message(pValue, bSetting, XFA_SOM_ValidationMessage);
1465d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1466d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1467d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Som_MandatoryMessage(CFXJSE_Value* pValue,
1468d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                             bool bSetting,
1469d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                             XFA_Attribute eAttribute) {
1470d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Script_Som_Message(pValue, bSetting, XFA_SOM_MandatoryMessage);
1471d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1472d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1473d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Field_Length(CFXJSE_Value* pValue,
1474d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                     bool bSetting,
1475d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                     XFA_Attribute eAttribute) {
1476d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting) {
1477d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ThrowInvalidPropertyException();
1478d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1479d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1480d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!ToNode(object_.Get())->GetWidgetAcc()) {
1481d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pValue->SetInteger(0);
1482d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1483d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1484d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pValue->SetInteger(
1485d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      ToNode(object_.Get())->GetWidgetAcc()->CountChoiceListItems(true));
1486d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1487d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1488d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Som_DefaultValue(CFXJSE_Value* pValue,
1489d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                         bool bSetting,
1490d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                         XFA_Attribute /* unused */) {
1491d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_Element eType = ToNode(GetXFAObject())->GetElementType();
1492d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1493d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  // TODO(dsinclair): This should look through the properties on the node to see
1494d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  // if defaultValue is defined and, if so, call that one. Just have to make
1495d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  // sure that those defaultValue calls don't call back to this one ....
1496d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eType == XFA_Element::Field) {
1497d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    static_cast<CJX_Field*>(this)->defaultValue(pValue, bSetting,
1498d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                XFA_Attribute::Unknown);
1499d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1500d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1501d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eType == XFA_Element::Draw) {
1502d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    static_cast<CJX_Draw*>(this)->defaultValue(pValue, bSetting,
1503d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                               XFA_Attribute::Unknown);
1504d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1505d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1506d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eType == XFA_Element::Boolean) {
1507d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    static_cast<CJX_Boolean*>(this)->defaultValue(pValue, bSetting,
1508d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                  XFA_Attribute::Unknown);
1509d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1510d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1511d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1512d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting) {
1513d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsNewValue;
1514d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pValue && !(pValue->IsNull() || pValue->IsUndefined()))
1515d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      wsNewValue = pValue->ToWideString();
1516d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1517d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsFormatValue(wsNewValue);
1518d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_WidgetAcc* pContainerWidgetAcc = nullptr;
1519d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (ToNode(GetXFAObject())->GetPacketType() == XFA_PacketType::Datasets) {
1520d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsPicture;
1521d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      for (const auto& pFormNode : *(ToNode(GetXFAObject())->GetBindItems())) {
1522d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!pFormNode || pFormNode->HasRemovedChildren())
1523d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          continue;
1524d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1525d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pContainerWidgetAcc = pFormNode->GetContainerWidgetAcc();
1526d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (pContainerWidgetAcc) {
1527d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          wsPicture =
1528d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              pContainerWidgetAcc->GetPictureContent(XFA_VALUEPICTURE_DataBind);
1529d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
1530d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!wsPicture.IsEmpty())
1531d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
1532d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1533d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pContainerWidgetAcc = nullptr;
1534d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1535d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    } else if (ToNode(GetXFAObject())->GetPacketType() ==
1536d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann               XFA_PacketType::Form) {
1537d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pContainerWidgetAcc = ToNode(GetXFAObject())->GetContainerWidgetAcc();
1538d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1539d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1540d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pContainerWidgetAcc)
1541d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      wsFormatValue = pContainerWidgetAcc->GetFormatDataValue(wsNewValue);
1542d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1543d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    SetContent(wsNewValue, wsFormatValue, true, true, true);
1544d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1545d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1546d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1547d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString content = GetContent(true);
1548d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (content.IsEmpty() && eType != XFA_Element::Text &&
1549d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      eType != XFA_Element::SubmitUrl) {
1550d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pValue->SetNull();
1551d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else if (eType == XFA_Element::Integer) {
1552d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pValue->SetInteger(FXSYS_wtoi(content.c_str()));
1553d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else if (eType == XFA_Element::Float || eType == XFA_Element::Decimal) {
1554d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CFX_Decimal decimal(content.AsStringView());
1555d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pValue->SetFloat((float)(double)decimal);
1556d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else {
1557d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pValue->SetString(content.UTF8Encode().AsStringView());
1558d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1559d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1560d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1561d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Som_DefaultValue_Read(CFXJSE_Value* pValue,
1562d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              bool bSetting,
1563d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              XFA_Attribute eAttribute) {
1564d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting) {
1565d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ThrowInvalidPropertyException();
1566d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1567d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1568d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1569d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString content = GetContent(true);
1570d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (content.IsEmpty()) {
1571d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pValue->SetNull();
1572d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1573d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1574d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pValue->SetString(content.UTF8Encode().AsStringView());
1575d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1576d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1577d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Som_DataNode(CFXJSE_Value* pValue,
1578d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                     bool bSetting,
1579d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                     XFA_Attribute eAttribute) {
1580d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting) {
1581d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ThrowInvalidPropertyException();
1582d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1583d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1584d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1585d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pDataNode = ToNode(GetXFAObject())->GetBindData();
1586d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pDataNode) {
1587d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pValue->SetNull();
1588d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1589d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1590d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1591d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pValue->Assign(
1592d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetDocument()->GetScriptContext()->GetJSValueFromMap(pDataNode));
1593d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1594d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1595d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Som_Mandatory(CFXJSE_Value* pValue,
1596d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                      bool bSetting,
1597d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                      XFA_Attribute eAttribute) {
1598d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Validate* validate =
1599d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      ToNode(object_.Get())->GetOrCreateValidateIfPossible();
1600d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!validate)
1601d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1602d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1603d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting) {
1604d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    validate->SetNullTest(pValue->ToWideString());
1605d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1606d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1607d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1608d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString str = CXFA_Node::AttributeEnumToName(validate->GetNullTest());
1609d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pValue->SetString(str.UTF8Encode().AsStringView());
1610d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1611d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1612d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Som_InstanceIndex(CFXJSE_Value* pValue,
1613d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          bool bSetting,
1614d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          XFA_Attribute eAttribute) {
1615d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!bSetting) {
1616d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pValue->SetInteger(Subform_and_SubformSet_InstanceIndex());
1617d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1618d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1619d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1620d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iTo = pValue->ToInteger();
1621d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iFrom = Subform_and_SubformSet_InstanceIndex();
1622d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pManagerNode = nullptr;
1623d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = ToNode(GetXFAObject())->GetPrevSibling(); pNode;
1624d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pNode = pNode->GetPrevSibling()) {
1625d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNode->GetElementType() == XFA_Element::InstanceManager) {
1626d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pManagerNode = pNode;
1627d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1628d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1629d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1630d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pManagerNode)
1631d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1632d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1633d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto* mgr = static_cast<CJX_InstanceManager*>(pManagerNode->JSObject());
1634d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  mgr->MoveInstance(iTo, iFrom);
1635d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_FFNotify* pNotify = GetDocument()->GetNotify();
1636d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pNotify)
1637d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1638d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1639d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pToInstance = pManagerNode->GetItemIfExists(iTo);
1640d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pToInstance && pToInstance->GetElementType() == XFA_Element::Subform) {
1641d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNotify->RunSubformIndexChange(pToInstance);
1642d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1643d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1644d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pFromInstance = pManagerNode->GetItemIfExists(iFrom);
1645d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pFromInstance &&
1646d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pFromInstance->GetElementType() == XFA_Element::Subform) {
1647d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNotify->RunSubformIndexChange(pFromInstance);
1648d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1649d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1650d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1651d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Subform_InstanceManager(CFXJSE_Value* pValue,
1652d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                bool bSetting,
1653d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                XFA_AttributeEnum eAttribute) {
1654d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting) {
1655d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ThrowInvalidPropertyException();
1656d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1657d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1658d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1659d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsName = GetCData(XFA_Attribute::Name);
1660d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pInstanceMgr = nullptr;
1661d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = ToNode(GetXFAObject())->GetPrevSibling(); pNode;
1662d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pNode = pNode->GetPrevSibling()) {
1663d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNode->GetElementType() == XFA_Element::InstanceManager) {
1664d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsInstMgrName =
1665d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pNode->JSObject()->GetCData(XFA_Attribute::Name);
1666d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (wsInstMgrName.GetLength() >= 1 && wsInstMgrName[0] == '_' &&
1667d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          wsInstMgrName.Right(wsInstMgrName.GetLength() - 1) == wsName) {
1668d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pInstanceMgr = pNode;
1669d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1670d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1671d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1672d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1673d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pInstanceMgr) {
1674d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pValue->SetNull();
1675d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1676d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1677d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1678d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pValue->Assign(
1679d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetDocument()->GetScriptContext()->GetJSValueFromMap(pInstanceMgr));
1680d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1681d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1682d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_SubmitFormat_Mode(CFXJSE_Value* pValue,
1683d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          bool bSetting,
1684d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          XFA_Attribute eAttribute) {}
1685d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1686d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_Form_Checksum(CFXJSE_Value* pValue,
1687d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                      bool bSetting,
1688d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                      XFA_Attribute eAttribute) {
1689d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting) {
1690d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    SetAttribute(XFA_Attribute::Checksum, pValue->ToWideString().AsStringView(),
1691d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                 false);
1692d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1693d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1694d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1695d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<WideString> checksum = TryAttribute(XFA_Attribute::Checksum, false);
1696d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pValue->SetString(checksum ? checksum->UTF8Encode().AsStringView() : "");
1697d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1698d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1699d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CJX_Object::Script_ExclGroup_ErrorText(CFXJSE_Value* pValue,
1700d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                            bool bSetting,
1701d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                            XFA_Attribute eAttribute) {
1702d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bSetting)
1703d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ThrowInvalidPropertyException();
1704d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1705