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

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

Issue 7745035: Add a big grab bag of missing web accessibility functionality... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 4 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
===================================================================
--- content/browser/accessibility/browser_accessibility_manager.cc (revision 98956)
+++ content/browser/accessibility/browser_accessibility_manager.cc (working copy)
@@ -61,7 +61,7 @@
delegate_(delegate),
factory_(factory),
focus_(NULL) {
- root_ = CreateAccessibilityTree(NULL, src, 0);
+ root_ = CreateAccessibilityTree(NULL, src, 0, false);
if (!focus_)
SetFocus(root_, false);
}
@@ -131,61 +131,61 @@
const ViewHostMsg_AccessibilityNotification_Params& param = params[index];
switch (param.notification_type) {
- case ViewHostMsg_AccessibilityNotification_Type::
- NOTIFICATION_TYPE_CHECK_STATE_CHANGED:
- OnAccessibilityObjectStateChange(param.acc_obj);
+ // Notifications where children are included.
+ case ViewHostMsg_AccEvent::CHILDREN_CHANGED:
+ case ViewHostMsg_AccEvent::LIVE_REGION_CHANGED:
+ OnSimpleAccessibilityNotification(
+ param.acc_obj, param.notification_type, true);
break;
- case ViewHostMsg_AccessibilityNotification_Type::
- NOTIFICATION_TYPE_CHILDREN_CHANGED:
- OnAccessibilityObjectChildrenChange(param.acc_obj);
- break;
- case ViewHostMsg_AccessibilityNotification_Type::
- NOTIFICATION_TYPE_FOCUS_CHANGED:
+
+ case ViewHostMsg_AccEvent::FOCUS_CHANGED:
OnAccessibilityObjectFocusChange(param.acc_obj);
break;
- case ViewHostMsg_AccessibilityNotification_Type::
- NOTIFICATION_TYPE_LOAD_COMPLETE:
+
+ case ViewHostMsg_AccEvent::LOAD_COMPLETE:
OnAccessibilityObjectLoadComplete(param.acc_obj);
break;
- case ViewHostMsg_AccessibilityNotification_Type::
- NOTIFICATION_TYPE_VALUE_CHANGED:
- OnAccessibilityObjectValueChange(param.acc_obj);
+
+ // All other notifications: the node is updated, but
+ // children are not included.
+ case ViewHostMsg_AccEvent::ACTIVE_DESCENDANT_CHANGED:
+ case ViewHostMsg_AccEvent::ALERT:
+ case ViewHostMsg_AccEvent::CHECK_STATE_CHANGED:
+ case ViewHostMsg_AccEvent::LAYOUT_COMPLETE:
+ case ViewHostMsg_AccEvent::MENU_LIST_VALUE_CHANGED:
+ case ViewHostMsg_AccEvent::OBJECT_HIDE:
+ case ViewHostMsg_AccEvent::OBJECT_SHOW:
+ case ViewHostMsg_AccEvent::ROW_COLLAPSED:
+ case ViewHostMsg_AccEvent::ROW_COUNT_CHANGED:
+ case ViewHostMsg_AccEvent::ROW_EXPANDED:
+ case ViewHostMsg_AccEvent::SCROLLED_TO_ANCHOR:
+ case ViewHostMsg_AccEvent::SELECTED_CHILDREN_CHANGED:
+ case ViewHostMsg_AccEvent::SELECTED_TEXT_CHANGED:
+ case ViewHostMsg_AccEvent::TEXT_INSERTED:
+ case ViewHostMsg_AccEvent::TEXT_REMOVED:
+ case ViewHostMsg_AccEvent::VALUE_CHANGED:
+ OnSimpleAccessibilityNotification(
+ param.acc_obj, param.notification_type, false);
break;
- case ViewHostMsg_AccessibilityNotification_Type::
- NOTIFICATION_TYPE_SELECTED_TEXT_CHANGED:
- OnAccessibilityObjectTextChange(param.acc_obj);
- break;
+
default:
DCHECK(0);
- break;
}
}
}
-void BrowserAccessibilityManager::OnAccessibilityObjectStateChange(
- const WebAccessibility& acc_obj) {
- BrowserAccessibility* new_browser_acc = UpdateNode(acc_obj, false);
+void BrowserAccessibilityManager::OnSimpleAccessibilityNotification(
+ const WebAccessibility& acc_obj,
+ int notification_type,
+ bool include_children) {
+ BrowserAccessibility* new_browser_acc =
+ UpdateNode(acc_obj, include_children);
if (!new_browser_acc)
return;
- NotifyAccessibilityEvent(
- ViewHostMsg_AccessibilityNotification_Type::
- NOTIFICATION_TYPE_CHECK_STATE_CHANGED,
- new_browser_acc);
+ NotifyAccessibilityEvent(notification_type, new_browser_acc);
}
-void BrowserAccessibilityManager::OnAccessibilityObjectChildrenChange(
- const WebAccessibility& acc_obj) {
- BrowserAccessibility* new_browser_acc = UpdateNode(acc_obj, true);
- if (!new_browser_acc)
- return;
-
- NotifyAccessibilityEvent(
- ViewHostMsg_AccessibilityNotification_Type::
- NOTIFICATION_TYPE_CHILDREN_CHANGED,
- new_browser_acc);
-}
-
void BrowserAccessibilityManager::OnAccessibilityObjectFocusChange(
const WebAccessibility& acc_obj) {
BrowserAccessibility* new_browser_acc = UpdateNode(acc_obj, false);
@@ -197,10 +197,7 @@
GotFocus();
} else if (!delegate_) {
// Mac currently does not have a BrowserAccessibilityDelegate.
- NotifyAccessibilityEvent(
- ViewHostMsg_AccessibilityNotification_Type::
- NOTIFICATION_TYPE_FOCUS_CHANGED,
- focus_);
+ NotifyAccessibilityEvent(ViewHostMsg_AccEvent::FOCUS_CHANGED, focus_);
}
}
@@ -212,47 +209,17 @@
if (!focus_)
SetFocus(root_, false);
- NotifyAccessibilityEvent(
- ViewHostMsg_AccessibilityNotification_Type::
- NOTIFICATION_TYPE_LOAD_COMPLETE,
- root_);
+ NotifyAccessibilityEvent(ViewHostMsg_AccEvent::LOAD_COMPLETE, root_);
if (delegate_ && delegate_->HasFocus())
GotFocus();
}
-void BrowserAccessibilityManager::OnAccessibilityObjectValueChange(
- const WebAccessibility& acc_obj) {
- BrowserAccessibility* new_browser_acc = UpdateNode(acc_obj, false);
- if (!new_browser_acc)
- return;
-
- NotifyAccessibilityEvent(
- ViewHostMsg_AccessibilityNotification_Type::
- NOTIFICATION_TYPE_VALUE_CHANGED,
- new_browser_acc);
-}
-
-void BrowserAccessibilityManager::OnAccessibilityObjectTextChange(
- const WebAccessibility& acc_obj) {
- BrowserAccessibility* new_browser_acc = UpdateNode(acc_obj, false);
- if (!new_browser_acc)
- return;
-
- NotifyAccessibilityEvent(
- ViewHostMsg_AccessibilityNotification_Type::
- NOTIFICATION_TYPE_SELECTED_TEXT_CHANGED,
- new_browser_acc);
-}
-
void BrowserAccessibilityManager::GotFocus() {
// TODO(ctguil): Remove when tree update logic handles focus changes.
if (!focus_)
return;
- NotifyAccessibilityEvent(
- ViewHostMsg_AccessibilityNotification_Type::
- NOTIFICATION_TYPE_FOCUS_CHANGED,
- focus_);
+ NotifyAccessibilityEvent(ViewHostMsg_AccEvent::FOCUS_CHANGED, focus_);
}
gfx::NativeView BrowserAccessibilityManager::GetParentView() {
@@ -314,6 +281,7 @@
current->child_id(),
current->index_in_parent(),
src);
+ current->SendNodeUpdateEvents();
return current;
}
@@ -327,8 +295,8 @@
// Build a new tree, reusing old nodes if possible. Each node that's
// reused will have its reference count incremented by one.
- current =
- CreateAccessibilityTree(current_parent, src, current_index_in_parent);
+ current = CreateAccessibilityTree(
+ current_parent, src, current_index_in_parent, true);
// Decrement the reference count of all nodes in the old tree, which will
// delete any nodes no longer needed.
@@ -344,9 +312,11 @@
BrowserAccessibility* BrowserAccessibilityManager::CreateAccessibilityTree(
BrowserAccessibility* parent,
const WebAccessibility& src,
- int index_in_parent) {
+ int index_in_parent,
+ bool send_show_events) {
BrowserAccessibility* instance = NULL;
int32 child_id = 0;
+ bool children_can_send_show_events = send_show_events;
base::hash_map<int32, int32>::iterator iter =
renderer_id_to_child_id_map_.find(src.id);
@@ -375,10 +345,12 @@
// reference count.
instance->UpdateParent(parent, index_in_parent);
instance->InternalAddReference();
+ send_show_events = false;
} else {
// Otherwise, create a new instance.
instance = factory_->Create();
child_id = GetNextChildID();
+ children_can_send_show_events = false;
}
instance->Initialize(this, parent, child_id, index_in_parent, src);
@@ -388,9 +360,18 @@
SetFocus(instance, false);
for (int i = 0; i < static_cast<int>(src.children.size()); ++i) {
BrowserAccessibility* child = CreateAccessibilityTree(
- instance, src.children[i], i);
+ instance, src.children[i], i, children_can_send_show_events);
instance->AddChild(child);
}
+ // Note: the purpose of send_show_events and children_can_send_show_events
+ // is so that we send a single OBJECT_SHOW event for the root of a subtree
+ // that just appeared for the first time, but not on any descendant of
+ // that subtree.
+ if (send_show_events)
+ NotifyAccessibilityEvent(ViewHostMsg_AccEvent::OBJECT_SHOW, instance);
+
+ instance->SendNodeUpdateEvents();
+
return instance;
}

Powered by Google App Engine
This is Rietveld 408576698