Make CXFA_NodeHelper::GetOneChildNamed() a member of CXFA_Node. Do the same for GetOneChildOfClass(). Change-Id: Ia7e2081b147add750145b17bd6391c668e2d1c5c Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/52372 Reviewed-by: Tom Sepez <tsepez@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fxjs/xfa/cfxjse_resolveprocessor.cpp b/fxjs/xfa/cfxjse_resolveprocessor.cpp index 92de697..0426d5a 100644 --- a/fxjs/xfa/cfxjse_resolveprocessor.cpp +++ b/fxjs/xfa/cfxjse_resolveprocessor.cpp
@@ -119,23 +119,22 @@ } bool CFXJSE_ResolveProcessor::ResolveAnyChild(CFXJSE_ResolveNodeData& rnd) { + CXFA_Node* pParent = ToNode(rnd.m_CurObject.Get()); + if (!pParent) + return false; + WideStringView wsName = rnd.m_wsName.AsStringView(); WideString wsCondition = rnd.m_wsCondition; - CXFA_Node* findNode = nullptr; - bool bClassName = false; - if (wsName.GetLength() && wsName[0] == '#') { - bClassName = true; - findNode = CXFA_NodeHelper::GetOneChildOfClass( - ToNode(rnd.m_CurObject.Get()), wsName.Right(wsName.GetLength() - 1)); - } else { - findNode = CXFA_NodeHelper::GetOneChildNamed(ToNode(rnd.m_CurObject.Get()), - wsName); - } - if (!findNode) + const bool bClassName = !wsName.IsEmpty() && wsName[0] == '#'; + CXFA_Node* pChild = + bClassName + ? pParent->GetOneChildOfClass(wsName.Right(wsName.GetLength() - 1)) + : pParent->GetOneChildNamed(wsName); + if (!pChild) return false; if (wsCondition.IsEmpty()) { - rnd.m_Objects.emplace_back(findNode); + rnd.m_Objects.emplace_back(pChild); return true; } @@ -144,7 +143,7 @@ nodes.push_back(pObject->AsNode()); std::vector<CXFA_Node*> siblings = - CXFA_NodeHelper::GetSiblings(findNode, XFA_LOGIC_Transparent, bClassName); + CXFA_NodeHelper::GetSiblings(pChild, XFA_LOGIC_Transparent, bClassName); nodes.insert(nodes.end(), siblings.begin(), siblings.end()); rnd.m_Objects = std::vector<UnownedPtr<CXFA_Object>>(nodes.begin(), nodes.end());
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp index 4c0d7d0..851532a 100644 --- a/xfa/fxfa/parser/cxfa_node.cpp +++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -695,6 +695,61 @@ return wsOutput; } +CXFA_Node* FindFirstSiblingNamedInList(CXFA_Node* parent, + uint32_t dwNameHash, + uint32_t dwFilter); +CXFA_Node* FindFirstSiblingOfClassInList(CXFA_Node* parent, + XFA_Element element, + uint32_t dwFilter); + +CXFA_Node* FindFirstSiblingNamed(CXFA_Node* parent, uint32_t dwNameHash) { + CXFA_Node* result = FindFirstSiblingNamedInList(parent, dwNameHash, + XFA_NODEFILTER_Properties); + if (result) + return result; + + return FindFirstSiblingNamedInList(parent, dwNameHash, + XFA_NODEFILTER_Children); +} + +CXFA_Node* FindFirstSiblingNamedInList(CXFA_Node* parent, + uint32_t dwNameHash, + uint32_t dwFilter) { + for (CXFA_Node* child : parent->GetNodeList(dwFilter, XFA_Element::Unknown)) { + if (child->GetNameHash() == dwNameHash) + return child; + + CXFA_Node* result = FindFirstSiblingNamed(child, dwNameHash); + if (result) + return result; + } + return nullptr; +} + +CXFA_Node* FindFirstSiblingOfClass(CXFA_Node* parent, XFA_Element element) { + CXFA_Node* result = + FindFirstSiblingOfClassInList(parent, element, XFA_NODEFILTER_Properties); + if (result) + return result; + + return FindFirstSiblingOfClassInList(parent, element, + XFA_NODEFILTER_Children); +} + +CXFA_Node* FindFirstSiblingOfClassInList(CXFA_Node* parent, + XFA_Element element, + uint32_t dwFilter) { + for (CXFA_Node* child : parent->GetNodeList(dwFilter, XFA_Element::Unknown)) { + if (child->GetElementType() == element) + return child; + + CXFA_Node* result = FindFirstSiblingOfClass(child, element); + if (result) + return result; + } + return nullptr; +} + } // namespace class CXFA_WidgetLayoutData { @@ -1562,6 +1617,18 @@ return nullptr; } +CXFA_Node* CXFA_Node::GetOneChildNamed(WideStringView wsName) { + return FindFirstSiblingNamed(this, FX_HashCode_GetW(wsName, false)); +} + +CXFA_Node* CXFA_Node::GetOneChildOfClass(WideStringView wsClass) { + XFA_Element element = XFA_GetElementByName(wsClass); + if (element == XFA_Element::Unknown) + return nullptr; + + return FindFirstSiblingOfClass(this, element); +} + CXFA_Node* CXFA_Node::GetInstanceMgrOfSubform() { CXFA_Node* pInstanceMgr = nullptr; if (m_ePacket == XFA_PacketType::Form) {
diff --git a/xfa/fxfa/parser/cxfa_node.h b/xfa/fxfa/parser/cxfa_node.h index d886d9f..e7767af 100644 --- a/xfa/fxfa/parser/cxfa_node.h +++ b/xfa/fxfa/parser/cxfa_node.h
@@ -214,6 +214,9 @@ return static_cast<T*>(GetNextSameClassSiblingInternal(eType)); } + CXFA_Node* GetOneChildNamed(WideStringView wsName); + CXFA_Node* GetOneChildOfClass(WideStringView wsClass); + CXFA_Node* GetInstanceMgrOfSubform(); Optional<bool> GetDefaultBoolean(XFA_Attribute attr) const;
diff --git a/xfa/fxfa/parser/cxfa_nodehelper.cpp b/xfa/fxfa/parser/cxfa_nodehelper.cpp index 8f72acf..b99e3f6 100644 --- a/xfa/fxfa/parser/cxfa_nodehelper.cpp +++ b/xfa/fxfa/parser/cxfa_nodehelper.cpp
@@ -20,61 +20,6 @@ namespace { -CXFA_Node* FindFirstSiblingNamedInList(CXFA_Node* parent, - uint32_t dwNameHash, - uint32_t dwFilter); -CXFA_Node* FindFirstSiblingOfClassInList(CXFA_Node* parent, - XFA_Element element, - uint32_t dwFilter); - -CXFA_Node* FindFirstSiblingNamed(CXFA_Node* parent, uint32_t dwNameHash) { - CXFA_Node* result = FindFirstSiblingNamedInList(parent, dwNameHash, - XFA_NODEFILTER_Properties); - if (result) - return result; - - return FindFirstSiblingNamedInList(parent, dwNameHash, - XFA_NODEFILTER_Children); -} - -CXFA_Node* FindFirstSiblingNamedInList(CXFA_Node* parent, - uint32_t dwNameHash, - uint32_t dwFilter) { - for (CXFA_Node* child : parent->GetNodeList(dwFilter, XFA_Element::Unknown)) { - if (child->GetNameHash() == dwNameHash) - return child; - - CXFA_Node* result = FindFirstSiblingNamed(child, dwNameHash); - if (result) - return result; - } - return nullptr; -} - -CXFA_Node* FindFirstSiblingOfClass(CXFA_Node* parent, XFA_Element element) { - CXFA_Node* result = - FindFirstSiblingOfClassInList(parent, element, XFA_NODEFILTER_Properties); - if (result) - return result; - - return FindFirstSiblingOfClassInList(parent, element, - XFA_NODEFILTER_Children); -} - -CXFA_Node* FindFirstSiblingOfClassInList(CXFA_Node* parent, - XFA_Element element, - uint32_t dwFilter) { - for (CXFA_Node* child : parent->GetNodeList(dwFilter, XFA_Element::Unknown)) { - if (child->GetElementType() == element) - return child; - - CXFA_Node* result = FindFirstSiblingOfClass(child, element); - if (result) - return result; - } - return nullptr; -} - void TraverseSiblings(CXFA_Node* parent, uint32_t dwNameHash, std::vector<CXFA_Node*>* pSiblings, @@ -171,27 +116,6 @@ CXFA_NodeHelper::~CXFA_NodeHelper() = default; // static -CXFA_Node* CXFA_NodeHelper::GetOneChildNamed(CXFA_Node* parent, - WideStringView wsName) { - if (!parent) - return nullptr; - return FindFirstSiblingNamed(parent, FX_HashCode_GetW(wsName, false)); -} - -// static -CXFA_Node* CXFA_NodeHelper::GetOneChildOfClass(CXFA_Node* parent, - WideStringView wsClass) { - if (!parent) - return nullptr; - - XFA_Element element = XFA_GetElementByName(wsClass); - if (element == XFA_Element::Unknown) - return nullptr; - - return FindFirstSiblingOfClass(parent, element); -} - -// static std::vector<CXFA_Node*> CXFA_NodeHelper::GetSiblings(CXFA_Node* pNode, XFA_LOGIC_TYPE eLogicType, bool bIsClassName) {
diff --git a/xfa/fxfa/parser/cxfa_nodehelper.h b/xfa/fxfa/parser/cxfa_nodehelper.h index c04178c..d4f973e 100644 --- a/xfa/fxfa/parser/cxfa_nodehelper.h +++ b/xfa/fxfa/parser/cxfa_nodehelper.h
@@ -26,10 +26,6 @@ CXFA_NodeHelper(); ~CXFA_NodeHelper(); - static CXFA_Node* GetOneChildNamed(CXFA_Node* parent, WideStringView wsName); - static CXFA_Node* GetOneChildOfClass(CXFA_Node* parent, - WideStringView wsClass); - static std::vector<CXFA_Node*> GetSiblings(CXFA_Node* pNode, XFA_LOGIC_TYPE eLogicType, bool bIsClassName);