Return unique_ptr from CPDF_Object::Clone().

Because that's what clone does.  There are numerous
release() calls that will go away as more code is
converted.

Review-Url: https://codereview.chromium.org/2484033002
diff --git a/core/fpdfapi/edit/fpdf_edit_create.cpp b/core/fpdfapi/edit/fpdf_edit_create.cpp
index a578a0a..c823ab0 100644
--- a/core/fpdfapi/edit/fpdf_edit_create.cpp
+++ b/core/fpdfapi/edit/fpdf_edit_create.cpp
@@ -404,7 +404,7 @@
 
 void CPDF_FlateEncoder::CloneDict() {
   if (!m_bCloned) {
-    m_pDict = ToDictionary(m_pDict->Clone());
+    m_pDict = ToDictionary(m_pDict->Clone().release());
     ASSERT(m_pDict);
     m_bCloned = true;
   }
@@ -425,7 +425,7 @@
       destAcc.LoadAllData(pStream);
       m_dwSize = destAcc.GetSize();
       m_pData = (uint8_t*)destAcc.DetachData();
-      m_pDict = ToDictionary(pStream->GetDict()->Clone());
+      m_pDict = ToDictionary(pStream->GetDict()->Clone().release());
       m_pDict->RemoveFor("Filter");
       m_bNewData = true;
       m_bCloned = true;
@@ -441,7 +441,7 @@
   m_bCloned = true;
   // TODO(thestig): Move to Init() and check return value.
   ::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), &m_pData, &m_dwSize);
-  m_pDict = ToDictionary(pStream->GetDict()->Clone());
+  m_pDict = ToDictionary(pStream->GetDict()->Clone().release());
   m_pDict->SetIntegerFor("Length", m_dwSize);
   m_pDict->SetNameFor("Filter", "FlateDecode");
   m_pDict->RemoveFor("DecodeParms");
