Warn about stale |this| in CXFA_FFWidget::On*() methods

Change return types to boolean, but do not peform all possible
checks (yet).

Change-Id: Ibf9c38e403471b85539a3f494a05f61e44a83b53
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/64810
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fxfa/cxfa_fffield.cpp b/xfa/fxfa/cxfa_fffield.cpp
index 47be2b7..e11e968 100644
--- a/xfa/fxfa/cxfa_fffield.cpp
+++ b/xfa/fxfa/cxfa_fffield.cpp
@@ -411,11 +411,12 @@
   return true;
 }
 
-void CXFA_FFField::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+bool CXFA_FFField::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
   SetButtonDown(true);
   SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
       GetNormalWidget(), FWL_MouseCommand::LeftButtonDown, dwFlags,
       FWLToClient(point)));
+  return true;
 }
 
 bool CXFA_FFField::OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
@@ -461,11 +462,12 @@
   return true;
 }
 
-void CXFA_FFField::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+bool CXFA_FFField::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
   SetButtonDown(true);
   SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
       GetNormalWidget(), FWL_MouseCommand::RightButtonDown, dwFlags,
       FWLToClient(point)));
+  return true;
 }
 
 bool CXFA_FFField::OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
diff --git a/xfa/fxfa/cxfa_fffield.h b/xfa/fxfa/cxfa_fffield.h
index 76cb0f8..47c0845 100644
--- a/xfa/fxfa/cxfa_fffield.h
+++ b/xfa/fxfa/cxfa_fffield.h
@@ -39,14 +39,14 @@
                                 FWL_MouseCommand command) override;
   bool OnMouseEnter() override;
   bool OnMouseExit() override;
-  void OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+  bool OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnLButtonDblClk(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnMouseMove(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnMouseWheel(uint32_t dwFlags,
                     int16_t zDelta,
                     const CFX_PointF& point) override;
-  void OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+  bool OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnRButtonDblClk(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnSetFocus(CXFA_FFWidget* pOldWidget) override WARN_UNUSED_RESULT;
diff --git a/xfa/fxfa/cxfa_ffimageedit.cpp b/xfa/fxfa/cxfa_ffimageedit.cpp
index 1660f33..ce9a990 100644
--- a/xfa/fxfa/cxfa_ffimageedit.cpp
+++ b/xfa/fxfa/cxfa_ffimageedit.cpp
@@ -100,12 +100,13 @@
   return true;
 }
 
-void CXFA_FFImageEdit::OnLButtonDown(uint32_t dwFlags,
+bool CXFA_FFImageEdit::OnLButtonDown(uint32_t dwFlags,
                                      const CFX_PointF& point) {
   SetButtonDown(true);
   SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
       GetNormalWidget(), FWL_MouseCommand::LeftButtonDown, dwFlags,
       FWLToClient(point)));
+  return true;
 }
 
 void CXFA_FFImageEdit::SetFWLRect() {
diff --git a/xfa/fxfa/cxfa_ffimageedit.h b/xfa/fxfa/cxfa_ffimageedit.h
index 839ad6e..f1233b3 100644
--- a/xfa/fxfa/cxfa_ffimageedit.h
+++ b/xfa/fxfa/cxfa_ffimageedit.h
@@ -23,7 +23,7 @@
   bool AcceptsFocusOnButtonDown(uint32_t dwFlags,
                                 const CFX_PointF& point,
                                 FWL_MouseCommand command) override;
-  void OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+  bool OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
   void OnProcessMessage(CFWL_Message* pMessage) override;
   void OnProcessEvent(CFWL_Event* pEvent) override;
   void OnDrawWidget(CXFA_Graphics* pGraphics,
diff --git a/xfa/fxfa/cxfa_ffsignature.cpp b/xfa/fxfa/cxfa_ffsignature.cpp
index 46ca02f..b138991 100644
--- a/xfa/fxfa/cxfa_ffsignature.cpp
+++ b/xfa/fxfa/cxfa_ffsignature.cpp
@@ -51,8 +51,10 @@
   return false;
 }
 
-void CXFA_FFSignature::OnLButtonDown(uint32_t dwFlags,
-                                     const CFX_PointF& point) {}
+bool CXFA_FFSignature::OnLButtonDown(uint32_t dwFlags,
+                                     const CFX_PointF& point) {
+  return false;
+}
 
 bool CXFA_FFSignature::OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
   return false;
@@ -73,8 +75,10 @@
   return false;
 }
 
-void CXFA_FFSignature::OnRButtonDown(uint32_t dwFlags,
-                                     const CFX_PointF& point) {}
+bool CXFA_FFSignature::OnRButtonDown(uint32_t dwFlags,
+                                     const CFX_PointF& point) {
+  return false;
+}
 
 bool CXFA_FFSignature::OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
   return false;
diff --git a/xfa/fxfa/cxfa_ffsignature.h b/xfa/fxfa/cxfa_ffsignature.h
index 1656127..1aa00b6 100644
--- a/xfa/fxfa/cxfa_ffsignature.h
+++ b/xfa/fxfa/cxfa_ffsignature.h
@@ -24,17 +24,16 @@
                                 FWL_MouseCommand command) override;
   bool OnMouseEnter() override;
   bool OnMouseExit() override;
