Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(402)

Unified Diff: content/browser/accessibility/browser_accessibility_manager.cc

Issue 2917363002: Automatically fire AX events on Mac based on tree changes (Closed)
Patch Set: Fix accidental shadowing of BrowserAccessibilityManager::OnAtomicUpdateFinished, caught by browser … Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
}
}
}

Powered by Google App Engine
This is Rietveld 408576698