@@ -1931,7 +1931,7 @@
     m_pIDArray.reset(new CPDF_Array);
     CPDF_Object* pID1 = pOldIDArray ? pOldIDArray->GetObjectAt(0) : nullptr;
     if (pID1) {
-      m_pIDArray->Add(pID1->Clone());
+      m_pIDArray->Add(pID1->Clone().release());
     } else {
       std::vector<uint8_t> buffer =
           PDF_GenerateFileID((uint32_t)(uintptr_t) this, m_dwLastObjNum);
@@ -1945,7 +1945,7 @@
   if (pOldIDArray) {
     CPDF_Object* pID2 = pOldIDArray->GetObjectAt(1);
     if ((m_dwFlags & FPDFCREATE_INCREMENTAL) && m_pEncryptDict && pID2) {
-      m_pIDArray->Add(pID2->Clone());
+      m_pIDArray->Add(pID2->Clone().release());
       return;
     }
     std::vector<uint8_t> buffer =
@@ -1954,7 +1954,7 @@
     m_pIDArray->Add(new CPDF_String(bsBuffer, true));
     return;
   }
-  m_pIDArray->Add(m_pIDArray->GetObjectAt(0)->Clone());
+  m_pIDArray->Add(m_pIDArray->GetObjectAt(0)->Clone().release());
   if (m_pEncryptDict && !pOldIDArray && m_pParser && bNewId) {
     if (m_pEncryptDict->GetStringFor("Filter") == "Standard") {
       CFX_ByteString user_pass = m_pParser->GetPassword();
diff --git a/core/fpdfapi/page/cpdf_contentmarkitem.cpp b/core/fpdfapi/page/cpdf_contentmarkitem.cpp
index dffeada..48a9679 100644
--- a/core/fpdfapi/page/cpdf_contentmarkitem.cpp
+++ b/core/fpdfapi/page/cpdf_contentmarkitem.cpp
@@ -16,7 +16,7 @@
       m_ParamType(that.m_ParamType),
       m_pPropertiesDict(that.m_pPropertiesDict) {
   if (that.m_pDirectDict)
-    m_pDirectDict.reset(that.m_pDirectDict->Clone()->AsDictionary());
+    m_pDirectDict = ToDictionary(that.m_pDirectDict->Clone());
 }
 
 CPDF_ContentMarkItem::~CPDF_ContentMarkItem() {}
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index cd77c0b..e7d23c0 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -667,7 +667,7 @@
       if (name != "DeviceRGB" && name != "DeviceGray" && name != "DeviceCMYK") {
         pCSObj = FindResourceObj("ColorSpace", name);
         if (pCSObj && pCSObj->IsInline()) {
-          pCSObj = pCSObj->Clone();
+          pCSObj = pCSObj->Clone().release();
           pDict->SetFor("ColorSpace", pCSObj);
         }
       }
diff --git a/core/fpdfapi/parser/cpdf_array.cpp b/core/fpdfapi/parser/cpdf_array.cpp
index 4000bbc..af9b544 100644
--- a/core/fpdfapi/parser/cpdf_array.cpp
+++ b/core/fpdfapi/parser/cpdf_array.cpp
@@ -44,21 +44,22 @@
   return this;
 }
 
-CPDF_Object* CPDF_Array::Clone() const {
+std::unique_ptr<CPDF_Object> CPDF_Array::Clone() const {
   return CloneObjectNonCyclic(false);
 }
 
-CPDF_Object* CPDF_Array::CloneNonCyclic(
+std::unique_ptr<CPDF_Object> CPDF_Array::CloneNonCyclic(
     bool bDirect,
     std::set<const CPDF_Object*>* pVisited) const {
   pVisited->insert(this);
-  CPDF_Array* pCopy = new CPDF_Array();
-  for (size_t i = 0; i < GetCount(); i++) {
-    CPDF_Object* value = m_Objects[i];
-    if (!pdfium::ContainsKey(*pVisited, value))
-      pCopy->m_Objects.push_back(value->CloneNonCyclic(bDirect, pVisited));
+  auto pCopy = pdfium::MakeUnique<CPDF_Array>();
+  for (CPDF_Object* value : m_Objects) {
+    if (!pdfium::ContainsKey(*pVisited, value)) {
+      pCopy->m_Objects.push_back(
+          value->CloneNonCyclic(bDirect, pVisited).release());
+    }
   }
-  return pCopy;
+  return std::move(pCopy);
 }
 
 CFX_FloatRect CPDF_Array::GetRect() {
diff --git a/core/fpdfapi/parser/cpdf_array.h b/core/fpdfapi/parser/cpdf_array.h
index 9deb478..5a9b10c 100644
--- a/core/fpdfapi/parser/cpdf_array.h
+++ b/core/fpdfapi/parser/cpdf_array.h
@@ -23,9 +23,9 @@
   CPDF_Array();
   ~CPDF_Array() override;
 
-  // CPDF_Object.
+  // CPDF_Object:
   Type GetType() const override;
-  CPDF_Object* Clone() const override;
+  std::unique_ptr<CPDF_Object> Clone() const override;
   bool IsArray() const override;
   CPDF_Array* AsArray() override;
   const CPDF_Array* AsArray() const override;
@@ -62,7 +62,7 @@
   const_iterator end() const { return m_Objects.end(); }
 
  protected:
-  CPDF_Object* CloneNonCyclic(
+  std::unique_ptr<CPDF_Object> CloneNonCyclic(
       bool bDirect,
       std::set<const CPDF_Object*>* pVisited) const override;
 
diff --git a/core/fpdfapi/parser/cpdf_array_unittest.cpp b/core/fpdfapi/parser/cpdf_array_unittest.cpp
index b1a4605..acb1bd8 100644
--- a/core/fpdfapi/parser/cpdf_array_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_array_unittest.cpp
@@ -87,7 +87,7 @@
     std::unique_ptr<CPDF_Array> arr(new CPDF_Array);
     for (size_t i = 0; i < FX_ArraySize(elems); ++i)
       arr->InsertAt(i, new CPDF_Number(elems[i]));
-    std::unique_ptr<CPDF_Array> arr2(arr->Clone()->AsArray());
+    std::unique_ptr<CPDF_Array> arr2 = ToArray(arr->Clone());
     EXPECT_EQ(arr->GetCount(), arr2->GetCount());
     for (size_t i = 0; i < FX_ArraySize(elems); ++i) {
       // Clone() always create new objects.
@@ -120,10 +120,10 @@
     ASSERT_EQ(kNumOfRows, arr->GetCount());
     // Not dereferencing reference objects means just creating new references
     // instead of new copies of direct objects.
-    std::unique_ptr<CPDF_Array> arr1(arr->Clone()->AsArray());
+    std::unique_ptr<CPDF_Array> arr1 = ToArray(arr->Clone());
     EXPECT_EQ(arr->GetCount(), arr1->GetCount());
     // Dereferencing reference objects creates new copies of direct objects.
-    std::unique_ptr<CPDF_Array> arr2(arr->CloneDirectObject()->AsArray());
+    std::unique_ptr<CPDF_Array> arr2 = ToArray(arr->CloneDirectObject());
     EXPECT_EQ(arr->GetCount(), arr2->GetCount());
     for (size_t i = 0; i < kNumOfRows; ++i) {
       CPDF_Array* arr_elem = arr->GetObjectAt(i)->AsArray();
diff --git a/core/fpdfapi/parser/cpdf_boolean.cpp b/core/fpdfapi/parser/cpdf_boolean.cpp
index 416b6ff..0204fd9 100644
--- a/core/fpdfapi/parser/cpdf_boolean.cpp
+++ b/core/fpdfapi/parser/cpdf_boolean.cpp
@@ -5,6 +5,7 @@
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
 #include "core/fpdfapi/parser/cpdf_boolean.h"
+#include "third_party/base/ptr_util.h"
 
 CPDF_Boolean::CPDF_Boolean() : m_bValue(false) {}
 
@@ -16,8 +17,8 @@
   return BOOLEAN;
 }
 
-CPDF_Object* CPDF_Boolean::Clone() const {
-  return new CPDF_Boolean(m_bValue);
+std::unique_ptr<CPDF_Object> CPDF_Boolean::Clone() const {
+  return pdfium::MakeUnique<CPDF_Boolean>(m_bValue);
 }
 
 CFX_ByteString CPDF_Boolean::GetString() const {
diff --git a/core/fpdfapi/parser/cpdf_boolean.h b/core/fpdfapi/parser/cpdf_boolean.h
index bc864a6..808f9ee 100644
--- a/core/fpdfapi/parser/cpdf_boolean.h
+++ b/core/fpdfapi/parser/cpdf_boolean.h
@@ -19,7 +19,7 @@
 
   // CPDF_Object:
   Type GetType() const override;
-  CPDF_Object* Clone() const override;
+  std::unique_ptr<CPDF_Object> Clone() const override;
   CFX_ByteString GetString() const override;
   int GetInteger() const override;
   void SetString(const CFX_ByteString& str) override;
diff --git a/core/fpdfapi/parser/cpdf_dictionary.cpp b/core/fpdfapi/parser/cpdf_dictionary.cpp
index 37efbbc..403c29f 100644
--- a/core/fpdfapi/parser/cpdf_dictionary.cpp
+++ b/core/fpdfapi/parser/cpdf_dictionary.cpp
@@ -57,23 +57,23 @@
   return this;
 }
 
-CPDF_Object* CPDF_Dictionary::Clone() const {
+std::unique_ptr<CPDF_Object> CPDF_Dictionary::Clone() const {
   return CloneObjectNonCyclic(false);
 }
 
-CPDF_Object* CPDF_Dictionary::CloneNonCyclic(
+std::unique_ptr<CPDF_Object> CPDF_Dictionary::CloneNonCyclic(
     bool bDirect,
     std::set<const CPDF_Object*>* pVisited) const {
   pVisited->insert(this);
-  CPDF_Dictionary* pCopy = new CPDF_Dictionary(m_pPool);
+  auto pCopy = pdfium::MakeUnique<CPDF_Dictionary>(m_pPool);
   for (const auto& it : *this) {
     CPDF_Object* value = it.second;
     if (!pdfium::ContainsKey(*pVisited, value)) {
-      pCopy->m_Map.insert(
-          std::make_pair(it.first, value->CloneNonCyclic(bDirect, pVisited)));
+      pCopy->m_Map.insert(std::make_pair(
+          it.first, value->CloneNonCyclic(bDirect, pVisited).release()));
     }
   }
-  return pCopy;
+  return std::move(pCopy);
 }
 
 CPDF_Object* CPDF_Dictionary::GetObjectFor(const CFX_ByteString& key) const {
diff --git a/core/fpdfapi/parser/cpdf_dictionary.h b/core/fpdfapi/parser/cpdf_dictionary.h
index 4ef2f96..fffe034 100644
--- a/core/fpdfapi/parser/cpdf_dictionary.h
+++ b/core/fpdfapi/parser/cpdf_dictionary.h
@@ -28,9 +28,9 @@
   explicit CPDF_Dictionary(const CFX_WeakPtr<CFX_ByteStringPool>& pPool);
   ~CPDF_Dictionary() override;
 
-  // CPDF_Object.
+  // CPDF_Object:
   Type GetType() const override;
-  CPDF_Object* Clone() const override;
+  std::unique_ptr<CPDF_Object> Clone() const override;
   CPDF_Dictionary* GetDict() const override;
   bool IsDictionary() const override;
   CPDF_Dictionary* AsDictionary() override;
@@ -90,7 +90,7 @@
 
  protected:
   CFX_ByteString MaybeIntern(const CFX_ByteString& str);
-  CPDF_Object* CloneNonCyclic(
+  std::unique_ptr<CPDF_Object> CloneNonCyclic(
       bool bDirect,
       std::set<const CPDF_Object*>* visited) const override;
 
diff --git a/core/fpdfapi/parser/cpdf_name.cpp b/core/fpdfapi/parser/cpdf_name.cpp
index 5cc8479..bb46425 100644
--- a/core/fpdfapi/parser/cpdf_name.cpp
+++ b/core/fpdfapi/parser/cpdf_name.cpp
@@ -7,6 +7,7 @@
 #include "core/fpdfapi/parser/cpdf_name.h"
 
 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
+#include "third_party/base/ptr_util.h"
 
 CPDF_Name::CPDF_Name(const CFX_ByteString& str) : m_Name(str) {}
 
@@ -16,8 +17,8 @@
   return NAME;
 }
 
-CPDF_Object* CPDF_Name::Clone() const {
-  return new CPDF_Name(m_Name);
+std::unique_ptr<CPDF_Object> CPDF_Name::Clone() const {
+  return pdfium::MakeUnique<CPDF_Name>(m_Name);
 }
 
 CFX_ByteString CPDF_Name::GetString() const {
diff --git a/core/fpdfapi/parser/cpdf_name.h b/core/fpdfapi/parser/cpdf_name.h
index aea1de4..ee50595 100644
--- a/core/fpdfapi/parser/cpdf_name.h
+++ b/core/fpdfapi/parser/cpdf_name.h
@@ -16,7 +16,7 @@
 
   // CPDF_Object:
   Type GetType() const override;
-  CPDF_Object* Clone() const override;
+  std::unique_ptr<CPDF_Object> Clone() const override;
   CFX_ByteString GetString() const override;
   CFX_WideString GetUnicodeText() const override;
   void SetString(const CFX_ByteString& str) override;
diff --git a/core/fpdfapi/parser/cpdf_null.cpp b/core/fpdfapi/parser/cpdf_null.cpp
index dd23101..41478d7 100644
--- a/core/fpdfapi/parser/cpdf_null.cpp
+++ b/core/fpdfapi/parser/cpdf_null.cpp
@@ -5,6 +5,7 @@
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
 #include "core/fpdfapi/parser/cpdf_null.h"
+#include "third_party/base/ptr_util.h"
 
 CPDF_Null::CPDF_Null() {}
 
@@ -12,6 +13,6 @@
   return NULLOBJ;
 }
 
-CPDF_Object* CPDF_Null::Clone() const {
-  return new CPDF_Null;
+std::unique_ptr<CPDF_Object> CPDF_Null::Clone() const {
+  return pdfium::MakeUnique<CPDF_Null>();
 }
diff --git a/core/fpdfapi/parser/cpdf_null.h b/core/fpdfapi/parser/cpdf_null.h
index 2b8b053..df985b9 100644
--- a/core/fpdfapi/parser/cpdf_null.h
+++ b/core/fpdfapi/parser/cpdf_null.h
@@ -15,7 +15,7 @@
 
   // CPDF_Object.
   Type GetType() const override;
-  CPDF_Object* Clone() const override;
+  std::unique_ptr<CPDF_Object> Clone() const override;
 };
 
 #endif  // CORE_FPDFAPI_PARSER_CPDF_NULL_H_
diff --git a/core/fpdfapi/parser/cpdf_number.cpp b/core/fpdfapi/parser/cpdf_number.cpp
index 3ae629e..24feb2a 100644
--- a/core/fpdfapi/parser/cpdf_number.cpp
+++ b/core/fpdfapi/parser/cpdf_number.cpp
@@ -5,6 +5,7 @@
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
 #include "core/fpdfapi/parser/cpdf_number.h"
+#include "third_party/base/ptr_util.h"
 
 CPDF_Number::CPDF_Number() : m_bInteger(true), m_Integer(0) {}
 
@@ -21,8 +22,9 @@
   return NUMBER;
 }
 
-CPDF_Object* CPDF_Number::Clone() const {
-  return m_bInteger ? new CPDF_Number(m_Integer) : new CPDF_Number(m_Float);
+std::unique_ptr<CPDF_Object> CPDF_Number::Clone() const {
+  return m_bInteger ? pdfium::MakeUnique<CPDF_Number>(m_Integer)
+                    : pdfium::MakeUnique<CPDF_Number>(m_Float);
 }
 
 FX_FLOAT CPDF_Number::GetNumber() const {
diff --git a/core/fpdfapi/parser/cpdf_number.h b/core/fpdfapi/parser/cpdf_number.h
index 717c2b7..0a8f187 100644
--- a/core/fpdfapi/parser/cpdf_number.h
+++ b/core/fpdfapi/parser/cpdf_number.h
@@ -19,9 +19,9 @@
   explicit CPDF_Number(const CFX_ByteStringC& str);
   ~CPDF_Number() override;
 
-  // CPDF_Object.
+  // CPDF_Object:
   Type GetType() const override;
-  CPDF_Object* Clone() const override;
+  std::unique_ptr<CPDF_Object> Clone() const override;
   CFX_ByteString GetString() const override;
   FX_FLOAT GetNumber() const override;
   int GetInteger() const override;
diff --git a/core/fpdfapi/parser/cpdf_object.cpp b/core/fpdfapi/parser/cpdf_object.cpp
index e9c215c..acda334 100644
--- a/core/fpdfapi/parser/cpdf_object.cpp
+++ b/core/fpdfapi/parser/cpdf_object.cpp
@@ -22,16 +22,17 @@
   return const_cast<CPDF_Object*>(this);
 }
 
-CPDF_Object* CPDF_Object::CloneObjectNonCyclic(bool bDirect) const {
+std::unique_ptr<CPDF_Object> CPDF_Object::CloneObjectNonCyclic(
+    bool bDirect) const {
   std::set<const CPDF_Object*> visited_objs;
   return CloneNonCyclic(bDirect, &visited_objs);
 }
 
-CPDF_Object* CPDF_Object::CloneDirectObject() const {
+std::unique_ptr<CPDF_Object> CPDF_Object::CloneDirectObject() const {
   return CloneObjectNonCyclic(true);
 }
 
-CPDF_Object* CPDF_Object::CloneNonCyclic(
+std::unique_ptr<CPDF_Object> CPDF_Object::CloneNonCyclic(
     bool bDirect,
     std::set<const CPDF_Object*>* pVisited) const {
   return Clone();
diff --git a/core/fpdfapi/parser/cpdf_object.h b/core/fpdfapi/parser/cpdf_object.h
index 8f6491e..c24b40a 100644
--- a/core/fpdfapi/parser/cpdf_object.h
+++ b/core/fpdfapi/parser/cpdf_object.h
@@ -46,12 +46,13 @@
   bool IsInline() const { return m_ObjNum == 0; }
 
   // Create a deep copy of the object.
-  virtual CPDF_Object* Clone() const = 0;
+  virtual std::unique_ptr<CPDF_Object> Clone() const = 0;
+
   // Create a deep copy of the object except any reference object be
   // copied to the object it points to directly.
-  virtual CPDF_Object* CloneDirectObject() const;
-  virtual CPDF_Object* GetDirect() const;
+  virtual std::unique_ptr<CPDF_Object> CloneDirectObject() const;
 
+  virtual CPDF_Object* GetDirect() const;
   virtual CFX_ByteString GetString() const;
   virtual CFX_WideString GetUnicodeText() const;
   virtual FX_FLOAT GetNumber() const;
@@ -97,7 +98,7 @@
 
   CPDF_Object() : m_ObjNum(0), m_GenNum(0) {}
 
-  CPDF_Object* CloneObjectNonCyclic(bool bDirect) const;
+  std::unique_ptr<CPDF_Object> CloneObjectNonCyclic(bool bDirect) const;
 
   // Create a deep copy of the object with the option to either
   // copy a reference object or directly copy the object it refers to
@@ -105,7 +106,7 @@
   // Also check cyclic reference against |pVisited|, no copy if it is found.
   // Complex objects should implement their own CloneNonCyclic()
   // function to properly check for possible loop.
-  virtual CPDF_Object* CloneNonCyclic(
+  virtual std::unique_ptr<CPDF_Object> CloneNonCyclic(
       bool bDirect,
       std::set<const CPDF_Object*>* pVisited) const;
 
diff --git a/core/fpdfapi/parser/cpdf_object_unittest.cpp b/core/fpdfapi/parser/cpdf_object_unittest.cpp
index 1bcf616..b40a8e3 100644
--- a/core/fpdfapi/parser/cpdf_object_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_object_unittest.cpp
@@ -91,10 +91,11 @@
 
     // Indirect references to indirect objects.
     m_ObjHolder.reset(new CPDF_IndirectObjectHolder());
-    m_IndirectObjs = {boolean_true_obj->Clone(), number_int_obj->Clone(),
-                      str_spec_obj->Clone(),     name_obj->Clone(),
-                      m_ArrayObj->Clone(),       m_DictObj->Clone(),
-                      stream_obj->Clone()};
+    m_IndirectObjs = {
+        boolean_true_obj->Clone().release(), number_int_obj->Clone().release(),
+        str_spec_obj->Clone().release(),     name_obj->Clone().release(),
+        m_ArrayObj->Clone().release(),       m_DictObj->Clone().release(),
+        stream_obj->Clone().release()};
     for (size_t i = 0; i < m_IndirectObjs.size(); ++i) {
       m_ObjHolder->AddIndirectObject(m_IndirectObjs[i]);
       m_RefObjs.emplace_back(new CPDF_Reference(
@@ -268,13 +269,13 @@
 TEST_F(PDFObjectsTest, Clone) {
   // Check for direct objects.
   for (size_t i = 0; i < m_DirectObjs.size(); ++i) {
-    std::unique_ptr<CPDF_Object> obj(m_DirectObjs[i]->Clone());
+    std::unique_ptr<CPDF_Object> obj = m_DirectObjs[i]->Clone();
     EXPECT_TRUE(Equal(m_DirectObjs[i].get(), obj.get()));
   }
 
   // Check indirect references.
   for (const auto& it : m_RefObjs) {
-    std::unique_ptr<CPDF_Object> obj(it->Clone());
+    std::unique_ptr<CPDF_Object> obj = it->Clone();
     EXPECT_TRUE(Equal(it.get(), obj.get()));
   }
 }
@@ -751,11 +752,12 @@
   ASSERT_TRUE(obj);
   EXPECT_TRUE(obj->IsReference());
 
-  CPDF_Object* cloned_array_object = array->CloneDirectObject();
+  std::unique_ptr<CPDF_Object> cloned_array_object = array->CloneDirectObject();
   ASSERT_TRUE(cloned_array_object);
   ASSERT_TRUE(cloned_array_object->IsArray());
 
-  std::unique_ptr<CPDF_Array> cloned_array(cloned_array_object->AsArray());
+  std::unique_ptr<CPDF_Array> cloned_array =
+      ToArray(std::move(cloned_array_object));
   ASSERT_EQ(1U, cloned_array->GetCount());
   CPDF_Object* cloned_obj = cloned_array->GetObjectAt(0);
   EXPECT_FALSE(cloned_obj);
@@ -785,12 +787,12 @@
   ASSERT_TRUE(obj);
   EXPECT_TRUE(obj->IsReference());
 
-  CPDF_Object* cloned_dict_object = dict->CloneDirectObject();
+  std::unique_ptr<CPDF_Object> cloned_dict_object = dict->CloneDirectObject();
   ASSERT_TRUE(cloned_dict_object);
   ASSERT_TRUE(cloned_dict_object->IsDictionary());
 
-  std::unique_ptr<CPDF_Dictionary> cloned_dict(
-      cloned_dict_object->AsDictionary());
+  std::unique_ptr<CPDF_Dictionary> cloned_dict =
+      ToDictionary(std::move(cloned_dict_object));
   ASSERT_EQ(1U, cloned_dict->GetCount());
   CPDF_Object* cloned_obj = cloned_dict->GetObjectFor("foo");
   EXPECT_FALSE(cloned_obj);
@@ -805,7 +807,7 @@
     arr_obj->InsertAt(0, dict_obj);
 
     // Clone this object to see whether stack overflow will be triggered.
-    std::unique_ptr<CPDF_Array> cloned_array(arr_obj->Clone()->AsArray());
+    std::unique_ptr<CPDF_Array> cloned_array = ToArray(arr_obj->Clone());
     // Cloned object should be the same as the original.
     ASSERT_TRUE(cloned_array);
     EXPECT_EQ(1u, cloned_array->GetCount());
@@ -823,7 +825,7 @@
     dict_obj->SetFor("stream", stream_obj.get());
 
     // Clone this object to see whether stack overflow will be triggered.
-    std::unique_ptr<CPDF_Stream> cloned_stream(stream_obj->Clone()->AsStream());
+    std::unique_ptr<CPDF_Stream> cloned_stream = ToStream(stream_obj->Clone());
     // Cloned object should be the same as the original.
     ASSERT_TRUE(cloned_stream);
     CPDF_Object* cloned_dict = cloned_stream->GetDict();
@@ -849,8 +851,8 @@
     EXPECT_EQ(dict_obj, elem0->AsReference()->GetDirect());
 
     // Clone this object to see whether stack overflow will be triggered.
-    std::unique_ptr<CPDF_Dictionary> cloned_dict(
-        ToDictionary(dict_obj->CloneDirectObject()));
+    std::unique_ptr<CPDF_Dictionary> cloned_dict =
+        ToDictionary(dict_obj->CloneDirectObject());
     // Cloned object should be the same as the original.
     ASSERT_TRUE(cloned_dict);
     CPDF_Object* cloned_arr = cloned_dict->GetObjectFor("arr");
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index ed20cf7..2d96834 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -737,8 +737,7 @@
                       CPDF_Object* pRoot = pDict->GetObjectFor("Root");
                       if (pRoot && pRoot->GetDict() &&
                           pRoot->GetDict()->GetObjectFor("Pages")) {
-                        m_pTrailer =
-                            ToDictionary(pdfium::WrapUnique(pDict->Clone()));
+                        m_pTrailer = ToDictionary(pDict->Clone());
                       }
                     }
                   }
@@ -811,14 +810,14 @@
                             m_pTrailer->SetReferenceFor(key, m_pDocument,
                                                         dwObjNum);
                           } else {
-                            m_pTrailer->SetFor(key, pElement->Clone());
+                            m_pTrailer->SetFor(key,
+                                               pElement->Clone().release());
                           }
                         }
                       }
                     } else {
                       if (pObj->IsStream()) {
-                        m_pTrailer =
-                            ToDictionary(pdfium::WrapUnique(pTrailer->Clone()));
+                        m_pTrailer = ToDictionary(pTrailer->Clone());
                       } else {
                         m_pTrailer = ToDictionary(std::move(pObj));
                       }
@@ -959,8 +958,7 @@
   if (size < 0)
     return false;
 
-  std::unique_ptr<CPDF_Dictionary> pNewTrailer =
-      ToDictionary(pdfium::WrapUnique(pDict->Clone()));
+  std::unique_ptr<CPDF_Dictionary> pNewTrailer = ToDictionary(pDict->Clone());
   if (bMainXRef) {
     m_pTrailer = std::move(pNewTrailer);
     ShrinkObjectMap(size);
diff --git a/core/fpdfapi/parser/cpdf_reference.cpp b/core/fpdfapi/parser/cpdf_reference.cpp
index a9cdf54..8f44aa0 100644
--- a/core/fpdfapi/parser/cpdf_reference.cpp
+++ b/core/fpdfapi/parser/cpdf_reference.cpp
@@ -7,6 +7,7 @@
 #include "core/fpdfapi/parser/cpdf_reference.h"
 
 #include "core/fpdfapi/parser/cpdf_indirect_object_holder.h"
+#include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
 
 CPDF_Reference::CPDF_Reference(CPDF_IndirectObjectHolder* pDoc, int objnum)
@@ -50,11 +51,11 @@
   return this;
 }
 
-CPDF_Object* CPDF_Reference::Clone() const {
+std::unique_ptr<CPDF_Object> CPDF_Reference::Clone() const {
   return CloneObjectNonCyclic(false);
 }
 
-CPDF_Object* CPDF_Reference::CloneNonCyclic(
+std::unique_ptr<CPDF_Object> CPDF_Reference::CloneNonCyclic(
     bool bDirect,
     std::set<const CPDF_Object*>* pVisited) const {
   pVisited->insert(this);
@@ -64,7 +65,7 @@
                ? pDirect->CloneNonCyclic(true, pVisited)
                : nullptr;
   }
-  return new CPDF_Reference(m_pObjList, m_RefObjNum);
+  return pdfium::MakeUnique<CPDF_Reference>(m_pObjList, m_RefObjNum);
 }
 
 CPDF_Object* CPDF_Reference::SafeGetDirect() const {
diff --git a/core/fpdfapi/parser/cpdf_reference.h b/core/fpdfapi/parser/cpdf_reference.h
index 20516ae..93bab00 100644
--- a/core/fpdfapi/parser/cpdf_reference.h
+++ b/core/fpdfapi/parser/cpdf_reference.h
@@ -18,9 +18,9 @@
   CPDF_Reference(CPDF_IndirectObjectHolder* pDoc, int objnum);
   ~CPDF_Reference() override;
 
-  // CPDF_Object.
+  // CPDF_Object:
   Type GetType() const override;
-  CPDF_Object* Clone() const override;
+  std::unique_ptr<CPDF_Object> Clone() const override;
   CPDF_Object* GetDirect() const override;
   CFX_ByteString GetString() const override;
   FX_FLOAT GetNumber() const override;
@@ -36,7 +36,7 @@
   void SetRef(CPDF_IndirectObjectHolder* pDoc, uint32_t objnum);
 
  protected:
-  CPDF_Object* CloneNonCyclic(
+  std::unique_ptr<CPDF_Object> CloneNonCyclic(
       bool bDirect,
       std::set<const CPDF_Object*>* pVisited) const override;
   CPDF_Object* SafeGetDirect() const;
diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp
index 11ef1d2..e8ee022 100644
--- a/core/fpdfapi/parser/cpdf_stream.cpp
+++ b/core/fpdfapi/parser/cpdf_stream.cpp
@@ -68,11 +68,11 @@
     m_pDict->SetIntegerFor("Length", m_dwSize);
 }
 
-CPDF_Object* CPDF_Stream::Clone() const {
+std::unique_ptr<CPDF_Object> CPDF_Stream::Clone() const {
   return CloneObjectNonCyclic(false);
 }
 
-CPDF_Object* CPDF_Stream::CloneNonCyclic(
+std::unique_ptr<CPDF_Object> CPDF_Stream::CloneNonCyclic(
     bool bDirect,
     std::set<const CPDF_Object*>* pVisited) const {
   pVisited->insert(this);
@@ -81,11 +81,11 @@
   uint32_t streamSize = acc.GetSize();
   CPDF_Dictionary* pDict = GetDict();
   if (pDict && !pdfium::ContainsKey(*pVisited, pDict)) {
-    pDict = ToDictionary(
-        static_cast<CPDF_Object*>(pDict)->CloneNonCyclic(bDirect, pVisited));
+    pDict = ToDictionary(static_cast<CPDF_Object*>(pDict)
+                             ->CloneNonCyclic(bDirect, pVisited)
+                             .release());
   }
-
-  return new CPDF_Stream(acc.DetachData(), streamSize, pDict);
+  return pdfium::MakeUnique<CPDF_Stream>(acc.DetachData(), streamSize, pDict);
 }
 
 void CPDF_Stream::SetData(const uint8_t* pData, uint32_t size) {
diff --git a/core/fpdfapi/parser/cpdf_stream.h b/core/fpdfapi/parser/cpdf_stream.h
index f0ba319..ddf7cc5 100644
--- a/core/fpdfapi/parser/cpdf_stream.h
+++ b/core/fpdfapi/parser/cpdf_stream.h
@@ -22,9 +22,9 @@
   CPDF_Stream(uint8_t* pData, uint32_t size, CPDF_Dictionary* pDict);
   ~CPDF_Stream() override;
 
-  // CPDF_Object.
+  // CPDF_Object:
   Type GetType() const override;
-  CPDF_Object* Clone() const override;
+  std::unique_ptr<CPDF_Object> Clone() const override;
   CPDF_Dictionary* GetDict() const override;
   CFX_WideString GetUnicodeText() const override;
   bool IsStream() const override;
@@ -48,7 +48,7 @@
   bool IsMemoryBased() const { return m_bMemoryBased; }
 
  protected:
-  CPDF_Object* CloneNonCyclic(
+  std::unique_ptr<CPDF_Object> CloneNonCyclic(
       bool bDirect,
       std::set<const CPDF_Object*>* pVisited) const override;
 
diff --git a/core/fpdfapi/parser/cpdf_string.cpp b/core/fpdfapi/parser/cpdf_string.cpp
index f4fa956..2116c20 100644
--- a/core/fpdfapi/parser/cpdf_string.cpp
+++ b/core/fpdfapi/parser/cpdf_string.cpp
@@ -7,6 +7,7 @@
 #include "core/fpdfapi/parser/cpdf_string.h"
 
 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
+#include "third_party/base/ptr_util.h"
 
 CPDF_String::CPDF_String() : m_bHex(false) {}
 
@@ -23,8 +24,8 @@
   return STRING;
 }
 
-CPDF_Object* CPDF_String::Clone() const {
-  return new CPDF_String(m_String, m_bHex);
+std::unique_ptr<CPDF_Object> CPDF_String::Clone() const {
+  return pdfium::MakeUnique<CPDF_String>(m_String, m_bHex);
 }
 
 CFX_ByteString CPDF_String::GetString() const {
diff --git a/core/fpdfapi/parser/cpdf_string.h b/core/fpdfapi/parser/cpdf_string.h
index 49834c0..1e73e86 100644
--- a/core/fpdfapi/parser/cpdf_string.h
+++ b/core/fpdfapi/parser/cpdf_string.h
@@ -18,9 +18,9 @@
   explicit CPDF_String(const CFX_WideString& str);
   ~CPDF_String() override;
 
-  // CPDF_Object.
+  // CPDF_Object:
   Type GetType() const override;
-  CPDF_Object* Clone() const override;
+  std::unique_ptr<CPDF_Object> Clone() const override;
   CFX_ByteString GetString() const override;
   CFX_WideString GetUnicodeText() const override;
   void SetString(const CFX_ByteString& str) override;
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index 8170b7f..4999f2d 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -219,14 +219,14 @@
         return false;
 
       if (pDV) {
-        CPDF_Object* pClone = pDV->Clone();
+        std::unique_ptr<CPDF_Object> pClone = pDV->Clone();
         if (!pClone)
           return false;
 
-        m_pDict->SetFor("V", pClone);
+        m_pDict->SetFor("V", pClone.release());
         if (pRV) {
-          CPDF_Object* pCloneR = pDV->Clone();
-          m_pDict->SetFor("RV", pCloneR);
+          std::unique_ptr<CPDF_Object> pCloneR = pDV->Clone();
+          m_pDict->SetFor("RV", pCloneR.release());
         }
       } else {
         m_pDict->RemoveFor("V");
diff --git a/core/fpdfdoc/cpdf_interform.cpp b/core/fpdfdoc/cpdf_interform.cpp
index f709c57..2a02e89 100644
--- a/core/fpdfdoc/cpdf_interform.cpp
+++ b/core/fpdfdoc/cpdf_interform.cpp
@@ -1105,22 +1105,22 @@
       if (pFieldDict->KeyExist("FT")) {
         CPDF_Object* pFTValue = pFieldDict->GetDirectObjectFor("FT");
         if (pFTValue)
-          pParent->SetFor("FT", pFTValue->Clone());
+          pParent->SetFor("FT", pFTValue->Clone().release());
       }
 
       if (pFieldDict->KeyExist("Ff")) {
         CPDF_Object* pFfValue = pFieldDict->GetDirectObjectFor("Ff");
         if (pFfValue)
-          pParent->SetFor("Ff", pFfValue->Clone());
+          pParent->SetFor("Ff", pFfValue->Clone().release());
       }
     }
 
     pField = new CPDF_FormField(this, pParent);
     CPDF_Object* pTObj = pDict->GetObjectFor("T");
     if (ToReference(pTObj)) {
-      CPDF_Object* pClone = pTObj->CloneDirectObject();
+      std::unique_ptr<CPDF_Object> pClone = pTObj->CloneDirectObject();
       if (pClone)
-        pDict->SetFor("T", pClone);
+        pDict->SetFor("T", pClone.release());
       else
         pDict->SetNameFor("T", "");
     }
@@ -1251,7 +1251,7 @@
       } else {
         CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V");
         if (pV)
-          pFieldDict->SetFor("V", pV->CloneDirectObject());
+          pFieldDict->SetFor("V", pV->CloneDirectObject().release());
       }
       pFields->Add(pFieldDict);
     }
@@ -1304,7 +1304,8 @@
   if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) &&
       pFieldDict->KeyExist("Opt")) {
     pField->m_pDict->SetFor(
-        "Opt", pFieldDict->GetDirectObjectFor("Opt")->CloneDirectObject());
+        "Opt",
+        pFieldDict->GetDirectObjectFor("Opt")->CloneDirectObject().release());
   }
 
   if (bNotify && m_pFormNotify) {
diff --git a/core/fpdfdoc/cpvt_generateap.cpp b/core/fpdfdoc/cpvt_generateap.cpp
index 66abde6..93ef9dc 100644
--- a/core/fpdfdoc/cpvt_generateap.cpp
+++ b/core/fpdfdoc/cpvt_generateap.cpp
@@ -186,7 +186,8 @@
         pStreamResFontList->SetReferenceFor(sFontName, pDoc,
                                             pFontDict->GetObjNum());
     } else {
-      pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone());
+      pStreamDict->SetFor("Resources",
+                          pFormDict->GetDictFor("DR")->Clone().release());
       pStreamResList = pStreamDict->GetDictFor("Resources");
     }
   }
@@ -437,7 +438,8 @@
           pStreamResFontList->SetReferenceFor(sFontName, pDoc,
                                               pFontDict->GetObjNum());
       } else {
-        pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone());
+        pStreamDict->SetFor("Resources",
+                            pFormDict->GetDictFor("DR")->Clone().release());
         pStreamResList = pStreamDict->GetDictFor("Resources");
       }
     }
diff --git a/fpdfsdk/fpdf_flatten.cpp b/fpdfsdk/fpdf_flatten.cpp
index 6cffbe0..f39a50a 100644
--- a/fpdfsdk/fpdf_flatten.cpp
+++ b/fpdfsdk/fpdf_flatten.cpp
@@ -408,8 +408,9 @@
 
     CPDF_Object* pObj = pAPStream;
     if (pObj->IsInline()) {
-      pObj = pObj->Clone();
-      pDocument->AddIndirectObject(pObj);
+      std::unique_ptr<CPDF_Object> pNew = pObj->Clone();
+      pObj = pNew.get();
+      pDocument->AddIndirectObject(pNew.release());
     }
 
     CPDF_Dictionary* pObjDic = pObj->GetDict();
diff --git a/fpdfsdk/fpdfppo.cpp b/fpdfsdk/fpdfppo.cpp
index ccfd141..f8b96de 100644
--- a/fpdfsdk/fpdfppo.cpp
+++ b/fpdfsdk/fpdfppo.cpp
@@ -109,7 +109,7 @@
       if (cbSrcKeyStr.Compare(("Type")) && cbSrcKeyStr.Compare(("Parent"))) {
         if (pCurPageDict->KeyExist(cbSrcKeyStr))
           pCurPageDict->RemoveFor(cbSrcKeyStr);
-        pCurPageDict->SetFor(cbSrcKeyStr, pObj->Clone());
+        pCurPageDict->SetFor(cbSrcKeyStr, pObj->Clone().release());
       }
     }
 
@@ -123,7 +123,7 @@
         // if not exists,we take the letter size.
         pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox");
         if (pInheritable) {
-          pCurPageDict->SetFor("MediaBox", pInheritable->Clone());
+          pCurPageDict->SetFor("MediaBox", pInheritable->Clone().release());
         } else {
           // Make the default size to be letter size (8.5'x11')
           CPDF_Array* pArray = new CPDF_Array;
@@ -134,7 +134,7 @@
           pCurPageDict->SetFor("MediaBox", pArray);
         }
       } else {
-        pCurPageDict->SetFor("MediaBox", pInheritable->Clone());
+        pCurPageDict->SetFor("MediaBox", pInheritable->Clone().release());
       }
     }
     // 2 Resources //required
@@ -142,27 +142,25 @@
       pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Resources");
       if (!pInheritable)
         return false;
-      pCurPageDict->SetFor("Resources", pInheritable->Clone());
+      pCurPageDict->SetFor("Resources", pInheritable->Clone().release());
     }
     // 3 CropBox  //Optional
     if (!pCurPageDict->KeyExist("CropBox")) {
       pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox");
       if (pInheritable)
-        pCurPageDict->SetFor("CropBox", pInheritable->Clone());
+        pCurPageDict->SetFor("CropBox", pInheritable->Clone().release());
     }
     // 4 Rotate  //Optional
     if (!pCurPageDict->KeyExist("Rotate")) {
       pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Rotate");
       if (pInheritable)
-        pCurPageDict->SetFor("Rotate", pInheritable->Clone());
+        pCurPageDict->SetFor("Rotate", pInheritable->Clone().release());
     }
 
     // Update the reference
     uint32_t dwOldPageObj = pSrcPageDict->GetObjNum();
     uint32_t dwNewPageObj = pCurPageDict->GetObjNum();
-
     (*pObjNumberMap)[dwOldPageObj] = dwNewPageObj;
-
     UpdateReference(pCurPageDict, pDestPDFDoc, pObjNumberMap.get());
     ++curpage;
   }
@@ -277,29 +275,22 @@
   if (!pDirect)
     return 0;
 
-  CPDF_Object* pClone = pDirect->Clone();
-  if (!pClone)
-    return 0;
-
+  std::unique_ptr<CPDF_Object> pClone = pDirect->Clone();
   if (CPDF_Dictionary* pDictClone = pClone->AsDictionary()) {
     if (pDictClone->KeyExist("Type")) {
       CFX_ByteString strType = pDictClone->GetStringFor("Type");
-      if (!FXSYS_stricmp(strType.c_str(), "Pages")) {
-        delete pDictClone;
+      if (!FXSYS_stricmp(strType.c_str(), "Pages"))
         return 4;
-      }
-      if (!FXSYS_stricmp(strType.c_str(), "Page")) {
-        delete pDictClone;
+      if (!FXSYS_stricmp(strType.c_str(), "Page"))
         return 0;
-      }
     }
   }
-  dwNewObjNum = pDoc->AddIndirectObject(pClone);
+  dwNewObjNum = pDoc->AddIndirectObject(pClone.get());
   (*pObjNumberMap)[dwObjnum] = dwNewObjNum;
-  if (!UpdateReference(pClone, pDoc, pObjNumberMap)) {
-    delete pClone;
+  if (!UpdateReference(pClone.get(), pDoc, pObjNumberMap))
     return 0;
-  }
+
+  pClone.release();  // TODO(tsepez): figure out ownership.
   return dwNewObjNum;
 }
 
@@ -400,6 +391,7 @@
   if (!pDstDict)
     return false;
 
-  pDstDict->SetFor("ViewerPreferences", pSrcDict->CloneDirectObject());
+  pDstDict->SetFor("ViewerPreferences",
+                   pSrcDict->CloneDirectObject().release());
   return true;
 }