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

Unified Diff: content/browser/accessibility/browser_accessibility_manager_mac.mm

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_mac.mm
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm b/content/browser/accessibility/browser_accessibility_manager_mac.mm
index 11ffb68ecca297d1152e3ff07adf06562f548361..c71ffbe2b2120b9688d9efffa53e215141b5696c 100644
--- a/content/browser/accessibility/browser_accessibility_manager_mac.mm
+++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm
@@ -362,6 +362,26 @@ void BrowserAccessibilityManagerMac::OnAccessibilityEvents(
BrowserAccessibilityManager::OnAccessibilityEvents(details);
}
+void BrowserAccessibilityManagerMac::OnTreeDataChanged(
+ ui::AXTree* tree,
+ const ui::AXTreeData& old_tree_data,
+ const ui::AXTreeData& new_tree_data) {
+ BrowserAccessibilityManager::OnTreeDataChanged(tree, old_tree_data,
+ new_tree_data);
+ if (new_tree_data.loaded && !old_tree_data.loaded)
+ tree_events_[tree->root()->id()].insert(ui::AX_EVENT_LOAD_COMPLETE);
+ if (new_tree_data.sel_anchor_object_id !=
+ old_tree_data.sel_anchor_object_id ||
+ new_tree_data.sel_anchor_offset != old_tree_data.sel_anchor_offset ||
+ new_tree_data.sel_anchor_affinity != old_tree_data.sel_anchor_affinity ||
+ new_tree_data.sel_focus_object_id != old_tree_data.sel_focus_object_id ||
+ new_tree_data.sel_focus_offset != old_tree_data.sel_focus_offset ||
+ new_tree_data.sel_focus_affinity != old_tree_data.sel_focus_affinity) {
+ tree_events_[tree->root()->id()].insert(
+ ui::AX_EVENT_DOCUMENT_SELECTION_CHANGED);
+ }
+}
+
void BrowserAccessibilityManagerMac::OnNodeDataWillChange(
ui::AXTree* tree,
const ui::AXNodeData& old_node_data,
@@ -411,6 +431,154 @@ void BrowserAccessibilityManagerMac::OnNodeDataWillChange(
}
}
+bool IsContainerWithSelectableChildrenRole(ui::AXRole role) {
+ switch (role) {
+ case ui::AX_ROLE_COMBO_BOX:
+ case ui::AX_ROLE_GRID:
+ case ui::AX_ROLE_LIST_BOX:
+ case ui::AX_ROLE_MENU:
+ case ui::AX_ROLE_MENU_BAR:
+ case ui::AX_ROLE_RADIO_GROUP:
+ case ui::AX_ROLE_TAB_LIST:
+ case ui::AX_ROLE_TOOLBAR:
+ case ui::AX_ROLE_TREE:
+ case ui::AX_ROLE_TREE_GRID:
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool IsRowContainer(ui::AXRole role) {
+ switch (role) {
+ case ui::AX_ROLE_TREE:
+ case ui::AX_ROLE_TREE_GRID:
+ case ui::AX_ROLE_GRID:
+ case ui::AX_ROLE_TABLE:
+ return true;
+ default:
+ return false;
+ }
+}
+
+void BrowserAccessibilityManagerMac::OnStateChanged(ui::AXTree* tree,
+ ui::AXNode* node,
+ ui::AXState state,
+ bool new_value) {
+ BrowserAccessibilityManager::OnStateChanged(tree, node, state, new_value);
+ if (state == ui::AX_STATE_EXPANDED) {
+ if (node->data().role == ui::AX_ROLE_ROW ||
+ node->data().role == ui::AX_ROLE_TREE_ITEM) {
+ if (new_value)
+ tree_events_[node->id()].insert(ui::AX_EVENT_ROW_EXPANDED);
+ else
+ tree_events_[node->id()].insert(ui::AX_EVENT_ROW_COLLAPSED);
+ ui::AXNode* container = node;
+ while (container && !IsRowContainer(container->data().role))
+ container = container->parent();
+ if (container)
+ tree_events_[container->id()].insert(ui::AX_EVENT_ROW_COUNT_CHANGED);
+ } else {
+ tree_events_[node->id()].insert(ui::AX_EVENT_EXPANDED_CHANGED);
+ }
+ }
+ if (state == ui::AX_STATE_SELECTED) {
+ ui::AXNode* container = node;
+ while (container &&
+ !IsContainerWithSelectableChildrenRole(container->data().role))
+ container = container->parent();
+ if (container)
+ tree_events_[container->id()].insert(
+ ui::AX_EVENT_SELECTED_CHILDREN_CHANGED);
+ }
+}
+
+void BrowserAccessibilityManagerMac::OnStringAttributeChanged(
+ ui::AXTree* tree,
+ ui::AXNode* node,
+ ui::AXStringAttribute attr,
+ const std::string& old_value,
+ const std::string& new_value) {
+ BrowserAccessibilityManager::OnStringAttributeChanged(tree, node, attr,
+ old_value, new_value);
+ switch (attr) {
+ case ui::AX_ATTR_VALUE:
+ tree_events_[node->id()].insert(ui::AX_EVENT_VALUE_CHANGED);
+ break;
+ case ui::AX_ATTR_ARIA_INVALID_VALUE:
+ tree_events_[node->id()].insert(ui::AX_EVENT_INVALID_STATUS_CHANGED);
+ break;
+ case ui::AX_ATTR_LIVE_STATUS:
+ tree_events_[node->id()].insert(ui::AX_EVENT_LIVE_REGION_CREATED);
+ break;
+ default:
+ break;
+ }
+}
+
+void BrowserAccessibilityManagerMac::OnIntAttributeChanged(
+ ui::AXTree* tree,
+ ui::AXNode* node,
+ ui::AXIntAttribute attr,
+ int32_t old_value,
+ int32_t new_value) {
+ BrowserAccessibilityManager::OnIntAttributeChanged(tree, node, attr,
+ old_value, new_value);
+ switch (attr) {
+ case ui::AX_ATTR_CHECKED_STATE:
+ tree_events_[node->id()].insert(ui::AX_EVENT_VALUE_CHANGED);
+ break;
+ case ui::AX_ATTR_ACTIVEDESCENDANT_ID:
+ tree_events_[node->id()].insert(ui::AX_EVENT_ACTIVEDESCENDANTCHANGED);
+ break;
+ case ui::AX_ATTR_INVALID_STATE:
+ tree_events_[node->id()].insert(ui::AX_EVENT_INVALID_STATUS_CHANGED);
+ break;
+ default:
+ break;
+ }
+}
+
+void BrowserAccessibilityManagerMac::OnFloatAttributeChanged(
+ ui::AXTree* tree,
+ ui::AXNode* node,
+ ui::AXFloatAttribute attr,
+ float old_value,
+ float new_value) {
+ BrowserAccessibilityManager::OnFloatAttributeChanged(tree, node, attr,
+ old_value, new_value);
+ if (attr == ui::AX_ATTR_VALUE_FOR_RANGE)
+ tree_events_[node->id()].insert(ui::AX_EVENT_VALUE_CHANGED);
+}
+
+void BrowserAccessibilityManagerMac::OnAtomicUpdateFinished(
+ ui::AXTree* tree,
+ bool root_changed,
+ const std::vector<Change>& changes) {
+ BrowserAccessibilityManager::OnAtomicUpdateFinished(tree, root_changed,
+ changes);
+ for (const auto& change : changes) {
+ if ((change.type == NODE_CREATED || change.type == SUBTREE_CREATED) &&
+ change.node->data().HasStringAttribute(ui::AX_ATTR_LIVE_STATUS)) {
+ if (change.node->data().role == ui::AX_ROLE_ALERT)
+ tree_events_[change.node->id()].insert(ui::AX_EVENT_ALERT);
+ else
+ tree_events_[change.node->id()].insert(
+ ui::AX_EVENT_LIVE_REGION_CREATED);
+ continue;
+ }
+ if (change.node->data().HasStringAttribute(
+ ui::AX_ATTR_CONTAINER_LIVE_STATUS)) {
+ ui::AXNode* live_root = change.node;
+ while (live_root &&
+ !live_root->data().HasStringAttribute(ui::AX_ATTR_LIVE_STATUS))
+ live_root = live_root->parent();
+ if (live_root)
+ tree_events_[live_root->id()].insert(ui::AX_EVENT_LIVE_REGION_CHANGED);
+ }
+ }
+}
+
NSDictionary* BrowserAccessibilityManagerMac::
GetUserInfoForSelectedTextChangedNotification() {
NSMutableDictionary* user_info = [[[NSMutableDictionary alloc] init]

Powered by Google App Engine
This is Rietveld 408576698