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 57989b6b15d3bba9b4eebfdc35a63063b4dbc910..984c9223268d2c549ab70460c7bc1e4b5f132d02 100644 |
--- a/content/browser/accessibility/browser_accessibility_manager_win.cc |
+++ b/content/browser/accessibility/browser_accessibility_manager_win.cc |
@@ -134,6 +134,15 @@ void BrowserAccessibilityManagerWin::NotifyAccessibilityEvent( |
if (node->GetRole() == ui::AX_ROLE_INLINE_TEXT_BOX) |
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->GetBoolAttribute(ui::AX_ATTR_DOC_LOADED)) { |
+ return; |
+ } |
+ |
LONG event_id = EVENT_MIN; |
switch (event_type) { |
case ui::AX_EVENT_ACTIVEDESCENDANTCHANGED: |
@@ -221,6 +230,10 @@ void BrowserAccessibilityManagerWin::NotifyAccessibilityEvent( |
// object and pass it that same id, which we can use to retrieve the |
// IAccessible for this node. |
LONG child_id = node->ToBrowserAccessibilityWin()->unique_id_win(); |
+ |
+ // Always send a focus before a load complete. |
+ if (event_type == ui::AX_EVENT_LOAD_COMPLETE) |
+ MaybeCallNotifyWinEvent(EVENT_OBJECT_FOCUS, child_id); |
MaybeCallNotifyWinEvent(event_id, child_id); |
} |