De-virtualize IsSignatureWidget()

Change-Id: I0b81f5fdaacb59a6b5d9f21cc92f72502990c06b
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/85410
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/cpdfsdk_annot.cpp b/fpdfsdk/cpdfsdk_annot.cpp
index f8f8839..f41fb3a 100644
--- a/fpdfsdk/cpdfsdk_annot.cpp
+++ b/fpdfsdk/cpdfsdk_annot.cpp
@@ -40,10 +40,6 @@
   return nullptr;
 }
 
-bool CPDFSDK_Annot::IsSignatureWidget() const {
-  return false;
-}
-
 IPDF_Page* CPDFSDK_Annot::GetPage() {
 #ifdef PDF_ENABLE_XFA
   IPDF_Page* pXFAPage = GetXFAPage();
diff --git a/fpdfsdk/cpdfsdk_annot.h b/fpdfsdk/cpdfsdk_annot.h
index 2b40449..3979d0b 100644
--- a/fpdfsdk/cpdfsdk_annot.h
+++ b/fpdfsdk/cpdfsdk_annot.h
@@ -27,7 +27,6 @@
 
   virtual int GetLayoutOrder() const;
   virtual CPDF_Annot* GetPDFAnnot() const;
-  virtual bool IsSignatureWidget() const;
   virtual CPDF_Annot::Subtype GetAnnotSubtype() const = 0;
   virtual CFX_FloatRect GetRect() const = 0;
 
diff --git a/fpdfsdk/cpdfsdk_annotiterator.cpp b/fpdfsdk/cpdfsdk_annotiterator.cpp
index 1c20f4c..aa373d4 100644
--- a/fpdfsdk/cpdfsdk_annotiterator.cpp
+++ b/fpdfsdk/cpdfsdk_annotiterator.cpp
@@ -12,6 +12,7 @@
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "fpdfsdk/cpdfsdk_annot.h"
 #include "fpdfsdk/cpdfsdk_pageview.h"
+#include "fpdfsdk/cpdfsdk_widget.h"
 #include "third_party/base/containers/contains.h"
 
 namespace {
@@ -69,9 +70,10 @@
 void CPDFSDK_AnnotIterator::CollectAnnots(
     std::vector<UnownedPtr<CPDFSDK_Annot>>* pArray) {
   for (auto* pAnnot : m_pPageView->GetAnnotList()) {
-    if (pdfium::Contains(m_subtypes, pAnnot->GetAnnotSubtype()) &&
-        !pAnnot->IsSignatureWidget()) {
-      pArray->emplace_back(pAnnot);
+    if (pdfium::Contains(m_subtypes, pAnnot->GetAnnotSubtype())) {
+      CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
+      if (!pWidget || !pWidget->IsSignatureWidget())
+        pArray->emplace_back(pAnnot);
     }
   }
 }
diff --git a/fpdfsdk/cpdfsdk_widget.h b/fpdfsdk/cpdfsdk_widget.h
index b5fbea5..9b32489 100644
--- a/fpdfsdk/cpdfsdk_widget.h
+++ b/fpdfsdk/cpdfsdk_widget.h
@@ -50,13 +50,13 @@
   ~CPDFSDK_Widget() override;
 
   // CPDFSDK_BAAnnot:
-  bool IsSignatureWidget() const override;
   CPDF_Action GetAAction(CPDF_AAction::AActionType eAAT) override;
   bool IsAppearanceValid() override;
 
   // CPDFSDK_Annot:
   int GetLayoutOrder() const override;
 
+  bool IsSignatureWidget() const;
   void SetRect(const CFX_FloatRect& rect);
   FormFieldType GetFieldType() const;
   int GetFieldFlags() const;
diff --git a/fpdfsdk/cpdfsdk_widgethandler.cpp b/fpdfsdk/cpdfsdk_widgethandler.cpp
index 35f074b..dff2596 100644
--- a/fpdfsdk/cpdfsdk_widgethandler.cpp
+++ b/fpdfsdk/cpdfsdk_widgethandler.cpp
@@ -83,18 +83,20 @@
                                    CFX_RenderDevice* pDevice,
                                    const CFX_Matrix& mtUser2Device,
                                    bool bDrawAnnots) {
-  if (pAnnot->IsSignatureWidget()) {
-    pAnnot->AsBAAnnot()->DrawAppearance(
-        pDevice, mtUser2Device, CPDF_Annot::AppearanceMode::kNormal, nullptr);
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
+  if (pWidget->IsSignatureWidget()) {
+    pWidget->DrawAppearance(pDevice, mtUser2Device,
+                            CPDF_Annot::AppearanceMode::kNormal, nullptr);
   } else {
     GetFormFillEnvironment()->GetInteractiveFormFiller()->OnDraw(
-        pAnnot->GetPageView(), pAnnot, pDevice, mtUser2Device);
+        pWidget->GetPageView(), pWidget, pDevice, mtUser2Device);
   }
 }
 
 void CPDFSDK_WidgetHandler::OnMouseEnter(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                          Mask<FWL_EVENTFLAG> nFlag) {
-  if (!pAnnot->IsSignatureWidget()) {
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot.Get());
+  if (!pWidget->IsSignatureWidget()) {
     GetFormFillEnvironment()->GetInteractiveFormFiller()->OnMouseEnter(
         pAnnot->GetPageView(), pAnnot, nFlag);
   }
@@ -102,7 +104,8 @@
 
 void CPDFSDK_WidgetHandler::OnMouseExit(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                         Mask<FWL_EVENTFLAG> nFlag) {
-  if (!pAnnot->IsSignatureWidget()) {
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot.Get());
+  if (!pWidget->IsSignatureWidget()) {
     GetFormFillEnvironment()->GetInteractiveFormFiller()->OnMouseExit(
         pAnnot->GetPageView(), pAnnot, nFlag);
   }
@@ -111,7 +114,8 @@
 bool CPDFSDK_WidgetHandler::OnLButtonDown(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                           Mask<FWL_EVENTFLAG> nFlags,
                                           const CFX_PointF& point) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot.Get());
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->OnLButtonDown(
              pAnnot->GetPageView(), pAnnot, nFlags, point);
 }
@@ -119,7 +123,8 @@
 bool CPDFSDK_WidgetHandler::OnLButtonUp(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                         Mask<FWL_EVENTFLAG> nFlags,
                                         const CFX_PointF& point) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot.Get());
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->OnLButtonUp(
              pAnnot->GetPageView(), pAnnot, nFlags, point);
 }
