diff options
author | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-13 06:57:49 +0000 |
---|---|---|
committer | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-13 06:57:49 +0000 |
commit | 9dc9d50342bd25ca4e997daf6d056b52dde54234 (patch) | |
tree | e946d01a621f1e39c908c2cf9d4fb32ff710e68b /content/browser/accessibility/browser_accessibility_manager_win.cc | |
parent | c8e9a870ed09c724c29009396b6e9eb4ec28553a (diff) | |
download | chromium_src-9dc9d50342bd25ca4e997daf6d056b52dde54234.zip chromium_src-9dc9d50342bd25ca4e997daf6d056b52dde54234.tar.gz chromium_src-9dc9d50342bd25ca4e997daf6d056b52dde54234.tar.bz2 |
Fix race in BrowserAccessibilityManagerWin creation.
Previously, BrowserAccessibilityManagerWin needed its parent
HWND and parent IAccessible upon construction, and if RWHVA
didn't have those, it didn't create the BAMW. This resulted
in at least two races:
* If an accessibility tree update came from the renderer
but the BAMW wasn't created because the window wasn't available,
the tree update would get discarded - possibly leading to an
assertion failure / renderer crash later on the next update
from being out of sync.
* If we tried to create the BAMW before the LegacyRWHH existed,
we would fall through and create a BAM instead of a BAMW,
making that whole tab inaccessible.
To fix both issues, we always create a BAMW when needed, and
we update the BAMW with the LegacyRWHH as soon as it's
available.
BUG=372478,379019
NOTRY=true
Review URL: https://codereview.chromium.org/329053004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@276950 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.cc | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc index 9aa5d4a..974b033 100644 --- a/content/browser/accessibility/browser_accessibility_manager_win.cc +++ b/content/browser/accessibility/browser_accessibility_manager_win.cc @@ -37,12 +37,14 @@ BrowserAccessibilityManagerWin::BrowserAccessibilityManagerWin( BrowserAccessibilityDelegate* delegate, BrowserAccessibilityFactory* factory) : BrowserAccessibilityManager(initial_tree, delegate, factory), - parent_hwnd_(accessible_hwnd->GetParent()), parent_iaccessible_(parent_iaccessible), tracked_scroll_object_(NULL), accessible_hwnd_(accessible_hwnd) { ui::win::CreateATLModuleIfNeeded(); - accessible_hwnd_->set_browser_accessibility_manager(this); + if (accessible_hwnd_) { + accessible_hwnd_->set_browser_accessibility_manager(this); + parent_hwnd_ = accessible_hwnd->GetParent(); + } } BrowserAccessibilityManagerWin::~BrowserAccessibilityManagerWin() { @@ -69,10 +71,17 @@ ui::AXTreeUpdate BrowserAccessibilityManagerWin::GetEmptyDocument() { return update; } +void BrowserAccessibilityManagerWin::SetAccessibleHWND( + LegacyRenderWidgetHostHWND* accessible_hwnd) { + accessible_hwnd_ = accessible_hwnd; + accessible_hwnd_->set_browser_accessibility_manager(this); + parent_hwnd_ = accessible_hwnd->GetParent(); +} + void BrowserAccessibilityManagerWin::MaybeCallNotifyWinEvent(DWORD event, LONG child_id) { // Don't fire events if this view isn't hooked up to its parent. - if (!parent_iaccessible()) + if (!parent_iaccessible() || !parent_hwnd()) return; // If on Win 7 and complete accessibility is enabled, use the fake child HWND |