Remove CFXJSE_ResolveProcessor::GetNodeHelper().
Instead, have the engine own both the node helper and the resolve
processor, and ensure that the former always outlives the latter.
Change-Id: Iabaf722bf64e37ac119f4354a4f0f04454b6ba6c
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/99450
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp
index 6142beb..7af3501 100644
--- a/fxjs/xfa/cfxjse_engine.cpp
+++ b/fxjs/xfa/cfxjse_engine.cpp
@@ -128,7 +128,9 @@
&kGlobalClassDescriptor,
pDocument->GetRoot()->JSObject(),
nullptr)),
- m_ResolveProcessor(std::make_unique<CFXJSE_ResolveProcessor>(this)) {
+ m_NodeHelper(std::make_unique<CFXJSE_NodeHelper>()),
+ m_ResolveProcessor(
+ std::make_unique<CFXJSE_ResolveProcessor>(this, m_NodeHelper.get())) {
RemoveBuiltInObjs(m_JsContext.get());
m_JsContext->EnableCompatibleMode();
@@ -695,12 +697,11 @@
ResolveResult result;
bool bNextCreate = false;
- CFXJSE_NodeHelper* pNodeHelper = m_ResolveProcessor->GetNodeHelper();
if (dwStyles & XFA_ResolveFlag::kCreateNode)
- pNodeHelper->SetCreateNodeType(bindNode);
+ m_NodeHelper->SetCreateNodeType(bindNode);
- pNodeHelper->m_pCreateParent = nullptr;
- pNodeHelper->m_iCurAllStart = -1;
+ m_NodeHelper->m_pCreateParent = nullptr;
+ m_NodeHelper->m_iCurAllStart = -1;
CFXJSE_ResolveProcessor::NodeData rndFind;
int32_t nStart = 0;
@@ -719,7 +720,7 @@
if (nStart < 1) {
if ((dwStyles & XFA_ResolveFlag::kCreateNode) && !bNextCreate) {
CXFA_Node* pDataNode = nullptr;
- nStart = pNodeHelper->m_iCurAllStart;
+ nStart = m_NodeHelper->m_iCurAllStart;
if (nStart != -1) {
pDataNode = m_pDocument->GetNotBindNode(findObjects);
if (pDataNode) {
@@ -735,7 +736,7 @@
}
dwStyles |= XFA_ResolveFlag::kBind;
findObjects.clear();
- findObjects.emplace_back(pNodeHelper->m_pAllStartParent.Get());
+ findObjects.emplace_back(m_NodeHelper->m_pAllStartParent.Get());
continue;
}
break;
@@ -743,8 +744,8 @@
if (bNextCreate) {
int32_t checked_length =
pdfium::base::checked_cast<int32_t>(wsExpression.GetLength());
- if (pNodeHelper->CreateNode(rndFind.m_wsName, rndFind.m_wsCondition,
- nStart == checked_length, this)) {
+ if (m_NodeHelper->CreateNode(rndFind.m_wsName, rndFind.m_wsCondition,
+ nStart == checked_length, this)) {
continue;
}
break;
@@ -793,14 +794,14 @@
if (nNodes < 1) {
if (dwStyles & XFA_ResolveFlag::kCreateNode) {
bNextCreate = true;
- if (!pNodeHelper->m_pCreateParent) {
- pNodeHelper->m_pCreateParent = ToNode(rndFind.m_CurObject.Get());
- pNodeHelper->m_iCreateCount = 1;
+ if (!m_NodeHelper->m_pCreateParent) {
+ m_NodeHelper->m_pCreateParent = ToNode(rndFind.m_CurObject.Get());
+ m_NodeHelper->m_iCreateCount = 1;
}
int32_t checked_length =
pdfium::base::checked_cast<int32_t>(wsExpression.GetLength());
- if (pNodeHelper->CreateNode(rndFind.m_wsName, rndFind.m_wsCondition,
- nStart == checked_length, this)) {
+ if (m_NodeHelper->CreateNode(rndFind.m_wsName, rndFind.m_wsCondition,
+ nStart == checked_length, this)) {
continue;
}
}
@@ -830,14 +831,14 @@
if ((dwStyles & XFA_ResolveFlag::kCreateNode) ||
(dwStyles & XFA_ResolveFlag::kBind) ||
(dwStyles & XFA_ResolveFlag::kBindNew)) {
- if (pNodeHelper->m_pCreateParent)
- result.objects.emplace_back(pNodeHelper->m_pCreateParent.Get());
+ if (m_NodeHelper->m_pCreateParent)
+ result.objects.emplace_back(m_NodeHelper->m_pCreateParent.Get());
else
- pNodeHelper->CreateNodeForCondition(rndFind.m_wsCondition);
+ m_NodeHelper->CreateNodeForCondition(rndFind.m_wsCondition);
- result.type = pNodeHelper->m_iCreateFlag;
+ result.type = m_NodeHelper->m_iCreateFlag;
if (result.type == ResolveResult::Type::kCreateNodeOne) {
- if (pNodeHelper->m_iCurAllStart != -1)
+ if (m_NodeHelper->m_iCurAllStart != -1)
result.type = ResolveResult::Type::kCreateNodeMidAll;
}
diff --git a/fxjs/xfa/cfxjse_engine.h b/fxjs/xfa/cfxjse_engine.h
index 8001224..82ec2eb 100644
--- a/fxjs/xfa/cfxjse_engine.h
+++ b/fxjs/xfa/cfxjse_engine.h
@@ -27,6 +27,7 @@
class CFXJSE_Context;
class CFXJSE_FormCalcContext;
class CFXJSE_HostObject;
+class CFXJSE_NodeHelper;
class CFXJSE_ResolveProcessor;
class CFXJSE_Value;
class CJS_Runtime;
@@ -187,6 +188,7 @@
UnownedPtr<CXFA_EventParam> m_eventParam;
std::vector<cppgc::Persistent<CXFA_Node>> m_upObjectArray;
UnownedPtr<std::vector<cppgc::Persistent<CXFA_Node>>> m_pScriptNodeArray;
+ std::unique_ptr<CFXJSE_NodeHelper> const m_NodeHelper;
std::unique_ptr<CFXJSE_ResolveProcessor> const m_ResolveProcessor;
std::unique_ptr<CFXJSE_FormCalcContext> m_FormCalcContext;
cppgc::Persistent<CXFA_Object> m_pThisObject;
diff --git a/fxjs/xfa/cfxjse_resolveprocessor.cpp b/fxjs/xfa/cfxjse_resolveprocessor.cpp
index 20dc040..0426127 100644
--- a/fxjs/xfa/cfxjse_resolveprocessor.cpp
+++ b/fxjs/xfa/cfxjse_resolveprocessor.cpp
@@ -25,9 +25,9 @@
#include "xfa/fxfa/parser/cxfa_occur.h"
#include "xfa/fxfa/parser/xfa_utils.h"
-CFXJSE_ResolveProcessor::CFXJSE_ResolveProcessor(CFXJSE_Engine* pEngine)
- : m_pEngine(pEngine),
- m_pNodeHelper(std::make_unique<CFXJSE_NodeHelper>()) {}
+CFXJSE_ResolveProcessor::CFXJSE_ResolveProcessor(CFXJSE_Engine* pEngine,
+ CFXJSE_NodeHelper* pHelper)
+ : m_pEngine(pEngine), m_pNodeHelper(pHelper) {}
CFXJSE_ResolveProcessor::~CFXJSE_ResolveProcessor() = default;
diff --git a/fxjs/xfa/cfxjse_resolveprocessor.h b/fxjs/xfa/cfxjse_resolveprocessor.h
index 3ab63de..554c25c 100644
--- a/fxjs/xfa/cfxjse_resolveprocessor.h
+++ b/fxjs/xfa/cfxjse_resolveprocessor.h
@@ -36,7 +36,7 @@
CFXJSE_Engine::ResolveResult m_Result;
};
- explicit CFXJSE_ResolveProcessor(CFXJSE_Engine* pEngine);
+ CFXJSE_ResolveProcessor(CFXJSE_Engine* pEngine, CFXJSE_NodeHelper* pHelper);
~CFXJSE_ResolveProcessor();
bool Resolve(v8::Isolate* pIsolate, NodeData& rnd);
@@ -44,8 +44,6 @@
int32_t IndexForDataBind(const WideString& wsNextCondition, int32_t iCount);
void SetCurStart(int32_t start) { m_iCurStart = start; }
- CFXJSE_NodeHelper* GetNodeHelper() { return m_pNodeHelper.get(); }
-
private:
bool ResolveForAttributeRs(CXFA_Object* curNode,
CFXJSE_Engine::ResolveResult* rnd,
@@ -72,7 +70,7 @@
int32_t m_iCurStart = 0;
UnownedPtr<CFXJSE_Engine> const m_pEngine;
- std::unique_ptr<CFXJSE_NodeHelper> const m_pNodeHelper;
+ UnownedPtr<CFXJSE_NodeHelper> const m_pNodeHelper;
};
#endif // FXJS_XFA_CFXJSE_RESOLVEPROCESSOR_H_