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);