Make CPDFSDK_Pageview observable across mouse move callbacks Bug: chromium:1017494 Change-Id: I8a7590be50d11f22e854531903565b2528539005 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/61871 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_page.h b/core/fpdfapi/page/cpdf_page.h index 3f64d94..8c4fae3 100644 --- a/core/fpdfapi/page/cpdf_page.h +++ b/core/fpdfapi/page/cpdf_page.h
@@ -14,8 +14,8 @@ #include "core/fpdfapi/page/ipdf_page.h" #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/fx_system.h" +#include "core/fxcrt/observed_ptr.h" #include "core/fxcrt/retain_ptr.h" -#include "core/fxcrt/unowned_ptr.h" #include "third_party/base/optional.h" class CPDF_Dictionary; @@ -25,7 +25,8 @@ class CPDF_Page final : public IPDF_Page, public CPDF_PageObjectHolder { public: - class View {}; // Caller implements as desired, empty here due to layering. + // Caller implements as desired, empty here due to layering. + class View : public Observable {}; // Data for the render layer to attach to this page. class RenderContextIface { @@ -79,7 +80,7 @@ CPDF_Document* GetPDFDocument() const { return m_pPDFDocument.Get(); } View* GetView() const { return m_pView.Get(); } - void SetView(View* pView) { m_pView = pView; } + void SetView(View* pView) { m_pView.Reset(pView); } void UpdateDimensions(); private: @@ -94,7 +95,7 @@ UnownedPtr<CPDF_Document> m_pPDFDocument; std::unique_ptr<RenderCacheIface> m_pRenderCache; std::unique_ptr<RenderContextIface> m_pRenderContext; - UnownedPtr<View> m_pView; + ObservedPtr<View> m_pView; }; #endif // CORE_FPDFAPI_PAGE_CPDF_PAGE_H_
diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp index 9c7159e..376e542 100644 --- a/fpdfsdk/cpdfsdk_pageview.cpp +++ b/fpdfsdk/cpdfsdk_pageview.cpp
@@ -370,27 +370,31 @@ bool CPDFSDK_PageView::OnMouseMove(const CFX_PointF& point, int nFlag) { CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = m_pFormFillEnv->GetAnnotHandlerMgr(); + ObservedPtr<CPDFSDK_Annot> pFXAnnot(GetFXAnnotAtPoint(point)); + ObservedPtr<CPDFSDK_PageView> pThis(this); if (m_bOnWidget && m_pCaptureWidget != pFXAnnot) ExitWidget(pAnnotHandlerMgr, true, nFlag); - if (pFXAnnot) { - if (!m_bOnWidget) { - EnterWidget(pAnnotHandlerMgr, &pFXAnnot, nFlag); + // ExitWidget() may have invalidated objects. + if (!pThis || !pFXAnnot) + return false; - // Annot_OnMouseEnter may have invalidated pFXAnnot. - if (!pFXAnnot) { - ExitWidget(pAnnotHandlerMgr, false, nFlag); - return true; - } + if (!m_bOnWidget) { + EnterWidget(pAnnotHandlerMgr, &pFXAnnot, nFlag); + + // EnterWidget() may have invalidated objects. + if (!pThis) + return false; + + if (!pFXAnnot) { + ExitWidget(pAnnotHandlerMgr, false, nFlag); + return true; } - - pAnnotHandlerMgr->Annot_OnMouseMove(this, &pFXAnnot, nFlag, point); - return true; } - - return false; + pAnnotHandlerMgr->Annot_OnMouseMove(this, &pFXAnnot, nFlag, point); + return true; } void CPDFSDK_PageView::EnterWidget(CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr,
diff --git a/testing/resources/javascript/xfa_specific/bug_1017494.evt b/testing/resources/javascript/xfa_specific/bug_1017494.evt new file mode 100644 index 0000000..bf27458 --- /dev/null +++ b/testing/resources/javascript/xfa_specific/bug_1017494.evt
@@ -0,0 +1,3 @@ +mousemove,0,0 +focus,87,0 +charcode,1
diff --git a/testing/resources/javascript/xfa_specific/bug_1017494.in b/testing/resources/javascript/xfa_specific/bug_1017494.in new file mode 100644 index 0000000..586a6ff --- /dev/null +++ b/testing/resources/javascript/xfa_specific/bug_1017494.in
@@ -0,0 +1,35 @@ +{{header}} +{{include ../../xfa_catalog_1_0.fragment}} +{{include ../../xfa_object_2_0.fragment}} +{{include ../../xfa_preamble_3_0.fragment}} +{{include ../../xfa_config_4_0.fragment}} +{{object 5 0}} << + {{streanlen}} +>> +stream +<template xmlns="http://www.xfa.org/schema/xfa-template/3.3/"> + <subform layout="tb" name="subform2"> + <field w="100pt" h="420pt" name="Field0"/> + <draw name="Field1"> + <ui> + <barcode type="ean8"/> + </ui> + <value> + <text>12ab,.</text> + </value> + </draw> + <pageSet> + <pageArea name="PageArea3"> + <contentArea h="44pt"/> + </pageArea> + </pageSet> + </subform> +</template> +endstream +endobj +{{include ../../xfa_locale_6_0.fragment}} +{{include ../../xfa_postamble_7_0.fragment}} +{{include ../../xfa_pages_8_0.fragment}} +{{xref}} +{{trailer}} +{{startxref}}