blob: 46163b55fc74d811dbbbc724139c8a32ed3193d5 [file] [log] [blame]
Dan Sinclair1770c022016-03-14 14:14:16 -04001// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
Dan Sinclaird19aa7c2017-11-06 17:10:21 +00007#include "fxjs/cfxjse_resolveprocessor.h"
Dan Sinclair1770c022016-03-14 14:14:16 -04008
Tom Sepezf8a94392017-03-14 12:13:22 -07009#include <algorithm>
10#include <utility>
11#include <vector>
12
Dan Sinclaircfb19442017-04-20 13:13:04 -040013#include "core/fxcrt/fx_extension.h"
Dan Sinclair3fff90a2017-11-01 13:12:39 +000014#include "fxjs/cfxjse_engine.h"
Lei Zhangd859d572018-01-17 20:44:26 +000015#include "fxjs/xfa/cjx_object.h"
Tom Sepezf8a94392017-03-14 12:13:22 -070016#include "third_party/base/ptr_util.h"
17#include "third_party/base/stl_util.h"
dsinclair16280242016-07-21 12:03:47 -070018#include "xfa/fxfa/parser/cxfa_document.h"
Dan Sinclairec1843d2017-03-28 16:04:41 -040019#include "xfa/fxfa/parser/cxfa_localemgr.h"
Dan Sinclairefcae5d2017-03-29 14:47:46 -040020#include "xfa/fxfa/parser/cxfa_node.h"
dsinclair31f87402016-07-20 06:34:45 -070021#include "xfa/fxfa/parser/cxfa_nodehelper.h"
Dan Sinclairefcae5d2017-03-29 14:47:46 -040022#include "xfa/fxfa/parser/cxfa_object.h"
Dan Sinclair8eb27222017-12-14 21:04:13 +000023#include "xfa/fxfa/parser/cxfa_occur.h"
dsinclair31f87402016-07-20 06:34:45 -070024#include "xfa/fxfa/parser/xfa_resolvenode_rs.h"
Dan Sinclair1770c022016-03-14 14:14:16 -040025#include "xfa/fxfa/parser/xfa_utils.h"
26
Dan Sinclaird19aa7c2017-11-06 17:10:21 +000027CFXJSE_ResolveProcessor::CFXJSE_ResolveProcessor()
Tom Sepeza0a69232017-05-01 11:39:33 -070028 : m_iCurStart(0), m_pNodeHelper(pdfium::MakeUnique<CXFA_NodeHelper>()) {}
thestig495bda12016-04-28 17:29:19 -070029
Dan Sinclaird19aa7c2017-11-06 17:10:21 +000030CFXJSE_ResolveProcessor::~CFXJSE_ResolveProcessor() {}
thestig495bda12016-04-28 17:29:19 -070031
Dan Sinclair76e336d2017-12-04 18:08:58 +000032bool CFXJSE_ResolveProcessor::Resolve(CFXJSE_ResolveNodeData& rnd) {
Tom Sepezf8a94392017-03-14 12:13:22 -070033 if (!rnd.m_CurObject)
Dan Sinclair76e336d2017-12-04 18:08:58 +000034 return false;
Tom Sepezf8a94392017-03-14 12:13:22 -070035
36 if (!rnd.m_CurObject->IsNode()) {
Dan Sinclair1770c022016-03-14 14:14:16 -040037 if (rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) {
Tom Sepezf8a94392017-03-14 12:13:22 -070038 return ResolveForAttributeRs(rnd.m_CurObject, rnd,
Ryan Harrison275e2602017-09-18 14:23:18 -040039 rnd.m_wsName.AsStringView());
Dan Sinclair1770c022016-03-14 14:14:16 -040040 }
Dan Sinclair76e336d2017-12-04 18:08:58 +000041 return false;
Dan Sinclair1770c022016-03-14 14:14:16 -040042 }
Dan Sinclair76e336d2017-12-04 18:08:58 +000043 if (rnd.m_dwStyles & XFA_RESOLVENODE_AnyChild)
dsinclaird1cf2392016-07-11 06:46:59 -070044 return ResolveAnyChild(rnd);
Dan Sinclair76e336d2017-12-04 18:08:58 +000045
Ryan Harrisona0377dc2017-08-15 11:04:37 -040046 if (rnd.m_wsName.GetLength()) {
47 wchar_t wch = rnd.m_wsName[0];
48 switch (wch) {
49 case '$':
50 return ResolveDollar(rnd);
51 case '!':
52 return ResolveExcalmatory(rnd);
53 case '#':
54 return ResolveNumberSign(rnd);
55 case '*':
56 return ResolveAsterisk(rnd);
57 // TODO(dsinclair): We could probably remove this.
58 case '.':
59 return ResolveAnyChild(rnd);
60 default:
61 break;
62 }
Dan Sinclair1770c022016-03-14 14:14:16 -040063 }
64 if (rnd.m_uHashName == XFA_HASHCODE_This && rnd.m_nLevel == 0) {
Tom Sepezf8a94392017-03-14 12:13:22 -070065 rnd.m_Objects.push_back(rnd.m_pSC->GetThisObject());
Dan Sinclair76e336d2017-12-04 18:08:58 +000066 return true;
Tom Sepezf8a94392017-03-14 12:13:22 -070067 }
68 if (rnd.m_CurObject->GetElementType() == XFA_Element::Xfa) {
Dan Sinclair1770c022016-03-14 14:14:16 -040069 CXFA_Object* pObjNode =
70 rnd.m_pSC->GetDocument()->GetXFAObject(rnd.m_uHashName);
71 if (pObjNode) {
Tom Sepezf8a94392017-03-14 12:13:22 -070072 rnd.m_Objects.push_back(pObjNode);
Dan Sinclair1770c022016-03-14 14:14:16 -040073 } else if (rnd.m_uHashName == XFA_HASHCODE_Xfa) {
Tom Sepezf8a94392017-03-14 12:13:22 -070074 rnd.m_Objects.push_back(rnd.m_CurObject);
Dan Sinclair1770c022016-03-14 14:14:16 -040075 } else if ((rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) &&
Tom Sepezf8a94392017-03-14 12:13:22 -070076 ResolveForAttributeRs(rnd.m_CurObject, rnd,
Ryan Harrison275e2602017-09-18 14:23:18 -040077 rnd.m_wsName.AsStringView())) {
Dan Sinclair76e336d2017-12-04 18:08:58 +000078 return true;
Dan Sinclair1770c022016-03-14 14:14:16 -040079 }
Tom Sepezf8a94392017-03-14 12:13:22 -070080 if (!rnd.m_Objects.empty())
dsinclaird1cf2392016-07-11 06:46:59 -070081 FilterCondition(rnd, rnd.m_wsCondition);
Tom Sepezf8a94392017-03-14 12:13:22 -070082
Dan Sinclair76e336d2017-12-04 18:08:58 +000083 return !rnd.m_Objects.empty();
Dan Sinclair1770c022016-03-14 14:14:16 -040084 }
Dan Sinclair76e336d2017-12-04 18:08:58 +000085 if (!ResolveNormal(rnd) && rnd.m_uHashName == XFA_HASHCODE_Xfa)
Tom Sepezf8a94392017-03-14 12:13:22 -070086 rnd.m_Objects.push_back(rnd.m_pSC->GetDocument()->GetRoot());
87
Dan Sinclair76e336d2017-12-04 18:08:58 +000088 return !rnd.m_Objects.empty();
Dan Sinclair1770c022016-03-14 14:14:16 -040089}
Tom Sepezf8a94392017-03-14 12:13:22 -070090
Dan Sinclair76e336d2017-12-04 18:08:58 +000091bool CFXJSE_ResolveProcessor::ResolveAnyChild(CFXJSE_ResolveNodeData& rnd) {
Ryan Harrison275e2602017-09-18 14:23:18 -040092 WideString wsName = rnd.m_wsName;
93 WideString wsCondition = rnd.m_wsCondition;
dsinclair85d1f2c2016-06-23 12:40:16 -070094 CXFA_Node* findNode = nullptr;
tsepezd19e9122016-11-02 15:43:18 -070095 bool bClassName = false;
Ryan Harrisona0377dc2017-08-15 11:04:37 -040096 if (wsName.GetLength() && wsName[0] == '#') {
tsepezd19e9122016-11-02 15:43:18 -070097 bClassName = true;
Dan Sinclair1770c022016-03-14 14:14:16 -040098 wsName = wsName.Right(wsName.GetLength() - 1);
99 }
dsinclaird1cf2392016-07-11 06:46:59 -0700100 findNode = m_pNodeHelper->ResolveNodes_GetOneChild(
Tom Sepezf8a94392017-03-14 12:13:22 -0700101 ToNode(rnd.m_CurObject), wsName.c_str(), bClassName);
Dan Sinclair76e336d2017-12-04 18:08:58 +0000102 if (!findNode)
103 return false;
104
Dan Sinclair1770c022016-03-14 14:14:16 -0400105 if (wsCondition.IsEmpty()) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700106 rnd.m_Objects.push_back(findNode);
Dan Sinclair76e336d2017-12-04 18:08:58 +0000107 return !rnd.m_Objects.empty();
Dan Sinclair1770c022016-03-14 14:14:16 -0400108 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000109
Tom Sepezf8a94392017-03-14 12:13:22 -0700110 std::vector<CXFA_Node*> tempNodes;
Tom Sepezcc205132017-05-16 14:01:47 -0700111 for (auto* pObject : rnd.m_Objects)
Tom Sepezf8a94392017-03-14 12:13:22 -0700112 tempNodes.push_back(pObject->AsNode());
113 m_pNodeHelper->CountSiblings(findNode, XFA_LOGIC_Transparent, &tempNodes,
114 bClassName);
115 rnd.m_Objects = std::vector<CXFA_Object*>(tempNodes.begin(), tempNodes.end());
dsinclaird1cf2392016-07-11 06:46:59 -0700116 FilterCondition(rnd, wsCondition);
Dan Sinclair76e336d2017-12-04 18:08:58 +0000117 return !rnd.m_Objects.empty();
Dan Sinclair1770c022016-03-14 14:14:16 -0400118}
Tom Sepezf8a94392017-03-14 12:13:22 -0700119
Dan Sinclair76e336d2017-12-04 18:08:58 +0000120bool CFXJSE_ResolveProcessor::ResolveDollar(CFXJSE_ResolveNodeData& rnd) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400121 WideString wsName = rnd.m_wsName;
122 WideString wsCondition = rnd.m_wsCondition;
Dan Sinclair1770c022016-03-14 14:14:16 -0400123 int32_t iNameLen = wsName.GetLength();
124 if (iNameLen == 1) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700125 rnd.m_Objects.push_back(rnd.m_CurObject);
Dan Sinclair76e336d2017-12-04 18:08:58 +0000126 return true;
Dan Sinclair1770c022016-03-14 14:14:16 -0400127 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000128 if (rnd.m_nLevel > 0)
129 return false;
130
dsinclaircbfef572016-05-18 13:16:12 -0700131 XFA_HashCode dwNameHash = static_cast<XFA_HashCode>(FX_HashCode_GetW(
Ryan Harrison275e2602017-09-18 14:23:18 -0400132 WideStringView(wsName.c_str() + 1, iNameLen - 1), false));
Dan Sinclair1770c022016-03-14 14:14:16 -0400133 if (dwNameHash == XFA_HASHCODE_Xfa) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700134 rnd.m_Objects.push_back(rnd.m_pSC->GetDocument()->GetRoot());
Dan Sinclair1770c022016-03-14 14:14:16 -0400135 } else {
136 CXFA_Object* pObjNode = rnd.m_pSC->GetDocument()->GetXFAObject(dwNameHash);
Tom Sepezf8a94392017-03-14 12:13:22 -0700137 if (pObjNode)
138 rnd.m_Objects.push_back(pObjNode);
Dan Sinclair1770c022016-03-14 14:14:16 -0400139 }
Tom Sepezf8a94392017-03-14 12:13:22 -0700140 if (!rnd.m_Objects.empty())
dsinclaird1cf2392016-07-11 06:46:59 -0700141 FilterCondition(rnd, wsCondition);
Tom Sepezf8a94392017-03-14 12:13:22 -0700142
Dan Sinclair76e336d2017-12-04 18:08:58 +0000143 return !rnd.m_Objects.empty();
Dan Sinclair1770c022016-03-14 14:14:16 -0400144}
Tom Sepezf8a94392017-03-14 12:13:22 -0700145
Dan Sinclair76e336d2017-12-04 18:08:58 +0000146bool CFXJSE_ResolveProcessor::ResolveExcalmatory(CFXJSE_ResolveNodeData& rnd) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700147 if (rnd.m_nLevel > 0)
Dan Sinclair76e336d2017-12-04 18:08:58 +0000148 return false;
Tom Sepezf8a94392017-03-14 12:13:22 -0700149
Dan Sinclair1770c022016-03-14 14:14:16 -0400150 CXFA_Node* datasets =
151 ToNode(rnd.m_pSC->GetDocument()->GetXFAObject(XFA_HASHCODE_Datasets));
Tom Sepezf8a94392017-03-14 12:13:22 -0700152 if (!datasets)
Dan Sinclair76e336d2017-12-04 18:08:58 +0000153 return false;
Tom Sepezf8a94392017-03-14 12:13:22 -0700154
Dan Sinclaird19aa7c2017-11-06 17:10:21 +0000155 CFXJSE_ResolveNodeData rndFind(rnd.m_pSC);
Tom Sepezf8a94392017-03-14 12:13:22 -0700156 rndFind.m_CurObject = datasets;
Dan Sinclair1770c022016-03-14 14:14:16 -0400157 rndFind.m_wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1);
dsinclaircbfef572016-05-18 13:16:12 -0700158 rndFind.m_uHashName = static_cast<XFA_HashCode>(
Ryan Harrison275e2602017-09-18 14:23:18 -0400159 FX_HashCode_GetW(rndFind.m_wsName.AsStringView(), false));
Dan Sinclair1770c022016-03-14 14:14:16 -0400160 rndFind.m_nLevel = rnd.m_nLevel + 1;
161 rndFind.m_dwStyles = XFA_RESOLVENODE_Children;
162 rndFind.m_wsCondition = rnd.m_wsCondition;
dsinclaird1cf2392016-07-11 06:46:59 -0700163 Resolve(rndFind);
Dan Sinclair76e336d2017-12-04 18:08:58 +0000164
Tom Sepezf8a94392017-03-14 12:13:22 -0700165 rnd.m_Objects.insert(rnd.m_Objects.end(), rndFind.m_Objects.begin(),
166 rndFind.m_Objects.end());
Dan Sinclair76e336d2017-12-04 18:08:58 +0000167 return !rnd.m_Objects.empty();
Dan Sinclair1770c022016-03-14 14:14:16 -0400168}
Tom Sepezf8a94392017-03-14 12:13:22 -0700169
Dan Sinclair76e336d2017-12-04 18:08:58 +0000170bool CFXJSE_ResolveProcessor::ResolveNumberSign(CFXJSE_ResolveNodeData& rnd) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400171 WideString wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1);
172 WideString wsCondition = rnd.m_wsCondition;
Tom Sepezf8a94392017-03-14 12:13:22 -0700173 CXFA_Node* curNode = ToNode(rnd.m_CurObject);
Ryan Harrison275e2602017-09-18 14:23:18 -0400174 if (ResolveForAttributeRs(curNode, rnd, wsName.AsStringView()))
Dan Sinclair76e336d2017-12-04 18:08:58 +0000175 return true;
Tom Sepezf8a94392017-03-14 12:13:22 -0700176
Dan Sinclaird19aa7c2017-11-06 17:10:21 +0000177 CFXJSE_ResolveNodeData rndFind(rnd.m_pSC);
Dan Sinclair1770c022016-03-14 14:14:16 -0400178 rndFind.m_nLevel = rnd.m_nLevel + 1;
179 rndFind.m_dwStyles = rnd.m_dwStyles;
180 rndFind.m_dwStyles |= XFA_RESOLVENODE_TagName;
181 rndFind.m_dwStyles &= ~XFA_RESOLVENODE_Attributes;
182 rndFind.m_wsName = wsName;
dsinclaircbfef572016-05-18 13:16:12 -0700183 rndFind.m_uHashName = static_cast<XFA_HashCode>(
Ryan Harrison275e2602017-09-18 14:23:18 -0400184 FX_HashCode_GetW(rndFind.m_wsName.AsStringView(), false));
Dan Sinclair1770c022016-03-14 14:14:16 -0400185 rndFind.m_wsCondition = wsCondition;
Tom Sepezf8a94392017-03-14 12:13:22 -0700186 rndFind.m_CurObject = curNode;
dsinclaird1cf2392016-07-11 06:46:59 -0700187 ResolveNormal(rndFind);
Tom Sepezf8a94392017-03-14 12:13:22 -0700188 if (rndFind.m_Objects.empty())
Dan Sinclair76e336d2017-12-04 18:08:58 +0000189 return false;
Tom Sepezf8a94392017-03-14 12:13:22 -0700190
191 if (wsCondition.GetLength() == 0 &&
192 pdfium::ContainsValue(rndFind.m_Objects, curNode)) {
193 rnd.m_Objects.push_back(curNode);
194 } else {
195 rnd.m_Objects.insert(rnd.m_Objects.end(), rndFind.m_Objects.begin(),
196 rndFind.m_Objects.end());
Dan Sinclair1770c022016-03-14 14:14:16 -0400197 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000198 return !rnd.m_Objects.empty();
Dan Sinclair1770c022016-03-14 14:14:16 -0400199}
Tom Sepezf8a94392017-03-14 12:13:22 -0700200
Dan Sinclair76e336d2017-12-04 18:08:58 +0000201bool CFXJSE_ResolveProcessor::ResolveForAttributeRs(
Dan Sinclair1770c022016-03-14 14:14:16 -0400202 CXFA_Object* curNode,
Dan Sinclaird19aa7c2017-11-06 17:10:21 +0000203 CFXJSE_ResolveNodeData& rnd,
Ryan Harrison275e2602017-09-18 14:23:18 -0400204 const WideStringView& strAttr) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400205 const XFA_SCRIPTATTRIBUTEINFO* lpScriptAttribute =
dsinclair070fcdf2016-06-22 22:04:54 -0700206 XFA_GetScriptAttributeByName(curNode->GetElementType(), strAttr);
Tom Sepezf8a94392017-03-14 12:13:22 -0700207 if (!lpScriptAttribute)
Dan Sinclair76e336d2017-12-04 18:08:58 +0000208 return false;
Tom Sepezf8a94392017-03-14 12:13:22 -0700209
210 rnd.m_pScriptAttribute = lpScriptAttribute;
211 rnd.m_Objects.push_back(curNode);
Dan Sinclair33beb4e2017-12-04 19:12:16 +0000212 rnd.m_dwFlag = XFA_ResolveNode_RSType_Attribute;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000213 return true;
Dan Sinclair1770c022016-03-14 14:14:16 -0400214}
Tom Sepezf8a94392017-03-14 12:13:22 -0700215
Dan Sinclair76e336d2017-12-04 18:08:58 +0000216bool CFXJSE_ResolveProcessor::ResolveNormal(CFXJSE_ResolveNodeData& rnd) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700217 if (rnd.m_nLevel > 32 || !rnd.m_CurObject->IsNode())
Dan Sinclair76e336d2017-12-04 18:08:58 +0000218 return false;
Tom Sepezf8a94392017-03-14 12:13:22 -0700219
220 CXFA_Node* curNode = rnd.m_CurObject->AsNode();
221 size_t nNum = rnd.m_Objects.size();
tsepez736f28a2016-03-25 14:19:51 -0700222 uint32_t dwStyles = rnd.m_dwStyles;
Ryan Harrison275e2602017-09-18 14:23:18 -0400223 WideString& wsName = rnd.m_wsName;
dsinclaircbfef572016-05-18 13:16:12 -0700224 XFA_HashCode uNameHash = rnd.m_uHashName;
Ryan Harrison275e2602017-09-18 14:23:18 -0400225 WideString& wsCondition = rnd.m_wsCondition;
Dan Sinclaird19aa7c2017-11-06 17:10:21 +0000226
227 CFXJSE_ResolveNodeData rndFind(rnd.m_pSC);
Dan Sinclair1770c022016-03-14 14:14:16 -0400228 rndFind.m_wsName = rnd.m_wsName;
229 rndFind.m_wsCondition = rnd.m_wsCondition;
Dan Sinclair1770c022016-03-14 14:14:16 -0400230 rndFind.m_nLevel = rnd.m_nLevel + 1;
231 rndFind.m_uHashName = uNameHash;
Dan Sinclaird19aa7c2017-11-06 17:10:21 +0000232
Tom Sepezf8a94392017-03-14 12:13:22 -0700233 std::vector<CXFA_Node*> children;
234 std::vector<CXFA_Node*> properties;
dsinclair85d1f2c2016-06-23 12:40:16 -0700235 CXFA_Node* pVariablesNode = nullptr;
236 CXFA_Node* pPageSetNode = nullptr;
Dan Sinclair18a60692018-01-10 16:30:56 +0000237 for (CXFA_Node* pChild = curNode->GetFirstChild(); pChild;
238 pChild = pChild->GetNextSibling()) {
dsinclair070fcdf2016-06-22 22:04:54 -0700239 if (pChild->GetElementType() == XFA_Element::Variables) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400240 pVariablesNode = pChild;
Dan Sinclair1770c022016-03-14 14:14:16 -0400241 continue;
Dan Sinclair1770c022016-03-14 14:14:16 -0400242 }
Tom Sepezf8a94392017-03-14 12:13:22 -0700243 if (pChild->GetElementType() == XFA_Element::PageSet) {
244 pPageSetNode = pChild;
245 continue;
246 }
Dan Sinclairf4736722017-11-27 18:10:47 +0000247 if (curNode->HasProperty(pChild->GetElementType()))
Tom Sepezf8a94392017-03-14 12:13:22 -0700248 properties.push_back(pChild);
249 else
250 children.push_back(pChild);
Dan Sinclair1770c022016-03-14 14:14:16 -0400251 }
252 if ((dwStyles & XFA_RESOLVENODE_Properties) && pVariablesNode) {
Dan Sinclair76e336d2017-12-04 18:08:58 +0000253 if (pVariablesNode->GetClassHashCode() == uNameHash) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700254 rnd.m_Objects.push_back(pVariablesNode);
Dan Sinclair1770c022016-03-14 14:14:16 -0400255 } else {
Tom Sepezf8a94392017-03-14 12:13:22 -0700256 rndFind.m_CurObject = pVariablesNode;
dsinclaird1cf2392016-07-11 06:46:59 -0700257 SetStylesForChild(dwStyles, rndFind);
Ryan Harrison275e2602017-09-18 14:23:18 -0400258 WideString wsSaveCondition = rndFind.m_wsCondition;
tsepez774bdde2016-04-14 09:49:44 -0700259 rndFind.m_wsCondition.clear();
dsinclaird1cf2392016-07-11 06:46:59 -0700260 ResolveNormal(rndFind);
Dan Sinclair1770c022016-03-14 14:14:16 -0400261 rndFind.m_wsCondition = wsSaveCondition;
Tom Sepezf8a94392017-03-14 12:13:22 -0700262 rnd.m_Objects.insert(rnd.m_Objects.end(), rndFind.m_Objects.begin(),
263 rndFind.m_Objects.end());
264 rndFind.m_Objects.clear();
Dan Sinclair1770c022016-03-14 14:14:16 -0400265 }
Tom Sepezf8a94392017-03-14 12:13:22 -0700266 if (rnd.m_Objects.size() > nNum) {
dsinclaird1cf2392016-07-11 06:46:59 -0700267 FilterCondition(rnd, wsCondition);
Dan Sinclair76e336d2017-12-04 18:08:58 +0000268 return !rnd.m_Objects.empty();
Dan Sinclair1770c022016-03-14 14:14:16 -0400269 }
270 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000271
Dan Sinclair1770c022016-03-14 14:14:16 -0400272 if (dwStyles & XFA_RESOLVENODE_Children) {
tsepezd19e9122016-11-02 15:43:18 -0700273 bool bSetFlag = false;
Tom Sepezf8a94392017-03-14 12:13:22 -0700274 if (pPageSetNode && (dwStyles & XFA_RESOLVENODE_Properties))
275 children.push_back(pPageSetNode);
276
277 for (CXFA_Node* child : children) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400278 if (dwStyles & XFA_RESOLVENODE_TagName) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700279 if (child->GetClassHashCode() == uNameHash)
280 rnd.m_Objects.push_back(child);
Dan Sinclair1770c022016-03-14 14:14:16 -0400281 } else if (child->GetNameHash() == uNameHash) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700282 rnd.m_Objects.push_back(child);
Dan Sinclair1770c022016-03-14 14:14:16 -0400283 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000284
dsinclaird1cf2392016-07-11 06:46:59 -0700285 if (m_pNodeHelper->NodeIsTransparent(child) &&
dsinclair070fcdf2016-06-22 22:04:54 -0700286 child->GetElementType() != XFA_Element::PageSet) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400287 if (!bSetFlag) {
dsinclaird1cf2392016-07-11 06:46:59 -0700288 SetStylesForChild(dwStyles, rndFind);
tsepezd19e9122016-11-02 15:43:18 -0700289 bSetFlag = true;
Dan Sinclair1770c022016-03-14 14:14:16 -0400290 }
Tom Sepezf8a94392017-03-14 12:13:22 -0700291 rndFind.m_CurObject = child;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000292
Ryan Harrison275e2602017-09-18 14:23:18 -0400293 WideString wsSaveCondition = rndFind.m_wsCondition;
tsepez774bdde2016-04-14 09:49:44 -0700294 rndFind.m_wsCondition.clear();
dsinclaird1cf2392016-07-11 06:46:59 -0700295 ResolveNormal(rndFind);
Dan Sinclair76e336d2017-12-04 18:08:58 +0000296
Dan Sinclair1770c022016-03-14 14:14:16 -0400297 rndFind.m_wsCondition = wsSaveCondition;
Tom Sepezf8a94392017-03-14 12:13:22 -0700298 rnd.m_Objects.insert(rnd.m_Objects.end(), rndFind.m_Objects.begin(),
299 rndFind.m_Objects.end());
300 rndFind.m_Objects.clear();
Dan Sinclair1770c022016-03-14 14:14:16 -0400301 }
302 }
Tom Sepezf8a94392017-03-14 12:13:22 -0700303 if (rnd.m_Objects.size() > nNum) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400304 if (!(dwStyles & XFA_RESOLVENODE_ALL)) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700305 std::vector<CXFA_Node*> upArrayNodes;
dsinclaird1cf2392016-07-11 06:46:59 -0700306 if (m_pNodeHelper->NodeIsTransparent(ToNode(curNode))) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700307 m_pNodeHelper->CountSiblings(ToNode(rnd.m_Objects[0]),
308 XFA_LOGIC_Transparent, &upArrayNodes,
dsinclaird1cf2392016-07-11 06:46:59 -0700309 !!(dwStyles & XFA_RESOLVENODE_TagName));
Dan Sinclair1770c022016-03-14 14:14:16 -0400310 }
Tom Sepezf8a94392017-03-14 12:13:22 -0700311 if (upArrayNodes.size() > rnd.m_Objects.size()) {
312 CXFA_Object* pSaveObject = rnd.m_Objects.front();
313 rnd.m_Objects = std::vector<CXFA_Object*>(upArrayNodes.begin(),
314 upArrayNodes.end());
315 rnd.m_Objects.front() = pSaveObject;
Dan Sinclair1770c022016-03-14 14:14:16 -0400316 }
317 }
dsinclaird1cf2392016-07-11 06:46:59 -0700318 FilterCondition(rnd, wsCondition);
Dan Sinclair76e336d2017-12-04 18:08:58 +0000319 return !rnd.m_Objects.empty();
Dan Sinclair1770c022016-03-14 14:14:16 -0400320 }
321 }
322 if (dwStyles & XFA_RESOLVENODE_Attributes) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400323 if (ResolveForAttributeRs(curNode, rnd, wsName.AsStringView()))
Dan Sinclair1770c022016-03-14 14:14:16 -0400324 return 1;
Dan Sinclair1770c022016-03-14 14:14:16 -0400325 }
326 if (dwStyles & XFA_RESOLVENODE_Properties) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700327 for (CXFA_Node* pChildProperty : properties) {
328 if (pChildProperty->IsUnnamed()) {
329 if (pChildProperty->GetClassHashCode() == uNameHash)
330 rnd.m_Objects.push_back(pChildProperty);
331 continue;
332 }
333 if (pChildProperty->GetNameHash() == uNameHash &&
334 pChildProperty->GetElementType() != XFA_Element::Extras &&
335 pChildProperty->GetElementType() != XFA_Element::Items) {
336 rnd.m_Objects.push_back(pChildProperty);
Dan Sinclair1770c022016-03-14 14:14:16 -0400337 }
338 }
Tom Sepezf8a94392017-03-14 12:13:22 -0700339 if (rnd.m_Objects.size() > nNum) {
dsinclaird1cf2392016-07-11 06:46:59 -0700340 FilterCondition(rnd, wsCondition);
Dan Sinclair76e336d2017-12-04 18:08:58 +0000341 return !rnd.m_Objects.empty();
Dan Sinclair1770c022016-03-14 14:14:16 -0400342 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000343
dsinclair85d1f2c2016-06-23 12:40:16 -0700344 CXFA_Node* pProp = nullptr;
dsinclair070fcdf2016-06-22 22:04:54 -0700345 if (XFA_Element::Subform == curNode->GetElementType() &&
Dan Sinclair1770c022016-03-14 14:14:16 -0400346 XFA_HASHCODE_Occur == uNameHash) {
347 CXFA_Node* pInstanceManager =
348 curNode->AsNode()->GetInstanceMgrOfSubform();
349 if (pInstanceManager) {
Dan Sinclair640d8ff2018-01-10 16:28:57 +0000350 pProp = pInstanceManager->JSObject()->GetOrCreateProperty<CXFA_Occur>(
351 0, XFA_Element::Occur);
Dan Sinclair1770c022016-03-14 14:14:16 -0400352 }
353 } else {
Dan Sinclairf4736722017-11-27 18:10:47 +0000354 XFA_Element eType = CXFA_Node::NameToElement(wsName);
Dan Sinclair640d8ff2018-01-10 16:28:57 +0000355 if (eType == XFA_Element::PageSet) {
356 pProp = curNode->AsNode()->JSObject()->GetProperty<CXFA_Node>(0, eType);
357 } else if (eType != XFA_Element::Unknown) {
358 pProp = curNode->AsNode()->JSObject()->GetOrCreateProperty<CXFA_Node>(
359 0, eType);
Dan Sinclair1770c022016-03-14 14:14:16 -0400360 }
361 }
362 if (pProp) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700363 rnd.m_Objects.push_back(pProp);
Dan Sinclair76e336d2017-12-04 18:08:58 +0000364 return !rnd.m_Objects.empty();
Dan Sinclair1770c022016-03-14 14:14:16 -0400365 }
366 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000367
dsinclaird1cf2392016-07-11 06:46:59 -0700368 CXFA_Node* parentNode = m_pNodeHelper->ResolveNodes_GetParent(
Dan Sinclair1770c022016-03-14 14:14:16 -0400369 curNode->AsNode(), XFA_LOGIC_NoTransparent);
370 uint32_t uCurClassHash = curNode->GetClassHashCode();
371 if (!parentNode) {
372 if (uCurClassHash == uNameHash) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700373 rnd.m_Objects.push_back(curNode->AsNode());
dsinclaird1cf2392016-07-11 06:46:59 -0700374 FilterCondition(rnd, wsCondition);
Tom Sepezf8a94392017-03-14 12:13:22 -0700375 if (!rnd.m_Objects.empty())
Dan Sinclair76e336d2017-12-04 18:08:58 +0000376 return true;
Dan Sinclair1770c022016-03-14 14:14:16 -0400377 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000378 return false;
Dan Sinclair1770c022016-03-14 14:14:16 -0400379 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000380
Dan Sinclair1770c022016-03-14 14:14:16 -0400381 if (dwStyles & XFA_RESOLVENODE_Siblings) {
Dan Sinclair18a60692018-01-10 16:30:56 +0000382 CXFA_Node* child = parentNode->GetFirstChild();
tsepez736f28a2016-03-25 14:19:51 -0700383 uint32_t dwSubStyles =
Dan Sinclair1770c022016-03-14 14:14:16 -0400384 XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties;
Tom Sepezf8a94392017-03-14 12:13:22 -0700385 if (dwStyles & XFA_RESOLVENODE_TagName)
Dan Sinclair1770c022016-03-14 14:14:16 -0400386 dwSubStyles |= XFA_RESOLVENODE_TagName;
Tom Sepezf8a94392017-03-14 12:13:22 -0700387 if (dwStyles & XFA_RESOLVENODE_ALL)
Dan Sinclair1770c022016-03-14 14:14:16 -0400388 dwSubStyles |= XFA_RESOLVENODE_ALL;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000389
Dan Sinclair1770c022016-03-14 14:14:16 -0400390 rndFind.m_dwStyles = dwSubStyles;
391 while (child) {
392 if (child == curNode) {
393 if (dwStyles & XFA_RESOLVENODE_TagName) {
Dan Sinclair76e336d2017-12-04 18:08:58 +0000394 if (uCurClassHash == uNameHash)
Tom Sepezf8a94392017-03-14 12:13:22 -0700395 rnd.m_Objects.push_back(curNode);
Dan Sinclair1770c022016-03-14 14:14:16 -0400396 } else {
397 if (child->GetNameHash() == uNameHash) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700398 rnd.m_Objects.push_back(curNode);
Dan Sinclair1770c022016-03-14 14:14:16 -0400399 if (rnd.m_nLevel == 0 && wsCondition.GetLength() == 0) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700400 rnd.m_Objects.clear();
401 rnd.m_Objects.push_back(curNode);
Dan Sinclair76e336d2017-12-04 18:08:58 +0000402 return true;
Dan Sinclair1770c022016-03-14 14:14:16 -0400403 }
404 }
405 }
Dan Sinclair18a60692018-01-10 16:30:56 +0000406 child = child->GetNextSibling();
Dan Sinclair1770c022016-03-14 14:14:16 -0400407 continue;
408 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000409
Dan Sinclair1770c022016-03-14 14:14:16 -0400410 if (dwStyles & XFA_RESOLVENODE_TagName) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700411 if (child->GetClassHashCode() == uNameHash)
412 rnd.m_Objects.push_back(child);
Dan Sinclair1770c022016-03-14 14:14:16 -0400413 } else if (child->GetNameHash() == uNameHash) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700414 rnd.m_Objects.push_back(child);
Dan Sinclair1770c022016-03-14 14:14:16 -0400415 }
Dan Sinclairf4736722017-11-27 18:10:47 +0000416
tsepezd19e9122016-11-02 15:43:18 -0700417 bool bInnerSearch = false;
Dan Sinclairf4736722017-11-27 18:10:47 +0000418 if (parentNode->HasProperty(child->GetElementType())) {
dsinclair070fcdf2016-06-22 22:04:54 -0700419 if ((child->GetElementType() == XFA_Element::Variables ||
420 child->GetElementType() == XFA_Element::PageSet)) {
tsepezd19e9122016-11-02 15:43:18 -0700421 bInnerSearch = true;
Dan Sinclair1770c022016-03-14 14:14:16 -0400422 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000423 } else if (m_pNodeHelper->NodeIsTransparent(child)) {
424 bInnerSearch = true;
Dan Sinclair1770c022016-03-14 14:14:16 -0400425 }
426 if (bInnerSearch) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700427 rndFind.m_CurObject = child;
Ryan Harrison275e2602017-09-18 14:23:18 -0400428 WideString wsOriginCondition = rndFind.m_wsCondition;
tsepez774bdde2016-04-14 09:49:44 -0700429 rndFind.m_wsCondition.clear();
Dan Sinclair76e336d2017-12-04 18:08:58 +0000430
tsepez736f28a2016-03-25 14:19:51 -0700431 uint32_t dwOriginStyle = rndFind.m_dwStyles;
Dan Sinclair1770c022016-03-14 14:14:16 -0400432 rndFind.m_dwStyles = dwOriginStyle | XFA_RESOLVENODE_ALL;
dsinclaird1cf2392016-07-11 06:46:59 -0700433 ResolveNormal(rndFind);
Dan Sinclair76e336d2017-12-04 18:08:58 +0000434
Dan Sinclair1770c022016-03-14 14:14:16 -0400435 rndFind.m_dwStyles = dwOriginStyle;
436 rndFind.m_wsCondition = wsOriginCondition;
Tom Sepezf8a94392017-03-14 12:13:22 -0700437 rnd.m_Objects.insert(rnd.m_Objects.end(), rndFind.m_Objects.begin(),
438 rndFind.m_Objects.end());
439 rndFind.m_Objects.clear();
Dan Sinclair1770c022016-03-14 14:14:16 -0400440 }
Dan Sinclair18a60692018-01-10 16:30:56 +0000441 child = child->GetNextSibling();
Dan Sinclair1770c022016-03-14 14:14:16 -0400442 }
Tom Sepezf8a94392017-03-14 12:13:22 -0700443 if (rnd.m_Objects.size() > nNum) {
dsinclaird1cf2392016-07-11 06:46:59 -0700444 if (m_pNodeHelper->NodeIsTransparent(parentNode)) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700445 std::vector<CXFA_Node*> upArrayNodes;
446 m_pNodeHelper->CountSiblings(ToNode(rnd.m_Objects.front()),
447 XFA_LOGIC_Transparent, &upArrayNodes,
dsinclaird1cf2392016-07-11 06:46:59 -0700448 !!(dwStyles & XFA_RESOLVENODE_TagName));
Tom Sepezf8a94392017-03-14 12:13:22 -0700449 if (upArrayNodes.size() > rnd.m_Objects.size()) {
450 CXFA_Object* pSaveObject = rnd.m_Objects.front();
451 rnd.m_Objects = std::vector<CXFA_Object*>(upArrayNodes.begin(),
452 upArrayNodes.end());
453 rnd.m_Objects.front() = pSaveObject;
Dan Sinclair1770c022016-03-14 14:14:16 -0400454 }
455 }
dsinclaird1cf2392016-07-11 06:46:59 -0700456 FilterCondition(rnd, wsCondition);
Dan Sinclair76e336d2017-12-04 18:08:58 +0000457 return !rnd.m_Objects.empty();
Dan Sinclair1770c022016-03-14 14:14:16 -0400458 }
459 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000460
Dan Sinclair1770c022016-03-14 14:14:16 -0400461 if (dwStyles & XFA_RESOLVENODE_Parent) {
tsepez736f28a2016-03-25 14:19:51 -0700462 uint32_t dwSubStyles = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent |
Dan Sinclair1770c022016-03-14 14:14:16 -0400463 XFA_RESOLVENODE_Properties;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000464 if (dwStyles & XFA_RESOLVENODE_TagName)
Dan Sinclair1770c022016-03-14 14:14:16 -0400465 dwSubStyles |= XFA_RESOLVENODE_TagName;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000466 if (dwStyles & XFA_RESOLVENODE_ALL)
Dan Sinclair1770c022016-03-14 14:14:16 -0400467 dwSubStyles |= XFA_RESOLVENODE_ALL;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000468
Dan Sinclair1770c022016-03-14 14:14:16 -0400469 rndFind.m_dwStyles = dwSubStyles;
Tom Sepezf8a94392017-03-14 12:13:22 -0700470 rndFind.m_CurObject = parentNode;
471 rnd.m_pSC->GetUpObjectArray()->push_back(parentNode);
dsinclaird1cf2392016-07-11 06:46:59 -0700472 ResolveNormal(rndFind);
Tom Sepezf8a94392017-03-14 12:13:22 -0700473 rnd.m_Objects.insert(rnd.m_Objects.end(), rndFind.m_Objects.begin(),
474 rndFind.m_Objects.end());
475 rndFind.m_Objects.clear();
476 if (rnd.m_Objects.size() > nNum)
Dan Sinclair76e336d2017-12-04 18:08:58 +0000477 return true;
Dan Sinclair1770c022016-03-14 14:14:16 -0400478 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000479 return false;
Dan Sinclair1770c022016-03-14 14:14:16 -0400480}
Tom Sepezf8a94392017-03-14 12:13:22 -0700481
Dan Sinclair76e336d2017-12-04 18:08:58 +0000482bool CFXJSE_ResolveProcessor::ResolveAsterisk(CFXJSE_ResolveNodeData& rnd) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700483 CXFA_Node* curNode = ToNode(rnd.m_CurObject);
484 std::vector<CXFA_Node*> array =
Dan Sinclair5e359312017-11-04 03:32:08 +0000485 curNode->GetNodeList(XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties,
486 XFA_Element::Unknown);
Tom Sepezf8a94392017-03-14 12:13:22 -0700487 rnd.m_Objects.insert(rnd.m_Objects.end(), array.begin(), array.end());
Dan Sinclair76e336d2017-12-04 18:08:58 +0000488 return !rnd.m_Objects.empty();
Dan Sinclair1770c022016-03-14 14:14:16 -0400489}
Tom Sepez9d20d1f2017-03-28 11:16:01 -0700490
Dan Sinclaird19aa7c2017-11-06 17:10:21 +0000491int32_t CFXJSE_ResolveProcessor::GetFilter(const WideStringView& wsExpression,
492 int32_t nStart,
493 CFXJSE_ResolveNodeData& rnd) {
dsinclair43854a52016-04-27 12:26:00 -0700494 ASSERT(nStart > -1);
Dan Sinclair76e336d2017-12-04 18:08:58 +0000495
Dan Sinclair1770c022016-03-14 14:14:16 -0400496 int32_t iLength = wsExpression.GetLength();
Dan Sinclair76e336d2017-12-04 18:08:58 +0000497 if (nStart >= iLength)
Dan Sinclair1770c022016-03-14 14:14:16 -0400498 return 0;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000499
Ryan Harrison275e2602017-09-18 14:23:18 -0400500 WideString& wsName = rnd.m_wsName;
501 WideString& wsCondition = rnd.m_wsCondition;
Dan Sinclair1770c022016-03-14 14:14:16 -0400502 int32_t nNameCount = 0;
503 int32_t nConditionCount = 0;
Tom Sepezb7973bb2018-04-17 16:41:28 +0000504 {
505 // Span's lifetime must end before ReleaseBuffer() below.
506 pdfium::span<wchar_t> pNameBuf = wsName.GetBuffer(iLength - nStart);
507 pdfium::span<wchar_t> pConditionBuf =
508 wsCondition.GetBuffer(iLength - nStart);
509 std::vector<int32_t> stack;
510 int32_t nType = -1;
511 const wchar_t* pSrc = wsExpression.unterminated_c_str();
512 wchar_t wPrev = 0;
513 wchar_t wCur;
514 bool bIsCondition = false;
515 while (nStart < iLength) {
516 wCur = pSrc[nStart++];
517 if (wCur == '.') {
518 if (wPrev == '\\') {
519 pNameBuf[nNameCount - 1] = wPrev = '.';
520 continue;
521 }
522 if (nNameCount == 0) {
523 rnd.m_dwStyles |= XFA_RESOLVENODE_AnyChild;
524 continue;
525 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000526
Tom Sepezb7973bb2018-04-17 16:41:28 +0000527 wchar_t wLookahead = nStart < iLength ? pSrc[nStart] : 0;
528 if (wLookahead != '[' && wLookahead != '(' && nType < 0)
529 break;
530 }
531 if (wCur == '[' || wCur == '(') {
532 bIsCondition = true;
533 } else if (wCur == '.' && nStart < iLength &&
534 (pSrc[nStart] == '[' || pSrc[nStart] == '(')) {
535 bIsCondition = true;
536 }
537 if (bIsCondition)
538 pConditionBuf[nConditionCount++] = wCur;
539 else
540 pNameBuf[nNameCount++] = wCur;
Tom Sepez0d32b8f2018-04-16 21:09:57 +0000541
Tom Sepezb7973bb2018-04-17 16:41:28 +0000542 if ((nType == 0 && wCur == ']') || (nType == 1 && wCur == ')') ||
543 (nType == 2 && wCur == '"')) {
544 nType = stack.empty() ? -1 : stack.back();
545 if (!stack.empty())
546 stack.pop_back();
547 } else if (wCur == '[') {
548 stack.push_back(nType);
549 nType = 0;
550 } else if (wCur == '(') {
551 stack.push_back(nType);
552 nType = 1;
553 } else if (wCur == '"') {
554 stack.push_back(nType);
555 nType = 2;
556 }
557 wPrev = wCur;
Tom Sepez0d32b8f2018-04-16 21:09:57 +0000558 }
Tom Sepezb7973bb2018-04-17 16:41:28 +0000559 if (!stack.empty())
560 return -1;
Dan Sinclair1770c022016-03-14 14:14:16 -0400561 }
Dan Sinclair1770c022016-03-14 14:14:16 -0400562 wsName.ReleaseBuffer(nNameCount);
Tom Sepez0d32b8f2018-04-16 21:09:57 +0000563 wsCondition.ReleaseBuffer(nConditionCount);
Tom Sepezb7973bb2018-04-17 16:41:28 +0000564 wsName.Trim();
Lei Zhang135c6602017-11-21 18:07:00 +0000565 wsCondition.Trim();
dsinclaircbfef572016-05-18 13:16:12 -0700566 rnd.m_uHashName =
Ryan Harrison275e2602017-09-18 14:23:18 -0400567 static_cast<XFA_HashCode>(FX_HashCode_GetW(wsName.AsStringView(), false));
Dan Sinclair1770c022016-03-14 14:14:16 -0400568 return nStart;
569}
Lei Zhangb8d86802017-12-01 22:52:42 +0000570
Dan Sinclaird19aa7c2017-11-06 17:10:21 +0000571void CFXJSE_ResolveProcessor::ConditionArray(int32_t iCurIndex,
572 WideString wsCondition,
573 int32_t iFoundCount,
574 CFXJSE_ResolveNodeData& rnd) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400575 int32_t iLen = wsCondition.GetLength();
tsepezd19e9122016-11-02 15:43:18 -0700576 bool bRelative = false;
577 bool bAll = false;
Dan Sinclair1770c022016-03-14 14:14:16 -0400578 int32_t i = 1;
579 for (; i < iLen; ++i) {
Dan Sinclair812e96c2017-03-13 16:43:37 -0400580 wchar_t ch = wsCondition[i];
Lei Zhangb8d86802017-12-01 22:52:42 +0000581 if (ch == ' ')
Dan Sinclair1770c022016-03-14 14:14:16 -0400582 continue;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000583 if (ch == '+' || ch == '-')
tsepezd19e9122016-11-02 15:43:18 -0700584 bRelative = true;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000585 else if (ch == '*')
tsepezd19e9122016-11-02 15:43:18 -0700586 bAll = true;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000587
Lei Zhangb8d86802017-12-01 22:52:42 +0000588 break;
Dan Sinclair1770c022016-03-14 14:14:16 -0400589 }
590 if (bAll) {
591 if (rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) {
592 if (rnd.m_dwStyles & XFA_RESOLVENODE_Bind) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700593 m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurObject);
Dan Sinclair1770c022016-03-14 14:14:16 -0400594 m_pNodeHelper->m_iCreateCount = 1;
Tom Sepezf8a94392017-03-14 12:13:22 -0700595 rnd.m_Objects.clear();
Dan Sinclair1770c022016-03-14 14:14:16 -0400596 m_pNodeHelper->m_iCurAllStart = -1;
dsinclair85d1f2c2016-06-23 12:40:16 -0700597 m_pNodeHelper->m_pAllStartParent = nullptr;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000598 } else if (m_pNodeHelper->m_iCurAllStart == -1) {
599 m_pNodeHelper->m_iCurAllStart = m_iCurStart;
600 m_pNodeHelper->m_pAllStartParent = ToNode(rnd.m_CurObject);
Dan Sinclair1770c022016-03-14 14:14:16 -0400601 }
602 } else if (rnd.m_dwStyles & XFA_RESOLVENODE_BindNew) {
Dan Sinclair76e336d2017-12-04 18:08:58 +0000603 if (m_pNodeHelper->m_iCurAllStart == -1)
Dan Sinclair1770c022016-03-14 14:14:16 -0400604 m_pNodeHelper->m_iCurAllStart = m_iCurStart;
Dan Sinclair1770c022016-03-14 14:14:16 -0400605 }
606 return;
607 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000608 if (iFoundCount == 1 && !iLen)
Dan Sinclair1770c022016-03-14 14:14:16 -0400609 return;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000610
611 int32_t iIndex = wsCondition.Mid(i, iLen - 1 - i).GetInteger();
612 if (bRelative)
Dan Sinclair1770c022016-03-14 14:14:16 -0400613 iIndex += iCurIndex;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000614
Dan Sinclair1770c022016-03-14 14:14:16 -0400615 if (iFoundCount <= iIndex || iIndex < 0) {
616 if (rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700617 m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurObject);
Dan Sinclair1770c022016-03-14 14:14:16 -0400618 m_pNodeHelper->m_iCreateCount = iIndex - iFoundCount + 1;
619 }
Tom Sepezf8a94392017-03-14 12:13:22 -0700620 rnd.m_Objects.clear();
Dan Sinclair1770c022016-03-14 14:14:16 -0400621 } else {
Tom Sepezf8a94392017-03-14 12:13:22 -0700622 CXFA_Object* ret = rnd.m_Objects[iIndex];
623 rnd.m_Objects.clear();
624 rnd.m_Objects.push_back(ret);
Dan Sinclair1770c022016-03-14 14:14:16 -0400625 }
626}
Tom Sepezf8a94392017-03-14 12:13:22 -0700627
Dan Sinclaird19aa7c2017-11-06 17:10:21 +0000628void CFXJSE_ResolveProcessor::DoPredicateFilter(int32_t iCurIndex,
629 WideString wsCondition,
630 int32_t iFoundCount,
631 CFXJSE_ResolveNodeData& rnd) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700632 ASSERT(iFoundCount == pdfium::CollectionSize<int32_t>(rnd.m_Objects));
Ryan Harrison275e2602017-09-18 14:23:18 -0400633 WideString wsExpression;
Dan Sinclair07c0a492017-12-14 20:29:23 +0000634 CXFA_Script::Type eLangType = CXFA_Script::Type::Unknown;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000635 if (wsCondition.Left(2) == L".[" && wsCondition.Last() == L']')
Dan Sinclair07c0a492017-12-14 20:29:23 +0000636 eLangType = CXFA_Script::Type::Formcalc;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000637 else if (wsCondition.Left(2) == L".(" && wsCondition.Last() == L')')
Dan Sinclair07c0a492017-12-14 20:29:23 +0000638 eLangType = CXFA_Script::Type::Javascript;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000639 else
Dan Sinclair1770c022016-03-14 14:14:16 -0400640 return;
dsinclairdf4bc592016-03-31 20:34:43 -0700641
Dan Sinclair3fff90a2017-11-01 13:12:39 +0000642 CFXJSE_Engine* pContext = rnd.m_pSC;
Dan Sinclair1770c022016-03-14 14:14:16 -0400643 wsExpression = wsCondition.Mid(2, wsCondition.GetLength() - 3);
644 for (int32_t i = iFoundCount - 1; i >= 0; i--) {
Dan Sinclaircb22f9a2017-12-11 22:01:08 +0000645 auto pRetValue = pdfium::MakeUnique<CFXJSE_Value>(rnd.m_pSC->GetIsolate());
Ryan Harrison275e2602017-09-18 14:23:18 -0400646 bool bRet = pContext->RunScript(eLangType, wsExpression.AsStringView(),
Tom Sepezf8a94392017-03-14 12:13:22 -0700647 pRetValue.get(), rnd.m_Objects[i]);
dsinclairf27aeec2016-06-07 19:36:18 -0700648 if (!bRet || !pRetValue->ToBoolean())
Tom Sepezf8a94392017-03-14 12:13:22 -0700649 rnd.m_Objects.erase(rnd.m_Objects.begin() + i);
Dan Sinclair1770c022016-03-14 14:14:16 -0400650 }
651}
652
Dan Sinclaird19aa7c2017-11-06 17:10:21 +0000653void CFXJSE_ResolveProcessor::FilterCondition(CFXJSE_ResolveNodeData& rnd,
654 WideString wsCondition) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400655 int32_t iCurrIndex = 0;
Tom Sepezf8a94392017-03-14 12:13:22 -0700656 const std::vector<CXFA_Node*>* pArray = rnd.m_pSC->GetUpObjectArray();
657 if (!pArray->empty()) {
658 CXFA_Node* curNode = pArray->back();
tsepezd19e9122016-11-02 15:43:18 -0700659 bool bIsProperty = m_pNodeHelper->NodeIsProperty(curNode);
Dan Sinclair1770c022016-03-14 14:14:16 -0400660 if (curNode->IsUnnamed() ||
dsinclair070fcdf2016-06-22 22:04:54 -0700661 (bIsProperty && curNode->GetElementType() != XFA_Element::PageSet)) {
dsinclaird1cf2392016-07-11 06:46:59 -0700662 iCurrIndex = m_pNodeHelper->GetIndex(curNode, XFA_LOGIC_Transparent,
tsepezd19e9122016-11-02 15:43:18 -0700663 bIsProperty, true);
Dan Sinclair1770c022016-03-14 14:14:16 -0400664 } else {
dsinclaird1cf2392016-07-11 06:46:59 -0700665 iCurrIndex = m_pNodeHelper->GetIndex(curNode, XFA_LOGIC_Transparent,
tsepezd19e9122016-11-02 15:43:18 -0700666 bIsProperty, false);
Dan Sinclair1770c022016-03-14 14:14:16 -0400667 }
668 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000669
Tom Sepezf8a94392017-03-14 12:13:22 -0700670 int32_t iFoundCount = pdfium::CollectionSize<int32_t>(rnd.m_Objects);
Lei Zhang135c6602017-11-21 18:07:00 +0000671 wsCondition.Trim();
Dan Sinclair76e336d2017-12-04 18:08:58 +0000672
Dan Sinclair1770c022016-03-14 14:14:16 -0400673 int32_t iLen = wsCondition.GetLength();
674 if (!iLen) {
Dan Sinclair76e336d2017-12-04 18:08:58 +0000675 if (rnd.m_dwStyles & XFA_RESOLVENODE_ALL)
Dan Sinclair1770c022016-03-14 14:14:16 -0400676 return;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000677 if (iFoundCount == 1)
Dan Sinclair1770c022016-03-14 14:14:16 -0400678 return;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000679
Dan Sinclair1770c022016-03-14 14:14:16 -0400680 if (iFoundCount <= iCurrIndex) {
681 if (rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700682 m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurObject);
Dan Sinclair1770c022016-03-14 14:14:16 -0400683 m_pNodeHelper->m_iCreateCount = iCurrIndex - iFoundCount + 1;
684 }
Tom Sepezf8a94392017-03-14 12:13:22 -0700685 rnd.m_Objects.clear();
Dan Sinclair1770c022016-03-14 14:14:16 -0400686 return;
Dan Sinclair1770c022016-03-14 14:14:16 -0400687 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000688
689 CXFA_Object* ret = rnd.m_Objects[iCurrIndex];
690 rnd.m_Objects.clear();
691 rnd.m_Objects.push_back(ret);
692 return;
Dan Sinclair1770c022016-03-14 14:14:16 -0400693 }
Dan Sinclair76e336d2017-12-04 18:08:58 +0000694
Dan Sinclair812e96c2017-03-13 16:43:37 -0400695 wchar_t wTypeChar = wsCondition[0];
Dan Sinclair1770c022016-03-14 14:14:16 -0400696 switch (wTypeChar) {
697 case '[':
dsinclaird1cf2392016-07-11 06:46:59 -0700698 ConditionArray(iCurrIndex, wsCondition, iFoundCount, rnd);
Dan Sinclair1770c022016-03-14 14:14:16 -0400699 return;
Dan Sinclair1770c022016-03-14 14:14:16 -0400700 case '.':
Dan Sinclair76e336d2017-12-04 18:08:58 +0000701 if (iLen > 1 && (wsCondition[1] == '[' || wsCondition[1] == '('))
dsinclaird1cf2392016-07-11 06:46:59 -0700702 DoPredicateFilter(iCurrIndex, wsCondition, iFoundCount, rnd);
Dan Sinclair76e336d2017-12-04 18:08:58 +0000703 return;
704 case '(':
705 case '"':
Dan Sinclair1770c022016-03-14 14:14:16 -0400706 default:
707 return;
708 }
709}
Dan Sinclaird19aa7c2017-11-06 17:10:21 +0000710void CFXJSE_ResolveProcessor::SetStylesForChild(uint32_t dwParentStyles,
711 CFXJSE_ResolveNodeData& rnd) {
tsepez736f28a2016-03-25 14:19:51 -0700712 uint32_t dwSubStyles = XFA_RESOLVENODE_Children;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000713 if (dwParentStyles & XFA_RESOLVENODE_TagName)
Dan Sinclair1770c022016-03-14 14:14:16 -0400714 dwSubStyles |= XFA_RESOLVENODE_TagName;
Dan Sinclair76e336d2017-12-04 18:08:58 +0000715
Dan Sinclair1770c022016-03-14 14:14:16 -0400716 dwSubStyles &= ~XFA_RESOLVENODE_Parent;
717 dwSubStyles &= ~XFA_RESOLVENODE_Siblings;
718 dwSubStyles &= ~XFA_RESOLVENODE_Properties;
719 dwSubStyles |= XFA_RESOLVENODE_ALL;
720 rnd.m_dwStyles = dwSubStyles;
721}
Tom Sepezf8a94392017-03-14 12:13:22 -0700722
Dan Sinclaird19aa7c2017-11-06 17:10:21 +0000723void CFXJSE_ResolveProcessor::SetIndexDataBind(WideString& wsNextCondition,
724 int32_t& iIndex,
725 int32_t iCount) {
dsinclaird1cf2392016-07-11 06:46:59 -0700726 if (m_pNodeHelper->CreateNode_ForCondition(wsNextCondition)) {
dsinclair56a8b192016-06-21 14:15:25 -0700727 if (m_pNodeHelper->m_eLastCreateType == XFA_Element::DataGroup) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400728 iIndex = 0;
729 } else {
730 iIndex = iCount - 1;
731 }
732 } else {
733 iIndex = iCount - 1;
734 }
735}
weili47bcd4c2016-06-16 08:00:06 -0700736
Dan Sinclaird19aa7c2017-11-06 17:10:21 +0000737CFXJSE_ResolveNodeData::CFXJSE_ResolveNodeData(CFXJSE_Engine* pSC)
weili47bcd4c2016-06-16 08:00:06 -0700738 : m_pSC(pSC),
Tom Sepezf8a94392017-03-14 12:13:22 -0700739 m_CurObject(nullptr),
weili47bcd4c2016-06-16 08:00:06 -0700740 m_wsName(),
741 m_uHashName(XFA_HASHCODE_None),
742 m_wsCondition(),
743 m_nLevel(0),
Tom Sepezf8a94392017-03-14 12:13:22 -0700744 m_Objects(),
weili47bcd4c2016-06-16 08:00:06 -0700745 m_dwStyles(XFA_RESOLVENODE_Children),
dsinclair85d1f2c2016-06-23 12:40:16 -0700746 m_pScriptAttribute(nullptr),
Dan Sinclair33beb4e2017-12-04 19:12:16 +0000747 m_dwFlag(XFA_ResolveNode_RSType_Nodes) {}
weili47bcd4c2016-06-16 08:00:06 -0700748
Dan Sinclaird19aa7c2017-11-06 17:10:21 +0000749CFXJSE_ResolveNodeData::~CFXJSE_ResolveNodeData() {}