Be more careful casting to widget subclasses.

Part of the effort to reduce unchecked static casts.

Change-Id: I1bff1c53aa7c5804660de4b65cf01523d70fcbb7
Reviewed-on: https://pdfium-review.googlesource.com/38896
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.cpp b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
index 649d3bb..da34286 100644
--- a/fpdfsdk/cpdfsdk_formfillenvironment.cpp
+++ b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
@@ -699,7 +699,7 @@
   }
 
   if (pFocusAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET) {
-    CPDFSDK_Widget* pWidget = static_cast<CPDFSDK_Widget*>(pFocusAnnot.Get());
+    CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pFocusAnnot.Get());
     FormFieldType fieldType = pWidget->GetFieldType();
     if (fieldType == FormFieldType::kTextField ||
         fieldType == FormFieldType::kComboBox) {
diff --git a/fpdfsdk/cpdfsdk_interform.cpp b/fpdfsdk/cpdfsdk_interform.cpp
index 9d646b6..3cfc84d 100644
--- a/fpdfsdk/cpdfsdk_interform.cpp
+++ b/fpdfsdk/cpdfsdk_interform.cpp
@@ -111,10 +111,8 @@
   auto pIterator = pdfium::MakeUnique<CPDFSDK_AnnotIterator>(
       pWidget->GetPageView(), CPDF_Annot::Subtype::WIDGET);
 
-  if (bNext)
-    return static_cast<CPDFSDK_Widget*>(pIterator->GetNextAnnot(pWidget));
-
-  return static_cast<CPDFSDK_Widget*>(pIterator->GetPrevAnnot(pWidget));
+  return ToCPDFSDKWidget(bNext ? pIterator->GetNextAnnot(pWidget)
+                               : pIterator->GetPrevAnnot(pWidget));
 }
 
 CPDFSDK_Widget* CPDFSDK_InterForm::GetWidget(CPDF_FormControl* pControl) const {
@@ -144,10 +142,7 @@
       pPage = m_pFormFillEnv->GetPageView(nPageIndex);
   }
 
-  if (!pPage)
-    return nullptr;
-
-  return static_cast<CPDFSDK_Widget*>(pPage->GetAnnotByDict(pControlDict));
+  return pPage ? ToCPDFSDKWidget(pPage->GetAnnotByDict(pControlDict)) : nullptr;
 }
 
 void CPDFSDK_InterForm::GetWidgets(
diff --git a/fpdfsdk/cpdfsdk_widgethandler.cpp b/fpdfsdk/cpdfsdk_widgethandler.cpp
index 12ae173..22f5d39 100644
--- a/fpdfsdk/cpdfsdk_widgethandler.cpp
+++ b/fpdfsdk/cpdfsdk_widgethandler.cpp
@@ -77,11 +77,10 @@
 
 void CPDFSDK_WidgetHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot) {
   ASSERT(pAnnot);
-
   if (m_pFormFiller)
     m_pFormFiller->OnDelete(pAnnot);
 
-  std::unique_ptr<CPDFSDK_Widget> pWidget(static_cast<CPDFSDK_Widget*>(pAnnot));
+  std::unique_ptr<CPDFSDK_Widget> pWidget(ToCPDFSDKWidget(pAnnot));
   CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm();
   CPDF_FormControl* pControl = pWidget->GetFormControl();
   pInterForm->RemoveMap(pControl);
@@ -222,7 +221,7 @@
   if (pAnnot->IsSignatureWidget())
     return;
 
-  CPDFSDK_Widget* pWidget = static_cast<CPDFSDK_Widget*>(pAnnot);
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
   if (!pWidget->IsAppearanceValid())
     pWidget->ResetAppearance(nullptr, false);
 
diff --git a/fpdfsdk/cpdfsdk_xfawidget.h b/fpdfsdk/cpdfsdk_xfawidget.h
index d2635eb..5db9f8d 100644
--- a/fpdfsdk/cpdfsdk_xfawidget.h
+++ b/fpdfsdk/cpdfsdk_xfawidget.h
@@ -36,4 +36,9 @@
   UnownedPtr<CXFA_FFWidget> m_hXFAWidget;
 };
 
+inline CPDFSDK_XFAWidget* ToXFAWidget(CPDFSDK_Annot* pAnnot) {
+  return pAnnot && pAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::XFAWIDGET
+      ? static_cast<CPDFSDK_XFAWidget*>(pAnnot) : nullptr;
+}
+
 #endif  // FPDFSDK_CPDFSDK_XFAWIDGET_H_
