summaryrefslogtreecommitdiffstats
path: root/content/browser/accessibility/browser_accessibility_manager_win.cc
diff options
context:
space:
mode:
authordmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-13 00:51:13 +0000
committerdmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-13 00:51:13 +0000
commit6f881d754034d3bc3225a62a22ad6f260bf5f62e (patch)
tree58f8c8a9538b216c9d480714fc272058a5418a22 /content/browser/accessibility/browser_accessibility_manager_win.cc
parent1faaa4e0fdc8d21cb19b759093fbc702897f6157 (diff)
downloadchromium_src-6f881d754034d3bc3225a62a22ad6f260bf5f62e.zip
chromium_src-6f881d754034d3bc3225a62a22ad6f260bf5f62e.tar.gz
chromium_src-6f881d754034d3bc3225a62a22ad6f260bf5f62e.tar.bz2
Fix case where BrowserAccessibilityManagerWin is deleted before AccessibleHWND
Also adds a unit test and enables unit tests that should have been running on Aura previously. BUG=327354 TBR=jam Review URL: https://codereview.chromium.org/103243004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@240502 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/accessibility/browser_accessibility_manager_win.cc')
-rw-r--r--content/browser/accessibility/browser_accessibility_manager_win.cc18
1 files changed, 16 insertions, 2 deletions
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc
index d4dbe6d..4e5f8dc 100644
--- a/content/browser/accessibility/browser_accessibility_manager_win.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_win.cc
@@ -64,9 +64,14 @@ class AccessibleHWND
IAccessible* window_accessible() { return window_accessible_; }
+ void OnManagerDeleted() {
+ manager_ = NULL;
+ }
+
protected:
virtual void OnFinalMessage(HWND hwnd) OVERRIDE {
- manager_->OnAccessibleHwndDeleted();
+ if (manager_)
+ manager_->OnAccessibleHwndDeleted();
delete this;
}
@@ -74,7 +79,7 @@ class AccessibleHWND
LRESULT OnGetObject(UINT message,
WPARAM w_param,
LPARAM l_param) {
- if (OBJID_CLIENT != l_param)
+ if (OBJID_CLIENT != l_param || !manager_)
return static_cast<LRESULT>(0L);
base::win::ScopedComPtr<IAccessible> root(
@@ -124,6 +129,8 @@ BrowserAccessibilityManagerWin::~BrowserAccessibilityManagerWin() {
tracked_scroll_object_->Release();
tracked_scroll_object_ = NULL;
}
+ if (accessible_hwnd_)
+ accessible_hwnd_->OnManagerDeleted();
}
// static
@@ -305,7 +312,14 @@ BrowserAccessibilityWin* BrowserAccessibilityManagerWin::GetFromUniqueIdWin(
}
void BrowserAccessibilityManagerWin::OnAccessibleHwndDeleted() {
+ // If the AccessibleHWND is deleted, |parent_hwnd_| and
+ // |parent_iaccessible_| are no longer valid either, since they were
+ // derived from AccessibleHWND. We don't have to restore them to
+ // previous values, though, because this should only happen
+ // during the destruct sequence for this window.
accessible_hwnd_ = NULL;
+ parent_hwnd_ = NULL;
+ parent_iaccessible_ = NULL;
}
} // namespace content