Watch CFXA_FFWidgets across more On* methods.
Recent bugs have shown that these paths need much more care.
Change-Id: I2cdf13b6ea10c066f23e0c71e43d2395fbc5b1de
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/64830
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fxfa/cxfa_ffcheckbutton.cpp b/xfa/fxfa/cxfa_ffcheckbutton.cpp
index 2245177..bfa1c51 100644
--- a/xfa/fxfa/cxfa_ffcheckbutton.cpp
+++ b/xfa/fxfa/cxfa_ffcheckbutton.cpp
@@ -250,12 +250,13 @@
if (!GetNormalWidget() || !IsButtonDown())
return false;
+ ObservedPtr<CXFA_FFCheckButton> pWatched(this);
SetButtonDown(false);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::LeftButtonUp, dwFlags,
FWLToClient(point)));
- return true;
+ return !!pWatched;
}
XFA_CHECKSTATE CXFA_FFCheckButton::FWLState2XFAState() {
diff --git a/xfa/fxfa/cxfa_ffcombobox.cpp b/xfa/fxfa/cxfa_ffcombobox.cpp
index 97de8ca..79b0ec6 100644
--- a/xfa/fxfa/cxfa_ffcombobox.cpp
+++ b/xfa/fxfa/cxfa_ffcombobox.cpp
@@ -107,11 +107,13 @@
}
bool CXFA_FFComboBox::OnKillFocus(CXFA_FFWidget* pNewWidget) {
+ ObservedPtr<CXFA_FFWidget> pWatched(this);
ObservedPtr<CXFA_FFWidget> pNewWatched(pNewWidget);
if (!ProcessCommittedData())
UpdateFWLData();
- return pNewWatched && CXFA_FFField::OnKillFocus(pNewWatched.Get());
+ return pWatched && pNewWatched &&
+ CXFA_FFField::OnKillFocus(pNewWatched.Get());
}
void CXFA_FFComboBox::OpenDropDownList() {
diff --git a/xfa/fxfa/cxfa_fffield.cpp b/xfa/fxfa/cxfa_fffield.cpp
index e11e968..692d13e 100644
--- a/xfa/fxfa/cxfa_fffield.cpp
+++ b/xfa/fxfa/cxfa_fffield.cpp
@@ -378,18 +378,22 @@
if (!GetNormalWidget())
return false;
+ ObservedPtr<CXFA_FFField> pWatched(this);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::Enter));
- return true;
+
+ return !!pWatched;
}
bool CXFA_FFField::OnMouseExit() {
if (!GetNormalWidget())
return false;
+ ObservedPtr<CXFA_FFField> pWatched(this);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::Leave));
- return true;
+
+ return !!pWatched;
}
CFX_PointF CXFA_FFField::FWLToClient(const CFX_PointF& point) {
@@ -412,11 +416,13 @@
}
bool CXFA_FFField::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+ ObservedPtr<CXFA_FFField> pWatched(this);
SetButtonDown(true);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::LeftButtonDown, dwFlags,
FWLToClient(point)));
- return true;
+
+ return !!pWatched;
}
bool CXFA_FFField::OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
@@ -425,30 +431,36 @@
if (!IsButtonDown())
return false;
+ ObservedPtr<CXFA_FFField> pWatched(this);
SetButtonDown(false);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::LeftButtonUp, dwFlags,
FWLToClient(point)));
- return true;
+
+ return !!pWatched;
}
bool CXFA_FFField::OnLButtonDblClk(uint32_t dwFlags, const CFX_PointF& point) {
if (!GetNormalWidget())
return false;
+ ObservedPtr<CXFA_FFField> pWatched(this);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::LeftButtonDblClk, dwFlags,
FWLToClient(point)));
- return true;
+
+ return !!pWatched;
}
bool CXFA_FFField::OnMouseMove(uint32_t dwFlags, const CFX_PointF& point) {
if (!GetNormalWidget())
return false;
+ ObservedPtr<CXFA_FFField> pWatched(this);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::Move, dwFlags, FWLToClient(point)));
- return true;
+
+ return !!pWatched;
}
bool CXFA_FFField::OnMouseWheel(uint32_t dwFlags,
@@ -457,17 +469,21 @@
if (!GetNormalWidget())
return false;
+ ObservedPtr<CXFA_FFField> pWatched(this);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouseWheel>(
GetNormalWidget(), dwFlags, FWLToClient(point), CFX_PointF(zDelta, 0)));
- return true;
+
+ return !!pWatched;
}
bool CXFA_FFField::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+ ObservedPtr<CXFA_FFField> pWatched(this);
SetButtonDown(true);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::RightButtonDown, dwFlags,
FWLToClient(point)));
- return true;
+
+ return !!pWatched;
}
bool CXFA_FFField::OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
@@ -476,21 +492,25 @@
if (!IsButtonDown())
return false;
+ ObservedPtr<CXFA_FFField> pWatched(this);
SetButtonDown(false);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::RightButtonUp, dwFlags,
FWLToClient(point)));
- return true;
+
+ return !!pWatched;
}
bool CXFA_FFField::OnRButtonDblClk(uint32_t dwFlags, const CFX_PointF& point) {
if (!GetNormalWidget())
return false;
+ ObservedPtr<CXFA_FFField> pWatched(this);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::RightButtonDblClk, dwFlags,
FWLToClient(point)));
- return true;
+
+ return !!pWatched;
}
bool CXFA_FFField::OnSetFocus(CXFA_FFWidget* pOldWidget) {
@@ -500,14 +520,17 @@
if (!GetNormalWidget())
return false;
+ ObservedPtr<CXFA_FFField> pWatched(this);
SendMessageToFWLWidget(
pdfium::MakeUnique<CFWL_MessageSetFocus>(nullptr, GetNormalWidget()));
GetLayoutItem()->SetStatusBits(XFA_WidgetStatus_Focused);
InvalidateRect();
- return true;
+
+ return !!pWatched;
}
bool CXFA_FFField::OnKillFocus(CXFA_FFWidget* pNewWidget) {
+ ObservedPtr<CXFA_FFField> pWatched(this);
ObservedPtr<CXFA_FFWidget> pNewWatched(pNewWidget);
if (GetNormalWidget()) {
SendMessageToFWLWidget(
@@ -515,25 +538,30 @@
GetLayoutItem()->ClearStatusBits(XFA_WidgetStatus_Focused);
InvalidateRect();
}
- return pNewWatched && CXFA_FFWidget::OnKillFocus(pNewWatched.Get());
+ return pWatched && pNewWatched &&
+ CXFA_FFWidget::OnKillFocus(pNewWatched.Get());
}
bool CXFA_FFField::OnKeyDown(uint32_t dwKeyCode, uint32_t dwFlags) {
if (!GetNormalWidget() || !GetDoc()->GetXFADoc()->IsInteractive())
return false;
+ ObservedPtr<CXFA_FFField> pWatched(this);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageKey>(
GetNormalWidget(), FWL_KeyCommand::KeyDown, dwFlags, dwKeyCode));
- return true;
+
+ return !!pWatched;
}
bool CXFA_FFField::OnKeyUp(uint32_t dwKeyCode, uint32_t dwFlags) {
if (!GetNormalWidget() || !GetDoc()->GetXFADoc()->IsInteractive())
return false;
+ ObservedPtr<CXFA_FFField> pWatched(this);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageKey>(
GetNormalWidget(), FWL_KeyCommand::KeyUp, dwFlags, dwKeyCode));
- return true;
+
+ return !!pWatched;
}
bool CXFA_FFField::OnChar(uint32_t dwChar, uint32_t dwFlags) {
@@ -546,9 +574,11 @@
if (!m_pNode->IsOpenAccess())
return false;
+ ObservedPtr<CXFA_FFField> pWatched(this);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageKey>(
GetNormalWidget(), FWL_KeyCommand::Char, dwFlags, dwChar));
- return true;
+
+ return !!pWatched;
}
FWL_WidgetHit CXFA_FFField::HitTest(const CFX_PointF& point) {
diff --git a/xfa/fxfa/cxfa_ffimageedit.cpp b/xfa/fxfa/cxfa_ffimageedit.cpp
index ce9a990..4ff46a9 100644
--- a/xfa/fxfa/cxfa_ffimageedit.cpp
+++ b/xfa/fxfa/cxfa_ffimageedit.cpp
@@ -102,11 +102,13 @@
bool CXFA_FFImageEdit::OnLButtonDown(uint32_t dwFlags,
const CFX_PointF& point) {
+ ObservedPtr<CXFA_FFImageEdit> pWatched(this);
SetButtonDown(true);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::LeftButtonDown, dwFlags,
FWLToClient(point)));
- return true;
+
+ return !!pWatched;
}
void CXFA_FFImageEdit::SetFWLRect() {
diff --git a/xfa/fxfa/cxfa_fflistbox.cpp b/xfa/fxfa/cxfa_fflistbox.cpp
index ede1bc5..1f53209 100644
--- a/xfa/fxfa/cxfa_fflistbox.cpp
+++ b/xfa/fxfa/cxfa_fflistbox.cpp
@@ -71,11 +71,13 @@
}
bool CXFA_FFListBox::OnKillFocus(CXFA_FFWidget* pNewFocus) {
- ObservedPtr<CXFA_FFWidget> pWatched(pNewFocus);
+ ObservedPtr<CXFA_FFListBox> pWatched(this);
+ ObservedPtr<CXFA_FFWidget> pNewWatched(pNewFocus);
if (!ProcessCommittedData())
UpdateFWLData();
- return pWatched && CXFA_FFField::OnKillFocus(pWatched.Get());
+ return pWatched && pNewWatched &&
+ CXFA_FFField::OnKillFocus(pNewWatched.Get());
}
bool CXFA_FFListBox::CommitData() {
diff --git a/xfa/fxfa/cxfa_fftextedit.cpp b/xfa/fxfa/cxfa_fftextedit.cpp
index d75bef8..c5c52b9 100644
--- a/xfa/fxfa/cxfa_fftextedit.cpp
+++ b/xfa/fxfa/cxfa_fftextedit.cpp
@@ -121,28 +121,38 @@
}
bool CXFA_FFTextEdit::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+ ObservedPtr<CXFA_FFTextEdit> pWatched(this);
if (!IsFocused()) {
GetLayoutItem()->SetStatusBits(XFA_WidgetStatus_Focused);
UpdateFWLData();
+ if (!pWatched)
+ return false;
+
InvalidateRect();
}
SetButtonDown(true);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::LeftButtonDown, dwFlags,
FWLToClient(point)));
- return true;
+
+ return !!pWatched;
}
bool CXFA_FFTextEdit::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+ ObservedPtr<CXFA_FFTextEdit> pWatched(this);
if (!IsFocused()) {
GetLayoutItem()->SetStatusBits(XFA_WidgetStatus_Focused);
UpdateFWLData();
+ if (!pWatched)
+ return false;
+
InvalidateRect();
}
SetButtonDown(true);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
nullptr, FWL_MouseCommand::RightButtonDown, dwFlags, FWLToClient(point)));
- return true;
+
+ return !!pWatched;
}
bool CXFA_FFTextEdit::OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
@@ -154,34 +164,47 @@
}
bool CXFA_FFTextEdit::OnSetFocus(CXFA_FFWidget* pOldWidget) {
- ObservedPtr<CXFA_FFWidget> pWatched(pOldWidget);
+ ObservedPtr<CXFA_FFTextEdit> pWatched(this);
+ ObservedPtr<CXFA_FFWidget> pOldWatched(pOldWidget);
GetLayoutItem()->ClearStatusBits(XFA_WidgetStatus_TextEditValueChanged);
if (!IsFocused()) {
GetLayoutItem()->SetStatusBits(XFA_WidgetStatus_Focused);
UpdateFWLData();
+ if (!pWatched)
+ return false;
+
InvalidateRect();
}
- if (!CXFA_FFWidget::OnSetFocus(pWatched.Get()))
+ if (!CXFA_FFWidget::OnSetFocus(pOldWatched.Get()))
return false;
SendMessageToFWLWidget(
pdfium::MakeUnique<CFWL_MessageSetFocus>(nullptr, GetNormalWidget()));
- return true;
+ return !!pWatched;
}
bool CXFA_FFTextEdit::OnKillFocus(CXFA_FFWidget* pNewWidget) {
- ObservedPtr<CXFA_FFWidget> pWatched(pNewWidget);
+ ObservedPtr<CXFA_FFWidget> pWatched(this);
+ ObservedPtr<CXFA_FFWidget> pNewWatched(pNewWidget);
SendMessageToFWLWidget(
pdfium::MakeUnique<CFWL_MessageKillFocus>(nullptr, GetNormalWidget()));
+ if (!pWatched)
+ return false;
+
GetLayoutItem()->ClearStatusBits(XFA_WidgetStatus_Focused);
SetEditScrollOffset();
ProcessCommittedData();
UpdateFWLData();
InvalidateRect();
+ if (!pWatched)
+ return false;
- if (!CXFA_FFWidget::OnKillFocus(pWatched.Get()))
+ if (!CXFA_FFWidget::OnKillFocus(pNewWatched.Get()))
+ return false;
+
+ if (!pWatched)
return false;
GetLayoutItem()->ClearStatusBits(XFA_WidgetStatus_TextEditValueChanged);
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp
index 61cd5cc..b743a6e 100644
--- a/xfa/fxfa/cxfa_ffwidget.cpp
+++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -435,10 +435,8 @@
eParam.m_eType = XFA_EVENT_Enter;
eParam.m_pTarget = m_pNode.Get();
m_pNode->ProcessEvent(GetDocView(), XFA_AttributeValue::Enter, &eParam);
- if (!pWatched)
- return false;
- return true;
+ return !!pWatched;
}
bool CXFA_FFWidget::OnKillFocus(CXFA_FFWidget* pNewWidget) {