Remove orphan tracking for CPDF parser objects.

They are now reference counted, so explicit orphan tracking
is no longer required.

Change-Id: I7e8422305c63886f6b9a4060148341f0761334fd
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/53891
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp
index 345a8ae..b2e1b54 100644
--- a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp
+++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp
@@ -70,9 +70,6 @@
   pObj->SetObjNum(++m_LastObjNum);
 
   auto& obj_holder = m_IndirectObjs[m_LastObjNum];
-  if (obj_holder)
-    m_OrphanObjs.push_back(std::move(obj_holder));
-
   obj_holder = std::move(pObj);
   return obj_holder.Get();
 }
@@ -90,7 +87,6 @@
     return false;
 
   pObj->SetObjNum(objnum);
-  AddOrphan(std::move(obj_holder));
   obj_holder = std::move(pObj);
   m_LastObjNum = std::max(m_LastObjNum, objnum);
   return true;
@@ -103,8 +99,3 @@
 
   m_IndirectObjs.erase(it);
 }
-
-void CPDF_IndirectObjectHolder::AddOrphan(RetainPtr<CPDF_Object> pObject) {
-  if (pObject)
-    m_OrphanObjs.push_back(std::move(pObject));
-}
diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.h b/core/fpdfapi/parser/cpdf_indirect_object_holder.h
index 36735bd..1887cc8 100644
--- a/core/fpdfapi/parser/cpdf_indirect_object_holder.h
+++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.h
@@ -63,11 +63,6 @@
   bool ReplaceIndirectObjectIfHigherGeneration(uint32_t objnum,
                                                RetainPtr<CPDF_Object> pObj);
 
-  // Takes ownership of |pObj|, persist it for life of the indirect object
-  // holder (typically so that unowned pointers to it remain valid). No-op
-  // if |pObj| is NULL.
-  void AddOrphan(RetainPtr<CPDF_Object> pObj);
-
   uint32_t GetLastObjNum() const { return m_LastObjNum; }
   void SetLastObjNum(uint32_t objnum) { m_LastObjNum = objnum; }
 
@@ -84,7 +79,6 @@
  private:
   uint32_t m_LastObjNum;
   std::map<uint32_t, RetainPtr<CPDF_Object>> m_IndirectObjs;
-  std::vector<RetainPtr<CPDF_Object>> m_OrphanObjs;
   WeakPtr<ByteStringPool> m_pByteStringPool;
 };
 
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index e3f2bd8..bd3b020 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -240,17 +240,13 @@
         if (!pClone)
           return false;
 
-        m_pForm->GetDocument()->AddOrphan(
-            m_pDict->RemoveFor(pdfium::form_fields::kV));
         m_pDict->SetFor(pdfium::form_fields::kV, std::move(pClone));
         if (pRV) {
-          m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("RV"));
           m_pDict->SetFor("RV", pDV->Clone());
         }
       } else {
-        m_pForm->GetDocument()->AddOrphan(
-            m_pDict->RemoveFor(pdfium::form_fields::kV));
-        m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("RV"));
+        m_pDict->RemoveFor(pdfium::form_fields::kV);
+        m_pDict->RemoveFor("RV");
       }
       if (notify == NotificationOption::kNotify)
         NotifyAfterValueChange();
@@ -394,15 +390,13 @@
       }
       ByteString key(bDefault ? pdfium::form_fields::kDV
                               : pdfium::form_fields::kV);
-      m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor(key));
       m_pDict->SetNewFor<CPDF_String>(key, csValue);
       int iIndex = FindOption(csValue);
       if (iIndex < 0) {
         if (m_Type == kRichText && !bDefault) {
-          m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("RV"));
           m_pDict->SetFor("RV", m_pDict->GetObjectFor(key)->Clone());
         }
-        m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("I"));
+        m_pDict->RemoveFor("I");
       } else {
         if (!bDefault) {
           ClearSelection(NotificationOption::kDoNotNotify);
@@ -520,9 +514,8 @@
     if (!NotifyListOrComboBoxBeforeChange(csValue))
       return false;
   }
-  m_pForm->GetDocument()->AddOrphan(
-      m_pDict->RemoveFor(pdfium::form_fields::kV));
-  m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("I"));
+  m_pDict->RemoveFor(pdfium::form_fields::kV);
+  m_pDict->RemoveFor("I");
   if (notify == NotificationOption::kNotify)
     NotifyListOrComboBoxAfterChange();
   return true;
@@ -619,17 +612,15 @@
     return;
 
   if (GetType() != kListBox) {
-    m_pForm->GetDocument()->AddOrphan(
-        m_pDict->RemoveFor(pdfium::form_fields::kV));
-    m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("I"));
+    m_pDict->RemoveFor(pdfium::form_fields::kV);
+    m_pDict->RemoveFor("I");
     return;
   }
 
   SelectOption(index, false, NotificationOption::kDoNotNotify);
   if (pValue->IsString()) {
     if (pValue->GetUnicodeText() == opt_value) {
-      m_pForm->GetDocument()->AddOrphan(
-          m_pDict->RemoveFor(pdfium::form_fields::kV));
+      m_pDict->RemoveFor(pdfium::form_fields::kV);
     }
     return;
   }
