Use unique_ptr for CXFA_XMLParser.

Also rename CFDE_XMLParser to IFDE_XMLParser since its an interface.

Review-Url: https://codereview.chromium.org/2555373002
diff --git a/testing/libfuzzer/pdf_xml_fuzzer.cc b/testing/libfuzzer/pdf_xml_fuzzer.cc
index 4f000ab..e3cd254 100644
--- a/testing/libfuzzer/pdf_xml_fuzzer.cc
+++ b/testing/libfuzzer/pdf_xml_fuzzer.cc
@@ -56,14 +56,11 @@
   if (!stream)
     return 0;
 
-  std::unique_ptr<CFDE_XMLDoc> doc = pdfium::MakeUnique<CFDE_XMLDoc>();
-  std::unique_ptr<CFDE_XMLParser, ReleaseDeleter<CFDE_XMLParser>> parser(
-      new CXFA_XMLParser(doc->GetRoot(), stream));
-  if (!doc->LoadXML(parser.release()))
+  auto doc = pdfium::MakeUnique<CFDE_XMLDoc>();
+  if (!doc->LoadXML(pdfium::MakeUnique<CXFA_XMLParser>(doc->GetRoot(), stream)))
     return 0;
 
-  int32_t load_result = doc->DoLoad(nullptr);
-  if (load_result < 100)
+  if (doc->DoLoad(nullptr) < 100)
     return 0;
 
   (void)XFA_FDEExtension_GetDocumentNode(doc.get());
diff --git a/xfa/fde/xml/fde_xml_imp.cpp b/xfa/fde/xml/fde_xml_imp.cpp
index f333b4f..7880804 100644
--- a/xfa/fde/xml/fde_xml_imp.cpp
+++ b/xfa/fde/xml/fde_xml_imp.cpp
@@ -7,6 +7,7 @@
 #include "xfa/fde/xml/fde_xml_imp.h"
 
 #include <algorithm>
+#include <utility>
 
 #include "core/fxcrt/fx_ext.h"
 #include "core/fxcrt/fx_safe_types.h"
@@ -957,29 +958,27 @@
 }
 
 void CFDE_XMLDoc::ReleaseParser() {
-  if (m_pXMLParser) {
-    m_pXMLParser->Release();
-    m_pXMLParser = nullptr;
-  }
+  m_pXMLParser.reset();
   if (m_pSyntaxParser) {
     m_pSyntaxParser->Release();
     m_pSyntaxParser = nullptr;
   }
 }
 
