summaryrefslogtreecommitdiff
path: root/fpdfsdk/pwl
diff options
context:
space:
mode:
Diffstat (limited to 'fpdfsdk/pwl')
-rw-r--r--fpdfsdk/pwl/cpwl_appstream.cpp3
-rw-r--r--fpdfsdk/pwl/cpwl_caret.cpp25
-rw-r--r--fpdfsdk/pwl/cpwl_caret.h4
-rw-r--r--fpdfsdk/pwl/cpwl_combo_box.cpp83
-rw-r--r--fpdfsdk/pwl/cpwl_combo_box.h6
-rw-r--r--fpdfsdk/pwl/cpwl_edit.cpp21
-rw-r--r--fpdfsdk/pwl/cpwl_edit.h2
-rw-r--r--fpdfsdk/pwl/cpwl_edit_ctrl.cpp27
-rw-r--r--fpdfsdk/pwl/cpwl_edit_ctrl.h4
-rw-r--r--fpdfsdk/pwl/cpwl_list_box.cpp6
-rw-r--r--fpdfsdk/pwl/cpwl_list_box.h2
-rw-r--r--fpdfsdk/pwl/cpwl_scroll_bar.cpp97
-rw-r--r--fpdfsdk/pwl/cpwl_scroll_bar.h6
-rw-r--r--fpdfsdk/pwl/cpwl_wnd.cpp63
-rw-r--r--fpdfsdk/pwl/cpwl_wnd.h17
15 files changed, 251 insertions, 115 deletions
diff --git a/fpdfsdk/pwl/cpwl_appstream.cpp b/fpdfsdk/pwl/cpwl_appstream.cpp
index 6a19efb906..7d7f172f2f 100644
--- a/fpdfsdk/pwl/cpwl_appstream.cpp
+++ b/fpdfsdk/pwl/cpwl_appstream.cpp
@@ -696,7 +696,8 @@ ByteString GenerateIconAppStream(CPDF_IconFit& fit,
icon.Create(cp);
icon.SetIconFit(&fit);
icon.SetPDFStream(pIconStream);
- icon.Move(rcIcon, false, false);
+ if (!icon.Move(rcIcon, false, false))
+ return ByteString();
ByteString sAlias = icon.GetImageAlias();
if (sAlias.GetLength() <= 0)
diff --git a/fpdfsdk/pwl/cpwl_caret.cpp b/fpdfsdk/pwl/cpwl_caret.cpp
index c58f019c4c..77a768afe0 100644
--- a/fpdfsdk/pwl/cpwl_caret.cpp
+++ b/fpdfsdk/pwl/cpwl_caret.cpp
@@ -83,7 +83,7 @@ void CPWL_Caret::SetCaret(bool bVisible,
EndTimer();
CPWL_Wnd::SetVisible(false);
// Note, |this| may no longer be viable at this point. If more work needs
- // to be done, add an observer.
+ // to be done, check the return value of SetVisible().
return;
}
@@ -93,15 +93,13 @@ void CPWL_Caret::SetCaret(bool bVisible,
EndTimer();
BeginTimer(PWL_CARET_FLASHINTERVAL);
- ObservedPtr observer(this);
- CPWL_Wnd::SetVisible(true);
- if (!observer)
+ if (!CPWL_Wnd::SetVisible(true))
return;
m_bFlash = true;
Move(m_rcInvalid, false, true);
// Note, |this| may no longer be viable at this point. If more work needs
- // to be done, add an observer.
+ // to be done, check the return value of Move().
return;
}
@@ -113,15 +111,12 @@ void CPWL_Caret::SetCaret(bool bVisible,
m_bFlash = true;
Move(m_rcInvalid, false, true);
// Note, |this| may no longer be viable at this point. If more work
- // needs to be done, add an observer.
+ // needs to be done, check the return value of Move().
}
-void CPWL_Caret::InvalidateRect(CFX_FloatRect* pRect) {
+bool CPWL_Caret::InvalidateRect(CFX_FloatRect* pRect) {
if (!pRect) {
- CPWL_Wnd::InvalidateRect(nullptr);
- // Note, |this| may no longer be viable at this point. If more work needs
- // to be done, add an observer.
- return;
+ return CPWL_Wnd::InvalidateRect(nullptr);
}
CFX_FloatRect rcRefresh = *pRect;
@@ -131,7 +126,9 @@ void CPWL_Caret::InvalidateRect(CFX_FloatRect* pRect) {
}
rcRefresh.top += 1;
rcRefresh.bottom -= 1;
- CPWL_Wnd::InvalidateRect(&rcRefresh);
- // Note, |this| may no longer be viable at this point. If more work needs
- // to be done, add an observer.
+ return CPWL_Wnd::InvalidateRect(&rcRefresh);
+}
+
+bool CPWL_Caret::SetVisible(bool bVisible) {
+ return true;
}
diff --git a/fpdfsdk/pwl/cpwl_caret.h b/fpdfsdk/pwl/cpwl_caret.h
index fb0fa8978c..d60a96419b 100644
--- a/fpdfsdk/pwl/cpwl_caret.h
+++ b/fpdfsdk/pwl/cpwl_caret.h
@@ -18,8 +18,8 @@ class CPWL_Caret : public CPWL_Wnd {
ByteString GetClassName() const override;
void DrawThisAppearance(CFX_RenderDevice* pDevice,
const CFX_Matrix& mtUser2Device) override;
- void InvalidateRect(CFX_FloatRect* pRect) override;
- void SetVisible(bool bVisible) override {}
+ bool InvalidateRect(CFX_FloatRect* pRect) override;
+ bool SetVisible(bool bVisible) override;
void TimerProc() override;
void SetCaret(bool bVisible,
diff --git a/fpdfsdk/pwl/cpwl_combo_box.cpp b/fpdfsdk/pwl/cpwl_combo_box.cpp
index 3ebccca263..92b01658f2 100644
--- a/fpdfsdk/pwl/cpwl_combo_box.cpp
+++ b/fpdfsdk/pwl/cpwl_combo_box.cpp
@@ -174,7 +174,9 @@ void CPWL_ComboBox::SetFocus() {
}
void CPWL_ComboBox::KillFocus() {
- SetPopup(false);
+ if (!SetPopup(false))
+ return;
+
CPWL_Wnd::KillFocus();
}
@@ -316,7 +318,9 @@ void CPWL_ComboBox::CreateListBox(const CreateParams& cp) {
m_pList->Create(lcp);
}
-void CPWL_ComboBox::RePosChildWnd() {
+bool CPWL_ComboBox::RePosChildWnd() {
+ ObservedPtr thisObserved(this);
+
const CFX_FloatRect rcClient = GetClientRect();
if (m_bPopup) {
const float fOldWindowHeight = m_rcOldWindow.Height();
@@ -338,34 +342,57 @@ void CPWL_ComboBox::RePosChildWnd() {
rcList.bottom += fOldWindowHeight;
}
- if (m_pButton)
+ if (m_pButton) {
m_pButton->Move(rcButton, true, false);
+ if (!thisObserved)
+ return false;
+ }
- if (m_pEdit)
+ if (m_pEdit) {
m_pEdit->Move(rcEdit, true, false);
+ if (!thisObserved)
+ return false;
+ }
if (m_pList) {
- m_pList->SetVisible(true);
- m_pList->Move(rcList, true, false);
+ if (!m_pList->SetVisible(true) || !thisObserved)
+ return false;
+
+ if (!m_pList->Move(rcList, true, false) || !thisObserved)
+ return false;
+
m_pList->ScrollToListItem(m_nSelectItem);
+ if (!thisObserved)
+ return false;
}
- return;
+ return true;
}
CFX_FloatRect rcButton = rcClient;
rcButton.left = std::max(rcButton.right - kDefaultButtonWidth, rcClient.left);
- if (m_pButton)
+ if (m_pButton) {
m_pButton->Move(rcButton, true, false);
+ if (!thisObserved)
+ return false;
+ }
CFX_FloatRect rcEdit = rcClient;
rcEdit.right = std::max(rcButton.left - 1.0f, rcEdit.left);
- if (m_pEdit)
+ if (m_pEdit) {
m_pEdit->Move(rcEdit, true, false);
+ if (!thisObserved)
+ return false;
+ }
- if (m_pList)
+ if (m_pList) {
m_pList->SetVisible(false);
+ if (!thisObserved)
+ return false;
+ }
+
+ return true;
}
void CPWL_ComboBox::SelectAll() {
@@ -377,27 +404,30 @@ CFX_FloatRect CPWL_ComboBox::GetFocusRect() const {
return CFX_FloatRect();
}
-void CPWL_ComboBox::SetPopup(bool bPopup) {
+bool CPWL_ComboBox::SetPopup(bool bPopup) {
if (!m_pList)
- return;
+ return true;
if (bPopup == m_bPopup)
- return;
+ return true;
float fListHeight = m_pList->GetContentRect().Height();
if (!IsFloatBigger(fListHeight, 0.0f))
- return;
+ return true;
if (!bPopup) {
m_bPopup = bPopup;
- Move(m_rcOldWindow, true, true);
- return;
+ return Move(m_rcOldWindow, true, true);
}
if (!m_pFillerNotify)
- return;
+ return true;
+
+ ObservedPtr thisObserved(this);
#ifdef PDF_ENABLE_XFA
if (m_pFillerNotify->OnPopupPreOpen(GetAttachedData(), 0))
- return;
+ return !!thisObserved;
+ if (!thisObserved)
+ return false;
#endif // PDF_ENABLE_XFA
float fBorderWidth = m_pList->GetBorderWidth() * 2;
@@ -411,7 +441,7 @@ void CPWL_ComboBox::SetPopup(bool bPopup) {
m_pFillerNotify->QueryWherePopup(GetAttachedData(), fPopupMin, fPopupMax,
&bBottom, &fPopupRet);
if (!IsFloatBigger(fPopupRet, 0.0f))
- return;
+ return true;
m_rcOldWindow = CPWL_Wnd::GetWindowRect();
m_bPopup = bPopup;
@@ -423,10 +453,16 @@ void CPWL_ComboBox::SetPopup(bool bPopup) {
else
rcWindow.top += fPopupRet;
- Move(rcWindow, true, true);
+ if (!Move(rcWindow, true, true))
+ return false;
+
#ifdef PDF_ENABLE_XFA
m_pFillerNotify->OnPopupPostOpen(GetAttachedData(), 0);
+ if (!thisObserved)
+ return false;
#endif // PDF_ENABLE_XFA
+
+ return !!thisObserved;
}
bool CPWL_ComboBox::OnKeyDown(uint16_t nChar, uint32_t nFlag) {
@@ -505,8 +541,11 @@ bool CPWL_ComboBox::OnChar(uint16_t nChar, uint32_t nFlag) {
}
void CPWL_ComboBox::NotifyLButtonDown(CPWL_Wnd* child, const CFX_PointF& pos) {
- if (child == m_pButton)
+ if (child == m_pButton) {
SetPopup(!m_bPopup);
+ // Note, |this| may no longer be viable at this point. If more work needs to
+ // be done, check the return value of SetPopup().
+ }
}
void CPWL_ComboBox::NotifyLButtonUp(CPWL_Wnd* child, const CFX_PointF& pos) {
@@ -517,6 +556,8 @@ void CPWL_ComboBox::NotifyLButtonUp(CPWL_Wnd* child, const CFX_PointF& pos) {
SelectAll();
m_pEdit->SetFocus();
SetPopup(false);
+ // Note, |this| may no longer be viable at this point. If more work needs to
+ // be done, check the return value of SetPopup().
}
bool CPWL_ComboBox::IsPopup() const {
diff --git a/fpdfsdk/pwl/cpwl_combo_box.h b/fpdfsdk/pwl/cpwl_combo_box.h
index 20744df169..6db721369b 100644
--- a/fpdfsdk/pwl/cpwl_combo_box.h
+++ b/fpdfsdk/pwl/cpwl_combo_box.h
@@ -56,7 +56,7 @@ class CPWL_ComboBox : public CPWL_Wnd {
void NotifyLButtonDown(CPWL_Wnd* child, const CFX_PointF& pos) override;
void NotifyLButtonUp(CPWL_Wnd* child, const CFX_PointF& pos) override;
void CreateChildWnd(const CreateParams& cp) override;
- void RePosChildWnd() override;
+ bool RePosChildWnd() override;
CFX_FloatRect GetFocusRect() const override;
void SetFocus() override;
void KillFocus() override;
@@ -85,7 +85,9 @@ class CPWL_ComboBox : public CPWL_Wnd {
void CreateEdit(const CreateParams& cp);
void CreateButton(const CreateParams& cp);
void CreateListBox(const CreateParams& cp);
- void SetPopup(bool bPopup);
+
+ // Returns |true| iff this instance is still allocated.
+ bool SetPopup(bool bPopup);
UnownedPtr<CPWL_Edit> m_pEdit;
UnownedPtr<CPWL_CBButton> m_pButton;
diff --git a/fpdfsdk/pwl/cpwl_edit.cpp b/fpdfsdk/pwl/cpwl_edit.cpp
index 662c69e369..650db5438b 100644
--- a/fpdfsdk/pwl/cpwl_edit.cpp
+++ b/fpdfsdk/pwl/cpwl_edit.cpp
@@ -79,13 +79,18 @@ void CPWL_Edit::SetText(const WideString& csText) {
m_pEdit->SetText(swText);
}
-void CPWL_Edit::RePosChildWnd() {
+bool CPWL_Edit::RePosChildWnd() {
if (CPWL_ScrollBar* pVSB = GetVScrollBar()) {
CFX_FloatRect rcWindow = m_rcOldWindow;
CFX_FloatRect rcVScroll =
CFX_FloatRect(rcWindow.right, rcWindow.bottom,
rcWindow.right + PWL_SCROLLBAR_WIDTH, rcWindow.top);
+
+ ObservedPtr thisObserved(this);
+
pVSB->Move(rcVScroll, true, false);
+ if (!thisObserved)
+ return false;
}
if (m_pEditCaret && !HasFlag(PES_TEXTOVERFLOW)) {
@@ -98,7 +103,7 @@ void CPWL_Edit::RePosChildWnd() {
m_pEditCaret->SetClipRect(rect);
}
- CPWL_EditCtrl::RePosChildWnd();
+ return CPWL_EditCtrl::RePosChildWnd();
}
CFX_FloatRect CPWL_Edit::GetClientRect() const {
@@ -290,8 +295,8 @@ bool CPWL_Edit::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) {
CPWL_Wnd::OnLButtonDown(point, nFlag);
if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point)) {
- if (m_bMouseDown)
- InvalidateRect(nullptr);
+ if (m_bMouseDown && !InvalidateRect(nullptr))
+ return true;
m_bMouseDown = true;
SetCapture();
@@ -355,17 +360,15 @@ void CPWL_Edit::OnKillFocus() {
if (!observed_ptr)
return;
- Move(m_rcOldWindow, true, true);
+ if (!Move(m_rcOldWindow, true, true))
+ return;
}
- if (!observed_ptr)
- return;
m_pEdit->SelectNone();
if (!observed_ptr)
return;
- SetCaret(false, CFX_PointF(), CFX_PointF());
- if (!observed_ptr)
+ if (!SetCaret(false, CFX_PointF(), CFX_PointF()))
return;
SetCharSet(FX_CHARSET_ANSI);
diff --git a/fpdfsdk/pwl/cpwl_edit.h b/fpdfsdk/pwl/cpwl_edit.h
index d093f44d84..9c6f5e8da1 100644
--- a/fpdfsdk/pwl/cpwl_edit.h
+++ b/fpdfsdk/pwl/cpwl_edit.h
@@ -49,7 +49,7 @@ class CPWL_Edit : public CPWL_EditCtrl {
// CPWL_EditCtrl
ByteString GetClassName() const override;
void OnCreated() override;
- void RePosChildWnd() override;
+ bool RePosChildWnd() override;
CFX_FloatRect GetClientRect() const override;
void DrawThisAppearance(CFX_RenderDevice* pDevice,
const CFX_Matrix& mtUser2Device) override;
diff --git a/fpdfsdk/pwl/cpwl_edit_ctrl.cpp b/fpdfsdk/pwl/cpwl_edit_ctrl.cpp
index f0fc408771..2fe6e28c59 100644
--- a/fpdfsdk/pwl/cpwl_edit_ctrl.cpp
+++ b/fpdfsdk/pwl/cpwl_edit_ctrl.cpp
@@ -67,8 +67,9 @@ void CPWL_EditCtrl::ReplaceSelection(const WideString& text) {
m_pEdit->InsertText(text, FX_CHARSET_Default);
}
-void CPWL_EditCtrl::RePosChildWnd() {
+bool CPWL_EditCtrl::RePosChildWnd() {
m_pEdit->SetPlateRect(GetClientRect());
+ return true;
}
void CPWL_EditCtrl::SetScrollInfo(const PWL_SCROLL_INFO& info) {
@@ -264,8 +265,8 @@ bool CPWL_EditCtrl::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) {
CPWL_Wnd::OnLButtonDown(point, nFlag);
if (ClientHitTest(point)) {
- if (m_bMouseDown)
- InvalidateRect(nullptr);
+ if (m_bMouseDown && !InvalidateRect(nullptr))
+ return true;
m_bMouseDown = true;
SetCapture();
@@ -307,6 +308,8 @@ void CPWL_EditCtrl::SetEditCaret(bool bVisible) {
GetCaretInfo(&ptHead, &ptFoot);
SetCaret(bVisible, ptHead, ptFoot);
+ // Note, |this| may no longer be viable at this point. If more work needs to
+ // be done, check the return value of SetCaret().
}
void CPWL_EditCtrl::GetCaretInfo(CFX_PointF* ptHead, CFX_PointF* ptFoot) const {
@@ -327,15 +330,21 @@ void CPWL_EditCtrl::GetCaretInfo(CFX_PointF* ptHead, CFX_PointF* ptFoot) const {
}
}
-void CPWL_EditCtrl::SetCaret(bool bVisible,
+bool CPWL_EditCtrl::SetCaret(bool bVisible,
const CFX_PointF& ptHead,
const CFX_PointF& ptFoot) {
- if (m_pEditCaret) {
- if (!IsFocused() || m_pEdit->IsSelected())
- bVisible = false;
+ if (!m_pEditCaret)
+ return true;
- m_pEditCaret->SetCaret(bVisible, ptHead, ptFoot);
- }
+ if (!IsFocused() || m_pEdit->IsSelected())
+ bVisible = false;
+
+ ObservedPtr thisObserved(this);
+ m_pEditCaret->SetCaret(bVisible, ptHead, ptFoot);
+ if (!thisObserved)
+ return false;
+
+ return true;
}
WideString CPWL_EditCtrl::GetText() const {
diff --git a/fpdfsdk/pwl/cpwl_edit_ctrl.h b/fpdfsdk/pwl/cpwl_edit_ctrl.h
index 37ac320d8f..31140e3038 100644
--- a/fpdfsdk/pwl/cpwl_edit_ctrl.h
+++ b/fpdfsdk/pwl/cpwl_edit_ctrl.h
@@ -56,14 +56,14 @@ class CPWL_EditCtrl : public CPWL_Wnd {
void SetScrollPosition(float pos) override;
void ScrollWindowVertically(float pos) override;
void CreateChildWnd(const CreateParams& cp) override;
- void RePosChildWnd() override;
+ bool RePosChildWnd() override;
void SetFontSize(float fFontSize) override;
float GetFontSize() const override;
void SetCursor() override;
WideString GetSelectedText() override;
void ReplaceSelection(const WideString& text) override;
- void SetCaret(bool bVisible,
+ bool SetCaret(bool bVisible,
const CFX_PointF& ptHead,
const CFX_PointF& ptFoot);
diff --git a/fpdfsdk/pwl/cpwl_list_box.cpp b/fpdfsdk/pwl/cpwl_list_box.cpp
index c8f7be995d..a7c02e4692 100644
--- a/fpdfsdk/pwl/cpwl_list_box.cpp
+++ b/fpdfsdk/pwl/cpwl_list_box.cpp
@@ -250,10 +250,12 @@ void CPWL_ListBox::KillFocus() {
CPWL_Wnd::KillFocus();
}
-void CPWL_ListBox::RePosChildWnd() {
- CPWL_Wnd::RePosChildWnd();
+bool CPWL_ListBox::RePosChildWnd() {
+ if (!CPWL_Wnd::RePosChildWnd())
+ return false;
m_pList->SetPlateRect(GetListRect());
+ return true;
}
bool CPWL_ListBox::OnNotifySelectionChanged(bool bKeyDown, uint32_t nFlag) {
diff --git a/fpdfsdk/pwl/cpwl_list_box.h b/fpdfsdk/pwl/cpwl_list_box.h
index fec4d63a0c..7cfdd18e93 100644
--- a/fpdfsdk/pwl/cpwl_list_box.h
+++ b/fpdfsdk/pwl/cpwl_list_box.h
@@ -61,7 +61,7 @@ class CPWL_ListBox : public CPWL_Wnd {
void SetScrollInfo(const PWL_SCROLL_INFO& info) override;
void SetScrollPosition(float pos) override;
void ScrollWindowVertically(float pos) override;
- void RePosChildWnd() override;
+ bool RePosChildWnd() override;
CFX_FloatRect GetFocusRect() const override;
void SetFontSize(float fFontSize) override;
float GetFontSize() const override;
diff --git a/fpdfsdk/pwl/cpwl_scroll_bar.cpp b/fpdfsdk/pwl/cpwl_scroll_bar.cpp
index e50f778943..58a874531f 100644
--- a/fpdfsdk/pwl/cpwl_scroll_bar.cpp
+++ b/fpdfsdk/pwl/cpwl_scroll_bar.cpp
@@ -344,7 +344,7 @@ void CPWL_ScrollBar::OnDestroy() {
CPWL_Wnd::OnDestroy();
}
-void CPWL_ScrollBar::RePosChildWnd() {
+bool CPWL_ScrollBar::RePosChildWnd() {
CFX_FloatRect rcClient = GetClientRect();
CFX_FloatRect rcMinButton, rcMaxButton;
float fBWidth = 0;
@@ -367,7 +367,8 @@ void CPWL_ScrollBar::RePosChildWnd() {
rcMaxButton = CFX_FloatRect(rcClient.right - fBWidth, rcClient.bottom,
rcClient.right, rcClient.top);
} else {
- SetVisible(false);
+ if (!SetVisible(false))
+ return false;
}
}
break;
@@ -389,17 +390,31 @@ void CPWL_ScrollBar::RePosChildWnd() {
CFX_FloatRect(rcClient.left, rcClient.bottom, rcClient.right,
rcClient.bottom + fBWidth);
} else {
- SetVisible(false);
+ if (!SetVisible(false))
+ return false;
}
}
break;
}
- if (m_pMinButton)
+ ObservedPtr thisObserved(this);
+
+ if (m_pMinButton) {
m_pMinButton->Move(rcMinButton, true, false);
- if (m_pMaxButton)
+ if (!thisObserved)
+ return false;
+ }
+
+ if (m_pMaxButton) {
m_pMaxButton->Move(rcMaxButton, true, false);
- MovePosButton(false);
+ if (!thisObserved)
+ return false;
+ }
+
+ if (!MovePosButton(false))
+ return false;
+
+ return true;
}
void CPWL_ScrollBar::DrawThisAppearance(CFX_RenderDevice* pDevice,
@@ -428,7 +443,8 @@ bool CPWL_ScrollBar::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) {
if (HasFlag(PWS_AUTOTRANSPARENT)) {
if (GetTransparency() != 255) {
SetTransparency(255);
- InvalidateRect(nullptr);
+ if (!InvalidateRect(nullptr))
+ return true;
}
}
@@ -459,13 +475,15 @@ bool CPWL_ScrollBar::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) {
if (rcMinArea.Contains(point)) {
m_sData.SubBig();
- MovePosButton(true);
+ if (!MovePosButton(true))
+ return true;
NotifyScrollWindow();
}
if (rcMaxArea.Contains(point)) {
m_sData.AddBig();
- MovePosButton(true);
+ if (!MovePosButton(true))
+ return true;
NotifyScrollWindow();
}
}
@@ -479,7 +497,8 @@ bool CPWL_ScrollBar::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) {
if (HasFlag(PWS_AUTOTRANSPARENT)) {
if (GetTransparency() != PWL_SCROLLBAR_TRANSPARENCY) {
SetTransparency(PWL_SCROLLBAR_TRANSPARENCY);
- InvalidateRect(nullptr);
+ if (!InvalidateRect(nullptr))
+ return true;
}
}
@@ -560,7 +579,10 @@ void CPWL_ScrollBar::CreateButtons(const CreateParams& cp) {
if (!m_pPosButton) {
m_pPosButton = new CPWL_SBButton(m_sbType, PSBT_POS);
- m_pPosButton->SetVisible(false);
+
+ ObservedPtr thisObserved(this);
+ if (!m_pPosButton->SetVisible(false) || !thisObserved)
+ return;
m_pPosButton->Create(scp);
}
}
@@ -575,24 +597,37 @@ float CPWL_ScrollBar::GetScrollBarWidth() const {
void CPWL_ScrollBar::SetScrollRange(float fMin,
float fMax,
float fClientWidth) {
- if (m_pPosButton) {
- m_sData.SetScrollRange(fMin, fMax);
- m_sData.SetClientWidth(fClientWidth);
+ if (!m_pPosButton)
+ return;
- if (IsFloatSmaller(m_sData.ScrollRange.GetWidth(), 0.0f)) {
- m_pPosButton->SetVisible(false);
- } else {
- m_pPosButton->SetVisible(true);
- MovePosButton(true);
- }
+ m_sData.SetScrollRange(fMin, fMax);
+ m_sData.SetClientWidth(fClientWidth);
+
+ ObservedPtr thisObserved(this);
+
+ if (IsFloatSmaller(m_sData.ScrollRange.GetWidth(), 0.0f)) {
+ m_pPosButton->SetVisible(false);
+ // Note, |this| may no longer be viable at this point. If more work needs
+ // to be done, check thisObserved.
+ return;
}
+
+ if (!m_pPosButton->SetVisible(true) || !thisObserved)
+ return;
+
+ MovePosButton(true);
+ // Note, |this| may no longer be viable at this point. If more work needs
+ // to be done, check the return value of MovePosButton().
}
void CPWL_ScrollBar::SetScrollPos(float fPos) {
float fOldPos = m_sData.fScrollPos;
m_sData.SetPos(fPos);
- if (!IsFloatEqual(m_sData.fScrollPos, fOldPos))
+ if (!IsFloatEqual(m_sData.fScrollPos, fOldPos)) {
MovePosButton(true);
+ // Note, |this| may no longer be viable at this point. If more work needs
+ // to be done, check the return value of MovePosButton().
+ }
}
void CPWL_ScrollBar::SetScrollStep(float fBigStep, float fSmallStep) {
@@ -600,7 +635,7 @@ void CPWL_ScrollBar::SetScrollStep(float fBigStep, float fSmallStep) {
m_sData.SetSmallStep(fSmallStep);
}
-void CPWL_ScrollBar::MovePosButton(bool bRefresh) {
+bool CPWL_ScrollBar::MovePosButton(bool bRefresh) {
ASSERT(m_pMinButton);
ASSERT(m_pMaxButton);
@@ -648,13 +683,20 @@ void CPWL_ScrollBar::MovePosButton(bool bRefresh) {
break;
}
+ ObservedPtr thisObserved(this);
+
m_pPosButton->Move(rcPosButton, true, bRefresh);
+ if (!thisObserved)
+ return false;
}
+
+ return true;
}
void CPWL_ScrollBar::OnMinButtonLBDown(const CFX_PointF& point) {
m_sData.SubSmall();
- MovePosButton(true);
+ if (!MovePosButton(true))
+ return;
NotifyScrollWindow();
m_bMinOrMax = true;
@@ -669,7 +711,8 @@ void CPWL_ScrollBar::OnMinButtonMouseMove(const CFX_PointF& point) {}
void CPWL_ScrollBar::OnMaxButtonLBDown(const CFX_PointF& point) {
m_sData.AddSmall();
- MovePosButton(true);
+ if (!MovePosButton(true))
+ return;
NotifyScrollWindow();
m_bMinOrMax = false;
@@ -758,7 +801,8 @@ void CPWL_ScrollBar::OnPosButtonMouseMove(const CFX_PointF& point) {
}
if (!IsFloatEqual(fOldScrollPos, m_sData.fScrollPos)) {
- MovePosButton(true);
+ if (!MovePosButton(true))
+ return;
if (m_bNotifyForever)
NotifyScrollWindow();
@@ -875,7 +919,8 @@ void CPWL_ScrollBar::TimerProc() {
m_sData.AddSmall();
if (sTemp != m_sData) {
- MovePosButton(true);
+ if (!MovePosButton(true))
+ return;
NotifyScrollWindow();
}
}
diff --git a/fpdfsdk/pwl/cpwl_scroll_bar.h b/fpdfsdk/pwl/cpwl_scroll_bar.h
index 1e71e3b90f..69217323ff 100644
--- a/fpdfsdk/pwl/cpwl_scroll_bar.h
+++ b/fpdfsdk/pwl/cpwl_scroll_bar.h
@@ -124,7 +124,7 @@ class CPWL_ScrollBar : public CPWL_Wnd {
ByteString GetClassName() const override;
void OnCreate(CreateParams* pParamsToAdjust) override;
void OnDestroy() override;
- void RePosChildWnd() override;
+ bool RePosChildWnd() override;
void DrawThisAppearance(CFX_RenderDevice* pDevice,
const CFX_Matrix& mtUser2Device) override;
bool OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) override;
@@ -145,7 +145,9 @@ class CPWL_ScrollBar : public CPWL_Wnd {
protected:
void SetScrollRange(float fMin, float fMax, float fClientWidth);
void SetScrollPos(float fPos);
- void MovePosButton(bool bRefresh);
+
+ // Returns |true| iff this instance is still allocated.
+ bool MovePosButton(bool bRefresh);
void SetScrollStep(float fBigStep, float fSmallStep);
void NotifyScrollWindow();
CFX_FloatRect GetScrollArea() const;
diff --git a/fpdfsdk/pwl/cpwl_wnd.cpp b/fpdfsdk/pwl/cpwl_wnd.cpp
index d7eb853c8f..124065cdf9 100644
--- a/fpdfsdk/pwl/cpwl_wnd.cpp
+++ b/fpdfsdk/pwl/cpwl_wnd.cpp
@@ -175,7 +175,9 @@ void CPWL_Wnd::Create(const CreateParams& cp) {
CreateChildWnd(ccp);
m_bVisible = HasFlag(PWS_VISIBLE);
OnCreated();
- RePosChildWnd();
+ if (!RePosChildWnd())
+ return;
+
m_bCreated = true;
}
@@ -201,7 +203,8 @@ void CPWL_Wnd::Destroy() {
if (m_bCreated) {
m_pVScrollBar = nullptr;
for (auto it = m_Children.rbegin(); it != m_Children.rend(); ++it) {
- if (CPWL_Wnd* pChild = *it) {
+ CPWL_Wnd* pChild = *it;
+ if (pChild) {
*it = nullptr;
pChild->Destroy();
delete pChild;
@@ -216,9 +219,9 @@ void CPWL_Wnd::Destroy() {
m_Children.clear();
}
-void CPWL_Wnd::Move(const CFX_FloatRect& rcNew, bool bReset, bool bRefresh) {
+bool CPWL_Wnd::Move(const CFX_FloatRect& rcNew, bool bReset, bool bRefresh) {
if (!IsValid())
- return;
+ return true;
CFX_FloatRect rcOld = GetWindowRect();
m_rcWindow = rcNew;
@@ -227,21 +230,23 @@ void CPWL_Wnd::Move(const CFX_FloatRect& rcNew, bool bReset, bool bRefresh) {
if (bReset) {
if (rcOld.left != rcNew.left || rcOld.right != rcNew.right ||
rcOld.top != rcNew.top || rcOld.bottom != rcNew.bottom) {
- RePosChildWnd();
+ if (!RePosChildWnd())
+ return false;
}
}
- if (bRefresh)
- InvalidateRectMove(rcOld, rcNew);
+ if (bRefresh && !InvalidateRectMove(rcOld, rcNew))
+ return false;
m_CreationParams.rcRectWnd = m_rcWindow;
+ return true;
}
-void CPWL_Wnd::InvalidateRectMove(const CFX_FloatRect& rcOld,
+bool CPWL_Wnd::InvalidateRectMove(const CFX_FloatRect& rcOld,
const CFX_FloatRect& rcNew) {
CFX_FloatRect rcUnion = rcOld;
rcUnion.Union(rcNew);
- InvalidateRect(&rcUnion);
+ return InvalidateRect(&rcUnion);
}
void CPWL_Wnd::DrawAppearance(CFX_RenderDevice* pDevice,
@@ -289,9 +294,10 @@ void CPWL_Wnd::DrawChildAppearance(CFX_RenderDevice* pDevice,
}
}
-void CPWL_Wnd::InvalidateRect(CFX_FloatRect* pRect) {
+bool CPWL_Wnd::InvalidateRect(CFX_FloatRect* pRect) {
+ ObservedPtr thisObserved(this);
if (!IsValid())
- return;
+ return true;
CFX_FloatRect rcRefresh = pRect ? *pRect : GetWindowRect();
@@ -310,8 +316,12 @@ void CPWL_Wnd::InvalidateRect(CFX_FloatRect* pRect) {
if (CPDFSDK_Widget* widget = static_cast<CPDFSDK_Widget*>(
m_CreationParams.pAttachedWidget.Get())) {
pSH->InvalidateRect(widget, rcWin);
+ if (!thisObserved)
+ return false;
}
}
+
+ return true;
}
#define PWL_IMPLEMENT_KEY_METHOD(key_method_name) \
@@ -563,19 +573,29 @@ const CPWL_Wnd* CPWL_Wnd::GetRootWnd() const {
return pParent ? pParent->GetRootWnd() : this;
}
-void CPWL_Wnd::SetVisible(bool bVisible) {
+bool CPWL_Wnd::SetVisible(bool bVisible) {
if (!IsValid())
- return;
+ return true;
+
+ ObservedPtr thisObserved(this);
for (auto* pChild : m_Children) {
- if (pChild)
+ if (pChild) {
pChild->SetVisible(bVisible);
+ if (!thisObserved)
+ return false;
+ }
}
+
if (bVisible != m_bVisible) {
m_bVisible = bVisible;
- RePosChildWnd();
- InvalidateRect(nullptr);
+ if (!RePosChildWnd())
+ return false;
+
+ if (!InvalidateRect(nullptr))
+ return false;
}
+ return true;
}
void CPWL_Wnd::SetClipRect(const CFX_FloatRect& rect) {
@@ -591,10 +611,10 @@ bool CPWL_Wnd::IsReadOnly() const {
return HasFlag(PWS_READONLY);
}
-void CPWL_Wnd::RePosChildWnd() {
+bool CPWL_Wnd::RePosChildWnd() {
CPWL_ScrollBar* pVSB = GetVScrollBar();
if (!pVSB)
- return;
+ return true;
CFX_FloatRect rcContent = GetWindowRect();
if (!rcContent.IsEmpty()) {
@@ -605,7 +625,14 @@ void CPWL_Wnd::RePosChildWnd() {
CFX_FloatRect rcVScroll =
CFX_FloatRect(rcContent.right - PWL_SCROLLBAR_WIDTH, rcContent.bottom,
rcContent.right - 1.0f, rcContent.top);
+
+ ObservedPtr thisObserved(this);
+
pVSB->Move(rcVScroll, true, false);
+ if (!thisObserved)
+ return false;
+
+ return true;
}
void CPWL_Wnd::CreateChildWnd(const CreateParams& cp) {}
diff --git a/fpdfsdk/pwl/cpwl_wnd.h b/fpdfsdk/pwl/cpwl_wnd.h
index c37fa2fff3..38d4ce0918 100644
--- a/fpdfsdk/pwl/cpwl_wnd.h
+++ b/fpdfsdk/pwl/cpwl_wnd.h
@@ -151,7 +151,9 @@ class CPWL_Wnd : public CPWL_TimerHandler, public Observable<CPWL_Wnd> {
~CPWL_Wnd() override;
virtual ByteString GetClassName() const;
- virtual void InvalidateRect(CFX_FloatRect* pRect);
+
+ // Returns |true| iff this instance is still allocated.
+ virtual bool InvalidateRect(CFX_FloatRect* pRect);
virtual bool OnKeyDown(uint16_t nChar, uint32_t nFlag);
virtual bool OnChar(uint16_t nChar, uint32_t nFlag);
@@ -173,7 +175,9 @@ class CPWL_Wnd : public CPWL_TimerHandler, public Observable<CPWL_Wnd> {
virtual void SetFocus();
virtual void KillFocus();
virtual void SetCursor();
- virtual void SetVisible(bool bVisible);
+
+ // Returns |true| iff this instance is still allocated.
+ virtual bool SetVisible(bool bVisible);
virtual void SetFontSize(float fFontSize);
virtual float GetFontSize() const;
@@ -186,7 +190,7 @@ class CPWL_Wnd : public CPWL_TimerHandler, public Observable<CPWL_Wnd> {
void InvalidateProvider(ProviderIface* provider);
void Create(const CreateParams& cp);
void Destroy();
- void Move(const CFX_FloatRect& rcNew, bool bReset, bool bRefresh);
+ bool Move(const CFX_FloatRect& rcNew, bool bReset, bool bRefresh);
void SetCapture();
void ReleaseCapture();
@@ -252,7 +256,9 @@ class CPWL_Wnd : public CPWL_TimerHandler, public Observable<CPWL_Wnd> {
CFX_SystemHandler* GetSystemHandler() const override;
virtual void CreateChildWnd(const CreateParams& cp);
- virtual void RePosChildWnd();
+
+ // Returns |true| iff this instance is still allocated.
+ virtual bool RePosChildWnd();
virtual void DrawThisAppearance(CFX_RenderDevice* pDevice,
const CFX_Matrix& mtUser2Device);
@@ -269,7 +275,8 @@ class CPWL_Wnd : public CPWL_TimerHandler, public Observable<CPWL_Wnd> {
bool IsValid() const { return m_bCreated; }
const CreateParams& GetCreationParams() const { return m_CreationParams; }
- void InvalidateRectMove(const CFX_FloatRect& rcOld,
+ // Returns |true| iff this instance is still allocated.
+ bool InvalidateRectMove(const CFX_FloatRect& rcOld,
const CFX_FloatRect& rcNew);
bool IsWndCaptureMouse(const CPWL_Wnd* pWnd) const;