De-virtualize CXFA_FFWidget::PreFinalize().

PDFium's use of virtual pre-finalizers was an artifact of converting
virtual dtors mostly as-is into pre-finalizers. Improve performance
by only implementing these on the sub-classes that actually require
them.

Bug: chromium:1252634
Change-Id: Ib0926716cb305ed3206d6696f1b5c78e03135b4f
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/85491
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fxfa/cxfa_ffimage.cpp b/xfa/fxfa/cxfa_ffimage.cpp
index f3cdb3f..0bbb8f4 100644
--- a/xfa/fxfa/cxfa_ffimage.cpp
+++ b/xfa/fxfa/cxfa_ffimage.cpp
@@ -21,7 +21,6 @@
 
 void CXFA_FFImage::PreFinalize() {
   GetNode()->SetImageImage(nullptr);
-  CXFA_FFWidget::PreFinalize();
 }
 
 bool CXFA_FFImage::IsLoaded() {
diff --git a/xfa/fxfa/cxfa_ffimage.h b/xfa/fxfa/cxfa_ffimage.h
index 5e192fa..1fe358e 100644
--- a/xfa/fxfa/cxfa_ffimage.h
+++ b/xfa/fxfa/cxfa_ffimage.h
@@ -7,15 +7,19 @@
 #ifndef XFA_FXFA_CXFA_FFIMAGE_H_
 #define XFA_FXFA_CXFA_FFIMAGE_H_
 
+#include "v8/include/cppgc/prefinalizer.h"
 #include "xfa/fxfa/cxfa_ffwidget.h"
 
 class CXFA_FFImage final : public CXFA_FFWidget {
+  CPPGC_USING_PRE_FINALIZER(CXFA_FFImage, PreFinalize);
+
  public:
   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
   ~CXFA_FFImage() override;
 
+  void PreFinalize();
+
   // CXFA_FFWidget:
-  void PreFinalize() override;
   void RenderWidget(CFGAS_GEGraphics* pGS,
                     const CFX_Matrix& matrix,
                     HighlightOption highlight) override;
diff --git a/xfa/fxfa/cxfa_ffimageedit.cpp b/xfa/fxfa/cxfa_ffimageedit.cpp
index 41a3017..61df5ce 100644
--- a/xfa/fxfa/cxfa_ffimageedit.cpp
+++ b/xfa/fxfa/cxfa_ffimageedit.cpp
@@ -29,7 +29,6 @@
 
 void CXFA_FFImageEdit::PreFinalize() {
   m_pNode->SetImageEditImage(nullptr);
-  CXFA_FFField::PreFinalize();
 }
 
 void CXFA_FFImageEdit::Trace(cppgc::Visitor* visitor) const {
diff --git a/xfa/fxfa/cxfa_ffimageedit.h b/xfa/fxfa/cxfa_ffimageedit.h
index df5bc6b..9bffd3a 100644
--- a/xfa/fxfa/cxfa_ffimageedit.h
+++ b/xfa/fxfa/cxfa_ffimageedit.h
@@ -8,15 +8,19 @@
 #define XFA_FXFA_CXFA_FFIMAGEEDIT_H_
 
 #include "v8/include/cppgc/member.h"
+#include "v8/include/cppgc/prefinalizer.h"
 #include "xfa/fxfa/cxfa_fffield.h"
 
 class CXFA_FFImageEdit final : public CXFA_FFField {
+  CPPGC_USING_PRE_FINALIZER(CXFA_FFImageEdit, PreFinalize);
+
  public:
   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
   ~CXFA_FFImageEdit() override;
 
+  void PreFinalize();
+
   // CXFA_FFField:
-  void PreFinalize() override;
   void Trace(cppgc::Visitor* visitor) const override;
   void RenderWidget(CFGAS_GEGraphics* pGS,
                     const CFX_Matrix& matrix,
diff --git a/xfa/fxfa/cxfa_fflistbox.cpp b/xfa/fxfa/cxfa_fflistbox.cpp
index 5d985f1..e0d9a53 100644
--- a/xfa/fxfa/cxfa_fflistbox.cpp
+++ b/xfa/fxfa/cxfa_fflistbox.cpp
@@ -37,7 +37,6 @@
         GetNormalWidget()->GetFWLApp()->GetNoteDriver();
     pNoteDriver->UnregisterEventTarget(GetNormalWidget());
   }
-  CXFA_FFDropDown::PreFinalize();
 }
 
 void CXFA_FFListBox::Trace(cppgc::Visitor* visitor) const {
diff --git a/xfa/fxfa/cxfa_fflistbox.h b/xfa/fxfa/cxfa_fflistbox.h
index ae8bca9..88a335f 100644
--- a/xfa/fxfa/cxfa_fflistbox.h
+++ b/xfa/fxfa/cxfa_fflistbox.h
@@ -8,15 +8,19 @@
 #define XFA_FXFA_CXFA_FFLISTBOX_H_
 
 #include "v8/include/cppgc/member.h"
+#include "v8/include/cppgc/prefinalizer.h"
 #include "xfa/fxfa/cxfa_ffdropdown.h"
 
 class CXFA_FFListBox final : public CXFA_FFDropDown {
+  CPPGC_USING_PRE_FINALIZER(CXFA_FFListBox, PreFinalize);
+
  public:
   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
   ~CXFA_FFListBox() override;
 
+  void PreFinalize();
+
   // CXFA_FFField:
-  void PreFinalize() override;
   void Trace(cppgc::Visitor* visitor) const override;
   bool LoadWidget() override;
   bool OnKillFocus(CXFA_FFWidget* pNewWidget) override WARN_UNUSED_RESULT;
@@ -26,7 +30,7 @@
                     const CFX_Matrix& matrix) override;
   FormFieldType GetFormFieldType() override;
 
-  // CXFA_FFDropDown
+  // CXFA_FFDropDown:
   void InsertItem(const WideString& wsLabel, int32_t nIndex) override;
   void DeleteItem(int32_t nIndex) override;
 
diff --git a/xfa/fxfa/cxfa_fftextedit.cpp b/xfa/fxfa/cxfa_fftextedit.cpp
index 9a83b6f..a60cd29 100644
--- a/xfa/fxfa/cxfa_fftextedit.cpp
+++ b/xfa/fxfa/cxfa_fftextedit.cpp
@@ -42,7 +42,6 @@
         GetNormalWidget()->GetFWLApp()->GetNoteDriver();
     pNoteDriver->UnregisterEventTarget(GetNormalWidget());
   }
-  CXFA_FFField::PreFinalize();
 }
 
 void CXFA_FFTextEdit::Trace(cppgc::Visitor* visitor) const {
diff --git a/xfa/fxfa/cxfa_fftextedit.h b/xfa/fxfa/cxfa_fftextedit.h
index 9513f28..2fb39ed 100644
--- a/xfa/fxfa/cxfa_fftextedit.h
+++ b/xfa/fxfa/cxfa_fftextedit.h
@@ -9,6 +9,7 @@
 
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_string.h"
+#include "v8/include/cppgc/prefinalizer.h"
 #include "xfa/fxfa/cxfa_fffield.h"
 
 class CFWL_Event;
@@ -19,11 +20,14 @@
 class IFWL_WidgetDelegate;
 
 class CXFA_FFTextEdit : public CXFA_FFField {
+  CPPGC_USING_PRE_FINALIZER(CXFA_FFTextEdit, PreFinalize);
+
  public:
   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
   ~CXFA_FFTextEdit() override;
 
-  void PreFinalize() override;
+  void PreFinalize();
+
   void Trace(cppgc::Visitor* visitor) const override;
 
   // CXFA_FFField
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp
index 8aa5c2e..2928913 100644
--- a/xfa/fxfa/cxfa_ffwidget.cpp
+++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -222,8 +222,6 @@
 
 CXFA_FFWidget::~CXFA_FFWidget() = default;
 
-void CXFA_FFWidget::PreFinalize() {}
-
 void CXFA_FFWidget::Trace(cppgc::Visitor* visitor) const {
   visitor->Trace(m_pLayoutItem);
   visitor->Trace(m_pDocView);
diff --git a/xfa/fxfa/cxfa_ffwidget.h b/xfa/fxfa/cxfa_ffwidget.h
index bddabe5..5df2c70 100644
--- a/xfa/fxfa/cxfa_ffwidget.h
+++ b/xfa/fxfa/cxfa_ffwidget.h
@@ -16,7 +16,6 @@
 #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"
@@ -65,8 +64,6 @@
 
 class CXFA_FFWidget : public cppgc::GarbageCollected<CXFA_FFWidget>,
                       public CFWL_Widget::AdapterIface {
-  CPPGC_USING_PRE_FINALIZER(CXFA_FFWidget, PreFinalize);
-
  public:
   enum FocusOption { kDoNotDrawFocus = 0, kDrawFocus };
   enum HighlightOption { kNoHighlight = 0, kHighlight };
@@ -88,7 +85,6 @@
   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
   ~CXFA_FFWidget() override;
 
-  virtual void PreFinalize();
   void Trace(cppgc::Visitor* visitor) const override;
 
   // CFWL_Widget::AdapterIface: