Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
cjx_object.h
Go to the documentation of this file.
1// Copyright 2017 The PDFium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#ifndef FXJS_XFA_CJX_OBJECT_H_
8#define FXJS_XFA_CJX_OBJECT_H_
9
10#include <map>
11#include <memory>
12#include <vector>
13
14#include "core/fxcrt/widestring.h"
15#include "fxjs/gc/heap.h"
16#include "fxjs/xfa/fxjse.h"
17#include "fxjs/xfa/jse_define.h"
18#include "third_party/abseil-cpp/absl/types/optional.h"
19#include "third_party/base/containers/span.h"
20#include "v8/include/cppgc/garbage-collected.h"
21#include "v8/include/cppgc/member.h"
22#include "v8/include/v8-forward.h"
23#include "xfa/fxfa/fxfa_basic.h"
24
25class CFXJSE_Engine;
27class CFX_XMLElement;
28class CJX_Object;
29class CXFA_Document;
30class CXFA_LayoutItem;
32class CXFA_Node;
33class CXFA_Object;
34
35using CJX_MethodCall =
36 CJS_Result (*)(CJX_Object* obj,
37 CFXJSE_Engine* runtime,
38 pdfium::span<v8::Local<v8::Value>> params);
39
41 const char* pName;
42 CJX_MethodCall pMethodCall;
43};
44
46 public CFXJSE_HostObject {
47 public:
48 // Corresponds 1:1 with CJX_ subclasses.
86
88 public:
91
92 void Trace(cppgc::Visitor* visitor) const;
93
95
96 private:
97 CalcData();
98 };
99
101 ~CJX_Object() override;
102
103 // CFXJSE_HostObject:
104 CJX_Object* AsCJXObject() override;
105
106 virtual void Trace(cppgc::Visitor* visitor) const;
107 virtual bool DynamicTypeIs(TypeTag eType) const;
108
109 JSE_PROP(className);
110
111 CXFA_Document* GetDocument() const;
112 CXFA_Node* GetXFANode() const;
113 CXFA_Object* GetXFAObject() const { return object_; }
114
115 void SetCalcRecursionCount(size_t count) { calc_recursion_count_ = count; }
116 size_t GetCalcRecursionCount() const { return calc_recursion_count_; }
117
118 void SetLayoutItem(CXFA_LayoutItem* item) { layout_item_ = item; }
119 CXFA_LayoutItem* GetLayoutItem() const { return layout_item_; }
120
121 bool HasMethod(const WideString& func) const;
122 CJS_Result RunMethod(CFXJSE_Engine* pScriptContext,
123 const WideString& func,
125
126 bool HasAttribute(XFA_Attribute eAttr) const;
127 WideString GetAttributeByString(WideStringView attr) const;
128 WideString GetAttributeByEnum(XFA_Attribute attr) const;
130 bool bUseDefault) const;
132 const WideString& wsValue,
133 bool bNotify);
134 void SetAttributeByString(WideStringView wsAttr, const WideString& wsValue);
135 void RemoveAttribute(WideStringView wsAttr);
136
137 WideString GetContent(bool bScriptModify) const;
138 absl::optional<WideString> TryContent(bool bScriptModify, bool bProto) const;
139 void SetContent(const WideString& wsContent,
140 const WideString& wsXMLValue,
141 bool bNotify,
142 bool bScriptModify,
143 bool bSyncData);
144
145 template <typename T>
146 T* GetProperty(int32_t index, XFA_Element eType) const {
147 return static_cast<T*>(GetPropertyInternal(index, eType));
148 }
149 template <typename T>
150 T* GetOrCreateProperty(int32_t index, XFA_Element eType) {
151 return static_cast<T*>(GetOrCreatePropertyInternal(index, eType));
152 }
153
154 void SetAttributeValue(const WideString& wsValue,
155 const WideString& wsXMLValue);
156
157 // Not actual properties, but invoked as property handlers to cover
158 // a broad range of underlying properties.
159 JSE_PROP(ScriptAttributeString);
160 JSE_PROP(ScriptAttributeBool);
161 JSE_PROP(ScriptAttributeInteger);
162 JSE_PROP(ScriptSomFontColor);
163 JSE_PROP(ScriptSomFillColor);
164 JSE_PROP(ScriptSomBorderColor);
165 JSE_PROP(ScriptSomBorderWidth);
166 JSE_PROP(ScriptSomValidationMessage);
167 JSE_PROP(ScriptSomMandatoryMessage);
168 JSE_PROP(ScriptSomDefaultValue);
169 JSE_PROP(ScriptSomDefaultValue_Read);
170 JSE_PROP(ScriptSomDataNode);
171 JSE_PROP(ScriptSomMandatory);
172 JSE_PROP(ScriptSomInstanceIndex);
173 JSE_PROP(ScriptSubmitFormatMode);
174
176
177 int32_t GetInteger(XFA_Attribute eAttr) const;
179 bool bUseDefault) const;
180 void SetInteger(XFA_Attribute eAttr, int32_t iValue, bool bNotify);
181
182 WideString GetCData(XFA_Attribute eAttr) const;
184 bool bUseDefault) const;
185 void SetCData(XFA_Attribute eAttr, const WideString& wsValue);
186
189 bool bUseDefault) const;
190 void SetEnum(XFA_Attribute eAttr, XFA_AttributeValue eValue, bool bNotify);
191
192 bool GetBoolean(XFA_Attribute eAttr) const;
193 absl::optional<bool> TryBoolean(XFA_Attribute eAttr, bool bUseDefault) const;
194 void SetBoolean(XFA_Attribute eAttr, bool bValue, bool bNotify);
195
197 float GetMeasureInUnit(XFA_Attribute eAttr, XFA_Unit unit) const;
199 bool bUseDefault) const;
200 absl::optional<float> TryMeasureAsFloat(XFA_Attribute attr) const;
201 void SetMeasure(XFA_Attribute eAttr,
202 const CXFA_Measurement& mValue,
203 bool bNotify);
204
205 void MergeAllData(CXFA_Object* pDstObj);
206
207 CalcData* GetCalcData() const { return calc_data_; }
208 CalcData* GetOrCreateCalcData(cppgc::Heap* heap);
209 void TakeCalcDataFrom(CJX_Object* that);
210
211 void ThrowInvalidPropertyException(v8::Isolate* pIsolate) const;
212 void ThrowArgumentMismatchException(v8::Isolate* pIsolate) const;
213 void ThrowIndexOutOfBoundsException(v8::Isolate* pIsolate) const;
214 void ThrowParamCountMismatchException(v8::Isolate* pIsolate,
215 const WideString& method) const;
216 void ThrowTooManyOccurrencesException(v8::Isolate* pIsolate,
217 const WideString& obj) const;
218
219 protected:
225
226 explicit CJX_Object(CXFA_Object* obj);
227
228 void ScriptSomMessage(v8::Isolate* pIsolate,
229 v8::Local<v8::Value>* pValue,
230 bool bSetting,
231 SOMMessageType iMessageType);
232 void SetAttributeValueImpl(const WideString& wsValue,
233 const WideString& wsXMLValue,
234 bool bNotify,
235 bool bScriptModify);
236 void SetCDataImpl(XFA_Attribute eAttr,
237 const WideString& wsValue,
238 bool bNotify,
239 bool bScriptModify);
240 void DefineMethods(pdfium::span<const CJX_MethodSpec> methods);
241 void MoveBufferMapData(CXFA_Object* pSrcObj, CXFA_Object* pDstObj);
242 void ThrowException(v8::Isolate* pIsolate, const WideString& str) const;
243
244 private:
245 using Type__ = CJX_Object;
246 static const TypeTag static_type__ = TypeTag::Object;
247
248 CXFA_Node* GetPropertyInternal(int32_t index, XFA_Element eType) const;
249 CXFA_Node* GetOrCreatePropertyInternal(int32_t index, XFA_Element eType);
250
251 void OnChanging(XFA_Attribute eAttr);
252 void OnChanged(XFA_Attribute eAttr, bool bScriptModify);
253
254 // Returns a pointer to the XML node that needs to be updated with the new
255 // attribute value. |nullptr| if no update is needed.
256 CFX_XMLElement* SetValue(XFA_Attribute eAttr, int32_t value, bool bNotify);
257 int32_t Subform_and_SubformSet_InstanceIndex();
258
259 CFXJSE_MapModule* CreateMapModule();
260 CFXJSE_MapModule* GetMapModule() const;
261 void SetMapModuleValue(uint32_t key, int32_t value);
262 void SetMapModuleString(uint32_t key, const WideString& wsValue);
263 void SetMapModuleMeasurement(uint32_t key, const CXFA_Measurement& value);
264 absl::optional<int32_t> GetMapModuleValue(uint32_t key) const;
265 absl::optional<WideString> GetMapModuleString(uint32_t key) const;
266 absl::optional<CXFA_Measurement> GetMapModuleMeasurement(uint32_t key) const;
267 absl::optional<int32_t> GetMapModuleValueFollowingChain(uint32_t key) const;
268 absl::optional<WideString> GetMapModuleStringFollowingChain(
269 uint32_t key) const;
270 absl::optional<CXFA_Measurement> GetMapModuleMeasurementFollowingChain(
271 uint32_t key) const;
272 bool HasMapModuleKey(uint32_t key) const;
273 void RemoveMapModuleKey(uint32_t key);
274 void MoveBufferMapData(CXFA_Object* pDstObj);
275
276 cppgc::Member<CXFA_Object> object_;
277 cppgc::Member<CXFA_LayoutItem> layout_item_;
278 cppgc::Member<CalcData> calc_data_;
279 std::unique_ptr<CFXJSE_MapModule> map_module_;
280 std::map<ByteString, CJX_MethodCall> method_specs_;
281 size_t calc_recursion_count_ = 0;
282};
283
284#endif // FXJS_XFA_CJX_OBJECT_H_
void FXJSE_ClearObjectBinding(v8::Local< v8::Object > hJSObject)
CFXJSE_HostObject * FXJSE_RetrieveObjectBinding(v8::Local< v8::Value > hValue)
void FXJSE_UpdateObjectBinding(v8::Local< v8::Object > hObject, CFXJSE_HostObject *pNewBinding)
static CFXJSE_Class * Create(CFXJSE_Context *pContext, const FXJSE_CLASS_DESCRIPTOR *pClassDescriptor, bool bIsJSGlobal)
v8::Local< v8::Object > GetGlobalObject()
v8::Local< v8::Context > GetContext()
ExecutionResult ExecuteScript(ByteStringView bsScript, v8::Local< v8::Object > pNewThisObject)
void AddClass(std::unique_ptr< CFXJSE_Class > pClass)
CFXJSE_Class * GetClassByName(ByteStringView szName) const
friend class EventParamScope
CFXJSE_ScopeUtil_IsolateHandleContext(CFXJSE_Context *pContext)
void Trace(cppgc::Visitor *visitor) const
virtual void Trace(cppgc::Visitor *visitor) const
WideString GetAttributeByString(WideStringView attr) const
void RemoveAttribute(WideStringView wsAttr)
void ScriptSomMessage(v8::Isolate *pIsolate, v8::Local< v8::Value > *pValue, bool bSetting, SOMMessageType iMessageType)
size_t GetCalcRecursionCount() const
Definition cjx_object.h:116
float GetMeasureInUnit(XFA_Attribute eAttr, XFA_Unit unit) const
void DefineMethods(pdfium::span< const CJX_MethodSpec > methods)
~CJX_Object() override
void SetCDataImpl(XFA_Attribute eAttr, const WideString &wsValue, bool bNotify, bool bScriptModify)
WideString GetContent(bool bScriptModify) const
bool HasMethod(const WideString &func) const
CJX_Object * AsCJXObject() override
CXFA_Object * GetXFAObject() const
Definition cjx_object.h:113
absl::optional< CXFA_Measurement > TryMeasure(XFA_Attribute eAttr, bool bUseDefault) const
CJS_Result RunMethod(CFXJSE_Engine *pScriptContext, const WideString &func, pdfium::span< v8::Local< v8::Value > > params)
void ThrowArgumentMismatchException(v8::Isolate *pIsolate) const
void ThrowIndexOutOfBoundsException(v8::Isolate *pIsolate) const
void SetAttributeByEnum(XFA_Attribute eAttr, const WideString &wsValue, bool bNotify)
void ThrowInvalidPropertyException(v8::Isolate *pIsolate) const
CXFA_Document * GetDocument() const
void ThrowParamCountMismatchException(v8::Isolate *pIsolate, const WideString &method) const
void SetCData(XFA_Attribute eAttr, const WideString &wsValue)
void SetBoolean(XFA_Attribute eAttr, bool bValue, bool bNotify)
absl::optional< WideString > TryCData(XFA_Attribute eAttr, bool bUseDefault) const
T * GetProperty(int32_t index, XFA_Element eType) const
Definition cjx_object.h:146
absl::optional< bool > TryBoolean(XFA_Attribute eAttr, bool bUseDefault) const
void SetInteger(XFA_Attribute eAttr, int32_t iValue, bool bNotify)
XFA_AttributeValue GetEnum(XFA_Attribute eAttr) const
void SetAttributeByString(WideStringView wsAttr, const WideString &wsValue)
bool GetBoolean(XFA_Attribute eAttr) const
virtual bool DynamicTypeIs(TypeTag eType) const
void MoveBufferMapData(CXFA_Object *pSrcObj, CXFA_Object *pDstObj)
void SetLayoutItem(CXFA_LayoutItem *item)
Definition cjx_object.h:118
bool HasAttribute(XFA_Attribute eAttr) const
int32_t GetInteger(XFA_Attribute eAttr) const
WideString GetCData(XFA_Attribute eAttr) const
void TakeCalcDataFrom(CJX_Object *that)
void ThrowException(v8::Isolate *pIsolate, const WideString &str) const
absl::optional< XFA_AttributeValue > TryEnum(XFA_Attribute eAttr, bool bUseDefault) const
absl::optional< WideString > TryAttribute(XFA_Attribute eAttr, bool bUseDefault) const
CXFA_Node * GetXFANode() const
CXFA_LayoutItem * GetLayoutItem() const
Definition cjx_object.h:119
void SetEnum(XFA_Attribute eAttr, XFA_AttributeValue eValue, bool bNotify)
void SetContent(const WideString &wsContent, const WideString &wsXMLValue, bool bNotify, bool bScriptModify, bool bSyncData)
absl::optional< int32_t > TryInteger(XFA_Attribute eAttr, bool bUseDefault) const
CXFA_Measurement GetMeasure(XFA_Attribute eAttr) const
void SetAttributeValue(const WideString &wsValue, const WideString &wsXMLValue)
void SetMeasure(XFA_Attribute eAttr, const CXFA_Measurement &mValue, bool bNotify)
absl::optional< WideString > TryContent(bool bScriptModify, bool bProto) const
absl::optional< float > TryMeasureAsFloat(XFA_Attribute attr) const
void MergeAllData(CXFA_Object *pDstObj)
CalcData * GetCalcData() const
Definition cjx_object.h:207
void SetCalcRecursionCount(size_t count)
Definition cjx_object.h:115
absl::optional< WideString > TryNamespace() const
WideString GetAttributeByEnum(XFA_Attribute attr) const
CalcData * GetOrCreateCalcData(cppgc::Heap *heap)
void SetAttributeValueImpl(const WideString &wsValue, const WideString &wsXMLValue, bool bNotify, bool bScriptModify)
CJX_Object(CXFA_Object *obj)
T * GetOrCreateProperty(int32_t index, XFA_Element eType)
Definition cjx_object.h:150
void ThrowTooManyOccurrencesException(v8::Isolate *pIsolate, const WideString &obj) const
XFA_Unit
Definition fxfa_basic.h:91
XFA_Attribute
Definition fxfa_basic.h:67
XFA_Element
Definition fxfa_basic.h:75
XFA_AttributeValue
Definition fxfa_basic.h:60
#define CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED
Definition heap.h:32
#define JSE_PROP(prop_name)
Definition jse_define.h:28
Definition heap.h:12
#define CHECK(cvref)
ExecutionResult & operator=(ExecutionResult &&that) noexcept
ExecutionResult(ExecutionResult &&that) noexcept
ExecutionResult(bool sts, std::unique_ptr< CFXJSE_Value > val)
CJX_MethodCall pMethodCall
Definition cjx_object.h:42
const char * pName
Definition cjx_object.h:41