diff options
author | Dan Sinclair <dsinclair@chromium.org> | 2018-05-02 16:02:03 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2018-05-02 16:02:03 +0000 |
commit | 70180648ffd01dd3716871758411d2031aaaebbe (patch) | |
tree | 6cc1d7aa3df8c3e343a1ef6f7e032bae8499f6db /fxjs/xfa | |
parent | 8ab2b2b2869f769dc169b4a96bb67ec596d5278b (diff) | |
download | pdfium-70180648ffd01dd3716871758411d2031aaaebbe.tar.xz |
Add a CFX_XMLDocument class.
This CL adds a CFX_XMLDocument to act as the XML node container. All
nodes are now owned by the document and the document is returned by the
CFX_XMLParser.
Classes which parse XML files now store the document instead of the root
node.
BUG: chromium:835636
Change-Id: I1e07d6115cf14714911d6fd4c3fa920c94fd5faf
Reviewed-on: https://pdfium-review.googlesource.com/31313
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
Diffstat (limited to 'fxjs/xfa')
-rw-r--r-- | fxjs/xfa/cjx_node.cpp | 35 | ||||
-rw-r--r-- | fxjs/xfa/cjx_packet.cpp | 14 |
2 files changed, 36 insertions, 13 deletions
diff --git a/fxjs/xfa/cjx_node.cpp b/fxjs/xfa/cjx_node.cpp index a8a88c9627..a07aa4cb2c 100644 --- a/fxjs/xfa/cjx_node.cpp +++ b/fxjs/xfa/cjx_node.cpp @@ -16,6 +16,7 @@ #include "fxjs/js_resources.h" #include "third_party/base/ptr_util.h" #include "xfa/fxfa/cxfa_eventparam.h" +#include "xfa/fxfa/cxfa_ffdoc.h" #include "xfa/fxfa/cxfa_ffnotify.h" #include "xfa/fxfa/parser/cxfa_document.h" #include "xfa/fxfa/parser/cxfa_document_parser.h" @@ -236,14 +237,26 @@ CJS_Return CJX_Node::loadXML(CFX_V8* runtime, WideString(wsContentType), false, false); } - std::unique_ptr<CFX_XMLNode> pFakeXMLRoot(pFakeRoot->GetXMLMappingNode()); + CFX_XMLNode* pFakeXMLRoot = pFakeRoot->GetXMLMappingNode(); if (!pFakeXMLRoot) { CFX_XMLNode* pThisXMLRoot = GetXFANode()->GetXMLMappingNode(); - pFakeXMLRoot = pThisXMLRoot ? pThisXMLRoot->Clone() : nullptr; - } - if (!pFakeXMLRoot) { - pFakeXMLRoot = pdfium::MakeUnique<CFX_XMLElement>( - WideString(GetXFANode()->GetClassName())); + CFX_XMLNode* clone; + if (pThisXMLRoot) { + clone = pThisXMLRoot->Clone(GetXFANode() + ->GetDocument() + ->GetNotify() + ->GetHDOC() + ->GetXMLDocument()); + } else { + clone = GetXFANode() + ->GetDocument() + ->GetNotify() + ->GetHDOC() + ->GetXMLDocument() + ->CreateNode<CFX_XMLElement>( + WideString(GetXFANode()->GetClassName())); + } + pFakeXMLRoot = clone; } if (bIgnoreRoot) { @@ -251,7 +264,7 @@ CJS_Return CJX_Node::loadXML(CFX_V8* runtime, while (pXMLChild) { CFX_XMLNode* pXMLSibling = pXMLChild->GetNextSibling(); pXMLNode->RemoveChildNode(pXMLChild); - pFakeXMLRoot->AppendChild(pdfium::WrapUnique<CFX_XMLNode>(pXMLChild)); + pFakeXMLRoot->AppendChild(pXMLChild); pXMLChild = pXMLSibling; } } else { @@ -259,10 +272,10 @@ CJS_Return CJX_Node::loadXML(CFX_V8* runtime, if (pXMLParent) pXMLParent->RemoveChildNode(pXMLNode); - pFakeXMLRoot->AppendChild(pdfium::WrapUnique<CFX_XMLNode>(pXMLNode)); + pFakeXMLRoot->AppendChild(pXMLNode); } - pParser->ConstructXFANode(pFakeRoot, pFakeXMLRoot.get()); + pParser->ConstructXFANode(pFakeRoot, pFakeXMLRoot); pFakeRoot = pParser->GetRootNode(); if (!pFakeRoot) return CJS_Return(true); @@ -289,10 +302,10 @@ CJS_Return CJX_Node::loadXML(CFX_V8* runtime, if (GetXFANode()->GetPacketType() == XFA_PacketType::Form && GetXFANode()->GetElementType() == XFA_Element::ExData) { CFX_XMLNode* pTempXMLNode = GetXFANode()->GetXMLMappingNode(); - GetXFANode()->SetXMLMappingNode(std::move(pFakeXMLRoot)); + GetXFANode()->SetXMLMappingNode(pFakeXMLRoot); if (pTempXMLNode && !pTempXMLNode->GetParent()) - pFakeXMLRoot.reset(pTempXMLNode); + pFakeXMLRoot = pTempXMLNode; else pFakeXMLRoot = nullptr; } diff --git a/fxjs/xfa/cjx_packet.cpp b/fxjs/xfa/cjx_packet.cpp index bd39ec0538..c3d8dbbeba 100644 --- a/fxjs/xfa/cjx_packet.cpp +++ b/fxjs/xfa/cjx_packet.cpp @@ -6,10 +6,15 @@ #include "fxjs/xfa/cjx_packet.h" +#include <utility> #include <vector> +#include "core/fxcrt/xml/cfx_xmldocument.h" +#include "core/fxcrt/xml/cfx_xmltext.h" #include "fxjs/cfxjse_value.h" #include "fxjs/js_resources.h" +#include "xfa/fxfa/cxfa_ffdoc.h" +#include "xfa/fxfa/cxfa_ffnotify.h" #include "xfa/fxfa/parser/cxfa_packet.h" const CJX_MethodSpec CJX_Packet::MethodSpecs[] = { @@ -75,8 +80,13 @@ void CJX_Packet::content(CFXJSE_Value* pValue, CFX_XMLNode* pXMLNode = GetXFANode()->GetXMLMappingNode(); if (bSetting) { if (pXMLNode && pXMLNode->GetType() == FX_XMLNODE_Element) { - CFX_XMLElement* pXMLElement = static_cast<CFX_XMLElement*>(pXMLNode); - pXMLElement->SetTextData(pValue->ToWideString()); + auto* text = GetXFANode() + ->GetDocument() + ->GetNotify() + ->GetHDOC() + ->GetXMLDocument() + ->CreateNode<CFX_XMLText>(pValue->ToWideString()); + pXMLNode->AppendChild(text); } return; } |