| Index: content/browser/accessibility/browser_accessibility_manager_win.cc
|
| diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc
|
| index 7c2165cbdef2193f6534f795a494599edf4873a7..0b9c3d58cc3737f466a25ecb355febbf01073453 100644
|
| --- a/content/browser/accessibility/browser_accessibility_manager_win.cc
|
| +++ b/content/browser/accessibility/browser_accessibility_manager_win.cc
|
| @@ -38,9 +38,7 @@ BrowserAccessibilityManagerWin::BrowserAccessibilityManagerWin(
|
| BrowserAccessibilityDelegate* delegate,
|
| BrowserAccessibilityFactory* factory)
|
| : BrowserAccessibilityManager(delegate, factory),
|
| - tracked_scroll_object_(NULL),
|
| - focus_event_on_root_needed_(false),
|
| - inside_on_window_focused_(false) {
|
| + tracked_scroll_object_(NULL) {
|
| ui::win::CreateATLModuleIfNeeded();
|
| Initialize(initial_tree);
|
| ui::GetIAccessible2UsageObserverList().AddObserver(this);
|
| @@ -119,32 +117,6 @@ void BrowserAccessibilityManagerWin::MaybeCallNotifyWinEvent(
|
| if (event == EVENT_OBJECT_REORDER && node->PlatformIsLeaf())
|
| return;
|
|
|
| - // Don't fire focus, or load complete notifications if the
|
| - // window isn't focused, because that can confuse screen readers into
|
| - // entering their "browse" mode.
|
| - if ((event == EVENT_OBJECT_FOCUS ||
|
| - event == IA2_EVENT_DOCUMENT_LOAD_COMPLETE) &&
|
| - !NativeViewHasFocus()) {
|
| - return;
|
| - }
|
| -
|
| - // NVDA gets confused if we focus the main document element when it hasn't
|
| - // finished loading and it has no children at all, so suppress that event.
|
| - if (event == EVENT_OBJECT_FOCUS &&
|
| - node == GetRoot() &&
|
| - node->PlatformChildCount() == 0 &&
|
| - !node->HasState(ui::AX_STATE_BUSY) &&
|
| - !node->manager()->GetTreeData().loaded) {
|
| - return;
|
| - }
|
| -
|
| - // If a focus event is needed on the root, fire that first before
|
| - // this event.
|
| - if (event == EVENT_OBJECT_FOCUS && node == GetRoot())
|
| - focus_event_on_root_needed_ = false;
|
| - else if (focus_event_on_root_needed_)
|
| - OnWindowFocused();
|
| -
|
| // Pass the negation of this node's unique id in the |child_id|
|
| // argument to NotifyWinEvent; the AT client will then call get_accChild
|
| // on the HWND's accessibility object and pass it that same id, which
|
| @@ -157,34 +129,6 @@ void BrowserAccessibilityManagerWin::OnIAccessible2Used() {
|
| BrowserAccessibilityStateImpl::GetInstance()->OnScreenReaderDetected();
|
| }
|
|
|
| -void BrowserAccessibilityManagerWin::OnWindowFocused() {
|
| - // Make sure we don't call this recursively.
|
| - if (inside_on_window_focused_)
|
| - return;
|
| - inside_on_window_focused_ = true;
|
| -
|
| - // This is called either when this web frame gets focused, or when
|
| - // the root of the accessibility tree changes. In both cases, we need
|
| - // to fire a focus event on the root and then on the focused element
|
| - // within the page, if different.
|
| -
|
| - // Set this flag so that we'll keep trying to fire these focus events
|
| - // if they're not successful this time.
|
| - focus_event_on_root_needed_ = true;
|
| -
|
| - if (!NativeViewHasFocus()) {
|
| - inside_on_window_focused_ = false;
|
| - return;
|
| - }
|
| -
|
| - // Try to fire a focus event on the root first and then the focused node.
|
| - // This will clear focus_event_on_root_needed_ if successful.
|
| - if (GetFocus() != GetRoot() && GetRoot())
|
| - NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, GetRoot());
|
| - BrowserAccessibilityManager::OnWindowFocused();
|
| - inside_on_window_focused_ = false;
|
| -}
|
| -
|
| void BrowserAccessibilityManagerWin::UserIsReloading() {
|
| if (GetRoot())
|
| MaybeCallNotifyWinEvent(IA2_EVENT_DOCUMENT_RELOAD, GetRoot());
|
| @@ -219,23 +163,6 @@ void BrowserAccessibilityManagerWin::NotifyAccessibilityEvent(
|
| return;
|
| }
|
|
|
| - // NVDA gets confused if we focus the main document element when it hasn't
|
| - // finished loading and it has no children at all, so suppress that event.
|
| - if (event_type == ui::AX_EVENT_FOCUS &&
|
| - node == GetRoot() &&
|
| - node->PlatformChildCount() == 0 &&
|
| - !node->HasState(ui::AX_STATE_BUSY) &&
|
| - !node->manager()->GetTreeData().loaded) {
|
| - return;
|
| - }
|
| -
|
| - // If a focus event is needed on the root, fire that first before
|
| - // this event.
|
| - if (event_type == ui::AX_EVENT_FOCUS && node == GetRoot())
|
| - focus_event_on_root_needed_ = false;
|
| - else if (focus_event_on_root_needed_)
|
| - OnWindowFocused();
|
| -
|
| LONG event_id = EVENT_MIN;
|
| switch (event_type) {
|
| case ui::AX_EVENT_ACTIVEDESCENDANTCHANGED:
|
| @@ -310,6 +237,26 @@ void BrowserAccessibilityManagerWin::NotifyAccessibilityEvent(
|
| }
|
| }
|
|
|
| +bool BrowserAccessibilityManagerWin::CanFireEvents() {
|
| + BrowserAccessibilityDelegate* root_delegate = GetDelegateFromRootManager();
|
| + if (!root_delegate)
|
| + return false;
|
| + HWND hwnd = root_delegate->AccessibilityGetAcceleratedWidget();
|
| + return hwnd != nullptr;
|
| +}
|
| +
|
| +void BrowserAccessibilityManagerWin::FireFocusEvent(
|
| + BrowserAccessibility* node) {
|
| + // On Windows, we always fire a FOCUS event on the root of a frame before
|
| + // firing a focus event within that frame.
|
| + if (node->manager() != last_focused_manager_ &&
|
| + node != node->manager()->GetRoot()) {
|
| + NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, node->manager()->GetRoot());
|
| + }
|
| +
|
| + BrowserAccessibilityManager::FireFocusEvent(node);
|
| +}
|
| +
|
| void BrowserAccessibilityManagerWin::OnNodeCreated(ui::AXTree* tree,
|
| ui::AXNode* node) {
|
| DCHECK(node);
|
|
|