OLD | NEW |
---|---|
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/browser_accessibility_manager_win.h" | 5 #include "chrome/browser/browser_accessibility_manager_win.h" |
6 | 6 |
7 #include "chrome/browser/browser_accessibility_win.h" | 7 #include "chrome/browser/browser_accessibility_win.h" |
8 #include "chrome/browser/renderer_host/render_process_host.h" | 8 #include "chrome/browser/renderer_host/render_process_host.h" |
9 #include "chrome/browser/renderer_host/render_view_host.h" | 9 #include "chrome/browser/renderer_host/render_view_host.h" |
10 #include "chrome/common/render_messages.h" | 10 #include "chrome/common/render_messages.h" |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
107 | 107 |
108 LONG child_id = iter->second; | 108 LONG child_id = iter->second; |
109 base::hash_map<LONG, BrowserAccessibility*>::iterator uniq_iter = | 109 base::hash_map<LONG, BrowserAccessibility*>::iterator uniq_iter = |
110 child_id_map_.find(child_id); | 110 child_id_map_.find(child_id); |
111 if (uniq_iter != child_id_map_.end()) | 111 if (uniq_iter != child_id_map_.end()) |
112 focus_ = uniq_iter->second; | 112 focus_ = uniq_iter->second; |
113 ::NotifyWinEvent(EVENT_OBJECT_FOCUS, parent_hwnd_, OBJID_CLIENT, child_id); | 113 ::NotifyWinEvent(EVENT_OBJECT_FOCUS, parent_hwnd_, OBJID_CLIENT, child_id); |
114 } | 114 } |
115 | 115 |
116 void BrowserAccessibilityManager::OnAccessibilityObjectStateChange( | 116 void BrowserAccessibilityManager::OnAccessibilityObjectStateChange( |
117 int renderer_id) { | 117 const webkit_glue::WebAccessibility& acc_obj) { |
118 base::hash_map<int, LONG>::iterator iter = | 118 BrowserAccessibility* new_browser_acc = UpdateTree(acc_obj); |
119 renderer_id_to_child_id_map_.find(renderer_id); | |
120 if (iter == renderer_id_to_child_id_map_.end()) | |
121 return; | |
122 | 119 |
123 LONG child_id = iter->second; | 120 NotifyWinEvent( |
124 ::NotifyWinEvent( | |
125 EVENT_OBJECT_STATECHANGE, | 121 EVENT_OBJECT_STATECHANGE, |
126 parent_hwnd_, | 122 parent_hwnd_, |
127 OBJID_CLIENT, | 123 OBJID_CLIENT, |
128 child_id); | 124 new_browser_acc->child_id()); |
129 } | 125 } |
130 | 126 |
131 void BrowserAccessibilityManager::OnAccessibilityObjectChildrenChange( | 127 void BrowserAccessibilityManager::OnAccessibilityObjectChildrenChange( |
132 const std::vector<webkit_glue::WebAccessibility>& acc_changes) { | 128 const std::vector<webkit_glue::WebAccessibility>& acc_changes) { |
133 if (delegate_) | 129 if (delegate_) |
134 delegate_->AccessibilityObjectChildrenChangeAck(); | 130 delegate_->AccessibilityObjectChildrenChangeAck(); |
135 | 131 |
136 // For each accessibility object child change. | 132 // For each accessibility object child change. |
137 for (unsigned int index = 0; index < acc_changes.size(); index++) { | 133 for (unsigned int index = 0; index < acc_changes.size(); index++) { |
138 const webkit_glue::WebAccessibility& acc_obj = acc_changes[index]; | 134 const webkit_glue::WebAccessibility& acc_obj = acc_changes[index]; |
139 base::hash_map<int, LONG>::iterator iter = | 135 BrowserAccessibility* new_browser_acc = UpdateTree(acc_obj); |
140 renderer_id_to_child_id_map_.find(acc_obj.id); | |
141 if (iter == renderer_id_to_child_id_map_.end()) | |
142 continue; | |
143 | 136 |
144 LONG child_id = iter->second; | 137 LONG child_id; |
145 BrowserAccessibility* old_browser_acc = GetFromChildID(child_id); | 138 if (root_ != new_browser_acc) { |
139 child_id = new_browser_acc->GetParent()->child_id(); | |
140 } else { | |
141 child_id = CHILDID_SELF; | |
142 } | |
143 | |
144 NotifyWinEvent(EVENT_OBJECT_REORDER, parent_hwnd_, OBJID_CLIENT, child_id); | |
145 } | |
146 } | |
147 | |
148 BrowserAccessibility* BrowserAccessibilityManager::UpdateTree( | |
149 const webkit_glue::WebAccessibility& acc_obj) { | |
150 base::hash_map<int, LONG>::iterator iter = | |
151 renderer_id_to_child_id_map_.find(acc_obj.id); | |
152 if (iter == renderer_id_to_child_id_map_.end()) | |
153 return NULL; | |
154 | |
155 LONG child_id = iter->second; | |
156 BrowserAccessibility* old_browser_acc = GetFromChildID(child_id); | |
157 | |
158 if (old_browser_acc->GetChildCount() == 0 && acc_obj.children.size() == 0) { | |
159 // Reinitialize the BrowserAccessibility if there are no children to update. | |
160 old_browser_acc->Initialize( | |
161 this, | |
dmazzoni
2010/09/01 15:10:52
nit: Indent 4 spaces
Chris Guillory
2010/09/01 15:35:27
Done.
| |
162 old_browser_acc->GetParent(), | |
163 child_id, | |
164 old_browser_acc->index_in_parent(), | |
165 acc_obj); | |
166 | |
167 return old_browser_acc; | |
168 } else { | |
169 BrowserAccessibility* old_focus = focus_; | |
146 | 170 |
147 BrowserAccessibility* new_browser_acc = CreateAccessibilityTree( | 171 BrowserAccessibility* new_browser_acc = CreateAccessibilityTree( |
148 old_browser_acc->GetParent(), | 172 old_browser_acc->GetParent(), |
149 child_id, | 173 child_id, |
150 acc_obj, | 174 acc_obj, |
151 old_browser_acc->index_in_parent()); | 175 old_browser_acc->index_in_parent()); |
152 | 176 |
153 if (focus_->IsDescendantOf(old_browser_acc)) | 177 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
| |
154 focus_ = new_browser_acc; | 178 focus_ = new_browser_acc; |
155 | 179 |
180 if (delegate_) | |
181 delegate_->SetAccessibilityFocus(focus_->renderer_id()); | |
182 } | |
183 | |
156 if (old_browser_acc->GetParent()) { | 184 if (old_browser_acc->GetParent()) { |
157 old_browser_acc->GetParent()->ReplaceChild( | 185 old_browser_acc->GetParent()->ReplaceChild( |
158 old_browser_acc, | 186 old_browser_acc, |
159 new_browser_acc); | 187 new_browser_acc); |
160 } else { | 188 } else { |
161 DCHECK_EQ(old_browser_acc, root_); | 189 DCHECK_EQ(old_browser_acc, root_); |
162 root_ = new_browser_acc; | 190 root_ = new_browser_acc; |
163 } | 191 } |
164 old_browser_acc->InactivateTree(); | 192 old_browser_acc->InactivateTree(); |
165 old_browser_acc->Release(); | 193 old_browser_acc->Release(); |
166 child_id_map_[child_id] = new_browser_acc; | 194 child_id_map_[child_id] = new_browser_acc; |
167 | 195 |
168 if (root_ != new_browser_acc) { | 196 if (focus_ != old_focus) { |
169 NotifyWinEvent( | 197 NotifyWinEvent( |
170 EVENT_OBJECT_REORDER, parent_hwnd_, OBJID_CLIENT, child_id); | 198 EVENT_OBJECT_FOCUS, parent_hwnd_, OBJID_CLIENT, focus_->child_id()); |
171 } else { | |
172 NotifyWinEvent( | |
173 EVENT_OBJECT_REORDER, parent_hwnd_, OBJID_CLIENT, CHILDID_SELF); | |
174 } | 199 } |
200 | |
201 return new_browser_acc; | |
175 } | 202 } |
176 } | 203 } |
177 | 204 |
178 LONG BrowserAccessibilityManager::GetNextChildID() { | 205 LONG BrowserAccessibilityManager::GetNextChildID() { |
179 // Get the next child ID, and wrap around when we get near the end | 206 // Get the next child ID, and wrap around when we get near the end |
180 // of a 32-bit integer range. It's okay to wrap around; we just want | 207 // of a 32-bit integer range. It's okay to wrap around; we just want |
181 // to avoid it as long as possible because clients may cache the ID of | 208 // to avoid it as long as possible because clients may cache the ID of |
182 // an object for a while to determine if they've seen it before. | 209 // an object for a while to determine if they've seen it before. |
183 next_child_id_--; | 210 next_child_id_--; |
184 if (next_child_id_ == -2000000000) | 211 if (next_child_id_ == -2000000000) |
(...skipping 15 matching lines...) Expand all Loading... | |
200 if ((src.state >> WebAccessibility::STATE_FOCUSED) & 1) | 227 if ((src.state >> WebAccessibility::STATE_FOCUSED) & 1) |
201 focus_ = instance; | 228 focus_ = instance; |
202 for (int i = 0; i < static_cast<int>(src.children.size()); ++i) { | 229 for (int i = 0; i < static_cast<int>(src.children.size()); ++i) { |
203 BrowserAccessibility* child = CreateAccessibilityTree( | 230 BrowserAccessibility* child = CreateAccessibilityTree( |
204 instance, GetNextChildID(), src.children[i], i); | 231 instance, GetNextChildID(), src.children[i], i); |
205 instance->AddChild(child); | 232 instance->AddChild(child); |
206 } | 233 } |
207 | 234 |
208 return instance; | 235 return instance; |
209 } | 236 } |
OLD | NEW |