summaryrefslogtreecommitdiff
path: root/xfa/fxfa
diff options
context:
space:
mode:
Diffstat (limited to 'xfa/fxfa')
-rw-r--r--xfa/fxfa/parser/cxfa_document.cpp36
-rw-r--r--xfa/fxfa/parser/cxfa_document.h12
-rw-r--r--xfa/fxfa/parser/cxfa_node.cpp17
-rw-r--r--xfa/fxfa/parser/cxfa_node.h2
-rw-r--r--xfa/fxfa/parser/cxfa_nodeowner.cpp35
-rw-r--r--xfa/fxfa/parser/cxfa_nodeowner.h28
6 files changed, 74 insertions, 56 deletions
diff --git a/xfa/fxfa/parser/cxfa_document.cpp b/xfa/fxfa/parser/cxfa_document.cpp
index 434d6cbfde..a21d3f974c 100644
--- a/xfa/fxfa/parser/cxfa_document.cpp
+++ b/xfa/fxfa/parser/cxfa_document.cpp
@@ -6,6 +6,8 @@
#include "xfa/fxfa/parser/cxfa_document.h"
+#include <set>
+
#include "core/fxcrt/fx_extension.h"
#include "fxjs/cfxjse_engine.h"
#include "xfa/fxfa/cxfa_ffnotify.h"
@@ -87,7 +89,8 @@ void MergeNode(CXFA_Document* pDocument,
} // namespace
CXFA_Document::CXFA_Document(CXFA_DocumentParser* pParser)
- : m_pParser(pParser),
+ : CXFA_NodeOwner(),
+ m_pParser(pParser),
m_pRootNode(nullptr),
m_eCurVersionMode(XFA_VERSION_DEFAULT),
m_dwDocFlags(0) {
@@ -98,12 +101,6 @@ CXFA_Document::~CXFA_Document() {
// Remove all the bindings before freeing the node as the ownership is wonky.
if (m_pRootNode)
m_pRootNode->ReleaseBindingNodes();
-
- delete m_pRootNode;
-
- for (CXFA_Node* pNode : m_PurgeNodes)
- delete pNode;
- m_PurgeNodes.clear();
}
CXFA_LayoutProcessor* CXFA_Document::GetLayoutProcessor() {
@@ -128,14 +125,6 @@ void CXFA_Document::ClearLayoutData() {
m_pScriptSignature.reset();
}
-void CXFA_Document::SetRoot(CXFA_Node* pNewRoot) {
- if (m_pRootNode)
- AddPurgeNode(m_pRootNode);
-
- m_pRootNode = pNewRoot;
- RemovePurgeNode(pNewRoot);
-}
-
CFX_XMLDoc* CXFA_Document::GetXMLDoc() const {
return m_pParser->GetXMLDoc();
}
@@ -221,22 +210,7 @@ CXFA_Node* CXFA_Document::CreateNode(XFA_PacketType packet,
XFA_Element eElement) {
if (eElement == XFA_Element::Unknown)
return nullptr;
-
- std::unique_ptr<CXFA_Node> pNode = CXFA_Node::Create(this, eElement, packet);
- if (!pNode)
- return nullptr;
-
- // TODO(dsinclair): AddPrugeNode should take ownership of the pointer.
- AddPurgeNode(pNode.get());
- return pNode.release();
-}
-
-void CXFA_Document::AddPurgeNode(CXFA_Node* pNode) {
- m_PurgeNodes.insert(pNode);
-}
-
-bool CXFA_Document::RemovePurgeNode(CXFA_Node* pNode) {
- return !!m_PurgeNodes.erase(pNode);
+ return AddOwnedNode(CXFA_Node::Create(this, eElement, packet));
}
void CXFA_Document::SetFlag(uint32_t dwFlag, bool bOn) {
diff --git a/xfa/fxfa/parser/cxfa_document.h b/xfa/fxfa/parser/cxfa_document.h
index 09c2601fa9..4d1c417c5b 100644
--- a/xfa/fxfa/parser/cxfa_document.h
+++ b/xfa/fxfa/parser/cxfa_document.h
@@ -9,11 +9,11 @@
#include <map>
#include <memory>
-#include <set>
#include <vector>
#include "xfa/fxfa/fxfa.h"
#include "xfa/fxfa/parser/cxfa_localemgr.h"
+#include "xfa/fxfa/parser/cxfa_nodeowner.h"
enum XFA_VERSION {
XFA_VERSION_UNKNOWN = 0,
@@ -57,10 +57,10 @@ class CXFA_LayoutProcessor;
class CXFA_Node;
class CXFA_Object;
-class CXFA_Document {
+class CXFA_Document : public CXFA_NodeOwner {
public:
explicit CXFA_Document(CXFA_DocumentParser* pParser);
- virtual ~CXFA_Document();
+ ~CXFA_Document() override;
virtual CXFA_FFNotify* GetNotify() const;
@@ -77,10 +77,7 @@ class CXFA_Document {
CXFA_LayoutProcessor* GetDocLayout();
CFXJSE_Engine* GetScriptContext();
- void SetRoot(CXFA_Node* pNewRoot);
-
- void AddPurgeNode(CXFA_Node* pNode);
- bool RemovePurgeNode(CXFA_Node* pNode);
+ void SetRoot(CXFA_Node* pNewRoot) { m_pRootNode = pNewRoot; }
bool HasFlag(uint32_t dwFlag) { return (m_dwDocFlags & dwFlag) == dwFlag; }
void SetFlag(uint32_t dwFlag, bool bOn);
@@ -119,7 +116,6 @@ class CXFA_Document {
std::unique_ptr<CScript_LogPseudoModel> m_pScriptLog;
std::unique_ptr<CScript_LayoutPseudoModel> m_pScriptLayout;
std::unique_ptr<CScript_SignaturePseudoModel> m_pScriptSignature;
- std::set<CXFA_Node*> m_PurgeNodes;
XFA_VERSION m_eCurVersionMode;
uint32_t m_dwDocFlags;
};
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 83da3e76df..9159f020da 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -537,16 +537,7 @@ CXFA_Node::CXFA_Node(CXFA_Document* pDoc,
pdfium::MakeUnique<CJX_Node>(this)) {}
CXFA_Node::~CXFA_Node() {
- ASSERT(!parent_);
-
- CXFA_Node* pNode = first_child_;
- while (pNode) {
- CXFA_Node* pNext = pNode->next_sibling_;
- pNode->parent_ = nullptr;
- delete pNode;
- pNode = pNext;
- }
- if (m_pXMLNode && IsOwnXMLNode())
+ if (m_pXMLNode && IsOwnedXMLNode())
delete m_pXMLNode;
}
@@ -1119,10 +1110,6 @@ void CXFA_Node::InsertChild(int32_t index, CXFA_Node* pNode) {
pNode->parent_ = this;
pNode->ClearFlag(XFA_NodeFlag_HasRemovedChildren);
- bool ret = m_pDocument->RemovePurgeNode(pNode);
- ASSERT(ret);
- (void)ret; // Avoid unused variable warning.
-
if (!first_child_) {
ASSERT(!last_child_);
@@ -1221,8 +1208,6 @@ void CXFA_Node::RemoveChild(CXFA_Node* pNode, bool bNotify) {
OnRemoved(bNotify);
- m_pDocument->AddPurgeNode(pNode);
-
if (!IsNeedSavingXMLNode() || !pNode->m_pXMLNode)
return;
diff --git a/xfa/fxfa/parser/cxfa_node.h b/xfa/fxfa/parser/cxfa_node.h
index e800c3c0c3..f5eb2be77e 100644
--- a/xfa/fxfa/parser/cxfa_node.h
+++ b/xfa/fxfa/parser/cxfa_node.h
@@ -469,7 +469,7 @@ class CXFA_Node : public CXFA_Object {
void SetImageEdit(const WideString& wsContentType,
const WideString& wsHref,
const WideString& wsData);
- bool IsOwnXMLNode() const { return HasFlag(XFA_NodeFlag_OwnXMLNode); }
+ bool IsOwnedXMLNode() const { return HasFlag(XFA_NodeFlag_OwnXMLNode); }
CXFA_Node* GetBindingNode() const {
if (binding_nodes_.empty())
return nullptr;
diff --git a/xfa/fxfa/parser/cxfa_nodeowner.cpp b/xfa/fxfa/parser/cxfa_nodeowner.cpp
new file mode 100644
index 0000000000..ae6f589616
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_nodeowner.cpp
@@ -0,0 +1,35 @@
+// Copyright 2018 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_nodeowner.h"
+
+#include <utility>
+
+#include "third_party/base/stl_util.h"
+#include "xfa/fxfa/parser/cxfa_node.h"
+
+CXFA_NodeOwner::CXFA_NodeOwner() = default;
+
+CXFA_NodeOwner::~CXFA_NodeOwner() = default;
+
+CXFA_Node* CXFA_NodeOwner::AddOwnedNode(std::unique_ptr<CXFA_Node> node) {
+ if (!node)
+ return nullptr;
+
+ CXFA_Node* ret = node.get();
+ nodes_.insert(std::move(node));
+ return ret;
+}
+
+void CXFA_NodeOwner::FreeOwnedNode(CXFA_Node* node) {
+ if (!node)
+ return;
+
+ pdfium::FakeUniquePtr<CXFA_Node> search(node);
+ auto it = nodes_.find(search);
+ assert(it != nodes_.end());
+ nodes_.erase(it);
+}
diff --git a/xfa/fxfa/parser/cxfa_nodeowner.h b/xfa/fxfa/parser/cxfa_nodeowner.h
new file mode 100644
index 0000000000..2aaabe4118
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_nodeowner.h
@@ -0,0 +1,28 @@
+// Copyright 2018 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_NODEOWNER_H_
+#define XFA_FXFA_PARSER_CXFA_NODEOWNER_H_
+
+#include <memory>
+#include <set>
+
+class CXFA_Node;
+
+class CXFA_NodeOwner {
+ public:
+ virtual ~CXFA_NodeOwner();
+
+ CXFA_Node* AddOwnedNode(std::unique_ptr<CXFA_Node> node);
+ void FreeOwnedNode(CXFA_Node* node);
+
+ protected:
+ CXFA_NodeOwner();
+
+ std::set<std::unique_ptr<CXFA_Node>> nodes_;
+};
+
+#endif // XFA_FXFA_PARSER_CXFA_NODEOWNER_H_