Encapsulate the CPDF_Page annots array. The long-term goal is to prevent the fpdfsdk/fpdf_* layer from specifying strings for dictionary keys to lower objects (these should know and restrict what keys are valid themselves). This is a small step in that direction. Change-Id: I1e5d12869dc541a4fa505808641ad988cb73f8b6 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/98954 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_page.cpp b/core/fpdfapi/page/cpdf_page.cpp index 8be52b4..6edf44c 100644 --- a/core/fpdfapi/page/cpdf_page.cpp +++ b/core/fpdfapi/page/cpdf_page.cpp
@@ -183,6 +183,18 @@ return (rotate < 0) ? (rotate + 4) : rotate; } +RetainPtr<CPDF_Array> CPDF_Page::GetOrCreateAnnotsArray() { + return GetMutableDict()->GetOrCreateArrayFor("Annots"); +} + +RetainPtr<CPDF_Array> CPDF_Page::GetMutableAnnotsArray() { + return GetMutableDict()->GetMutableArrayFor("Annots"); +} + +RetainPtr<const CPDF_Array> CPDF_Page::GetAnnotsArray() const { + return GetDict()->GetArrayFor("Annots"); +} + void CPDF_Page::SetRenderContext(std::unique_ptr<RenderContextIface> pContext) { DCHECK(!m_pRenderContext); DCHECK(pContext);
diff --git a/core/fpdfapi/page/cpdf_page.h b/core/fpdfapi/page/cpdf_page.h index 0274fe2..3fe4a80 100644 --- a/core/fpdfapi/page/cpdf_page.h +++ b/core/fpdfapi/page/cpdf_page.h
@@ -19,6 +19,7 @@ #include "core/fxcrt/unowned_ptr.h" #include "third_party/abseil-cpp/absl/types/optional.h" +class CPDF_Array; class CPDF_Dictionary; class CPDF_Document; class CPDF_Image; @@ -80,6 +81,11 @@ const CFX_SizeF& GetPageSize() const { return m_PageSize; } const CFX_Matrix& GetPageMatrix() const { return m_PageMatrix; } int GetPageRotation() const; + + RetainPtr<CPDF_Array> GetOrCreateAnnotsArray(); + RetainPtr<CPDF_Array> GetMutableAnnotsArray(); + RetainPtr<const CPDF_Array> GetAnnotsArray() const; + RenderCacheIface* GetRenderCache() const { return m_pRenderCache.get(); } void SetRenderCache(std::unique_ptr<RenderCacheIface> pCache) { m_pRenderCache = std::move(pCache);
diff --git a/core/fpdfdoc/cpdf_annotlist.cpp b/core/fpdfdoc/cpdf_annotlist.cpp index f6c8469..7bb8fe1 100644 --- a/core/fpdfdoc/cpdf_annotlist.cpp +++ b/core/fpdfdoc/cpdf_annotlist.cpp
@@ -172,8 +172,7 @@ CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage) : m_pDocument(pPage->GetDocument()) { - RetainPtr<CPDF_Array> pAnnots = - pPage->GetMutableDict()->GetMutableArrayFor("Annots"); + RetainPtr<CPDF_Array> pAnnots = pPage->GetMutableAnnotsArray(); if (!pAnnots) return;
diff --git a/core/fpdfdoc/cpdf_interactiveform.cpp b/core/fpdfdoc/cpdf_interactiveform.cpp index 7e6a344..5d99137 100644 --- a/core/fpdfdoc/cpdf_interactiveform.cpp +++ b/core/fpdfdoc/cpdf_interactiveform.cpp
@@ -622,8 +622,7 @@ const CPDF_Page* pPage, const CFX_PointF& point, int* z_order) const { - RetainPtr<const CPDF_Array> pAnnotList = - pPage->GetDict()->GetArrayFor("Annots"); + RetainPtr<const CPDF_Array> pAnnotList = pPage->GetAnnotsArray(); if (!pAnnotList) return nullptr; @@ -785,8 +784,7 @@ } void CPDF_InteractiveForm::FixPageFields(CPDF_Page* pPage) { - RetainPtr<CPDF_Array> pAnnots = - pPage->GetMutableDict()->GetMutableArrayFor("Annots"); + RetainPtr<CPDF_Array> pAnnots = pPage->GetMutableAnnotsArray(); if (!pAnnots) return;
diff --git a/core/fpdfdoc/cpdf_linklist.cpp b/core/fpdfdoc/cpdf_linklist.cpp index a3044ee..75b4f0c 100644 --- a/core/fpdfdoc/cpdf_linklist.cpp +++ b/core/fpdfdoc/cpdf_linklist.cpp
@@ -54,8 +54,7 @@ // std::map::operator[] forces the creation of a map entry. auto* page_link_list = &m_PageMap[objnum]; - RetainPtr<CPDF_Array> pAnnotList = - pPage->GetMutableDict()->GetMutableArrayFor("Annots"); + RetainPtr<CPDF_Array> pAnnotList = pPage->GetMutableAnnotsArray(); if (!pAnnotList) return page_link_list;
diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index b9452b8..28597dd 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp
@@ -371,8 +371,7 @@ auto pNewAnnot = std::make_unique<CPDF_AnnotContext>(pDict, IPDFPageFromFPDFPage(page)); - RetainPtr<CPDF_Array> pAnnotList = - pPage->GetMutableDict()->GetOrCreateArrayFor("Annots"); + RetainPtr<CPDF_Array> pAnnotList = pPage->GetOrCreateAnnotsArray(); pAnnotList->Append(pDict); // Caller takes ownership. @@ -384,7 +383,7 @@ if (!pPage) return 0; - RetainPtr<const CPDF_Array> pAnnots = pPage->GetDict()->GetArrayFor("Annots"); + RetainPtr<const CPDF_Array> pAnnots = pPage->GetAnnotsArray(); return pAnnots ? fxcrt::CollectionSize<int>(*pAnnots) : 0; } @@ -394,8 +393,7 @@ if (!pPage || index < 0) return nullptr; - RetainPtr<CPDF_Array> pAnnots = - pPage->GetMutableDict()->GetMutableArrayFor("Annots"); + RetainPtr<CPDF_Array> pAnnots = pPage->GetMutableAnnotsArray(); if (!pAnnots || static_cast<size_t>(index) >= pAnnots->size()) return nullptr; @@ -421,7 +419,7 @@ if (!pAnnotDict) return -1; - RetainPtr<const CPDF_Array> pAnnots = pPage->GetDict()->GetArrayFor("Annots"); + RetainPtr<const CPDF_Array> pAnnots = pPage->GetAnnotsArray(); if (!pAnnots) return -1; @@ -447,8 +445,7 @@ if (!pPage || index < 0) return false; - RetainPtr<CPDF_Array> pAnnots = - pPage->GetMutableDict()->GetMutableArrayFor("Annots"); + RetainPtr<CPDF_Array> pAnnots = pPage->GetMutableAnnotsArray(); if (!pAnnots || static_cast<size_t>(index) >= pAnnots->size()) return false;
diff --git a/fpdfsdk/fpdf_doc.cpp b/fpdfsdk/fpdf_doc.cpp index 1e84e7a..d5c4abf 100644 --- a/fpdfsdk/fpdf_doc.cpp +++ b/fpdfsdk/fpdf_doc.cpp
@@ -372,8 +372,7 @@ CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!pPage) return false; - RetainPtr<CPDF_Array> pAnnots = - pPage->GetMutableDict()->GetMutableArrayFor("Annots"); + RetainPtr<CPDF_Array> pAnnots = pPage->GetMutableAnnotsArray(); if (!pAnnots) return false; for (size_t i = *start_pos; i < pAnnots->size(); i++) {