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

Side by Side Diff: webkit/glue/webaccessibilitymanager_impl.cc

Issue 115374: Adds propagation and handling of render-side focus events, for the benefit of... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/glue/webaccessibilitymanager_impl.h ('k') | webkit/glue/webview_delegate.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 "config.h" 5 #include "config.h"
6 6
7 #include "AXObjectCache.h" 7 #include "AXObjectCache.h"
8 #include "Document.h" 8 #include "Document.h"
9 #include "Frame.h" 9 #include "Frame.h"
10 #include "RefPtr.h" 10 #include "RefPtr.h"
(...skipping 16 matching lines...) Expand all
27 RefPtr<GlueAccessibilityObject> acc_obj_root_; 27 RefPtr<GlueAccessibilityObject> acc_obj_root_;
28 }; 28 };
29 29
30 /*static*/ 30 /*static*/
31 WebAccessibilityManager* WebAccessibilityManager::Create() { 31 WebAccessibilityManager* WebAccessibilityManager::Create() {
32 return new WebAccessibilityManagerImpl(); 32 return new WebAccessibilityManagerImpl();
33 } 33 }
34 34
35 // class WebAccessibilityManagerImpl 35 // class WebAccessibilityManagerImpl
36 WebAccessibilityManagerImpl::WebAccessibilityManagerImpl() 36 WebAccessibilityManagerImpl::WebAccessibilityManagerImpl()
37 : root_(new GlueAccessibilityObjectRoot) { 37 : root_(new GlueAccessibilityObjectRoot),
38 acc_obj_id_(0) {
39 }
40
41 WebAccessibilityManagerImpl::~WebAccessibilityManagerImpl() {
42 int_to_glue_acc_obj_map_.clear();
43 acc_obj_to_int_map_.clear();
38 } 44 }
39 45
40 bool WebAccessibilityManagerImpl::GetAccObjInfo(WebView* view, 46 bool WebAccessibilityManagerImpl::GetAccObjInfo(WebView* view,
41 const WebAccessibility::InParams& in_params, 47 const WebAccessibility::InParams& in_params,
42 WebAccessibility::OutParams* out_params) { 48 WebAccessibility::OutParams* out_params) {
43 if (!root_->acc_obj_root_ && !InitAccObjRoot(view)) { 49 if (!root_->acc_obj_root_ && !InitAccObjRoot(view)) {
44 // Failure in retrieving or initializing the root. 50 // Failure in retrieving or initializing the root.
45 return false; 51 return false;
46 } 52 }
47 53
48 // Find GlueAccessibilityObject requested by [in_params.object_id]. 54 // Function input parameters.
49 IntToAccObjMap::iterator it = 55 int object_id = in_params.object_id;
50 int_to_acc_obj_map_.find(in_params.object_id); 56 int child_id = in_params.child_id;
51 if (it == int_to_acc_obj_map_.end() || !it->second) { 57
58 if (!in_params.direct_descendant) {
59 // Object is not a direct child, re-map the input parameters accordingly.
60 // The object to be retrived is referred to by the |in_params.child_id|, as
jcampan 2009/05/19 21:50:04 typo: retrived -> retrieved
61 // a result of e.g. a focus event. The local |child_id| is set to 0, to
62 // indicate that any function call should refer to the object itself.
63 object_id = in_params.child_id;
64 child_id = 0;
65 }
66
67 // Find GlueAccessibilityObject requested by |object_id|.
68 IntToGlueAccObjMap::iterator it =
69 int_to_glue_acc_obj_map_.find(object_id);
70 if (it == int_to_glue_acc_obj_map_.end() || !it->second) {
52 // Map did not contain a valid instance of the data requested. 71 // Map did not contain a valid instance of the data requested.
53 return false; 72 return false;
54 } 73 }
55 RefPtr<GlueAccessibilityObject> active_acc_obj = it->second; 74 RefPtr<GlueAccessibilityObject> active_acc_obj = it->second;
56 75
57 // Function input parameters.
58 int child_id = in_params.child_id;
59
60 // Temp paramters for holding output information. 76 // Temp paramters for holding output information.
61 RefPtr<GlueAccessibilityObject> out_acc_obj = NULL; 77 RefPtr<GlueAccessibilityObject> out_acc_obj = NULL;
62 WebCore::String out_string; 78 WebCore::String out_string;
63 79
64 switch (in_params.function_id) { 80 switch (in_params.function_id) {
65 case WebAccessibility::FUNCTION_DODEFAULTACTION : 81 case WebAccessibility::FUNCTION_DODEFAULTACTION :
66 if (!active_acc_obj->DoDefaultAction(child_id)) 82 if (!active_acc_obj->DoDefaultAction(child_id))
67 return false; 83 return false;
68 break; 84 break;
69 case WebAccessibility::FUNCTION_HITTEST : 85 case WebAccessibility::FUNCTION_HITTEST :
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 default: 165 default:
150 // Non-supported function id. 166 // Non-supported function id.
151 return false; 167 return false;
152 } 168 }
153 169
154 // Output and hashmap assignments, as appropriate. 170 // Output and hashmap assignments, as appropriate.
155 if (!out_string.isEmpty()) 171 if (!out_string.isEmpty())
156 out_params->output_string = StringToString16(out_string); 172 out_params->output_string = StringToString16(out_string);
157 173
158 if (out_acc_obj) { 174 if (out_acc_obj) {
159 AccObjToIntMap::iterator it = acc_obj_to_int_map_.find(out_acc_obj.get()); 175 AccObjToIntMap::iterator it =
176 acc_obj_to_int_map_.find(out_acc_obj->accessibilityObject());
160 177
161 if (it != acc_obj_to_int_map_.end()) { 178 if (it != acc_obj_to_int_map_.end()) {
162 // Data already present in map, return previously assigned id. 179 // Data already present in map, return previously assigned id.
163 out_params->object_id = it->second; 180 out_params->object_id = it->second;
164 out_params->output_long1 = -1; 181 out_params->output_long1 = -1;
165 } else { 182 } else {
166 // Insert new GlueAccessibilityObject in hashmaps. 183 // Insert new GlueAccessibilityObject in hashmaps.
167 int_to_acc_obj_map_[acc_obj_id_] = out_acc_obj.get(); 184 int_to_glue_acc_obj_map_[acc_obj_id_] = out_acc_obj.get();
168 acc_obj_to_int_map_[out_acc_obj.get()] = acc_obj_id_; 185 acc_obj_to_int_map_[out_acc_obj->accessibilityObject()] = acc_obj_id_;
169 out_params->object_id = acc_obj_id_++; 186 out_params->object_id = acc_obj_id_++;
170 out_params->output_long1 = -1; 187 out_params->output_long1 = -1;
171 } 188 }
172 } 189 }
173 // TODO(klink): Handle simple objects returned. 190 // TODO(klink): Handle simple objects returned.
174 return true; 191 return true;
175 } 192 }
176 193
177 bool WebAccessibilityManagerImpl::InitAccObjRoot(WebView* view) { 194 bool WebAccessibilityManagerImpl::InitAccObjRoot(WebView* view) {
178 // Root id is always 0.
179 acc_obj_id_ = 0;
180
181 // Enable accessibility and retrieve Document. 195 // Enable accessibility and retrieve Document.
182 WebCore::AXObjectCache::enableAccessibility(); 196 WebCore::AXObjectCache::enableAccessibility();
183 WebFrameImpl* main_frame_impl = 197 WebFrameImpl* main_frame_impl =
184 static_cast<WebFrameImpl*>(view->GetMainFrame()); 198 static_cast<WebFrameImpl*>(view->GetMainFrame());
185 if (!main_frame_impl || !main_frame_impl->frame()) 199 if (!main_frame_impl || !main_frame_impl->frame())
186 return false; 200 return false;
187 201
188 WebCore::Document* doc = main_frame_impl->frame()->document(); 202 WebCore::Document* doc = main_frame_impl->frame()->document();
189 203
190 if (!doc || !doc->renderer()) 204 if (!doc || !doc->renderer())
191 return false; 205 return false;
192 206
193 if (!root_->acc_obj_root_) { 207 if (!root_->acc_obj_root_) {
194 // Either we've never had a wrapper for this frame's top-level Document, 208 // Either we've never had a wrapper for this frame's top-level Document,
195 // the Document renderer was destroyed and its wrapper was detached, or 209 // the Document renderer was destroyed and its wrapper was detached, or
196 // the previous Document is in the page cache, and the current document 210 // the previous Document is in the page cache, and the current document
197 // needs to be wrapped. 211 // needs to be wrapped.
198 root_->acc_obj_root_ = GlueAccessibilityObject::CreateInstance(doc-> 212 root_->acc_obj_root_ = GlueAccessibilityObject::CreateInstance(doc->
199 axObjectCache()->getOrCreate(doc->renderer())); 213 axObjectCache()->getOrCreate(doc->renderer()));
200 } 214 }
201 // Insert root in hashmaps. 215 // Insert root in hashmaps.
202 int_to_acc_obj_map_[acc_obj_id_] = root_->acc_obj_root_.get(); 216 int_to_glue_acc_obj_map_[acc_obj_id_] = root_->acc_obj_root_.get();
203 acc_obj_to_int_map_[root_->acc_obj_root_.get()] = acc_obj_id_++; 217 acc_obj_to_int_map_[root_->acc_obj_root_->accessibilityObject()] =
218 acc_obj_id_++;
204 219
205 return true; 220 return true;
206 } 221 }
207 222
208 bool WebAccessibilityManagerImpl::ClearAccObjMap(int acc_obj_id, 223 bool WebAccessibilityManagerImpl::ClearAccObjMap(int acc_obj_id,
209 bool clear_all) { 224 bool clear_all) {
210 if (clear_all) { 225 if (clear_all) {
211 // Clear maps and invalidate root. 226 // Clear maps and invalidate root.
212 int_to_acc_obj_map_.clear(); 227 int_to_glue_acc_obj_map_.clear();
213 acc_obj_to_int_map_.clear(); 228 acc_obj_to_int_map_.clear();
214 root_->acc_obj_root_ = 0; 229 root_->acc_obj_root_ = 0;
215 return true; 230 return true;
216 } 231 }
217 232
218 IntToAccObjMap::iterator it = int_to_acc_obj_map_.find(acc_obj_id); 233 IntToGlueAccObjMap::iterator it = int_to_glue_acc_obj_map_.find(acc_obj_id);
219 234
220 if (it == int_to_acc_obj_map_.end()) { 235 if (it == int_to_glue_acc_obj_map_.end()) {
221 // Element not found. 236 // Element not found.
222 return false; 237 return false;
223 } 238 }
224 239
225 if (it->second) { 240 if (it->second) {
226 // Erase element from reverse hashmap. 241 // Erase element from reverse hashmap.
227 AccObjToIntMap::iterator it2 = acc_obj_to_int_map_.find(it->second); 242 AccObjToIntMap::iterator it2 =
243 acc_obj_to_int_map_.find(it->second->accessibilityObject());
228 244
229 if (it2 != acc_obj_to_int_map_.end()) 245 if (it2 != acc_obj_to_int_map_.end())
230 acc_obj_to_int_map_.erase(it2); 246 acc_obj_to_int_map_.erase(it2);
231 } 247 }
232 int_to_acc_obj_map_.erase(it); 248 int_to_glue_acc_obj_map_.erase(it);
233 249
234 if (acc_obj_id == 0) { 250 if (acc_obj_id == 0) {
235 // Invalidate root. 251 // Invalidate root.
236 root_->acc_obj_root_ = 0; 252 root_->acc_obj_root_ = 0;
237 } 253 }
238 return true; 254 return true;
239 } 255 }
240 256
257 int WebAccessibilityManagerImpl::FocusAccObj(
258 WebCore::AccessibilityObject* acc_obj) {
259 if (!acc_obj) {
260 // Return with failure.
261 return -1;
262 }
263
264 AccObjToIntMap::iterator it = acc_obj_to_int_map_.find(acc_obj);
265
266 if (it != acc_obj_to_int_map_.end()) {
267 return it->second;
268 } else {
darin (slow to review) 2009/05/18 22:43:21 nit: no need for else after return. would be nice
269 // Insert new accessibility object in hashmaps and return its newly
270 // assigned accessibility object id.
271 int_to_glue_acc_obj_map_[acc_obj_id_] =
272 GlueAccessibilityObject::CreateInstance(acc_obj);
273 acc_obj_to_int_map_[acc_obj] = acc_obj_id_;
274
275 return acc_obj_id_++;
276 }
277 }
278
241 } // namespace webkit_glue 279 } // namespace webkit_glue
OLDNEW
« no previous file with comments | « webkit/glue/webaccessibilitymanager_impl.h ('k') | webkit/glue/webview_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698