Index: content/browser/accessibility/browser_accessibility_manager.cc |
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc |
index da8f52def68732333741b3085173d3d794e78315..30099107b3367fd38b4c252f607dfce51932bd38 100644 |
--- a/content/browser/accessibility/browser_accessibility_manager.cc |
+++ b/content/browser/accessibility/browser_accessibility_manager.cc |
@@ -390,24 +390,39 @@ void BrowserAccessibilityManager::OnAccessibilityEvents( |
} |
// Fire any events related to changes to the tree. |
- for (auto& event : tree_events_) { |
- BrowserAccessibility* event_target = GetFromID(event.second); |
+ for (auto& entry : tree_events_) { |
+ BrowserAccessibility* event_target = GetFromID(entry.first); |
if (!event_target) |
continue; |
- NotifyAccessibilityEvent(BrowserAccessibilityEvent::FromTreeChange, |
- event.first, event_target); |
+ std::set<ui::AXEvent>& events = entry.second; |
+ if (events.find(ui::AX_EVENT_LIVE_REGION_CREATED) != events.end() || |
+ events.find(ui::AX_EVENT_ALERT) != events.end()) { |
+ events.erase(ui::AX_EVENT_LIVE_REGION_CHANGED); |
+ } |
+ for (auto event : events) { |
+ NotifyAccessibilityEvent(BrowserAccessibilityEvent::FromTreeChange, event, |
+ event_target); |
+ } |
} |
tree_events_.clear(); |
- // Based on the changes to the tree, first fire focus events if needed. |
+ // Based on the changes to the tree, fire focus events if needed. |
// Screen readers might not do the right thing if they're not aware of what |
// has focus, so always try that first. Nothing will be fired if the window |
// itself isn't focused or if focus hasn't changed. |
GetRootManager()->FireFocusEventsIfNeeded( |
BrowserAccessibilityEvent::FromBlink); |
- // Now iterate over the events from the renderer and fire the events |
- // other than focus events. |
+ // We are in the process of inferring all native events from tree changes. |
+ // Mac OS X no longer needs to iterate over the specific events coming from |
+ // the renderer, all needed events were fired above by iterating over |
+ // tree_events_. |
+ // |
+ // When all platforms have switched to inferring all events, we can delete |
+ // the following code, which iterates over the non-focus events from the |
+ // renderer and fires native events based on them. |
+ // |
+ // See http://crbug.com/699438 for details. |
for (uint32_t index = 0; index < details.size(); index++) { |
const AXEventNotificationDetails& detail = details[index]; |
@@ -418,6 +433,12 @@ void BrowserAccessibilityManager::OnAccessibilityEvents( |
continue; |
ui::AXEvent event_type = detail.event_type; |
+ |
+#if defined(OS_MACOSX) |
+ if (event_type != ui::AX_EVENT_HOVER) |
+ continue; |
+#endif // !defined(OS_MACOSX) |
+ |
if (event_type == ui::AX_EVENT_FOCUS || |
event_type == ui::AX_EVENT_BLUR) { |
if (osk_state_ != OSK_DISALLOWED_BECAUSE_TAB_HIDDEN && |
@@ -1100,8 +1121,10 @@ void BrowserAccessibilityManager::OnNodeDataWillChange( |
const ui::AXNodeData& old_node_data, |
const ui::AXNodeData& new_node_data) {} |
-void BrowserAccessibilityManager::OnTreeDataChanged(ui::AXTree* tree) { |
-} |
+void BrowserAccessibilityManager::OnTreeDataChanged( |
+ ui::AXTree* tree, |
+ const ui::AXTreeData& old_tree_data, |
+ const ui::AXTreeData& new_tree_data) {} |
void BrowserAccessibilityManager::OnNodeWillBeDeleted(ui::AXTree* tree, |
ui::AXNode* node) { |
@@ -1197,10 +1220,9 @@ void BrowserAccessibilityManager::OnAtomicUpdateFinished( |
if (object && object->HasStringAttribute(ui::AX_ATTR_LIVE_STATUS)) { |
int32_t id = object->GetId(); |
if (object->GetRole() == ui::AX_ROLE_ALERT) { |
- tree_events_.push_back(std::make_pair(ui::AX_EVENT_ALERT, id)); |
+ tree_events_[id].insert(ui::AX_EVENT_ALERT); |
} else { |
- tree_events_.push_back( |
- std::make_pair(ui::AX_EVENT_LIVE_REGION_CREATED, id)); |
+ tree_events_[id].insert(ui::AX_EVENT_LIVE_REGION_CREATED); |
} |
} |
} |