Store retained keys in CPDF_StructTree::StructElementMap.

Change-Id: Ic361535d77c54cf4628036616666f69513b30981
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/98472
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfdoc/cpdf_structelement.cpp b/core/fpdfdoc/cpdf_structelement.cpp
index 11e47fe..b03189a 100644
--- a/core/fpdfdoc/cpdf_structelement.cpp
+++ b/core/fpdfdoc/cpdf_structelement.cpp
@@ -40,9 +40,9 @@
 CPDF_StructElement::Kid::~Kid() = default;
 
 CPDF_StructElement::CPDF_StructElement(const CPDF_StructTree* pTree,
-                                       const CPDF_Dictionary* pDict)
+                                       RetainPtr<const CPDF_Dictionary> pDict)
     : m_pTree(pTree),
-      m_pDict(pDict),
+      m_pDict(std::move(pDict)),
       m_Type(GetStructElementType(m_pTree.Get(), m_pDict.Get())) {
   LoadKids(m_pDict.Get());
 }
diff --git a/core/fpdfdoc/cpdf_structelement.h b/core/fpdfdoc/cpdf_structelement.h
index c34f000..7521e01 100644
--- a/core/fpdfdoc/cpdf_structelement.h
+++ b/core/fpdfdoc/cpdf_structelement.h
@@ -57,7 +57,7 @@
   };
 
   CPDF_StructElement(const CPDF_StructTree* pTree,
-                     const CPDF_Dictionary* pDict);
+                     RetainPtr<const CPDF_Dictionary> pDict);
   ~CPDF_StructElement() override;
 
   void LoadKids(const CPDF_Dictionary* pDict);
diff --git a/core/fpdfdoc/cpdf_structtree.cpp b/core/fpdfdoc/cpdf_structtree.cpp
index 8650e65..1294ba5 100644
--- a/core/fpdfdoc/cpdf_structtree.cpp
+++ b/core/fpdfdoc/cpdf_structtree.cpp
@@ -6,6 +6,8 @@
 
 #include "core/fpdfdoc/cpdf_structtree.h"
 
+#include <utility>
+
 #include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/cpdf_document.h"
@@ -80,15 +82,13 @@
   StructElementMap element_map;
   for (size_t i = 0; i < pParentArray->size(); i++) {
     RetainPtr<const CPDF_Dictionary> pParent = pParentArray->GetDictAt(i);
-    if (pParent) {
-      // TODO(tsepez): pass moved retained object.
-      AddPageNode(pParent.Get(), &element_map, 0);
-    }
+    if (pParent)
+      AddPageNode(std::move(pParent), &element_map, 0);
   }
 }
 
 RetainPtr<CPDF_StructElement> CPDF_StructTree::AddPageNode(
-    const CPDF_Dictionary* pDict,
+    RetainPtr<const CPDF_Dictionary> pDict,
     StructElementMap* map,
     int nLevel) {
   static constexpr int kStructTreeMaxRecursion = 32;
@@ -103,17 +103,17 @@
   (*map)[pDict] = pElement;
   RetainPtr<const CPDF_Dictionary> pParent = pDict->GetDictFor("P");
   if (!pParent || pParent->GetNameFor("Type") == "StructTreeRoot") {
-    if (!AddTopLevelNode(pDict, pElement))
+    if (!AddTopLevelNode(pDict.Get(), pElement))
       map->erase(pDict);
     return pElement;
   }
 
   RetainPtr<CPDF_StructElement> pParentElement =
-      AddPageNode(pParent.Get(), map, nLevel + 1);
+      AddPageNode(std::move(pParent), map, nLevel + 1);
   if (!pParentElement)
     return pElement;
 
-  if (!pParentElement->UpdateKidIfElement(pDict, pElement.Get()))
+  if (!pParentElement->UpdateKidIfElement(pDict.Get(), pElement.Get()))
     map->erase(pDict);
 
   pElement->SetParent(pParentElement.Get());
diff --git a/core/fpdfdoc/cpdf_structtree.h b/core/fpdfdoc/cpdf_structtree.h
index b0eafba..f99205f 100644
--- a/core/fpdfdoc/cpdf_structtree.h
+++ b/core/fpdfdoc/cpdf_structtree.h
@@ -7,6 +7,7 @@
 #ifndef CORE_FPDFDOC_CPDF_STRUCTTREE_H_
 #define CORE_FPDFDOC_CPDF_STRUCTTREE_H_
 
+#include <functional>
 #include <map>
 #include <memory>
 #include <vector>
@@ -33,13 +34,15 @@
   const CPDF_Dictionary* GetTreeRoot() const { return m_pTreeRoot.Get(); }
 
  private:
-  using StructElementMap =
-      std::map<const CPDF_Dictionary*, RetainPtr<CPDF_StructElement>>;
+  using StructElementMap = std::map<RetainPtr<const CPDF_Dictionary>,
+                                    RetainPtr<CPDF_StructElement>,
+                                    std::less<>>;
 
   void LoadPageTree(const CPDF_Dictionary* pPageDict);
-  RetainPtr<CPDF_StructElement> AddPageNode(const CPDF_Dictionary* pDict,
-                                            StructElementMap* map,
-                                            int nLevel);
+  RetainPtr<CPDF_StructElement> AddPageNode(
+      RetainPtr<const CPDF_Dictionary> pDict,
+      StructElementMap* map,
+      int nLevel);
   bool AddTopLevelNode(const CPDF_Dictionary* pDict,
                        const RetainPtr<CPDF_StructElement>& pElement);