Pass retained arguments to fpdfdoc/ class constructors. These classes are goint to retain the argument for the lifetime of instances of the class, so allow use of move semantics. Affected classes are CPDF_AAction, CPDF_Annot, CPDF_FormField, CPDF_Icon, and CPDF_Link. Change-Id: I8fb8aaf358c12c78622852003898484db9192eb3 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/98633 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfdoc/cpdf_aaction.cpp b/core/fpdfdoc/cpdf_aaction.cpp index 3c9535a..13dd695 100644 --- a/core/fpdfdoc/cpdf_aaction.cpp +++ b/core/fpdfdoc/cpdf_aaction.cpp
@@ -7,6 +7,7 @@ #include "core/fpdfdoc/cpdf_aaction.h" #include <iterator> +#include <utility> #include "core/fpdfapi/parser/cpdf_dictionary.h" @@ -43,7 +44,8 @@ } // namespace -CPDF_AAction::CPDF_AAction(const CPDF_Dictionary* pDict) : m_pDict(pDict) {} +CPDF_AAction::CPDF_AAction(RetainPtr<const CPDF_Dictionary> pDict) + : m_pDict(std::move(pDict)) {} CPDF_AAction::CPDF_AAction(const CPDF_AAction& that) = default;
diff --git a/core/fpdfdoc/cpdf_aaction.h b/core/fpdfdoc/cpdf_aaction.h index f3314e6..806ef2c 100644 --- a/core/fpdfdoc/cpdf_aaction.h +++ b/core/fpdfdoc/cpdf_aaction.h
@@ -39,7 +39,7 @@ kNumberOfActions // Must be last. }; - explicit CPDF_AAction(const CPDF_Dictionary* pDict); + explicit CPDF_AAction(RetainPtr<const CPDF_Dictionary> pDict); CPDF_AAction(const CPDF_AAction& that); ~CPDF_AAction();
diff --git a/core/fpdfdoc/cpdf_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp index 1049589..6da7eae 100644 --- a/core/fpdfdoc/cpdf_annot.cpp +++ b/core/fpdfdoc/cpdf_annot.cpp
@@ -100,8 +100,9 @@ } // namespace -CPDF_Annot::CPDF_Annot(CPDF_Dictionary* pDict, CPDF_Document* pDocument) - : m_pAnnotDict(pDict), +CPDF_Annot::CPDF_Annot(RetainPtr<CPDF_Dictionary> pDict, + CPDF_Document* pDocument) + : m_pAnnotDict(std::move(pDict)), m_pDocument(pDocument), m_nSubtype(StringToAnnotSubtype( m_pAnnotDict->GetByteStringFor(pdfium::annotation::kSubtype))),
diff --git a/core/fpdfdoc/cpdf_annot.h b/core/fpdfdoc/cpdf_annot.h index f1d4b6f..cf4c7f6 100644 --- a/core/fpdfdoc/cpdf_annot.h +++ b/core/fpdfdoc/cpdf_annot.h
@@ -73,7 +73,7 @@ size_t nIndex); static size_t QuadPointCount(const CPDF_Array* pArray); - CPDF_Annot(CPDF_Dictionary* pDict, CPDF_Document* pDocument); + CPDF_Annot(RetainPtr<CPDF_Dictionary> pDict, CPDF_Document* pDocument); ~CPDF_Annot(); Subtype GetSubtype() const;
diff --git a/core/fpdfdoc/cpdf_annotlist.cpp b/core/fpdfdoc/cpdf_annotlist.cpp index 2cbbc91..ba48654 100644 --- a/core/fpdfdoc/cpdf_annotlist.cpp +++ b/core/fpdfdoc/cpdf_annotlist.cpp
@@ -116,7 +116,8 @@ pAnnotDict->SetRectFor(pdfium::annotation::kRect, popupRect); pAnnotDict->SetNewFor<CPDF_Number>(pdfium::annotation::kF, 0); - auto pPopupAnnot = std::make_unique<CPDF_Annot>(pAnnotDict.Get(), pDocument); + auto pPopupAnnot = + std::make_unique<CPDF_Annot>(std::move(pAnnotDict), pDocument); pAnnot->SetPopupAnnot(pPopupAnnot.get()); return pPopupAnnot; } @@ -194,7 +195,7 @@ } pAnnots->ConvertToIndirectObjectAt(i, m_pDocument.Get()); m_AnnotList.push_back( - std::make_unique<CPDF_Annot>(pDict.Get(), m_pDocument.Get())); + std::make_unique<CPDF_Annot>(pDict, m_pDocument.Get())); if (bRegenerateAP && subtype == "Widget" && CPDF_InteractiveForm::IsUpdateAPEnabled() && !pDict->GetDictFor(pdfium::annotation::kAP)) {
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp index 2f9ec84..4e90b7e 100644 --- a/core/fpdfdoc/cpdf_formfield.cpp +++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -97,8 +97,8 @@ } CPDF_FormField::CPDF_FormField(CPDF_InteractiveForm* pForm, - CPDF_Dictionary* pDict) - : m_pForm(pForm), m_pDict(pDict) { + RetainPtr<CPDF_Dictionary> pDict) + : m_pForm(pForm), m_pDict(std::move(pDict)) { InitFieldFlags(); } @@ -270,7 +270,7 @@ CPDF_AAction CPDF_FormField::GetAdditionalAction() const { CPDF_Object* pObj = GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kAA); - return CPDF_AAction(pObj ? pObj->GetDict().Get() : nullptr); + return CPDF_AAction(pObj ? pObj->GetDict() : nullptr); } WideString CPDF_FormField::GetAlternateName() const {
diff --git a/core/fpdfdoc/cpdf_formfield.h b/core/fpdfdoc/cpdf_formfield.h index ee4495b..cafbad1 100644 --- a/core/fpdfdoc/cpdf_formfield.h +++ b/core/fpdfdoc/cpdf_formfield.h
@@ -69,7 +69,7 @@ kSign }; - CPDF_FormField(CPDF_InteractiveForm* pForm, CPDF_Dictionary* pDict); + CPDF_FormField(CPDF_InteractiveForm* pForm, RetainPtr<CPDF_Dictionary> pDict); ~CPDF_FormField(); static absl::optional<FormFieldType> IntToFormFieldType(int value);
diff --git a/core/fpdfdoc/cpdf_formfield_unittest.cpp b/core/fpdfdoc/cpdf_formfield_unittest.cpp index ea51901..c3e83d2 100644 --- a/core/fpdfdoc/cpdf_formfield_unittest.cpp +++ b/core/fpdfdoc/cpdf_formfield_unittest.cpp
@@ -54,7 +54,7 @@ CPDF_TestDocument doc; CPDF_InteractiveForm form(&doc); - CPDF_FormField form_field(&form, form_dict.Get()); + CPDF_FormField form_field(&form, std::move(form_dict)); EXPECT_EQ(expected_use_indices, form_field.UseSelectedIndicesObject()); for (int i = 0; i < form_field.CountOptions(); i++) { const bool expected_selected = pdfium::Contains(expected_indices, i);
diff --git a/core/fpdfdoc/cpdf_icon.cpp b/core/fpdfdoc/cpdf_icon.cpp index 9417e8e..f2a9ac6 100644 --- a/core/fpdfdoc/cpdf_icon.cpp +++ b/core/fpdfdoc/cpdf_icon.cpp
@@ -6,10 +6,13 @@ #include "core/fpdfdoc/cpdf_icon.h" +#include <utility> + #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_stream.h" -CPDF_Icon::CPDF_Icon(const CPDF_Stream* pStream) : m_pStream(pStream) {} +CPDF_Icon::CPDF_Icon(RetainPtr<const CPDF_Stream> pStream) + : m_pStream(std::move(pStream)) {} CPDF_Icon::~CPDF_Icon() = default;
diff --git a/core/fpdfdoc/cpdf_icon.h b/core/fpdfdoc/cpdf_icon.h index 62c86f7..cd6f898 100644 --- a/core/fpdfdoc/cpdf_icon.h +++ b/core/fpdfdoc/cpdf_icon.h
@@ -15,7 +15,7 @@ class CPDF_Icon final { public: - explicit CPDF_Icon(const CPDF_Stream* pStream); + explicit CPDF_Icon(RetainPtr<const CPDF_Stream> pStream); ~CPDF_Icon(); CFX_SizeF GetImageSize() const;
diff --git a/core/fpdfdoc/cpdf_interactiveform.cpp b/core/fpdfdoc/cpdf_interactiveform.cpp index b8dcba0..2babe7b 100644 --- a/core/fpdfdoc/cpdf_interactiveform.cpp +++ b/core/fpdfdoc/cpdf_interactiveform.cpp
@@ -839,7 +839,7 @@ } } - auto newField = std::make_unique<CPDF_FormField>(this, pParent.Get()); + auto newField = std::make_unique<CPDF_FormField>(this, std::move(pParent)); pField = newField.get(); RetainPtr<const CPDF_Object> pTObj = pFieldDict->GetObjectFor(pdfium::form_fields::kT);
diff --git a/core/fpdfdoc/cpdf_link.cpp b/core/fpdfdoc/cpdf_link.cpp index 24d1a5d..57ed88e 100644 --- a/core/fpdfdoc/cpdf_link.cpp +++ b/core/fpdfdoc/cpdf_link.cpp
@@ -6,11 +6,14 @@ #include "core/fpdfdoc/cpdf_link.h" +#include <utility> + #include "core/fpdfapi/parser/cpdf_dictionary.h" CPDF_Link::CPDF_Link() = default; -CPDF_Link::CPDF_Link(CPDF_Dictionary* pDict) : m_pDict(pDict) {} +CPDF_Link::CPDF_Link(RetainPtr<CPDF_Dictionary> pDict) + : m_pDict(std::move(pDict)) {} CPDF_Link::CPDF_Link(const CPDF_Link& that) = default;
diff --git a/core/fpdfdoc/cpdf_link.h b/core/fpdfdoc/cpdf_link.h index 43e8542..2b2faec 100644 --- a/core/fpdfdoc/cpdf_link.h +++ b/core/fpdfdoc/cpdf_link.h
@@ -16,7 +16,7 @@ class CPDF_Link { public: CPDF_Link(); - explicit CPDF_Link(CPDF_Dictionary* pDict); + explicit CPDF_Link(RetainPtr<CPDF_Dictionary> pDict); CPDF_Link(const CPDF_Link& that); ~CPDF_Link();
diff --git a/core/fpdfdoc/cpdf_linklist.cpp b/core/fpdfdoc/cpdf_linklist.cpp index cb2d20c..a3044ee 100644 --- a/core/fpdfdoc/cpdf_linklist.cpp +++ b/core/fpdfdoc/cpdf_linklist.cpp
@@ -6,6 +6,8 @@ #include "core/fpdfdoc/cpdf_linklist.h" +#include <utility> + #include "core/fpdfapi/page/cpdf_page.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" @@ -25,11 +27,11 @@ for (size_t i = pPageLinkList->size(); i > 0; --i) { size_t annot_index = i - 1; - CPDF_Dictionary* pAnnot = (*pPageLinkList)[annot_index].Get(); + RetainPtr<CPDF_Dictionary> pAnnot = (*pPageLinkList)[annot_index]; if (!pAnnot) continue; - CPDF_Link link(pAnnot); + CPDF_Link link(std::move(pAnnot)); if (!link.GetRect().Contains(point)) continue;
diff --git a/fpdfsdk/cpdfsdk_appstream.cpp b/fpdfsdk/cpdfsdk_appstream.cpp index 5b5550d..c000588 100644 --- a/fpdfsdk/cpdfsdk_appstream.cpp +++ b/fpdfsdk/cpdfsdk_appstream.cpp
@@ -703,7 +703,7 @@ } ByteString GenerateIconAppStream(CPDF_IconFit& fit, - CPDF_Stream* pIconStream, + RetainPtr<CPDF_Stream> pIconStream, const CFX_FloatRect& rcIcon) { if (rcIcon.IsEmpty() || !pIconStream) return ByteString(); @@ -715,7 +715,7 @@ if (!pWnd->Move(rcIcon, false, false)) return ByteString(); - auto pPDFIcon = std::make_unique<CPDF_Icon>(pIconStream); + auto pPDFIcon = std::make_unique<CPDF_Icon>(std::move(pIconStream)); ByteString sAlias = pPDFIcon->GetImageAlias(); if (sAlias.GetLength() <= 0) return ByteString(); @@ -748,7 +748,7 @@ ByteString GetPushButtonAppStream(const CFX_FloatRect& rcBBox, IPVT_FontMap* pFontMap, - CPDF_Stream* pIconStream, + RetainPtr<CPDF_Stream> pIconStream, CPDF_IconFit& IconFit, const WideString& sLabel, const CFX_Color& crText, @@ -910,7 +910,7 @@ } fxcrt::ostringstream sTemp; - sTemp << GenerateIconAppStream(IconFit, pIconStream, rcIcon); + sTemp << GenerateIconAppStream(IconFit, std::move(pIconStream), rcIcon); if (!rcLabel.IsEmpty()) { pEdit->SetPlateRect(rcLabel); @@ -1242,8 +1242,8 @@ GetBorderAppStreamInternal(rcWindow, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder) + GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow : rcClient, - &font_map, pNormalIcon.Get(), iconFit, - csNormalCaption, crText, fFontSize, nLayout); + &font_map, pNormalIcon, iconFit, csNormalCaption, + crText, fFontSize, nLayout); Write("N", csAP, ByteString()); if (pNormalIcon) @@ -1269,7 +1269,7 @@ GetBorderAppStreamInternal(rcWindow, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder) + GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow : rcClient, - &font_map, pRolloverIcon.Get(), iconFit, + &font_map, pRolloverIcon, iconFit, csRolloverCaption, crText, fFontSize, nLayout); Write("R", csAP, ByteString()); @@ -1305,8 +1305,8 @@ GetBorderAppStreamInternal(rcWindow, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder) + GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow : rcClient, - &font_map, pDownIcon.Get(), iconFit, - csDownCaption, crText, fFontSize, nLayout); + &font_map, pDownIcon, iconFit, csDownCaption, + crText, fFontSize, nLayout); Write("D", csAP, ByteString()); if (pDownIcon)
diff --git a/fpdfsdk/cpdfsdk_baannot.cpp b/fpdfsdk/cpdfsdk_baannot.cpp index a72ec83..47743c9 100644 --- a/fpdfsdk/cpdfsdk_baannot.cpp +++ b/fpdfsdk/cpdfsdk_baannot.cpp
@@ -211,8 +211,7 @@ } CPDF_AAction CPDFSDK_BAAnnot::GetAAction() const { - return CPDF_AAction( - GetAnnotDict()->GetDictFor(pdfium::form_fields::kAA).Get()); + return CPDF_AAction(GetAnnotDict()->GetDictFor(pdfium::form_fields::kAA)); } CPDF_Action CPDFSDK_BAAnnot::GetAAction(CPDF_AAction::AActionType eAAT) {
diff --git a/fpdfsdk/fpdf_doc.cpp b/fpdfsdk/fpdf_doc.cpp index b53fa97..fcc38ba 100644 --- a/fpdfsdk/fpdf_doc.cpp +++ b/fpdfsdk/fpdf_doc.cpp
@@ -345,7 +345,7 @@ CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); if (!pDoc) return nullptr; - CPDF_Link cLink(CPDFDictionaryFromFPDFLink(link)); + CPDF_Link cLink(pdfium::WrapRetain(CPDFDictionaryFromFPDFLink(link))); FPDF_DEST dest = FPDFDestFromCPDFArray(cLink.GetDest(pDoc).GetArray()); if (dest) return dest; @@ -360,7 +360,7 @@ if (!link) return nullptr; - CPDF_Link cLink(CPDFDictionaryFromFPDFLink(link)); + CPDF_Link cLink(pdfium::WrapRetain(CPDFDictionaryFromFPDFLink(link))); return FPDFActionFromCPDFDictionary(cLink.GetAction().GetDict()); } @@ -447,7 +447,7 @@ return nullptr; const CPDF_Dictionary* page_dict = pdf_page->GetDict(); - CPDF_AAction aa(page_dict->GetDictFor(pdfium::form_fields::kAA).Get()); + CPDF_AAction aa(page_dict->GetDictFor(pdfium::form_fields::kAA)); CPDF_AAction::AActionType type; if (aa_type == FPDFPAGE_AACTION_OPEN)
diff --git a/fpdfsdk/fpdf_formfill.cpp b/fpdfsdk/fpdf_formfill.cpp index 04e500c..2694f75 100644 --- a/fpdfsdk/fpdf_formfill.cpp +++ b/fpdfsdk/fpdf_formfill.cpp
@@ -778,7 +778,7 @@ if (!pDict) return; - CPDF_AAction aa(pDict->GetDictFor(pdfium::form_fields::kAA).Get()); + CPDF_AAction aa(pDict->GetDictFor(pdfium::form_fields::kAA)); auto type = static_cast<CPDF_AAction::AActionType>(aaType); if (aa.ActionExist(type)) pFormFillEnv->DoActionDocument(aa.GetAction(type), type); @@ -801,7 +801,7 @@ return; const CPDF_Dictionary* pPageDict = pPDFPage->GetDict(); - CPDF_AAction aa(pPageDict->GetDictFor(pdfium::form_fields::kAA).Get()); + CPDF_AAction aa(pPageDict->GetDictFor(pdfium::form_fields::kAA)); CPDF_AAction::AActionType type = aaType == FPDFPAGE_AACTION_OPEN ? CPDF_AAction::kOpenPage : CPDF_AAction::kClosePage;