@@ -127,7 +132,8 @@
 bool CPDFSDK_WidgetHandler::OnLButtonDblClk(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                             Mask<FWL_EVENTFLAG> nFlags,
                                             const CFX_PointF& point) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot.Get());
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->OnLButtonDblClk(
              pAnnot->GetPageView(), pAnnot, nFlags, point);
 }
@@ -135,7 +141,8 @@
 bool CPDFSDK_WidgetHandler::OnMouseMove(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                         Mask<FWL_EVENTFLAG> nFlags,
                                         const CFX_PointF& point) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot.Get());
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->OnMouseMove(
              pAnnot->GetPageView(), pAnnot, nFlags, point);
 }
@@ -144,7 +151,8 @@
                                          Mask<FWL_EVENTFLAG> nFlags,
                                          const CFX_PointF& point,
                                          const CFX_Vector& delta) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot.Get());
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->OnMouseWheel(
              pAnnot->GetPageView(), pAnnot, nFlags, point, delta);
 }
@@ -152,7 +160,8 @@
 bool CPDFSDK_WidgetHandler::OnRButtonDown(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                           Mask<FWL_EVENTFLAG> nFlags,
                                           const CFX_PointF& point) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot.Get());
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->OnRButtonDown(
              pAnnot->GetPageView(), pAnnot, nFlags, point);
 }
@@ -160,7 +169,8 @@
 bool CPDFSDK_WidgetHandler::OnRButtonUp(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                         Mask<FWL_EVENTFLAG> nFlags,
                                         const CFX_PointF& point) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot.Get());
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->OnRButtonUp(
              pAnnot->GetPageView(), pAnnot, nFlags, point);
 }
@@ -174,7 +184,8 @@
 bool CPDFSDK_WidgetHandler::OnChar(CPDFSDK_Annot* pAnnot,
                                    uint32_t nChar,
                                    Mask<FWL_EVENTFLAG> nFlags) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->OnChar(
              pAnnot, nChar, nFlags);
 }
@@ -182,7 +193,8 @@
 bool CPDFSDK_WidgetHandler::OnKeyDown(CPDFSDK_Annot* pAnnot,
                                       FWL_VKEYCODE nKeyCode,
                                       Mask<FWL_EVENTFLAG> nFlag) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->OnKeyDown(
              pAnnot, nKeyCode, nFlag);
 }