-  void OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+  bool OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnLButtonDblClk(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnMouseMove(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnMouseWheel(uint32_t dwFlags,
                     int16_t zDelta,
                     const CFX_PointF& pointy) override;
-  void OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+  bool OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnRButtonDblClk(uint32_t dwFlags, const CFX_PointF& point) override;
-
   bool OnKeyDown(uint32_t dwKeyCode, uint32_t dwFlags) override;
   bool OnKeyUp(uint32_t dwKeyCode, uint32_t dwFlags) override;
   bool OnChar(uint32_t dwChar, uint32_t dwFlags) override;
diff --git a/xfa/fxfa/cxfa_fftext.cpp b/xfa/fxfa/cxfa_fftext.cpp
index b6e8e61..f4ddbe0 100644
--- a/xfa/fxfa/cxfa_fftext.cpp
+++ b/xfa/fxfa/cxfa_fftext.cpp
@@ -115,8 +115,9 @@
   return true;
 }
 
-void CXFA_FFText::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+bool CXFA_FFText::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
   SetButtonDown(true);
+  return true;
 }
 
 bool CXFA_FFText::OnMouseMove(uint32_t dwFlags, const CFX_PointF& point) {
diff --git a/xfa/fxfa/cxfa_fftext.h b/xfa/fxfa/cxfa_fftext.h
index abcb51a..92eafb1 100644
--- a/xfa/fxfa/cxfa_fftext.h
+++ b/xfa/fxfa/cxfa_fftext.h
@@ -18,7 +18,7 @@
   bool AcceptsFocusOnButtonDown(uint32_t dwFlags,
                                 const CFX_PointF& point,
                                 FWL_MouseCommand command) override;
-  void OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+  bool OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnMouseMove(uint32_t dwFlags, const CFX_PointF& point) override;
   FWL_WidgetHit HitTest(const CFX_PointF& point) override;
diff --git a/xfa/fxfa/cxfa_fftextedit.cpp b/xfa/fxfa/cxfa_fftextedit.cpp
index d9af369..d75bef8 100644
--- a/xfa/fxfa/cxfa_fftextedit.cpp
+++ b/xfa/fxfa/cxfa_fftextedit.cpp
@@ -120,7 +120,7 @@
   return true;
 }
 
-void CXFA_FFTextEdit::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+bool CXFA_FFTextEdit::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
   if (!IsFocused()) {
     GetLayoutItem()->SetStatusBits(XFA_WidgetStatus_Focused);
     UpdateFWLData();
@@ -130,9 +130,10 @@
   SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
       GetNormalWidget(), FWL_MouseCommand::LeftButtonDown, dwFlags,
       FWLToClient(point)));
+  return true;
 }
 
-void CXFA_FFTextEdit::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+bool CXFA_FFTextEdit::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
   if (!IsFocused()) {
     GetLayoutItem()->SetStatusBits(XFA_WidgetStatus_Focused);
     UpdateFWLData();
@@ -141,6 +142,7 @@
   SetButtonDown(true);
   SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
       nullptr, FWL_MouseCommand::RightButtonDown, dwFlags, FWLToClient(point)));
+  return true;
 }
 
 bool CXFA_FFTextEdit::OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
diff --git a/xfa/fxfa/cxfa_fftextedit.h b/xfa/fxfa/cxfa_fftextedit.h
index ad49626..09b9434 100644
--- a/xfa/fxfa/cxfa_fftextedit.h
+++ b/xfa/fxfa/cxfa_fftextedit.h
@@ -30,8 +30,8 @@
   bool AcceptsFocusOnButtonDown(uint32_t dwFlags,
                                 const CFX_PointF& point,
                                 FWL_MouseCommand command) override;
-  void OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
-  void OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+  bool OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+  bool OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) override;
   bool OnSetFocus(CXFA_FFWidget* pOldWidget) override WARN_UNUSED_RESULT;
   bool OnKillFocus(CXFA_FFWidget* pNewWidget) override WARN_UNUSED_RESULT;
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp
index d134b0b..61cd5cc 100644
--- a/xfa/fxfa/cxfa_ffwidget.cpp
+++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -384,7 +384,9 @@
   return false;
 }
 
-void CXFA_FFWidget::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {}
+bool CXFA_FFWidget::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+  return false;
+}
 
 bool CXFA_FFWidget::OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
   return false;
@@ -404,7 +406,9 @@
   return false;
 }
 
-void CXFA_FFWidget::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {}
+bool CXFA_FFWidget::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+  return false;
+}
 
 bool CXFA_FFWidget::OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
   return false;
