Avoid vending dictionary pointers from CPDF_StructElement. Introduce operations that operate on behalf of the callers. Change-Id: I92ce6b0e5a2c744249178bc18df8e35468661f2a Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/98792 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfdoc/cpdf_structelement.cpp b/core/fpdfdoc/cpdf_structelement.cpp index 211ec1c..34370f3 100644 --- a/core/fpdfdoc/cpdf_structelement.cpp +++ b/core/fpdfdoc/cpdf_structelement.cpp
@@ -18,21 +18,6 @@ #include "core/fpdfdoc/cpdf_structtree.h" #include "third_party/base/check.h" -namespace { - -ByteString GetStructElementType(const CPDF_StructTree* pTree, - const CPDF_Dictionary* pDict) { - ByteString type = pDict->GetNameFor("S"); - if (pTree->GetRoleMap()) { - ByteString mapped = pTree->GetRoleMap()->GetNameFor(type); - if (!mapped.IsEmpty()) - type = std::move(mapped); - } - return type; -} - -} // namespace - CPDF_StructElement::Kid::Kid() = default; CPDF_StructElement::Kid::Kid(const Kid& that) = default; @@ -43,7 +28,7 @@ RetainPtr<const CPDF_Dictionary> pDict) : m_pTree(pTree), m_pDict(std::move(pDict)), - m_Type(GetStructElementType(m_pTree.Get(), m_pDict.Get())) { + m_Type(m_pTree->GetRoleMapNameFor(m_pDict->GetNameFor("S"))) { LoadKids(m_pDict); } @@ -120,7 +105,7 @@ return; if (pKidObj->IsNumber()) { - if (m_pTree->GetPage()->GetObjNum() != PageObjNum) + if (m_pTree->GetPageObjNum() != PageObjNum) return; pKid->m_Type = Kid::kPageContent; @@ -139,7 +124,7 @@ } ByteString type = pKidDict->GetNameFor("Type"); if ((type == "MCR" || type == "OBJR") && - m_pTree->GetPage()->GetObjNum() != PageObjNum) { + m_pTree->GetPageObjNum() != PageObjNum) { return; }
diff --git a/core/fpdfdoc/cpdf_structtree.cpp b/core/fpdfdoc/cpdf_structtree.cpp index acfa405..10298f9 100644 --- a/core/fpdfdoc/cpdf_structtree.cpp +++ b/core/fpdfdoc/cpdf_structtree.cpp
@@ -45,6 +45,15 @@ CPDF_StructTree::~CPDF_StructTree() = default; +ByteString CPDF_StructTree::GetRoleMapNameFor(const ByteString& type) const { + if (m_pRoleMap) { + ByteString mapped = m_pRoleMap->GetNameFor(type); + if (!mapped.IsEmpty()) + return mapped; + } + return type; +} + void CPDF_StructTree::LoadPageTree(const CPDF_Dictionary* pPageDict) { m_pPage.Reset(pPageDict); if (!m_pTreeRoot)
diff --git a/core/fpdfdoc/cpdf_structtree.h b/core/fpdfdoc/cpdf_structtree.h index f99205f..aebbc99 100644 --- a/core/fpdfdoc/cpdf_structtree.h +++ b/core/fpdfdoc/cpdf_structtree.h
@@ -12,9 +12,10 @@ #include <memory> #include <vector> +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fxcrt/bytestring.h" #include "core/fxcrt/retain_ptr.h" -class CPDF_Dictionary; class CPDF_Document; class CPDF_StructElement; @@ -29,9 +30,8 @@ size_t CountTopElements() const { return m_Kids.size(); } CPDF_StructElement* GetTopElement(size_t i) const { return m_Kids[i].Get(); } - const CPDF_Dictionary* GetRoleMap() const { return m_pRoleMap.Get(); } - const CPDF_Dictionary* GetPage() const { return m_pPage.Get(); } - const CPDF_Dictionary* GetTreeRoot() const { return m_pTreeRoot.Get(); } + uint32_t GetPageObjNum() const { return m_pPage->GetObjNum(); } + ByteString GetRoleMapNameFor(const ByteString& type) const; private: using StructElementMap = std::map<RetainPtr<const CPDF_Dictionary>,