diff --git a/fpdfsdk/cpdfsdk_xfawidgethandler.cpp b/fpdfsdk/cpdfsdk_xfawidgethandler.cpp
index 1a8ec69..a395eef 100644
--- a/fpdfsdk/cpdfsdk_xfawidgethandler.cpp
+++ b/fpdfsdk/cpdfsdk_xfawidgethandler.cpp
@@ -70,7 +70,7 @@
 void CPDFSDK_XFAWidgetHandler::OnLoad(CPDFSDK_Annot* pAnnot) {}
 
 void CPDFSDK_XFAWidgetHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot) {
-  CPDFSDK_XFAWidget* pWidget = static_cast<CPDFSDK_XFAWidget*>(pAnnot);
+  CPDFSDK_XFAWidget* pWidget = ToXFAWidget(pAnnot);
   CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm();
   pInterForm->RemoveXFAMap(pWidget->GetXFAWidget());
 
diff --git a/fpdfsdk/formfiller/cffl_button.cpp b/fpdfsdk/formfiller/cffl_button.cpp
index dab0045..ea2315d 100644
--- a/fpdfsdk/formfiller/cffl_button.cpp
+++ b/fpdfsdk/formfiller/cffl_button.cpp
@@ -64,7 +64,7 @@
                          CFX_RenderDevice* pDevice,
                          const CFX_Matrix& mtUser2Device) {
   ASSERT(pPageView);
-  CPDFSDK_Widget* pWidget = static_cast<CPDFSDK_Widget*>(pAnnot);
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
   CPDF_FormControl* pCtrl = pWidget->GetFormControl();
   if (pCtrl->GetHighlightingMode() != CPDF_FormControl::Push) {
     pWidget->DrawAppearance(pDevice, mtUser2Device, CPDF_Annot::Normal,
diff --git a/fpdfsdk/formfiller/cffl_checkbox.cpp b/fpdfsdk/formfiller/cffl_checkbox.cpp
index e9c72ef..57119c5 100644
--- a/fpdfsdk/formfiller/cffl_checkbox.cpp
+++ b/fpdfsdk/formfiller/cffl_checkbox.cpp
@@ -61,7 +61,7 @@
 
       CPWL_CheckBox* pWnd = GetCheckBox(pPageView, true);
       if (pWnd) {
-        CPDFSDK_Widget* pWidget = static_cast<CPDFSDK_Widget*>(pAnnot);
+        CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
         pWnd->SetCheck(!pWidget->IsChecked());
       }
 
@@ -83,7 +83,7 @@
 
   CPWL_CheckBox* pWnd = GetCheckBox(pPageView, true);
   if (pWnd) {
-    CPDFSDK_Widget* pWidget = static_cast<CPDFSDK_Widget*>(pAnnot);
+    CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
     pWnd->SetCheck(!pWidget->IsChecked());
   }
 
diff --git a/fpdfsdk/formfiller/cffl_formfiller.cpp b/fpdfsdk/formfiller/cffl_formfiller.cpp
index 94592e7..85f5346 100644
--- a/fpdfsdk/formfiller/cffl_formfiller.cpp
+++ b/fpdfsdk/formfiller/cffl_formfiller.cpp
@@ -291,7 +291,7 @@
 }
 
 void CFFL_FormFiller::SetFocusForAnnot(CPDFSDK_Annot* pAnnot, uint32_t nFlag) {
-  auto* pWidget = static_cast<CPDFSDK_Widget*>(pAnnot);
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
   IPDF_Page* pPage = pWidget->GetPage();
   CPDFSDK_PageView* pPageView = m_pFormFillEnv->GetPageView(pPage, true);
   if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, true))
diff --git a/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp b/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp
index d73aaf9..c1cc355 100644
--- a/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp
+++ b/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp
@@ -58,7 +58,7 @@
                                         CFX_RenderDevice* pDevice,
                                         CFX_Matrix* pUser2Device) {
   ASSERT(pPageView);
-  CPDFSDK_Widget* pWidget = static_cast<CPDFSDK_Widget*>(pAnnot);
+  CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
   if (!IsVisible(pWidget))
     return;
 
@@ -66,7 +66,6 @@
   if (pFormFiller && pFormFiller->IsValid()) {
     pFormFiller->OnDraw(pPageView, pAnnot, pDevice, *pUser2Device);
     pAnnot->GetPDFPage();
-
     if (m_pFormFillEnv->GetFocusAnnot() != pAnnot)
       return;
 
diff --git a/fpdfsdk/pwl/cpwl_wnd.cpp b/fpdfsdk/pwl/cpwl_wnd.cpp
index 8782e85..a561b2d 100644
--- a/fpdfsdk/pwl/cpwl_wnd.cpp
+++ b/fpdfsdk/pwl/cpwl_wnd.cpp
@@ -277,33 +277,32 @@
 }
 
 bool CPWL_Wnd::InvalidateRect(CFX_FloatRect* pRect) {
-  ObservedPtr thisObserved(this);
-  if (!IsValid())
+    if (!IsValid())
     return true;
 
+  ObservedPtr thisObserved(this);
   CFX_FloatRect rcRefresh = pRect ? *pRect : GetWindowRect();
-
   if (!HasFlag(PWS_NOREFRESHCLIP)) {
     CFX_FloatRect rcClip = GetClipRect();
-    if (!rcClip.IsEmpty()) {
+    if (!rcClip.IsEmpty())
       rcRefresh.Intersect(rcClip);
-    }
   }
 
   CFX_FloatRect rcWin = PWLtoWnd(rcRefresh);
   rcWin.Inflate(1, 1);
   rcWin.Normalize();
 
-  if (CFX_SystemHandler* pSH = GetSystemHandler()) {
-    if (CPDFSDK_Widget* widget = static_cast<CPDFSDK_Widget*>(
-            m_CreationParams.pAttachedWidget.Get())) {
-      pSH->InvalidateRect(widget, rcWin);
-      if (!thisObserved)
-        return false;
-    }
-  }
+  CFX_SystemHandler* pSH = GetSystemHandler();
+  if (!pSH)
+    return true;
 
-  return true;
+  CPDFSDK_Widget* widget =
+      ToCPDFSDKWidget(m_CreationParams.pAttachedWidget.Get());
+  if (!widget)
+    return true;
+
+  pSH->InvalidateRect(widget, rcWin);
+  return !!thisObserved;
 }
 
 #define PWL_IMPLEMENT_KEY_METHOD(key_method_name)                  \
diff --git a/fxjs/cjs_document.cpp b/fxjs/cjs_document.cpp
index 51e189e..4ac2f15 100644
--- a/fxjs/cjs_document.cpp
+++ b/fxjs/cjs_document.cpp
@@ -417,7 +417,7 @@
     return CJS_Return();
 
   for (const auto& pAnnot : widgets) {
-    CPDFSDK_Widget* pWidget = static_cast<CPDFSDK_Widget*>(pAnnot.Get());
+    CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot.Get());
     if (!pWidget)
       continue;
 
diff --git a/fxjs/cjs_field.cpp b/fxjs/cjs_field.cpp
index 6513d4e..19e6712 100644
--- a/fxjs/cjs_field.cpp
+++ b/fxjs/cjs_field.cpp
@@ -54,20 +54,18 @@
       for (auto& pObserved : widgets) {
         if (pObserved) {
           bool bFormatted = false;
-          WideString sValue = static_cast<CPDFSDK_Widget*>(pObserved.Get())
-                                  ->OnFormat(bFormatted);
+          WideString sValue =
+              ToCPDFSDKWidget(pObserved.Get())->OnFormat(bFormatted);
           if (pObserved) {  // Not redundant, may be clobbered by OnFormat.
-            static_cast<CPDFSDK_Widget*>(pObserved.Get())
-                ->ResetAppearance(bFormatted ? &sValue : nullptr, false);
+            ToCPDFSDKWidget(pObserved.Get())->ResetAppearance(
+                bFormatted ? &sValue : nullptr, false);
           }
         }
       }
     } else {
       for (auto& pObserved : widgets) {
-        if (pObserved) {
-          static_cast<CPDFSDK_Widget*>(pObserved.Get())
-              ->ResetAppearance(nullptr, false);
-        }
+        if (pObserved)
+          ToCPDFSDKWidget(pObserved.Get())->ResetAppearance(nullptr, false);
       }
     }
   }
@@ -84,7 +82,7 @@
     // |GetFormFillEnv| out of the loop.
     for (auto& pObserved : widgets) {
       if (pObserved) {
-        CPDFSDK_Widget* pWidget = static_cast<CPDFSDK_Widget*>(pObserved.Get());
+        CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pObserved.Get());
         pWidget->GetInterForm()->GetFormFillEnv()->UpdateAllViews(nullptr,
                                                                   pWidget);
       }
@@ -1540,7 +1538,7 @@
     if (!pObserved)
       return CJS_Return(JSMessage::kBadObjectError);
 
-    auto* pWidget = static_cast<CPDFSDK_Widget*>(pObserved.Get());
+    auto* pWidget = ToCPDFSDKWidget(pObserved.Get());
     CPDFSDK_PageView* pPageView = pWidget->GetPageView();
     if (!pPageView)
       return CJS_Return(JSMessage::kBadObjectError);