| 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;
|
| }
|
|
|