diff --git a/xfa/fxfa/cxfa_ffwidget.h b/xfa/fxfa/cxfa_ffwidget.h
index e0f9ee3..c173f59 100644
--- a/xfa/fxfa/cxfa_ffwidget.h
+++ b/xfa/fxfa/cxfa_ffwidget.h
@@ -90,27 +90,35 @@
   virtual bool AcceptsFocusOnButtonDown(uint32_t dwFlags,
                                         const CFX_PointF& point,
                                         FWL_MouseCommand command);
-  virtual bool OnMouseEnter();
-  virtual bool OnMouseExit();
-  virtual void OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point);
-  virtual bool OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point);
-  virtual bool OnLButtonDblClk(uint32_t dwFlags, const CFX_PointF& point);
-  virtual bool OnMouseMove(uint32_t dwFlags, const CFX_PointF& point);
+
+  // Caution: Returning false from an On* method may mean |this| is destroyed.
+  virtual bool OnMouseEnter() WARN_UNUSED_RESULT;
+  virtual bool OnMouseExit() WARN_UNUSED_RESULT;
+  virtual bool OnLButtonDown(uint32_t dwFlags,
+                             const CFX_PointF& point) WARN_UNUSED_RESULT;
+  virtual bool OnLButtonUp(uint32_t dwFlags,
+                           const CFX_PointF& point) WARN_UNUSED_RESULT;
+  virtual bool OnLButtonDblClk(uint32_t dwFlags,
+                               const CFX_PointF& point) WARN_UNUSED_RESULT;
+  virtual bool OnMouseMove(uint32_t dwFlags,
+                           const CFX_PointF& point) WARN_UNUSED_RESULT;
   virtual bool OnMouseWheel(uint32_t dwFlags,
                             int16_t zDelta,
-                            const CFX_PointF& point);
-  virtual void OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point);
-  virtual bool OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point);
-  virtual bool OnRButtonDblClk(uint32_t dwFlags, const CFX_PointF& point);
-
-  // Returning false may imply |this| is gone, continue with caution.
+                            const CFX_PointF& point) WARN_UNUSED_RESULT;
+  virtual bool OnRButtonDown(uint32_t dwFlags,
+                             const CFX_PointF& point) WARN_UNUSED_RESULT;
+  virtual bool OnRButtonUp(uint32_t dwFlags,
+                           const CFX_PointF& point) WARN_UNUSED_RESULT;
+  virtual bool OnRButtonDblClk(uint32_t dwFlags,
+                               const CFX_PointF& point) WARN_UNUSED_RESULT;
   virtual bool OnSetFocus(CXFA_FFWidget* pOldWidget) WARN_UNUSED_RESULT;
   virtual bool OnKillFocus(CXFA_FFWidget* pNewWidget) WARN_UNUSED_RESULT;
+  virtual bool OnKeyDown(uint32_t dwKeyCode,
+                         uint32_t dwFlags) WARN_UNUSED_RESULT;
+  virtual bool OnKeyUp(uint32_t dwKeyCode, uint32_t dwFlags) WARN_UNUSED_RESULT;
+  virtual bool OnChar(uint32_t dwChar, uint32_t dwFlags) WARN_UNUSED_RESULT;
+  virtual bool OnSetCursor(const CFX_PointF& point) WARN_UNUSED_RESULT;
 
-  virtual bool OnKeyDown(uint32_t dwKeyCode, uint32_t dwFlags);
-  virtual bool OnKeyUp(uint32_t dwKeyCode, uint32_t dwFlags);
-  virtual bool OnChar(uint32_t dwChar, uint32_t dwFlags);
-  virtual bool OnSetCursor(const CFX_PointF& point);
   virtual FWL_WidgetHit HitTest(const CFX_PointF& point);
   virtual bool CanUndo();
   virtual bool CanRedo();
diff --git a/xfa/fxfa/cxfa_ffwidgethandler.cpp b/xfa/fxfa/cxfa_ffwidgethandler.cpp
index 29ea34e..aeb6a4a 100644
--- a/xfa/fxfa/cxfa_ffwidgethandler.cpp
+++ b/xfa/fxfa/cxfa_ffwidgethandler.cpp
@@ -54,7 +54,7 @@
       m_pDocView->GetDoc()->GetDocEnvironment()->SetFocusWidget(
           m_pDocView->GetDoc(), hWidget);
     }
-    hWidget->OnLButtonDown(dwFlags, hWidget->Rotate2Normal(point));
+    bRet = hWidget->OnLButtonDown(dwFlags, hWidget->Rotate2Normal(point));
   }
   m_pDocView->UnlockUpdate();
   m_pDocView->UpdateDocView();
@@ -106,7 +106,7 @@
       m_pDocView->GetDoc()->GetDocEnvironment()->SetFocusWidget(
           m_pDocView->GetDoc(), hWidget);
     }
-    hWidget->OnRButtonDown(dwFlags, hWidget->Rotate2Normal(point));
+    bRet = hWidget->OnRButtonDown(dwFlags, hWidget->Rotate2Normal(point));
   }
   return bRet;
 }