Chromium Code Reviews| Index: chrome/browser/browser_accessibility_manager_win.cc |
| =================================================================== |
| --- chrome/browser/browser_accessibility_manager_win.cc (revision 57984) |
| +++ chrome/browser/browser_accessibility_manager_win.cc (working copy) |
| @@ -114,18 +114,14 @@ |
| } |
| void BrowserAccessibilityManager::OnAccessibilityObjectStateChange( |
| - int renderer_id) { |
| - base::hash_map<int, LONG>::iterator iter = |
| - renderer_id_to_child_id_map_.find(renderer_id); |
| - if (iter == renderer_id_to_child_id_map_.end()) |
| - return; |
| + const webkit_glue::WebAccessibility& acc_obj) { |
| + BrowserAccessibility* new_browser_acc = UpdateTree(acc_obj); |
| - LONG child_id = iter->second; |
| - ::NotifyWinEvent( |
| + NotifyWinEvent( |
| EVENT_OBJECT_STATECHANGE, |
| parent_hwnd_, |
| OBJID_CLIENT, |
| - child_id); |
| + new_browser_acc->child_id()); |
| } |
| void BrowserAccessibilityManager::OnAccessibilityObjectChildrenChange( |
| @@ -136,23 +132,55 @@ |
| // For each accessibility object child change. |
| for (unsigned int index = 0; index < acc_changes.size(); index++) { |
| const webkit_glue::WebAccessibility& acc_obj = acc_changes[index]; |
| - base::hash_map<int, LONG>::iterator iter = |
| - renderer_id_to_child_id_map_.find(acc_obj.id); |
| - if (iter == renderer_id_to_child_id_map_.end()) |
| - continue; |
| + BrowserAccessibility* new_browser_acc = UpdateTree(acc_obj); |
| - LONG child_id = iter->second; |
| - BrowserAccessibility* old_browser_acc = GetFromChildID(child_id); |
| + LONG child_id; |
| + if (root_ != new_browser_acc) { |
| + child_id = new_browser_acc->GetParent()->child_id(); |
| + } else { |
| + child_id = CHILDID_SELF; |
| + } |
| + NotifyWinEvent(EVENT_OBJECT_REORDER, parent_hwnd_, OBJID_CLIENT, child_id); |
| + } |
| +} |
| + |
| +BrowserAccessibility* BrowserAccessibilityManager::UpdateTree( |
| + const webkit_glue::WebAccessibility& acc_obj) { |
| + base::hash_map<int, LONG>::iterator iter = |
| + renderer_id_to_child_id_map_.find(acc_obj.id); |
| + if (iter == renderer_id_to_child_id_map_.end()) |
| + return NULL; |
| + |
| + LONG child_id = iter->second; |
| + BrowserAccessibility* old_browser_acc = GetFromChildID(child_id); |
| + |
| + if (old_browser_acc->GetChildCount() == 0 && acc_obj.children.size() == 0) { |
| + // Reinitialize the BrowserAccessibility if there are no children to update. |
| + old_browser_acc->Initialize( |
| + this, |
|
dmazzoni
2010/09/01 15:10:52
nit: Indent 4 spaces
Chris Guillory
2010/09/01 15:35:27
Done.
|
| + old_browser_acc->GetParent(), |
| + child_id, |
| + old_browser_acc->index_in_parent(), |
| + acc_obj); |
| + |
| + return old_browser_acc; |
| + } else { |
| + BrowserAccessibility* old_focus = focus_; |
| + |
| BrowserAccessibility* new_browser_acc = CreateAccessibilityTree( |
| old_browser_acc->GetParent(), |
| child_id, |
| acc_obj, |
| old_browser_acc->index_in_parent()); |
| - if (focus_->IsDescendantOf(old_browser_acc)) |
| + if (focus_->IsDescendantOf(old_browser_acc)) { |
|
dmazzoni
2010/09/01 15:10:52
We definitely need to fix the focus (it can't poin
Chris Guillory
2010/09/01 15:35:27
That's a good thought. I remove this for now as th
|
| focus_ = new_browser_acc; |
| + if (delegate_) |
| + delegate_->SetAccessibilityFocus(focus_->renderer_id()); |
| + } |
| + |
| if (old_browser_acc->GetParent()) { |
| old_browser_acc->GetParent()->ReplaceChild( |
| old_browser_acc, |
| @@ -165,13 +193,12 @@ |
| old_browser_acc->Release(); |
| child_id_map_[child_id] = new_browser_acc; |
| - if (root_ != new_browser_acc) { |
| + if (focus_ != old_focus) { |
| NotifyWinEvent( |
| - EVENT_OBJECT_REORDER, parent_hwnd_, OBJID_CLIENT, child_id); |
| - } else { |
| - NotifyWinEvent( |
| - EVENT_OBJECT_REORDER, parent_hwnd_, OBJID_CLIENT, CHILDID_SELF); |
| + EVENT_OBJECT_FOCUS, parent_hwnd_, OBJID_CLIENT, focus_->child_id()); |
| } |
| + |
| + return new_browser_acc; |
| } |
| } |