summaryrefslogtreecommitdiff
path: root/fpdfsdk/pwl/cpwl_wnd.cpp
diff options
context:
space:
mode:
authorDan Sinclair <dsinclair@chromium.org>2017-09-19 13:46:08 -0400
committerChromium commit bot <commit-bot@chromium.org>2017-09-19 17:57:30 +0000
commit6f960347f8474a202d8dd99063bf8ce584896baf (patch)
treebddfcc4e3cfe629d769807965cbf28145f874f4f /fpdfsdk/pwl/cpwl_wnd.cpp
parent2d510f7dc4d6c30cdecef09c5e68c47e98de6ffb (diff)
downloadpdfium-6f960347f8474a202d8dd99063bf8ce584896baf.tar.xz
Setting focus on a widget may destroy the widget
When a widget has focus set, this can trigger an Invalidation call which can trigger a page and annotation reload. This reload can destroy the current widget we're handling. This CL adds ObservedPtrs as needed so we can make sure the widgets are still alive after we've done the Invalidation. Bug: chromium:765921 Change-Id: I51cd24aa1ebd96abe9478efef5130a4e568dac1a Reviewed-on: https://pdfium-review.googlesource.com/14290 Commit-Queue: dsinclair <dsinclair@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org>
Diffstat (limited to 'fpdfsdk/pwl/cpwl_wnd.cpp')
-rw-r--r--fpdfsdk/pwl/cpwl_wnd.cpp20
1 files changed, 11 insertions, 9 deletions
diff --git a/fpdfsdk/pwl/cpwl_wnd.cpp b/fpdfsdk/pwl/cpwl_wnd.cpp
index 1c1512e296..4e4abd2017 100644
--- a/fpdfsdk/pwl/cpwl_wnd.cpp
+++ b/fpdfsdk/pwl/cpwl_wnd.cpp
@@ -86,19 +86,21 @@ class CPWL_MsgControl : public CFX_Observable<CPWL_MsgControl> {
void SetFocus(CPWL_Wnd* pWnd) {
m_aKeyboardPath.clear();
- if (pWnd) {
- m_pMainKeyboardWnd = pWnd;
- CPWL_Wnd* pParent = pWnd;
- while (pParent) {
- m_aKeyboardPath.push_back(pParent);
- pParent = pParent->GetParentWindow();
- }
- pWnd->OnSetFocus();
+ if (!pWnd)
+ return;
+
+ m_pMainKeyboardWnd = pWnd;
+ CPWL_Wnd* pParent = pWnd;
+ while (pParent) {
+ m_aKeyboardPath.push_back(pParent);
+ pParent = pParent->GetParentWindow();
}
+ // Note, pWnd may get destroyed in the OnSetFocus call.
+ pWnd->OnSetFocus();
}
void KillFocus() {
- ObservedPtr observed_ptr = ObservedPtr(this);
+ ObservedPtr observed_ptr(this);
if (!m_aKeyboardPath.empty())
if (CPWL_Wnd* pWnd = m_aKeyboardPath[0])
pWnd->OnKillFocus();