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