Always retain corresponding layoutitem in CXFA_FF*::On*() methods
Changes ownership model from weak retention to strong in a few
places.
Change-Id: I58e8e4ad09890715e029041006729ea510c6e5db
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/66730
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 72e024c..1b022f6 100644
--- a/xfa/fxfa/cxfa_ffcheckbutton.cpp
+++ b/xfa/fxfa/cxfa_ffcheckbutton.cpp
@@ -250,13 +250,15 @@
if (!GetNormalWidget() || !IsButtonDown())
return false;
- ObservedPtr<CXFA_FFCheckButton> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SetButtonDown(false);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::LeftButtonUp, dwFlags,
FWLToClient(point)));
- return !!pWatched;
+ return true;
}
XFA_CHECKSTATE CXFA_FFCheckButton::FWLState2XFAState() {
@@ -300,6 +302,9 @@
}
void CXFA_FFCheckButton::OnProcessMessage(CFWL_Message* pMessage) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
m_pOldDelegate->OnProcessMessage(pMessage);
}
@@ -346,6 +351,9 @@
void CXFA_FFCheckButton::OnDrawWidget(CXFA_Graphics* pGraphics,
const CFX_Matrix& matrix) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
m_pOldDelegate->OnDrawWidget(pGraphics, matrix);
}
diff --git a/xfa/fxfa/cxfa_ffcombobox.cpp b/xfa/fxfa/cxfa_ffcombobox.cpp
index 2f89ce2..522a0be 100644
--- a/xfa/fxfa/cxfa_ffcombobox.cpp
+++ b/xfa/fxfa/cxfa_ffcombobox.cpp
@@ -103,6 +103,9 @@
}
bool CXFA_FFComboBox::OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
if (!CXFA_FFField::OnRButtonUp(dwFlags, point))
return false;
@@ -111,13 +114,14 @@
}
bool CXFA_FFComboBox::OnKillFocus(CXFA_FFWidget* pNewWidget) {
- ObservedPtr<CXFA_FFWidget> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
ObservedPtr<CXFA_FFWidget> pNewWatched(pNewWidget);
if (!ProcessCommittedData())
UpdateFWLData();
- return pWatched && pNewWatched &&
- CXFA_FFField::OnKillFocus(pNewWatched.Get());
+ return pNewWatched && CXFA_FFField::OnKillFocus(pNewWatched.Get());
}
void CXFA_FFComboBox::OpenDropDownList() {
@@ -311,6 +315,9 @@
void CXFA_FFComboBox::OnTextChanged(CFWL_Widget* pWidget,
const WideString& wsChanged) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
CXFA_EventParam eParam;
eParam.m_wsPrevText = m_pNode->GetValue(XFA_VALUEPICTURE_Raw);
eParam.m_wsChange = wsChanged;
@@ -318,18 +325,20 @@
}
void CXFA_FFComboBox::OnSelectChanged(CFWL_Widget* pWidget, bool bLButtonUp) {
- ObservedPtr<CXFA_FFComboBox> watched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
CXFA_EventParam eParam;
eParam.m_wsPrevText = m_pNode->GetValue(XFA_VALUEPICTURE_Raw);
FWLEventSelChange(&eParam);
- if (!watched)
- return;
-
if (m_pNode->IsChoiceListCommitOnSelect() && bLButtonUp)
m_pDocView->SetFocusNode(nullptr);
}
void CXFA_FFComboBox::OnPreOpen(CFWL_Widget* pWidget) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
CXFA_EventParam eParam;
eParam.m_eType = XFA_EVENT_PreOpen;
eParam.m_pTarget = m_pNode.Get();
@@ -337,6 +346,9 @@
}
void CXFA_FFComboBox::OnPostOpen(CFWL_Widget* pWidget) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
CXFA_EventParam eParam;
eParam.m_eType = XFA_EVENT_PostOpen;
eParam.m_pTarget = m_pNode.Get();
@@ -344,6 +356,9 @@
}
void CXFA_FFComboBox::OnProcessMessage(CFWL_Message* pMessage) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
m_pOldDelegate->OnProcessMessage(pMessage);
}
@@ -379,5 +394,8 @@
void CXFA_FFComboBox::OnDrawWidget(CXFA_Graphics* pGraphics,
const CFX_Matrix& matrix) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
m_pOldDelegate->OnDrawWidget(pGraphics, matrix);
}
diff --git a/xfa/fxfa/cxfa_ffdatetimeedit.cpp b/xfa/fxfa/cxfa_ffdatetimeedit.cpp
index a0fcd26..7017442 100644
--- a/xfa/fxfa/cxfa_ffdatetimeedit.cpp
+++ b/xfa/fxfa/cxfa_ffdatetimeedit.cpp
@@ -188,8 +188,10 @@
int32_t iYear,
int32_t iMonth,
int32_t iDay) {
- WideString wsPicture = m_pNode->GetPictureContent(XFA_VALUEPICTURE_Edit);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+ WideString wsPicture = m_pNode->GetPictureContent(XFA_VALUEPICTURE_Edit);
CXFA_LocaleValue date(XFA_VT_DATE, GetDoc()->GetXFADoc()->GetLocaleMgr());
date.SetDate(CFX_DateTime(iYear, iMonth, iDay, 0, 0, 0, 0));
diff --git a/xfa/fxfa/cxfa_fffield.cpp b/xfa/fxfa/cxfa_fffield.cpp
index d83f8da..2f2e366 100644
--- a/xfa/fxfa/cxfa_fffield.cpp
+++ b/xfa/fxfa/cxfa_fffield.cpp
@@ -380,22 +380,26 @@
if (!GetNormalWidget())
return false;
- ObservedPtr<CXFA_FFField> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::Enter));
- return !!pWatched;
+ return true;
}
bool CXFA_FFField::OnMouseExit() {
if (!GetNormalWidget())
return false;
- ObservedPtr<CXFA_FFField> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::Leave));
- return !!pWatched;
+ return true;
}
CFX_PointF CXFA_FFField::FWLToClient(const CFX_PointF& point) {
@@ -418,13 +422,15 @@
}
bool CXFA_FFField::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
- ObservedPtr<CXFA_FFField> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SetButtonDown(true);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::LeftButtonDown, dwFlags,
FWLToClient(point)));
- return !!pWatched;
+ return true;
}
bool CXFA_FFField::OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
@@ -433,36 +439,42 @@
if (!IsButtonDown())
return false;
- ObservedPtr<CXFA_FFField> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SetButtonDown(false);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::LeftButtonUp, dwFlags,
FWLToClient(point)));
- return !!pWatched;
+ return true;
}
bool CXFA_FFField::OnLButtonDblClk(uint32_t dwFlags, const CFX_PointF& point) {
if (!GetNormalWidget())
return false;
- ObservedPtr<CXFA_FFField> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::LeftButtonDblClk, dwFlags,
FWLToClient(point)));
- return !!pWatched;
+ return true;
}
bool CXFA_FFField::OnMouseMove(uint32_t dwFlags, const CFX_PointF& point) {
if (!GetNormalWidget())
return false;
- ObservedPtr<CXFA_FFField> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::Move, dwFlags, FWLToClient(point)));
- return !!pWatched;
+ return true;
}
bool CXFA_FFField::OnMouseWheel(uint32_t dwFlags,
@@ -471,21 +483,25 @@
if (!GetNormalWidget())
return false;
- ObservedPtr<CXFA_FFField> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouseWheel>(
GetNormalWidget(), dwFlags, FWLToClient(point), CFX_PointF(zDelta, 0)));
- return !!pWatched;
+ return true;
}
bool CXFA_FFField::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
- ObservedPtr<CXFA_FFField> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SetButtonDown(true);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::RightButtonDown, dwFlags,
FWLToClient(point)));
- return !!pWatched;
+ return true;
}
bool CXFA_FFField::OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
@@ -494,25 +510,29 @@
if (!IsButtonDown())
return false;
- ObservedPtr<CXFA_FFField> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SetButtonDown(false);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::RightButtonUp, dwFlags,
FWLToClient(point)));
- return !!pWatched;
+ return true;
}
bool CXFA_FFField::OnRButtonDblClk(uint32_t dwFlags, const CFX_PointF& point) {
if (!GetNormalWidget())
return false;
- ObservedPtr<CXFA_FFField> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::RightButtonDblClk, dwFlags,
FWLToClient(point)));
- return !!pWatched;
+ return true;
}
bool CXFA_FFField::OnSetFocus(CXFA_FFWidget* pOldWidget) {
@@ -522,17 +542,21 @@
if (!GetNormalWidget())
return false;
- ObservedPtr<CXFA_FFField> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SendMessageToFWLWidget(
pdfium::MakeUnique<CFWL_MessageSetFocus>(nullptr, GetNormalWidget()));
GetLayoutItem()->SetStatusBits(XFA_WidgetStatus_Focused);
InvalidateRect();
- return !!pWatched;
+ return true;
}
bool CXFA_FFField::OnKillFocus(CXFA_FFWidget* pNewWidget) {
- ObservedPtr<CXFA_FFField> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
ObservedPtr<CXFA_FFWidget> pNewWatched(pNewWidget);
if (GetNormalWidget()) {
SendMessageToFWLWidget(
@@ -540,34 +564,36 @@
GetLayoutItem()->ClearStatusBits(XFA_WidgetStatus_Focused);
InvalidateRect();
}
- return pWatched && pNewWatched &&
- CXFA_FFWidget::OnKillFocus(pNewWatched.Get());
+ return 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);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageKey>(
GetNormalWidget(), FWL_KeyCommand::KeyDown, dwFlags, dwKeyCode));
- return !!pWatched;
+ return true;
}
bool CXFA_FFField::OnKeyUp(uint32_t dwKeyCode, uint32_t dwFlags) {
if (!GetNormalWidget() || !GetDoc()->GetXFADoc()->IsInteractive())
return false;
- ObservedPtr<CXFA_FFField> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageKey>(
GetNormalWidget(), FWL_KeyCommand::KeyUp, dwFlags, dwKeyCode));
- return !!pWatched;
+ return true;
}
bool CXFA_FFField::OnChar(uint32_t dwChar, uint32_t dwFlags) {
- RetainPtr<CXFA_ContentLayoutItem> pWatched(m_pLayoutItem.Get());
if (!GetDoc()->GetXFADoc()->IsInteractive())
return false;
if (dwChar == XFA_FWL_VKEY_Tab)
@@ -577,6 +603,9 @@
if (!m_pNode->IsOpenAccess())
return false;
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageKey>(
GetNormalWidget(), FWL_KeyCommand::Char, dwFlags, dwChar));
@@ -744,6 +773,9 @@
void CXFA_FFField::OnProcessMessage(CFWL_Message* pMessage) {}
void CXFA_FFField::OnProcessEvent(CFWL_Event* pEvent) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
switch (pEvent->GetType()) {
case CFWL_Event::Type::Mouse: {
CFWL_EventMouse* event = static_cast<CFWL_EventMouse*>(pEvent);
diff --git a/xfa/fxfa/cxfa_ffimageedit.cpp b/xfa/fxfa/cxfa_ffimageedit.cpp
index 5d5a69f..0c5e129 100644
--- a/xfa/fxfa/cxfa_ffimageedit.cpp
+++ b/xfa/fxfa/cxfa_ffimageedit.cpp
@@ -102,13 +102,15 @@
bool CXFA_FFImageEdit::OnLButtonDown(uint32_t dwFlags,
const CFX_PointF& point) {
- ObservedPtr<CXFA_FFImageEdit> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
SetButtonDown(true);
SendMessageToFWLWidget(pdfium::MakeUnique<CFWL_MessageMouse>(
GetNormalWidget(), FWL_MouseCommand::LeftButtonDown, dwFlags,
FWLToClient(point)));
- return !!pWatched;
+ return true;
}
void CXFA_FFImageEdit::SetFWLRect() {
@@ -133,6 +135,9 @@
}
void CXFA_FFImageEdit::OnProcessMessage(CFWL_Message* pMessage) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
m_pOldDelegate->OnProcessMessage(pMessage);
}
@@ -146,6 +151,9 @@
void CXFA_FFImageEdit::OnDrawWidget(CXFA_Graphics* pGraphics,
const CFX_Matrix& matrix) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
m_pOldDelegate->OnDrawWidget(pGraphics, matrix);
}
diff --git a/xfa/fxfa/cxfa_fflistbox.cpp b/xfa/fxfa/cxfa_fflistbox.cpp
index fe55303..bb693bc 100644
--- a/xfa/fxfa/cxfa_fflistbox.cpp
+++ b/xfa/fxfa/cxfa_fflistbox.cpp
@@ -76,13 +76,14 @@
}
bool CXFA_FFListBox::OnKillFocus(CXFA_FFWidget* pNewFocus) {
- ObservedPtr<CXFA_FFListBox> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
ObservedPtr<CXFA_FFWidget> pNewWatched(pNewFocus);
if (!ProcessCommittedData())
UpdateFWLData();
- return pWatched && pNewWatched &&
- CXFA_FFField::OnKillFocus(pNewWatched.Get());
+ return pNewWatched && CXFA_FFField::OnKillFocus(pNewWatched.Get());
}
bool CXFA_FFListBox::CommitData() {
@@ -160,6 +161,9 @@
}
void CXFA_FFListBox::OnSelectChanged(CFWL_Widget* pWidget) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
CXFA_EventParam eParam;
eParam.m_eType = XFA_EVENT_Change;
eParam.m_pTarget = m_pNode.Get();
@@ -192,6 +196,9 @@
}
void CXFA_FFListBox::OnProcessMessage(CFWL_Message* pMessage) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
m_pOldDelegate->OnProcessMessage(pMessage);
}
@@ -212,6 +219,9 @@
void CXFA_FFListBox::OnDrawWidget(CXFA_Graphics* pGraphics,
const CFX_Matrix& matrix) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
m_pOldDelegate->OnDrawWidget(pGraphics, matrix);
}
diff --git a/xfa/fxfa/cxfa_ffnumericedit.cpp b/xfa/fxfa/cxfa_ffnumericedit.cpp
index ae6a749..d089178 100644
--- a/xfa/fxfa/cxfa_ffnumericedit.cpp
+++ b/xfa/fxfa/cxfa_ffnumericedit.cpp
@@ -81,6 +81,9 @@
}
bool CXFA_FFNumericEdit::OnValidate(CFWL_Widget* pWidget, WideString& wsText) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
WideString wsPattern = m_pNode->GetPictureContent(XFA_VALUEPICTURE_Edit);
if (!wsPattern.IsEmpty())
return true;
diff --git a/xfa/fxfa/cxfa_ffpushbutton.cpp b/xfa/fxfa/cxfa_ffpushbutton.cpp
index d7e1f34..646cb8d 100644
--- a/xfa/fxfa/cxfa_ffpushbutton.cpp
+++ b/xfa/fxfa/cxfa_ffpushbutton.cpp
@@ -191,6 +191,9 @@
}
void CXFA_FFPushButton::OnProcessMessage(CFWL_Message* pMessage) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
m_pOldDelegate->OnProcessMessage(pMessage);
}
@@ -204,6 +207,9 @@
void CXFA_FFPushButton::OnDrawWidget(CXFA_Graphics* pGraphics,
const CFX_Matrix& matrix) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
auto* pWidget = GetNormalWidget();
if (pWidget->GetStylesEx() & XFA_FWL_PSBSTYLEEXT_HiliteInverted) {
if ((pWidget->GetStates() & FWL_STATE_PSB_Pressed) &&
diff --git a/xfa/fxfa/cxfa_fftextedit.cpp b/xfa/fxfa/cxfa_fftextedit.cpp
index 8ddc2ff..4744212 100644
--- a/xfa/fxfa/cxfa_fftextedit.cpp
+++ b/xfa/fxfa/cxfa_fftextedit.cpp
@@ -121,13 +121,12 @@
}
bool CXFA_FFTextEdit::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
- ObservedPtr<CXFA_FFTextEdit> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
if (!IsFocused()) {
GetLayoutItem()->SetStatusBits(XFA_WidgetStatus_Focused);
UpdateFWLData();
- if (!pWatched)
- return false;
-
InvalidateRect();
}
SetButtonDown(true);
@@ -135,27 +134,29 @@
GetNormalWidget(), FWL_MouseCommand::LeftButtonDown, dwFlags,
FWLToClient(point)));
- return !!pWatched;
+ return true;
}
bool CXFA_FFTextEdit::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
- ObservedPtr<CXFA_FFTextEdit> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
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 !!pWatched;
+ return true;
}
bool CXFA_FFTextEdit::OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
if (!CXFA_FFField::OnRButtonUp(dwFlags, point))
return false;
@@ -164,15 +165,14 @@
}
bool CXFA_FFTextEdit::OnSetFocus(CXFA_FFWidget* pOldWidget) {
- ObservedPtr<CXFA_FFTextEdit> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
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(pOldWatched.Get()))
@@ -181,32 +181,26 @@
SendMessageToFWLWidget(
pdfium::MakeUnique<CFWL_MessageSetFocus>(nullptr, GetNormalWidget()));
- return !!pWatched;
+ return true;
}
bool CXFA_FFTextEdit::OnKillFocus(CXFA_FFWidget* pNewWidget) {
- ObservedPtr<CXFA_FFWidget> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
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(pNewWatched.Get()))
return false;
- if (!pWatched)
- return false;
-
GetLayoutItem()->ClearStatusBits(XFA_WidgetStatus_TextEditValueChanged);
return true;
}
@@ -326,6 +320,9 @@
void CXFA_FFTextEdit::OnTextWillChange(CFWL_Widget* pWidget,
CFWL_EventTextWillChange* event) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
GetLayoutItem()->SetStatusBits(XFA_WidgetStatus_TextEditValueChanged);
CXFA_EventParam eParam;
@@ -347,6 +344,9 @@
}
void CXFA_FFTextEdit::OnTextFull(CFWL_Widget* pWidget) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
CXFA_EventParam eParam;
eParam.m_eType = XFA_EVENT_Full;
eParam.m_pTarget = m_pNode.Get();
@@ -354,6 +354,9 @@
}
void CXFA_FFTextEdit::OnProcessMessage(CFWL_Message* pMessage) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
m_pOldDelegate->OnProcessMessage(pMessage);
}
@@ -378,6 +381,9 @@
void CXFA_FFTextEdit::OnDrawWidget(CXFA_Graphics* pGraphics,
const CFX_Matrix& matrix) {
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
m_pOldDelegate->OnDrawWidget(pGraphics, matrix);
}
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp
index 728fd99..62a5eda 100644
--- a/xfa/fxfa/cxfa_ffwidget.cpp
+++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -422,35 +422,30 @@
}
bool CXFA_FFWidget::OnSetFocus(CXFA_FFWidget* pOldWidget) {
- // OnSetFocus event may remove this widget.
- ObservedPtr<CXFA_FFWidget> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
CXFA_FFWidget* pParent = GetFFWidget(ToContentLayoutItem(GetParent()));
if (pParent && !pParent->IsAncestorOf(pOldWidget)) {
if (!pParent->OnSetFocus(pOldWidget))
return false;
}
- if (!pWatched)
- return false;
-
GetLayoutItem()->SetStatusBits(XFA_WidgetStatus_Focused);
CXFA_EventParam eParam;
eParam.m_eType = XFA_EVENT_Enter;
eParam.m_pTarget = m_pNode.Get();
m_pNode->ProcessEvent(GetDocView(), XFA_AttributeValue::Enter, &eParam);
-
- return !!pWatched;
+ return true;
}
bool CXFA_FFWidget::OnKillFocus(CXFA_FFWidget* pNewWidget) {
- // OnKillFocus event may remove these widgets.
- ObservedPtr<CXFA_FFWidget> pWatched(this);
+ // Prevents destruction of the CXFA_ContentLayoutItem that owns |this|.
+ RetainPtr<CXFA_ContentLayoutItem> retainer(m_pLayoutItem.Get());
+
ObservedPtr<CXFA_FFWidget> pNewWatched(pNewWidget);
GetLayoutItem()->ClearStatusBits(XFA_WidgetStatus_Focused);
EventKillFocus();
- if (!pWatched)
- return false;
-
if (!pNewWidget)
return true;
@@ -463,7 +458,7 @@
if (!pParent->OnKillFocus(pNewWidget))
return false;
}
- return pWatched && pNewWatched;
+ return !!pNewWatched;
}
bool CXFA_FFWidget::OnKeyDown(uint32_t dwKeyCode, uint32_t dwFlags) {