@@ -194,10 +206,10 @@
 }
 
 void CPDFSDK_WidgetHandler::OnLoad(CPDFSDK_Annot* pAnnot) {
-  if (pAnnot->IsSignatureWidget())
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
+  if (pWidget->IsSignatureWidget())
     return;
 
-  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
   if (!pWidget->IsAppearanceValid())
     pWidget->ResetAppearance(pdfium::nullopt, CPDFSDK_Widget::kValueUnchanged);
 
@@ -227,7 +239,8 @@
   if (!IsFocusableAnnot(pAnnot->GetPDFAnnot()->GetSubtype()))
     return false;
 
-  return pAnnot->IsSignatureWidget() ||
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot.Get());
+  return pWidget->IsSignatureWidget() ||
          GetFormFillEnvironment()->GetInteractiveFormFiller()->OnSetFocus(
              pAnnot, nFlag);
 }
@@ -237,7 +250,8 @@
   if (!IsFocusableAnnot(pAnnot->GetPDFAnnot()->GetSubtype()))
     return false;
 
-  return pAnnot->IsSignatureWidget() ||
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot.Get());
+  return pWidget->IsSignatureWidget() ||
          GetFormFillEnvironment()->GetInteractiveFormFiller()->OnKillFocus(
              pAnnot, nFlag);
 }
@@ -245,75 +259,85 @@
 bool CPDFSDK_WidgetHandler::SetIndexSelected(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                              int index,
                                              bool selected) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot.Get());
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->SetIndexSelected(
              pAnnot, index, selected);
 }
 
 bool CPDFSDK_WidgetHandler::IsIndexSelected(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                             int index) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot.Get());
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->IsIndexSelected(
              pAnnot, index);
 }
 
 CFX_FloatRect CPDFSDK_WidgetHandler::GetViewBBox(CPDFSDK_Annot* pAnnot) {
-  if (!pAnnot->IsSignatureWidget()) {
-    return CFX_FloatRect(
-        GetFormFillEnvironment()->GetInteractiveFormFiller()->GetViewBBox(
-            pAnnot->GetPageView(), pAnnot));
-  }
-  return CFX_FloatRect();
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
+  if (pWidget->IsSignatureWidget())
+    return CFX_FloatRect();
+
+  return CFX_FloatRect(
+      GetFormFillEnvironment()->GetInteractiveFormFiller()->GetViewBBox(
+          pAnnot->GetPageView(), pAnnot));
 }
 
 WideString CPDFSDK_WidgetHandler::GetText(CPDFSDK_Annot* pAnnot) {
-  if (!pAnnot->IsSignatureWidget()) {
-    return GetFormFillEnvironment()->GetInteractiveFormFiller()->GetText(
-        pAnnot);
-  }
-  return WideString();
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
+  if (pWidget->IsSignatureWidget())
+    return WideString();
+
+  return GetFormFillEnvironment()->GetInteractiveFormFiller()->GetText(pAnnot);
 }
 
 WideString CPDFSDK_WidgetHandler::GetSelectedText(CPDFSDK_Annot* pAnnot) {
-  if (!pAnnot->IsSignatureWidget()) {
-    return GetFormFillEnvironment()
-        ->GetInteractiveFormFiller()
-        ->GetSelectedText(pAnnot);
-  }
-  return WideString();
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
+  if (pWidget->IsSignatureWidget())
+    return WideString();
+
+  return GetFormFillEnvironment()->GetInteractiveFormFiller()->GetSelectedText(
+      pAnnot);
 }
 
 void CPDFSDK_WidgetHandler::ReplaceSelection(CPDFSDK_Annot* pAnnot,
                                              const WideString& text) {
-  if (!pAnnot->IsSignatureWidget()) {
-    GetFormFillEnvironment()->GetInteractiveFormFiller()->ReplaceSelection(
-        pAnnot, text);
-  }
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
+  if (pWidget->IsSignatureWidget())
+    return;
+
+  GetFormFillEnvironment()->GetInteractiveFormFiller()->ReplaceSelection(pAnnot,
+                                                                         text);
 }
 
 bool CPDFSDK_WidgetHandler::SelectAllText(CPDFSDK_Annot* pAnnot) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->SelectAllText(
              pAnnot);
 }
 
 bool CPDFSDK_WidgetHandler::CanUndo(CPDFSDK_Annot* pAnnot) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->CanUndo(pAnnot);
 }
 
 bool CPDFSDK_WidgetHandler::CanRedo(CPDFSDK_Annot* pAnnot) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->CanRedo(pAnnot);
 }
 
 bool CPDFSDK_WidgetHandler::Undo(CPDFSDK_Annot* pAnnot) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->Undo(pAnnot);
 }
 
 bool CPDFSDK_WidgetHandler::Redo(CPDFSDK_Annot* pAnnot) {
-  return !pAnnot->IsSignatureWidget() &&
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
+  return !pWidget->IsSignatureWidget() &&
          GetFormFillEnvironment()->GetInteractiveFormFiller()->Redo(pAnnot);
 }