Deduplicate pointers to widgets in pwl. See https://pdfium-review.googlesource.com/c/pdfium/+/58730 for additional evidence this is correct. This CL introduces some double observation that can be removed given better type consistency. Change-Id: I5d856448bb367fa244f4769a05267aff91aa2cdc Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/58751 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/formfiller/cffl_formfiller.cpp b/fpdfsdk/formfiller/cffl_formfiller.cpp index 1040172..e5a7d60 100644 --- a/fpdfsdk/formfiller/cffl_formfiller.cpp +++ b/fpdfsdk/formfiller/cffl_formfiller.cpp
@@ -378,10 +378,8 @@ return nullptr; CPWL_Wnd::CreateParams cp = GetCreateParam(); - cp.pAttachedWidget.Reset(m_pWidget.Get()); - auto pPrivateData = pdfium::MakeUnique<CFFL_PrivateData>(); - pPrivateData->pWidget = m_pWidget.Get(); + pPrivateData->pWidget.Reset(m_pWidget.Get()); pPrivateData->pPageView = pPageView; pPrivateData->nWidgetAppearanceAge = m_pWidget->GetAppearanceAge(); pPrivateData->nWidgetValueAge = 0; @@ -580,7 +578,7 @@ void CFFL_FormFiller::TimerProc() {} -IPWL_SystemHandler* CFFL_FormFiller::GetSystemHandler() const { +CFX_SystemHandler* CFFL_FormFiller::GetSystemHandler() const { return m_pFormFillEnv->GetSysHandler(); }
diff --git a/fpdfsdk/formfiller/cffl_formfiller.h b/fpdfsdk/formfiller/cffl_formfiller.h index 0397c1f..88c32d8 100644 --- a/fpdfsdk/formfiller/cffl_formfiller.h +++ b/fpdfsdk/formfiller/cffl_formfiller.h
@@ -12,13 +12,14 @@ #include "core/fpdfdoc/cba_fontmap.h" #include "core/fxcrt/unowned_ptr.h" +#include "fpdfsdk/cfx_systemhandler.h" #include "fpdfsdk/cpdfsdk_fieldaction.h" +#include "fpdfsdk/cpdfsdk_widget.h" #include "fpdfsdk/formfiller/cffl_interactiveformfiller.h" class CPDFSDK_Annot; class CPDFSDK_FormFillEnvironment; class CPDFSDK_PageView; -class CPDFSDK_Widget; class CFFL_FormFiller : public CPWL_Wnd::ProviderIface, public CPWL_TimerHandler { @@ -85,7 +86,7 @@ // CPWL_TimerHandler: void TimerProc() override; - IPWL_SystemHandler* GetSystemHandler() const override; + CFX_SystemHandler* GetSystemHandler() const override; // Covariant return. // CPWL_Wnd::ProviderIface: CFX_Matrix GetWindowMatrix(const CPWL_Wnd::PrivateData* pAttached) override;
diff --git a/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp b/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp index b760365..c98afcc 100644 --- a/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp +++ b/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp
@@ -589,7 +589,7 @@ bool* bBottom, float* fPopupRet) { auto* pData = static_cast<const CFFL_PrivateData*>(pAttached); - CPDFSDK_Widget* pWidget = pData->pWidget; + CPDFSDK_Widget* pWidget = pData->GetWidget(); CPDF_Page* pPage = pWidget->GetPDFPage(); CFX_FloatRect rcPageView(0, pPage->GetPageHeight(), pPage->GetPageWidth(), 0); @@ -813,7 +813,7 @@ auto* pData = static_cast<const CFFL_PrivateData*>(pAttached); ASSERT(pData->pWidget); - ObservedPtr<CPDFSDK_Annot> pObserved(pData->pWidget); + ObservedPtr<CPDFSDK_Annot> pObserved(pData->GetWidget()); return OnPreOpen(&pObserved, pData->pPageView, nFlag) || !pObserved; } @@ -823,7 +823,7 @@ auto* pData = static_cast<const CFFL_PrivateData*>(pAttached); ASSERT(pData->pWidget); - ObservedPtr<CPDFSDK_Annot> pObserved(pData->pWidget); + ObservedPtr<CPDFSDK_Annot> pObserved(pData->GetWidget()); return OnPostOpen(&pObserved, pData->pPageView, nFlag) || !pObserved; } @@ -908,11 +908,11 @@ *static_cast<const CFFL_PrivateData*>(pAttached); ASSERT(privateData.pWidget); - CFFL_FormFiller* pFormFiller = GetFormFiller(privateData.pWidget); + CFFL_FormFiller* pFormFiller = GetFormFiller(privateData.GetWidget()); #ifdef PDF_ENABLE_XFA if (pFormFiller->IsFieldFull(privateData.pPageView)) { - ObservedPtr<CPDFSDK_Annot> pObserved(privateData.pWidget); + ObservedPtr<CPDFSDK_Annot> pObserved(privateData.GetWidget()); if (OnFull(&pObserved, privateData.pPageView, nFlag) || !pObserved) return {true, true}; } @@ -945,13 +945,14 @@ fa); pFormFiller->SaveState(privateData.pPageView); - ObservedPtr<CPDFSDK_Annot> pObserved(privateData.pWidget); + ObservedPtr<CPDFSDK_Annot> pObserved(privateData.GetWidget()); bool action_status = privateData.pWidget->OnAAction( CPDF_AAction::kKeyStroke, &fa, privateData.pPageView); - if (!pObserved || !IsValidAnnot(privateData.pPageView, privateData.pWidget)) + if (!pObserved || + !IsValidAnnot(privateData.pPageView, privateData.GetWidget())) { return {true, true}; - + } if (!action_status) return {true, false}; @@ -971,7 +972,7 @@ } else { pFormFiller->RestoreState(privateData.pPageView); } - if (pFormFillEnv->GetFocusAnnot() == privateData.pWidget) + if (pFormFillEnv->GetFocusAnnot() == privateData.GetWidget()) return {false, bExit}; pFormFiller->CommitData(privateData.pPageView, nFlag); @@ -987,3 +988,7 @@ std::unique_ptr<CPWL_Wnd::PrivateData> CFFL_PrivateData::Clone() const { return pdfium::MakeUnique<CFFL_PrivateData>(*this); } + +CPDFSDK_Widget* CFFL_PrivateData::GetWidget() const { + return pWidget.Get(); +}
diff --git a/fpdfsdk/formfiller/cffl_interactiveformfiller.h b/fpdfsdk/formfiller/cffl_interactiveformfiller.h index 6541374..fb546ab 100644 --- a/fpdfsdk/formfiller/cffl_interactiveformfiller.h +++ b/fpdfsdk/formfiller/cffl_interactiveformfiller.h
@@ -11,6 +11,7 @@ #include <memory> #include <utility> +#include "core/fxcrt/observed_ptr.h" #include "core/fxcrt/unowned_ptr.h" #include "fpdfsdk/cpdfsdk_annot.h" #include "fpdfsdk/pwl/cpwl_edit.h" @@ -178,8 +179,9 @@ // CPWL_Wnd::PrivateData: std::unique_ptr<CPWL_Wnd::PrivateData> Clone() const override; + CPDFSDK_Widget* GetWidget() const override; - CPDFSDK_Widget* pWidget = nullptr; + ObservedPtr<CPDFSDK_Widget> pWidget; CPDFSDK_PageView* pPageView = nullptr; uint32_t nWidgetAppearanceAge = 0; uint32_t nWidgetValueAge = 0;
diff --git a/fpdfsdk/pwl/cpwl_wnd.cpp b/fpdfsdk/pwl/cpwl_wnd.cpp index 6316ced..d2daa9c 100644 --- a/fpdfsdk/pwl/cpwl_wnd.cpp +++ b/fpdfsdk/pwl/cpwl_wnd.cpp
@@ -12,6 +12,7 @@ #include <vector> #include "core/fxge/cfx_renderdevice.h" +#include "fpdfsdk/cpdfsdk_widget.h" #include "fpdfsdk/pwl/cpwl_scroll_bar.h" #include "public/fpdf_fwlevent.h" #include "third_party/base/ptr_util.h" @@ -272,8 +273,7 @@ if (!pSH) return true; - CPDFSDK_Widget* widget = - ToCPDFSDKWidget(m_CreationParams.pAttachedWidget.Get()); + CPDFSDK_Widget* widget = m_pAttachedData->GetWidget(); if (!widget) return true;
diff --git a/fpdfsdk/pwl/cpwl_wnd.h b/fpdfsdk/pwl/cpwl_wnd.h index 2349783..d0fe7b7 100644 --- a/fpdfsdk/pwl/cpwl_wnd.h +++ b/fpdfsdk/pwl/cpwl_wnd.h
@@ -15,10 +15,10 @@ #include "core/fxcrt/unowned_ptr.h" #include "core/fxge/cfx_color.h" #include "core/fxge/cfx_renderdevice.h" -#include "fpdfsdk/cpdfsdk_widget.h" #include "fpdfsdk/pwl/cpwl_timer.h" #include "fpdfsdk/pwl/cpwl_timer_handler.h" +class CPDFSDK_Widget; class CPWL_Edit; class CPWL_MsgControl; class CPWL_ScrollBar; @@ -98,6 +98,7 @@ public: virtual ~PrivateData() = default; virtual std::unique_ptr<PrivateData> Clone() const = 0; + virtual CPDFSDK_Widget* GetWidget() const = 0; }; class ProviderIface : public Observable { @@ -127,7 +128,6 @@ UnownedPtr<FocusHandlerIface> pFocusHandler; // optional uint32_t dwFlags = 0; // optional CFX_Color sBackgroundColor; // optional - ObservedPtr<CPDFSDK_Widget> pAttachedWidget; // required BorderStyle nBorderStyle = BorderStyle::SOLID; // optional int32_t dwBorderWidth = 1; // optional CFX_Color sBorderColor; // optional