summaryrefslogtreecommitdiff
path: root/xfa/fxfa/parser/cxfa_nodeowner.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xfa/fxfa/parser/cxfa_nodeowner.cpp')
-rw-r--r--xfa/fxfa/parser/cxfa_nodeowner.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/xfa/fxfa/parser/cxfa_nodeowner.cpp b/xfa/fxfa/parser/cxfa_nodeowner.cpp
index ae6f589616..63f2f717c2 100644
--- a/xfa/fxfa/parser/cxfa_nodeowner.cpp
+++ b/xfa/fxfa/parser/cxfa_nodeowner.cpp
@@ -15,6 +15,19 @@ CXFA_NodeOwner::CXFA_NodeOwner() = default;
CXFA_NodeOwner::~CXFA_NodeOwner() = default;
+void CXFA_NodeOwner::ReleaseXMLNodesIfNeeded() {
+ // Because we don't know what order we'll free the nodes we may end up
+ // destroying the XML tree before nodes have been cleaned up that point into
+ // it. This will cause the ProbeForLowSeverityLifetimeIssue to fire.
+ //
+ // This doesn't happen in the destructor because of the ownership semantics
+ // between the CXFA_Document and CXFA_SimpleParser. It has to happen before
+ // the simple parser is destroyed, but the document has to live longer then
+ // the simple parser.
+ for (auto& it : nodes_)
+ it->ReleaseXMLNodeIfUnowned();
+}
+
CXFA_Node* CXFA_NodeOwner::AddOwnedNode(std::unique_ptr<CXFA_Node> node) {
if (!node)
return nullptr;