@@ -643,8 +634,6 @@
       pArray->AddNew<CPDF_String>(GetOptionValue(i));
   }
   if (pArray->size() > 0) {
-    m_pForm->GetDocument()->AddOrphan(
-        m_pDict->RemoveFor(pdfium::form_fields::kV));
     m_pDict->SetFor(pdfium::form_fields::kV, std::move(pArray));
   }
 }
@@ -882,7 +871,7 @@
     if (bSelected)
       pArray->AddNew<CPDF_Number>(iOptIndex);
     if (pArray->IsEmpty())
-      m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("I"));
+      m_pDict->RemoveFor("I");
   }
   if (notify == NotificationOption::kNotify)
     NotifyListOrComboBoxAfterChange();
diff --git a/fpdfsdk/cpdfsdk_baannot.cpp b/fpdfsdk/cpdfsdk_baannot.cpp
index 8bc4eb3..459b9d3 100644
--- a/fpdfsdk/cpdfsdk_baannot.cpp
+++ b/fpdfsdk/cpdfsdk_baannot.cpp
@@ -55,10 +55,7 @@
 void CPDFSDK_BAAnnot::SetRect(const CFX_FloatRect& rect) {
   ASSERT(rect.right - rect.left >= 1.0f);
   ASSERT(rect.top - rect.bottom >= 1.0f);
-  CPDF_Dictionary* pDict = GetAnnotDict();
-  m_pAnnot->GetDocument()->AddOrphan(
-      pDict->RemoveFor(pdfium::annotation::kRect));
-  pDict->SetRectFor(pdfium::annotation::kRect, rect);
+  GetAnnotDict()->SetRectFor(pdfium::annotation::kRect, rect);
 }
 
 CFX_FloatRect CPDFSDK_BAAnnot::GetRect() const {
@@ -102,8 +99,9 @@
 
 void CPDFSDK_BAAnnot::SetAnnotName(const WideString& sName) {
   CPDF_Dictionary* pDict = GetAnnotDict();
-  m_pAnnot->GetDocument()->AddOrphan(pDict->RemoveFor(pdfium::annotation::kNM));
-  if (!sName.IsEmpty())
+  if (sName.IsEmpty())
+    pDict->RemoveFor(pdfium::annotation::kNM);
+  else
     pDict->SetNewFor<CPDF_String>(pdfium::annotation::kNM, sName);
 }
 
@@ -112,10 +110,8 @@
 }
 
 void CPDFSDK_BAAnnot::SetFlags(uint32_t nFlags) {
-  CPDF_Dictionary* pDict = GetAnnotDict();
-  m_pAnnot->GetDocument()->AddOrphan(pDict->RemoveFor(pdfium::annotation::kF));
-  pDict->SetNewFor<CPDF_Number>(pdfium::annotation::kF,
-                                static_cast<int>(nFlags));
+  GetAnnotDict()->SetNewFor<CPDF_Number>(pdfium::annotation::kF,
+                                         static_cast<int>(nFlags));
 }
 
 uint32_t CPDFSDK_BAAnnot::GetFlags() const {
@@ -124,8 +120,9 @@
 
 void CPDFSDK_BAAnnot::SetAppState(const ByteString& str) {
   CPDF_Dictionary* pDict = GetAnnotDict();
-  m_pAnnot->GetDocument()->AddOrphan(pDict->RemoveFor(pdfium::annotation::kAS));
-  if (!str.IsEmpty())
+  if (str.IsEmpty())
+    pDict->RemoveFor(pdfium::annotation::kAS);
+  else
     pDict->SetNewFor<CPDF_String>(pdfium::annotation::kAS, str, false);
 }
 
@@ -142,7 +139,6 @@
     CPDF_Dictionary* pBSDict = GetAnnotDict()->GetDictFor("BS");
     if (!pBSDict)
       pBSDict = GetAnnotDict()->SetNewFor<CPDF_Dictionary>("BS");
-    m_pAnnot->GetDocument()->AddOrphan(pBSDict->RemoveFor("W"));
     pBSDict->SetNewFor<CPDF_Number>("W", nWidth);
   }
 }
@@ -184,7 +180,6 @@
     default:
       return;
   }
-  m_pAnnot->GetDocument()->AddOrphan(pBSDict->RemoveFor("S"));
   pBSDict->SetNewFor<CPDF_Name>("S", name);
 }
 
diff --git a/fpdfsdk/pwl/cpwl_appstream.cpp b/fpdfsdk/pwl/cpwl_appstream.cpp
index e2b12da..3087b3b 100644
--- a/fpdfsdk/pwl/cpwl_appstream.cpp
+++ b/fpdfsdk/pwl/cpwl_appstream.cpp
@@ -1945,8 +1945,7 @@
 }
 
 void CPWL_AppStream::Remove(const ByteString& sAPType) {
-  CPDF_Document* doc = widget_->GetPageView()->GetPDFDocument();
-  doc->AddOrphan(dict_->RemoveFor(sAPType));
+  dict_->RemoveFor(sAPType);
 }
 
 ByteString CPWL_AppStream::GetBackgroundAppStream() const {