Avoid holding raw pointer to GCed sub-class through virtual interface. Make the interface a gc-mixin, and trace it like any other member. This is strictly more correct, though it shouldn't matter because of other traced pointers back to the widget thru the widget mgr. Change-Id: Ia496102534c5141a5be33091f6804f48ffa4dc5d Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/79370 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fwl/cfwl_widget.cpp b/xfa/fwl/cfwl_widget.cpp index 63ad532..ff783ae 100644 --- a/xfa/fwl/cfwl_widget.cpp +++ b/xfa/fwl/cfwl_widget.cpp
@@ -53,6 +53,7 @@ } void CFWL_Widget::Trace(cppgc::Visitor* visitor) const { + visitor->Trace(m_pAdapterIface); visitor->Trace(m_pFWLApp); visitor->Trace(m_pWidgetMgr); visitor->Trace(m_pDelegate);
diff --git a/xfa/fwl/cfwl_widget.h b/xfa/fwl/cfwl_widget.h index 60939a0..28ff8e7 100644 --- a/xfa/fwl/cfwl_widget.h +++ b/xfa/fwl/cfwl_widget.h
@@ -54,7 +54,7 @@ CPPGC_USING_PRE_FINALIZER(CFWL_Widget, PreFinalize); public: - class AdapterIface { + class AdapterIface : public cppgc::GarbageCollectedMixin { public: virtual ~AdapterIface() = default; virtual CFX_Matrix GetRotateMatrix() = 0; @@ -184,7 +184,7 @@ int32_t m_iLock = 0; uint64_t m_nEventKey = 0; - AdapterIface* m_pAdapterIface = nullptr; + cppgc::Member<AdapterIface> m_pAdapterIface; cppgc::Member<CFWL_App> const m_pFWLApp; cppgc::Member<CFWL_WidgetMgr> const m_pWidgetMgr; cppgc::Member<IFWL_WidgetDelegate> m_pDelegate;
diff --git a/xfa/fxfa/cxfa_ffwidget.h b/xfa/fxfa/cxfa_ffwidget.h index ddf29fb..04afd14 100644 --- a/xfa/fxfa/cxfa_ffwidget.h +++ b/xfa/fxfa/cxfa_ffwidget.h
@@ -72,7 +72,7 @@ ~CXFA_FFWidget() override; virtual void PreFinalize(); - virtual void Trace(cppgc::Visitor* visitor) const; + void Trace(cppgc::Visitor* visitor) const override; // CFWL_Widget::AdapterIface: CFX_Matrix GetRotateMatrix() override;