-bool CFDE_XMLDoc::LoadXML(CFDE_XMLParser* pXMLParser) {
+bool CFDE_XMLDoc::LoadXML(std::unique_ptr<IFDE_XMLParser> pXMLParser) {
   if (!pXMLParser)
     return false;
 
   Reset(true);
-  m_pXMLParser = pXMLParser;
-  return !!m_pXMLParser;
+  m_pXMLParser = std::move(pXMLParser);
+  return true;
 }
 
 int32_t CFDE_XMLDoc::DoLoad(IFX_Pause* pPause) {
-  if (m_iStatus >= 100)
-    return m_iStatus;
-  return m_iStatus = m_pXMLParser->DoParser(pPause);
+  if (m_iStatus < 100)
+    m_iStatus = m_pXMLParser->DoParser(pPause);
+
+  return m_iStatus;
 }
 
 void CFDE_XMLDoc::CloseXML() {
diff --git a/xfa/fde/xml/fde_xml_imp.h b/xfa/fde/xml/fde_xml_imp.h
index 283184a..8571f1b 100644
--- a/xfa/fde/xml/fde_xml_imp.h
+++ b/xfa/fde/xml/fde_xml_imp.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FDE_XML_FDE_XML_IMP_H_
 #define XFA_FDE_XML_FDE_XML_IMP_H_
 
+#include <memory>
+
 #include "core/fxcrt/fx_system.h"
 #include "xfa/fde/xml/fde_xml.h"
 #include "xfa/fgas/crt/fgas_memory.h"
@@ -19,8 +21,8 @@
 class CFDE_XMLText;
 class CFDE_XMLDoc;
 class CFDE_XMLDOMParser;
-class CFDE_XMLParser;
 class CFDE_XMLSyntaxParser;
+class IFDE_XMLParser;
 
 class CFDE_XMLNode : public CFX_Target {
  public:
@@ -193,7 +195,7 @@
   CFDE_XMLDoc();
   ~CFDE_XMLDoc() override;
 
-  bool LoadXML(CFDE_XMLParser* pXMLParser);
+  bool LoadXML(std::unique_ptr<IFDE_XMLParser> pXMLParser);
   int32_t DoLoad(IFX_Pause* pPause = nullptr);
   void CloseXML();
   CFDE_XMLNode* GetRoot() const { return m_pRoot; }
@@ -209,14 +211,12 @@
   int32_t m_iStatus;
   CFDE_XMLNode* m_pRoot;
   CFDE_XMLSyntaxParser* m_pSyntaxParser;
-  CFDE_XMLParser* m_pXMLParser;
+  std::unique_ptr<IFDE_XMLParser> m_pXMLParser;
 };
 
-class CFDE_XMLParser {
+class IFDE_XMLParser {
  public:
-  virtual ~CFDE_XMLParser() {}
-
-  virtual void Release() = 0;
+  virtual ~IFDE_XMLParser() {}
   virtual int32_t DoParser(IFX_Pause* pPause) = 0;
 };
 
diff --git a/xfa/fxfa/parser/cxfa_simple_parser.cpp b/xfa/fxfa/parser/cxfa_simple_parser.cpp
index 9eca652..9f6fef9 100644
--- a/xfa/fxfa/parser/cxfa_simple_parser.cpp
+++ b/xfa/fxfa/parser/cxfa_simple_parser.cpp
@@ -6,6 +6,8 @@
 
 #include "xfa/fxfa/parser/cxfa_simple_parser.h"
 
+#include <utility>
+
 #include "core/fxcrt/fx_ext.h"
 #include "third_party/base/ptr_util.h"
 #include "xfa/fgas/crt/fgas_codepage.h"
@@ -293,9 +295,11 @@
       wCodePage != FX_CODEPAGE_UTF8) {
     m_pStream->SetCodePage(FX_CODEPAGE_UTF8);
   }
-  m_pXMLDoc.reset(new CFDE_XMLDoc);
-  m_pXMLParser = new CXFA_XMLParser(m_pXMLDoc->GetRoot(), m_pStream);
-  if (!m_pXMLDoc->LoadXML(m_pXMLParser))
+  m_pXMLDoc = pdfium::MakeUnique<CFDE_XMLDoc>();
+  auto pNewParser =
+      pdfium::MakeUnique<CXFA_XMLParser>(m_pXMLDoc->GetRoot(), m_pStream);
+  m_pXMLParser = pNewParser.get();
+  if (!m_pXMLDoc->LoadXML(std::move(pNewParser)))
     return XFA_PARSESTATUS_StatusErr;
 
   m_ePacketID = ePacketID;
@@ -326,12 +330,12 @@
                                         IFX_Pause* pPause) {
   CloseParser();
   pXMLNode = nullptr;
-
-  auto pStream = pdfium::MakeRetain<CXFA_WideTextRead>(wsXML);
   m_pXMLDoc = pdfium::MakeUnique<CFDE_XMLDoc>();
-  CXFA_XMLParser* pParser = new CXFA_XMLParser(m_pXMLDoc->GetRoot(), pStream);
+  auto pStream = pdfium::MakeRetain<CXFA_WideTextRead>(wsXML);
+  auto pParser =
+      pdfium::MakeUnique<CXFA_XMLParser>(m_pXMLDoc->GetRoot(), pStream);
   pParser->m_dwCheckStatus = 0x03;
-  if (!m_pXMLDoc->LoadXML(pParser))
+  if (!m_pXMLDoc->LoadXML(std::move(pParser)))
     return XFA_PARSESTATUS_StatusErr;
 
   int32_t iRet = m_pXMLDoc->DoLoad(pPause);
diff --git a/xfa/fxfa/parser/cxfa_xml_parser.cpp b/xfa/fxfa/parser/cxfa_xml_parser.cpp
index 6d2ef35..95920d9 100644
--- a/xfa/fxfa/parser/cxfa_xml_parser.cpp
+++ b/xfa/fxfa/parser/cxfa_xml_parser.cpp
@@ -29,10 +29,6 @@
   m_ws2.clear();
 }
 
-void CXFA_XMLParser::Release() {
-  delete this;
-}
-
 int32_t CXFA_XMLParser::DoParser(IFX_Pause* pPause) {
   if (m_syntaxParserResult == FDE_XmlSyntaxResult::Error)
     return -1;
diff --git a/xfa/fxfa/parser/cxfa_xml_parser.h b/xfa/fxfa/parser/cxfa_xml_parser.h
index 4c64ee2..e49a9dd 100644
--- a/xfa/fxfa/parser/cxfa_xml_parser.h
+++ b/xfa/fxfa/parser/cxfa_xml_parser.h
@@ -14,14 +14,13 @@
 class IFGAS_Stream;
 class IFX_Pause;
 
-class CXFA_XMLParser : public CFDE_XMLParser {
+class CXFA_XMLParser : public IFDE_XMLParser {
  public:
   CXFA_XMLParser(CFDE_XMLNode* pRoot,
                  const CFX_RetainPtr<IFGAS_Stream>& pStream);
   ~CXFA_XMLParser() override;
 
-  // CFDE_XMLParser
-  void Release() override;
+  // IFDE_XMLParser
   int32_t DoParser(IFX_Pause* pPause) override;
 
   FX_FILESIZE m_nStart[2];