From 13aa65a71294cac6e4bdaab73ddd6f4b9fcd8676 Mon Sep 17 00:00:00 2001 From: dan sinclair Date: Tue, 17 Apr 2018 21:34:18 +0000 Subject: Add ownership to CFX_XMLNode children This CL sets the CFX_XML tree ownership. The pointers set into the tree must be unique_ptrs and the CFX_XMLNode children are set to be either unique_ptrs or UnownedPtrs. Change-Id: Ib0db495c81471e40f5b4533503f7bbe5a784fd77 Reviewed-on: https://pdfium-review.googlesource.com/30711 Reviewed-by: Henrique Nakashima Commit-Queue: dsinclair --- xfa/fxfa/parser/cxfa_document.cpp | 3 ++- xfa/fxfa/parser/cxfa_document_parser.cpp | 7 +++++-- xfa/fxfa/parser/cxfa_node.cpp | 10 ++-------- 3 files changed, 9 insertions(+), 11 deletions(-) (limited to 'xfa') diff --git a/xfa/fxfa/parser/cxfa_document.cpp b/xfa/fxfa/parser/cxfa_document.cpp index 713e15c4fa..c3e73e2f19 100644 --- a/xfa/fxfa/parser/cxfa_document.cpp +++ b/xfa/fxfa/parser/cxfa_document.cpp @@ -7,6 +7,7 @@ #include "xfa/fxfa/parser/cxfa_document.h" #include +#include #include "core/fxcrt/fx_extension.h" #include "core/fxcrt/fx_fallthrough.h" @@ -1633,7 +1634,7 @@ void CXFA_Document::DoDataMerge() { false); CFX_XMLElement* ref = pDatasetsXMLNode.get(); - m_pRootNode->GetXMLMappingNode()->AppendChild(pDatasetsXMLNode.release()); + m_pRootNode->GetXMLMappingNode()->AppendChild(std::move(pDatasetsXMLNode)); m_pRootNode->InsertChild(pDatasetsRoot, nullptr); pDatasetsRoot->SetXMLMappingNode(ref); } diff --git a/xfa/fxfa/parser/cxfa_document_parser.cpp b/xfa/fxfa/parser/cxfa_document_parser.cpp index 62828d71a7..4770d849b1 100644 --- a/xfa/fxfa/parser/cxfa_document_parser.cpp +++ b/xfa/fxfa/parser/cxfa_document_parser.cpp @@ -349,7 +349,7 @@ std::unique_ptr CXFA_DocumentParser::LoadXML( ASSERT(pStream); auto root = pdfium::MakeUnique(); - root->AppendChild(new CFX_XMLInstruction(L"xml")); + root->AppendChild(pdfium::MakeUnique(L"xml")); CFX_XMLParser parser(root.get(), pStream); return parser.Parse() ? std::move(root) : nullptr; @@ -674,7 +674,10 @@ CXFA_Node* CXFA_DocumentParser::ParseAsXDPPacket_Data( static_cast(pXMLDocumentNode) ->RemoveAttribute(L"xmlns:xfa"); } - pDataElement->AppendChild(pXMLDocumentNode); + // The node was either removed from the parent above, or already has no + // parent so we can take ownership. + pDataElement->AppendChild( + pdfium::WrapUnique(pXMLDocumentNode)); pDataXMLNode.Reset(std::move(pDataElement)); } if (!pDataXMLNode) diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp index 7da4ed551d..3399023037 100644 --- a/xfa/fxfa/parser/cxfa_node.cpp +++ b/xfa/fxfa/parser/cxfa_node.cpp @@ -1158,14 +1158,8 @@ void CXFA_Node::InsertChild(int32_t index, CXFA_Node* pNode) { return; ASSERT(!pNode->xml_node_->GetParent()); - - xml_node_->InsertChildNode(pNode->xml_node_.Get(), index); - if (pNode->xml_node_.IsOwned()) { - // We remove ownership of the XML node from pNode and transfer the ownership - // into the XML tree, the pNode still has an unowned pointer to the XML - // node. - pNode->xml_node_.Release().release(); - } + ASSERT(pNode->xml_node_.IsOwned()); + xml_node_->InsertChildNode(pNode->xml_node_.Release(), index); } void CXFA_Node::InsertChild(CXFA_Node* pNode, CXFA_Node* pBeforeNode) { -- cgit v1.2.3