Add CFXA_FFTextEdit::PreFinalize()

Still too much work going on in its destructor. Needs to be virtual
since we may only have a member to a parent class.

Bug: pdfium:1563
Change-Id: I6f2c11ff118ddcc7ccaf1c75d87efd8ee9f718eb
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/72914
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fxfa/cxfa_fftextedit.cpp b/xfa/fxfa/cxfa_fftextedit.cpp
index 1f52214..1ee30c2 100644
--- a/xfa/fxfa/cxfa_fftextedit.cpp
+++ b/xfa/fxfa/cxfa_fftextedit.cpp
@@ -34,12 +34,15 @@
 
 CXFA_FFTextEdit::CXFA_FFTextEdit(CXFA_Node* pNode) : CXFA_FFField(pNode) {}
 
-CXFA_FFTextEdit::~CXFA_FFTextEdit() {
+CXFA_FFTextEdit::~CXFA_FFTextEdit() = default;
+
+void CXFA_FFTextEdit::PreFinalize() {
   if (GetNormalWidget()) {
     CFWL_NoteDriver* pNoteDriver =
         GetNormalWidget()->GetFWLApp()->GetNoteDriver();
     pNoteDriver->UnregisterEventTarget(GetNormalWidget());
   }
+  CXFA_FFField::PreFinalize();
 }
 
 bool CXFA_FFTextEdit::LoadWidget() {
diff --git a/xfa/fxfa/cxfa_fftextedit.h b/xfa/fxfa/cxfa_fftextedit.h
index f3ad66c..5b4e298 100644
--- a/xfa/fxfa/cxfa_fftextedit.h
+++ b/xfa/fxfa/cxfa_fftextedit.h
@@ -24,6 +24,8 @@
   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
   ~CXFA_FFTextEdit() override;
 
+  void PreFinalize() override;
+
   // CXFA_FFField
   bool LoadWidget() override;
   void UpdateWidgetProperty() override;
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp
index 5a8c3c9..85930b9 100644
--- a/xfa/fxfa/cxfa_ffwidget.cpp
+++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -231,6 +231,8 @@
 
 CXFA_FFWidget::~CXFA_FFWidget() = default;
 
+void CXFA_FFWidget::PreFinalize() {}
+
 void CXFA_FFWidget::Trace(cppgc::Visitor* visitor) const {
   visitor->Trace(m_pLayoutItem);
   visitor->Trace(m_pNode);
diff --git a/xfa/fxfa/cxfa_ffwidget.h b/xfa/fxfa/cxfa_ffwidget.h
index df72e6f..f49eaf6 100644
--- a/xfa/fxfa/cxfa_ffwidget.h
+++ b/xfa/fxfa/cxfa_ffwidget.h
@@ -15,6 +15,7 @@
 #include "core/fxge/cfx_graphstatedata.h"
 #include "fxjs/gc/heap.h"
 #include "v8/include/cppgc/garbage-collected.h"
+#include "v8/include/cppgc/prefinalizer.h"
 #include "v8/include/cppgc/visitor.h"
 #include "xfa/fwl/cfwl_app.h"
 #include "xfa/fwl/cfwl_messagemouse.h"
@@ -72,6 +73,8 @@
 class CXFA_FFWidget : public cppgc::GarbageCollected<CXFA_FFWidget>,
                       public Observable,
                       public CFWL_Widget::AdapterIface {
+  CPPGC_USING_PRE_FINALIZER(CXFA_FFWidget, PreFinalize);
+
  public:
   enum FocusOption { kDoNotDrawFocus = 0, kDrawFocus };
   enum HighlightOption { kNoHighlight = 0, kHighlight };
@@ -79,6 +82,7 @@
   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
   ~CXFA_FFWidget() override;
 
+  virtual void PreFinalize();
   virtual void Trace(cppgc::Visitor* visitor) const;
 
   // CFWL_Widget::AdapterIface: