blob: 484d883e9e4606672c5c4c3aab5801d94ac7c2c9 [file] [log] [blame]
kumarashishg826308d2023-06-23 13:21:22 +00001// Copyright 2017 The PDFium Authors
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -07002// 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#include "fxjs/xfa/cjx_layoutpseudomodel.h"
8
9#include <set>
Haibo Huang49cc9302020-04-27 16:14:24 -070010#include <utility>
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070011
12#include "core/fxcrt/fx_coordinates.h"
kumarashishg826308d2023-06-23 13:21:22 +000013#include "fxjs/fxv8.h"
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070014#include "fxjs/js_resources.h"
Haibo Huang49cc9302020-04-27 16:14:24 -070015#include "fxjs/xfa/cfxjse_class.h"
16#include "fxjs/xfa/cfxjse_engine.h"
kumarashishg826308d2023-06-23 13:21:22 +000017#include "third_party/base/containers/contains.h"
18#include "v8/include/cppgc/allocation.h"
19#include "v8/include/v8-object.h"
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070020#include "xfa/fxfa/cxfa_ffnotify.h"
Haibo Huang49cc9302020-04-27 16:14:24 -070021#include "xfa/fxfa/layout/cxfa_contentlayoutitem.h"
22#include "xfa/fxfa/layout/cxfa_layoutitem.h"
23#include "xfa/fxfa/layout/cxfa_layoutprocessor.h"
24#include "xfa/fxfa/layout/cxfa_traversestrategy_layoutitem.h"
25#include "xfa/fxfa/layout/cxfa_viewlayoutitem.h"
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070026#include "xfa/fxfa/parser/cscript_layoutpseudomodel.h"
27#include "xfa/fxfa/parser/cxfa_arraynodelist.h"
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070028#include "xfa/fxfa/parser/cxfa_document.h"
29#include "xfa/fxfa/parser/cxfa_form.h"
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070030#include "xfa/fxfa/parser/cxfa_measurement.h"
31#include "xfa/fxfa/parser/cxfa_node.h"
32#include "xfa/fxfa/parser/cxfa_nodeiteratortemplate.h"
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070033
34const CJX_MethodSpec CJX_LayoutPseudoModel::MethodSpecs[] = {
35 {"absPage", absPage_static},
36 {"absPageCount", absPageCount_static},
37 {"absPageCountInBatch", absPageCountInBatch_static},
38 {"absPageInBatch", absPageInBatch_static},
39 {"absPageSpan", absPageSpan_static},
40 {"h", h_static},
41 {"page", page_static},
42 {"pageContent", pageContent_static},
43 {"pageCount", pageCount_static},
44 {"pageSpan", pageSpan_static},
45 {"relayout", relayout_static},
46 {"relayoutPageArea", relayoutPageArea_static},
47 {"sheet", sheet_static},
48 {"sheetCount", sheetCount_static},
49 {"sheetCountInBatch", sheetCountInBatch_static},
50 {"sheetInBatch", sheetInBatch_static},
51 {"w", w_static},
52 {"x", x_static},
53 {"y", y_static}};
54
55CJX_LayoutPseudoModel::CJX_LayoutPseudoModel(CScript_LayoutPseudoModel* model)
56 : CJX_Object(model) {
Haibo Huang49cc9302020-04-27 16:14:24 -070057 DefineMethods(MethodSpecs);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070058}
59
kumarashishg826308d2023-06-23 13:21:22 +000060CJX_LayoutPseudoModel::~CJX_LayoutPseudoModel() = default;
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070061
Haibo Huang49cc9302020-04-27 16:14:24 -070062bool CJX_LayoutPseudoModel::DynamicTypeIs(TypeTag eType) const {
63 return eType == static_type__ || ParentType__::DynamicTypeIs(eType);
64}
65
kumarashishg826308d2023-06-23 13:21:22 +000066void CJX_LayoutPseudoModel::ready(v8::Isolate* pIsolate,
67 v8::Local<v8::Value>* pValue,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070068 bool bSetting,
69 XFA_Attribute eAttribute) {
70 CXFA_FFNotify* pNotify = GetDocument()->GetNotify();
71 if (!pNotify)
72 return;
73 if (bSetting) {
kumarashishg826308d2023-06-23 13:21:22 +000074 ThrowException(pIsolate,
75 WideString::FromASCII("Unable to set ready value."));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070076 return;
77 }
78
kumarashishg826308d2023-06-23 13:21:22 +000079 CXFA_FFDocView::LayoutStatus iStatus = pNotify->GetLayoutStatus();
80 const bool bReady = iStatus != CXFA_FFDocView::LayoutStatus::kNone &&
81 iStatus != CXFA_FFDocView::LayoutStatus::kStart;
82 *pValue = fxv8::NewBooleanHelper(pIsolate, bReady);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070083}
84
kumarashishg826308d2023-06-23 13:21:22 +000085CJS_Result CJX_LayoutPseudoModel::DoHWXYInternal(
86 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070087 const std::vector<v8::Local<v8::Value>>& params,
kumarashishg826308d2023-06-23 13:21:22 +000088 HWXY layoutModel) {
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070089 if (params.empty() || params.size() > 3)
Haibo Huang49cc9302020-04-27 16:14:24 -070090 return CJS_Result::Failure(JSMessage::kParamError);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070091
kumarashishg826308d2023-06-23 13:21:22 +000092 CXFA_Node* pNode = ToNode(runtime->ToXFAObject(params[0]));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070093 if (!pNode)
Haibo Huang49cc9302020-04-27 16:14:24 -070094 return CJS_Result::Success();
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070095
Haibo Huang49cc9302020-04-27 16:14:24 -070096 WideString unit = WideString::FromASCII("pt");
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070097 if (params.size() >= 2) {
98 WideString tmp_unit = runtime->ToWideString(params[1]);
99 if (!tmp_unit.IsEmpty())
Haibo Huang49cc9302020-04-27 16:14:24 -0700100 unit = std::move(tmp_unit);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700101 }
102 int32_t iIndex = params.size() >= 3 ? runtime->ToInt32(params[2]) : 0;
Haibo Huang49cc9302020-04-27 16:14:24 -0700103 auto* pDocLayout = CXFA_LayoutProcessor::FromDocument(GetDocument());
104 CXFA_ContentLayoutItem* pLayoutItem =
105 ToContentLayoutItem(pDocLayout->GetLayoutItem(pNode));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700106 if (!pLayoutItem)
Haibo Huang49cc9302020-04-27 16:14:24 -0700107 return CJS_Result::Success();
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700108
109 while (iIndex > 0 && pLayoutItem) {
110 pLayoutItem = pLayoutItem->GetNext();
111 --iIndex;
112 }
113
114 if (!pLayoutItem)
Haibo Huang49cc9302020-04-27 16:14:24 -0700115 return CJS_Result::Success(runtime->NewNumber(0.0));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700116
117 CXFA_Measurement measure;
kumarashishg826308d2023-06-23 13:21:22 +0000118 CFX_RectF rtRect = pLayoutItem->GetRelativeRect();
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700119 switch (layoutModel) {
kumarashishg826308d2023-06-23 13:21:22 +0000120 case HWXY::kH:
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700121 measure.Set(rtRect.height, XFA_Unit::Pt);
122 break;
kumarashishg826308d2023-06-23 13:21:22 +0000123 case HWXY::kW:
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700124 measure.Set(rtRect.width, XFA_Unit::Pt);
125 break;
kumarashishg826308d2023-06-23 13:21:22 +0000126 case HWXY::kX:
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700127 measure.Set(rtRect.left, XFA_Unit::Pt);
128 break;
kumarashishg826308d2023-06-23 13:21:22 +0000129 case HWXY::kY:
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700130 measure.Set(rtRect.top, XFA_Unit::Pt);
131 break;
132 }
133
Haibo Huang49cc9302020-04-27 16:14:24 -0700134 XFA_Unit eUnit = CXFA_Measurement::GetUnitFromString(unit.AsStringView());
135 if (eUnit == XFA_Unit::Unknown)
136 return CJS_Result::Failure(JSMessage::kValueError);
137
138 float fValue = measure.ToUnit(eUnit);
139 return CJS_Result::Success(
140 runtime->NewNumber(FXSYS_roundf(fValue * 1000) / 1000.0f));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700141}
142
Haibo Huang49cc9302020-04-27 16:14:24 -0700143CJS_Result CJX_LayoutPseudoModel::h(
kumarashishg826308d2023-06-23 13:21:22 +0000144 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700145 const std::vector<v8::Local<v8::Value>>& params) {
kumarashishg826308d2023-06-23 13:21:22 +0000146 return DoHWXYInternal(runtime, params, HWXY::kH);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700147}
148
Haibo Huang49cc9302020-04-27 16:14:24 -0700149CJS_Result CJX_LayoutPseudoModel::w(
kumarashishg826308d2023-06-23 13:21:22 +0000150 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700151 const std::vector<v8::Local<v8::Value>>& params) {
kumarashishg826308d2023-06-23 13:21:22 +0000152 return DoHWXYInternal(runtime, params, HWXY::kW);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700153}
154
Haibo Huang49cc9302020-04-27 16:14:24 -0700155CJS_Result CJX_LayoutPseudoModel::x(
kumarashishg826308d2023-06-23 13:21:22 +0000156 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700157 const std::vector<v8::Local<v8::Value>>& params) {
kumarashishg826308d2023-06-23 13:21:22 +0000158 return DoHWXYInternal(runtime, params, HWXY::kX);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700159}
160
Haibo Huang49cc9302020-04-27 16:14:24 -0700161CJS_Result CJX_LayoutPseudoModel::y(
kumarashishg826308d2023-06-23 13:21:22 +0000162 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700163 const std::vector<v8::Local<v8::Value>>& params) {
kumarashishg826308d2023-06-23 13:21:22 +0000164 return DoHWXYInternal(runtime, params, HWXY::kY);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700165}
166
kumarashishg826308d2023-06-23 13:21:22 +0000167CJS_Result CJX_LayoutPseudoModel::AllPageCount(CFXJSE_Engine* runtime) {
168 auto* pDocLayout = CXFA_LayoutProcessor::FromDocument(GetDocument());
169 return CJS_Result::Success(runtime->NewNumber(pDocLayout->CountPages()));
170}
171
172CJS_Result CJX_LayoutPseudoModel::NumberedPageCount(CFXJSE_Engine* runtime) {
Haibo Huang49cc9302020-04-27 16:14:24 -0700173 auto* pDocLayout = CXFA_LayoutProcessor::FromDocument(GetDocument());
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700174 int32_t iPageCount = 0;
175 int32_t iPageNum = pDocLayout->CountPages();
kumarashishg826308d2023-06-23 13:21:22 +0000176 for (int32_t i = 0; i < iPageNum; i++) {
177 CXFA_ViewLayoutItem* pLayoutPage = pDocLayout->GetPage(i);
178 if (!pLayoutPage)
179 continue;
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700180
kumarashishg826308d2023-06-23 13:21:22 +0000181 CXFA_Node* pMasterPage = pLayoutPage->GetMasterPage();
182 if (pMasterPage->JSObject()->GetInteger(XFA_Attribute::Numbered))
183 iPageCount++;
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700184 }
Haibo Huang49cc9302020-04-27 16:14:24 -0700185 return CJS_Result::Success(runtime->NewNumber(iPageCount));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700186}
187
Haibo Huang49cc9302020-04-27 16:14:24 -0700188CJS_Result CJX_LayoutPseudoModel::pageCount(
kumarashishg826308d2023-06-23 13:21:22 +0000189 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700190 const std::vector<v8::Local<v8::Value>>& params) {
kumarashishg826308d2023-06-23 13:21:22 +0000191 return NumberedPageCount(runtime);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700192}
193
Haibo Huang49cc9302020-04-27 16:14:24 -0700194CJS_Result CJX_LayoutPseudoModel::pageSpan(
kumarashishg826308d2023-06-23 13:21:22 +0000195 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700196 const std::vector<v8::Local<v8::Value>>& params) {
197 if (params.size() != 1)
Haibo Huang49cc9302020-04-27 16:14:24 -0700198 return CJS_Result::Failure(JSMessage::kParamError);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700199
kumarashishg826308d2023-06-23 13:21:22 +0000200 CXFA_Node* pNode = ToNode(runtime->ToXFAObject(params[0]));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700201 if (!pNode)
Haibo Huang49cc9302020-04-27 16:14:24 -0700202 return CJS_Result::Success();
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700203
Haibo Huang49cc9302020-04-27 16:14:24 -0700204 auto* pDocLayout = CXFA_LayoutProcessor::FromDocument(GetDocument());
205 CXFA_ContentLayoutItem* pLayoutItem =
206 ToContentLayoutItem(pDocLayout->GetLayoutItem(pNode));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700207 if (!pLayoutItem)
Haibo Huang49cc9302020-04-27 16:14:24 -0700208 return CJS_Result::Success(runtime->NewNumber(-1));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700209
210 int32_t iLast = pLayoutItem->GetLast()->GetPage()->GetPageIndex();
211 int32_t iFirst = pLayoutItem->GetFirst()->GetPage()->GetPageIndex();
212 int32_t iPageSpan = iLast - iFirst + 1;
Haibo Huang49cc9302020-04-27 16:14:24 -0700213 return CJS_Result::Success(runtime->NewNumber(iPageSpan));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700214}
215
Haibo Huang49cc9302020-04-27 16:14:24 -0700216CJS_Result CJX_LayoutPseudoModel::page(
kumarashishg826308d2023-06-23 13:21:22 +0000217 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700218 const std::vector<v8::Local<v8::Value>>& params) {
219 return PageInternals(runtime, params, false);
220}
221
222std::vector<CXFA_Node*> CJX_LayoutPseudoModel::GetObjArray(
223 CXFA_LayoutProcessor* pDocLayout,
224 int32_t iPageNo,
225 const WideString& wsType,
226 bool bOnPageArea) {
Haibo Huang49cc9302020-04-27 16:14:24 -0700227 CXFA_ViewLayoutItem* pLayoutPage = pDocLayout->GetPage(iPageNo);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700228 if (!pLayoutPage)
229 return std::vector<CXFA_Node*>();
230
231 std::vector<CXFA_Node*> retArray;
Haibo Huang49cc9302020-04-27 16:14:24 -0700232 if (wsType.EqualsASCII("pageArea")) {
233 if (pLayoutPage->GetFormNode())
234 retArray.push_back(pLayoutPage->GetFormNode());
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700235 return retArray;
236 }
Haibo Huang49cc9302020-04-27 16:14:24 -0700237 if (wsType.EqualsASCII("contentArea")) {
238 for (CXFA_LayoutItem* pItem = pLayoutPage->GetFirstChild(); pItem;
239 pItem = pItem->GetNextSibling()) {
240 if (pItem->GetFormNode()->GetElementType() == XFA_Element::ContentArea)
241 retArray.push_back(pItem->GetFormNode());
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700242 }
243 return retArray;
244 }
245 std::set<CXFA_Node*> formItems;
246 if (wsType.IsEmpty()) {
Haibo Huang49cc9302020-04-27 16:14:24 -0700247 if (pLayoutPage->GetFormNode())
248 retArray.push_back(pLayoutPage->GetFormNode());
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700249
Haibo Huang49cc9302020-04-27 16:14:24 -0700250 for (CXFA_LayoutItem* pItem = pLayoutPage->GetFirstChild(); pItem;
251 pItem = pItem->GetNextSibling()) {
252 if (pItem->GetFormNode()->GetElementType() == XFA_Element::ContentArea) {
253 retArray.push_back(pItem->GetFormNode());
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700254 if (!bOnPageArea) {
Haibo Huang49cc9302020-04-27 16:14:24 -0700255 CXFA_LayoutItemIterator iterator(pItem->GetFirstChild());
256 for (CXFA_LayoutItem* pChild = iterator.GetCurrent(); pChild;
257 pChild = iterator.MoveToNext()) {
258 CXFA_ContentLayoutItem* pItemChild = pChild->AsContentLayoutItem();
259 if (!pItemChild)
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700260 continue;
Haibo Huang49cc9302020-04-27 16:14:24 -0700261
262 XFA_Element eType = pItemChild->GetFormNode()->GetElementType();
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700263 if (eType != XFA_Element::Field && eType != XFA_Element::Draw &&
264 eType != XFA_Element::Subform && eType != XFA_Element::Area) {
265 continue;
266 }
kumarashishg826308d2023-06-23 13:21:22 +0000267 if (pdfium::Contains(formItems, pItemChild->GetFormNode()))
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700268 continue;
269
Haibo Huang49cc9302020-04-27 16:14:24 -0700270 formItems.insert(pItemChild->GetFormNode());
271 retArray.push_back(pItemChild->GetFormNode());
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700272 }
273 }
274 } else {
275 if (bOnPageArea) {
Haibo Huang49cc9302020-04-27 16:14:24 -0700276 CXFA_LayoutItemIterator iterator(pItem);
277 for (CXFA_LayoutItem* pChild = iterator.GetCurrent(); pChild;
278 pChild = iterator.MoveToNext()) {
279 CXFA_ContentLayoutItem* pItemChild = pChild->AsContentLayoutItem();
280 if (!pItemChild)
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700281 continue;
Haibo Huang49cc9302020-04-27 16:14:24 -0700282
283 XFA_Element eType = pItemChild->GetFormNode()->GetElementType();
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700284 if (eType != XFA_Element::Field && eType != XFA_Element::Draw &&
285 eType != XFA_Element::Subform && eType != XFA_Element::Area) {
286 continue;
287 }
kumarashishg826308d2023-06-23 13:21:22 +0000288 if (pdfium::Contains(formItems, pItemChild->GetFormNode()))
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700289 continue;
Haibo Huang49cc9302020-04-27 16:14:24 -0700290
291 formItems.insert(pItemChild->GetFormNode());
292 retArray.push_back(pItemChild->GetFormNode());
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700293 }
294 }
295 }
296 }
297 return retArray;
298 }
299
300 XFA_Element eType = XFA_Element::Unknown;
Haibo Huang49cc9302020-04-27 16:14:24 -0700301 if (wsType.EqualsASCII("field"))
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700302 eType = XFA_Element::Field;
Haibo Huang49cc9302020-04-27 16:14:24 -0700303 else if (wsType.EqualsASCII("draw"))
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700304 eType = XFA_Element::Draw;
Haibo Huang49cc9302020-04-27 16:14:24 -0700305 else if (wsType.EqualsASCII("subform"))
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700306 eType = XFA_Element::Subform;
Haibo Huang49cc9302020-04-27 16:14:24 -0700307 else if (wsType.EqualsASCII("area"))
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700308 eType = XFA_Element::Area;
309
310 if (eType != XFA_Element::Unknown) {
Haibo Huang49cc9302020-04-27 16:14:24 -0700311 for (CXFA_LayoutItem* pItem = pLayoutPage->GetFirstChild(); pItem;
312 pItem = pItem->GetNextSibling()) {
313 if (pItem->GetFormNode()->GetElementType() == XFA_Element::ContentArea) {
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700314 if (!bOnPageArea) {
Haibo Huang49cc9302020-04-27 16:14:24 -0700315 CXFA_LayoutItemIterator iterator(pItem->GetFirstChild());
316 for (CXFA_LayoutItem* pChild = iterator.GetCurrent(); pChild;
317 pChild = iterator.MoveToNext()) {
318 CXFA_ContentLayoutItem* pItemChild = pChild->AsContentLayoutItem();
319 if (!pItemChild)
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700320 continue;
Haibo Huang49cc9302020-04-27 16:14:24 -0700321 if (pItemChild->GetFormNode()->GetElementType() != eType)
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700322 continue;
kumarashishg826308d2023-06-23 13:21:22 +0000323 if (pdfium::Contains(formItems, pItemChild->GetFormNode()))
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700324 continue;
325
Haibo Huang49cc9302020-04-27 16:14:24 -0700326 formItems.insert(pItemChild->GetFormNode());
327 retArray.push_back(pItemChild->GetFormNode());
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700328 }
329 }
330 } else {
331 if (bOnPageArea) {
Haibo Huang49cc9302020-04-27 16:14:24 -0700332 CXFA_LayoutItemIterator iterator(pItem);
333 for (CXFA_LayoutItem* pChild = iterator.GetCurrent(); pChild;
334 pChild = iterator.MoveToNext()) {
335 CXFA_ContentLayoutItem* pItemChild = pChild->AsContentLayoutItem();
336 if (!pItemChild)
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700337 continue;
Haibo Huang49cc9302020-04-27 16:14:24 -0700338 if (pItemChild->GetFormNode()->GetElementType() != eType)
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700339 continue;
kumarashishg826308d2023-06-23 13:21:22 +0000340 if (pdfium::Contains(formItems, pItemChild->GetFormNode()))
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700341 continue;
342
Haibo Huang49cc9302020-04-27 16:14:24 -0700343 formItems.insert(pItemChild->GetFormNode());
344 retArray.push_back(pItemChild->GetFormNode());
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700345 }
346 }
347 }
348 }
349 }
350 return retArray;
351}
352
Haibo Huang49cc9302020-04-27 16:14:24 -0700353CJS_Result CJX_LayoutPseudoModel::pageContent(
kumarashishg826308d2023-06-23 13:21:22 +0000354 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700355 const std::vector<v8::Local<v8::Value>>& params) {
356 if (params.empty() || params.size() > 3)
Haibo Huang49cc9302020-04-27 16:14:24 -0700357 return CJS_Result::Failure(JSMessage::kParamError);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700358
359 int32_t iIndex = 0;
360 if (params.size() >= 1)
361 iIndex = runtime->ToInt32(params[0]);
362
363 WideString wsType;
364 if (params.size() >= 2)
365 wsType = runtime->ToWideString(params[1]);
366
367 bool bOnPageArea = false;
368 if (params.size() >= 3)
369 bOnPageArea = runtime->ToBoolean(params[2]);
370
371 CXFA_FFNotify* pNotify = GetDocument()->GetNotify();
372 if (!pNotify)
Haibo Huang49cc9302020-04-27 16:14:24 -0700373 return CJS_Result::Success();
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700374
kumarashishg826308d2023-06-23 13:21:22 +0000375 CXFA_Document* pDoc = GetDocument();
376 auto* pDocLayout = CXFA_LayoutProcessor::FromDocument(pDoc);
377 auto* pArrayNodeList = cppgc::MakeGarbageCollected<CXFA_ArrayNodeList>(
378 pDoc->GetHeap()->GetAllocationHandle(), pDoc);
379 pDoc->GetNodeOwner()->PersistList(pArrayNodeList);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700380 pArrayNodeList->SetArrayNodeList(
381 GetObjArray(pDocLayout, iIndex, wsType, bOnPageArea));
kumarashishg826308d2023-06-23 13:21:22 +0000382 return CJS_Result::Success(runtime->NewNormalXFAObject(pArrayNodeList));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700383}
384
Haibo Huang49cc9302020-04-27 16:14:24 -0700385CJS_Result CJX_LayoutPseudoModel::absPageCount(
kumarashishg826308d2023-06-23 13:21:22 +0000386 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700387 const std::vector<v8::Local<v8::Value>>& params) {
kumarashishg826308d2023-06-23 13:21:22 +0000388 return AllPageCount(runtime);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700389}
390
Haibo Huang49cc9302020-04-27 16:14:24 -0700391CJS_Result CJX_LayoutPseudoModel::absPageCountInBatch(
kumarashishg826308d2023-06-23 13:21:22 +0000392 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700393 const std::vector<v8::Local<v8::Value>>& params) {
Haibo Huang49cc9302020-04-27 16:14:24 -0700394 return CJS_Result::Success(runtime->NewNumber(0));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700395}
396
Haibo Huang49cc9302020-04-27 16:14:24 -0700397CJS_Result CJX_LayoutPseudoModel::sheetCountInBatch(
kumarashishg826308d2023-06-23 13:21:22 +0000398 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700399 const std::vector<v8::Local<v8::Value>>& params) {
Haibo Huang49cc9302020-04-27 16:14:24 -0700400 return CJS_Result::Success(runtime->NewNumber(0));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700401}
402
Haibo Huang49cc9302020-04-27 16:14:24 -0700403CJS_Result CJX_LayoutPseudoModel::relayout(
kumarashishg826308d2023-06-23 13:21:22 +0000404 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700405 const std::vector<v8::Local<v8::Value>>& params) {
406 CXFA_Node* pRootNode = GetDocument()->GetRoot();
Haibo Huang49cc9302020-04-27 16:14:24 -0700407 auto* pLayoutProcessor = GetDocument()->GetLayoutProcessor();
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700408 CXFA_Form* pFormRoot =
409 pRootNode->GetFirstChildByClass<CXFA_Form>(XFA_Element::Form);
Haibo Huang49cc9302020-04-27 16:14:24 -0700410 if (pFormRoot) {
kumarashishg826308d2023-06-23 13:21:22 +0000411 if (pFormRoot->GetFirstChild())
412 pLayoutProcessor->SetHasChangedContainer();
Haibo Huang49cc9302020-04-27 16:14:24 -0700413 }
kumarashishg826308d2023-06-23 13:21:22 +0000414 pLayoutProcessor->SetForceRelayout();
Haibo Huang49cc9302020-04-27 16:14:24 -0700415 return CJS_Result::Success();
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700416}
417
Haibo Huang49cc9302020-04-27 16:14:24 -0700418CJS_Result CJX_LayoutPseudoModel::absPageSpan(
kumarashishg826308d2023-06-23 13:21:22 +0000419 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700420 const std::vector<v8::Local<v8::Value>>& params) {
421 return pageSpan(runtime, params);
422}
423
Haibo Huang49cc9302020-04-27 16:14:24 -0700424CJS_Result CJX_LayoutPseudoModel::absPageInBatch(
kumarashishg826308d2023-06-23 13:21:22 +0000425 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700426 const std::vector<v8::Local<v8::Value>>& params) {
427 if (params.size() != 1)
Haibo Huang49cc9302020-04-27 16:14:24 -0700428 return CJS_Result::Failure(JSMessage::kParamError);
429
430 return CJS_Result::Success(runtime->NewNumber(0));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700431}
432
Haibo Huang49cc9302020-04-27 16:14:24 -0700433CJS_Result CJX_LayoutPseudoModel::sheetInBatch(
kumarashishg826308d2023-06-23 13:21:22 +0000434 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700435 const std::vector<v8::Local<v8::Value>>& params) {
436 if (params.size() != 1)
Haibo Huang49cc9302020-04-27 16:14:24 -0700437 return CJS_Result::Failure(JSMessage::kParamError);
438
439 return CJS_Result::Success(runtime->NewNumber(0));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700440}
441
Haibo Huang49cc9302020-04-27 16:14:24 -0700442CJS_Result CJX_LayoutPseudoModel::sheet(
kumarashishg826308d2023-06-23 13:21:22 +0000443 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700444 const std::vector<v8::Local<v8::Value>>& params) {
445 return PageInternals(runtime, params, true);
446}
447
Haibo Huang49cc9302020-04-27 16:14:24 -0700448CJS_Result CJX_LayoutPseudoModel::relayoutPageArea(
kumarashishg826308d2023-06-23 13:21:22 +0000449 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700450 const std::vector<v8::Local<v8::Value>>& params) {
Haibo Huang49cc9302020-04-27 16:14:24 -0700451 return CJS_Result::Success();
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700452}
453
Haibo Huang49cc9302020-04-27 16:14:24 -0700454CJS_Result CJX_LayoutPseudoModel::sheetCount(
kumarashishg826308d2023-06-23 13:21:22 +0000455 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700456 const std::vector<v8::Local<v8::Value>>& params) {
kumarashishg826308d2023-06-23 13:21:22 +0000457 return AllPageCount(runtime);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700458}
459
Haibo Huang49cc9302020-04-27 16:14:24 -0700460CJS_Result CJX_LayoutPseudoModel::absPage(
kumarashishg826308d2023-06-23 13:21:22 +0000461 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700462 const std::vector<v8::Local<v8::Value>>& params) {
463 return PageInternals(runtime, params, true);
464}
465
Haibo Huang49cc9302020-04-27 16:14:24 -0700466CJS_Result CJX_LayoutPseudoModel::PageInternals(
kumarashishg826308d2023-06-23 13:21:22 +0000467 CFXJSE_Engine* runtime,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700468 const std::vector<v8::Local<v8::Value>>& params,
469 bool bAbsPage) {
470 if (params.size() != 1)
Haibo Huang49cc9302020-04-27 16:14:24 -0700471 return CJS_Result::Failure(JSMessage::kParamError);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700472
kumarashishg826308d2023-06-23 13:21:22 +0000473 CXFA_Node* pNode = ToNode(runtime->ToXFAObject(params[0]));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700474 if (!pNode)
Haibo Huang49cc9302020-04-27 16:14:24 -0700475 return CJS_Result::Success(runtime->NewNumber(0));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700476
Haibo Huang49cc9302020-04-27 16:14:24 -0700477 auto* pDocLayout = CXFA_LayoutProcessor::FromDocument(GetDocument());
478 CXFA_ContentLayoutItem* pLayoutItem =
479 ToContentLayoutItem(pDocLayout->GetLayoutItem(pNode));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700480 if (!pLayoutItem)
Haibo Huang49cc9302020-04-27 16:14:24 -0700481 return CJS_Result::Success(runtime->NewNumber(-1));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700482
483 int32_t iPage = pLayoutItem->GetFirst()->GetPage()->GetPageIndex();
Haibo Huang49cc9302020-04-27 16:14:24 -0700484 return CJS_Result::Success(runtime->NewNumber(bAbsPage ? iPage : iPage + 1));
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -0700485}