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

Side by Side Diff: chrome/browser/browser_accessibility.cc

Issue 2121004: Windows accessibility improvements: 1. All WebKit roles are now passed to the... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 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 | « chrome/browser/browser_accessibility.h ('k') | chrome/browser/browser_accessibility_manager.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) 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.h" 5 #include "chrome/browser/browser_accessibility.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "chrome/browser/browser_accessibility_manager.h" 8 #include "chrome/browser/browser_accessibility_manager.h"
9 9
10 using webkit_glue::WebAccessibility; 10 using webkit_glue::WebAccessibility;
(...skipping 18 matching lines...) Expand all
29 LONG index_in_parent, 29 LONG index_in_parent,
30 const webkit_glue::WebAccessibility& src) { 30 const webkit_glue::WebAccessibility& src) {
31 manager_ = manager; 31 manager_ = manager;
32 parent_ = parent; 32 parent_ = parent;
33 child_id_ = child_id; 33 child_id_ = child_id;
34 index_in_parent_ = index_in_parent; 34 index_in_parent_ = index_in_parent;
35 35
36 renderer_id_ = src.id; 36 renderer_id_ = src.id;
37 name_ = src.name; 37 name_ = src.name;
38 value_ = src.value; 38 value_ = src.value;
39 action_ = src.action; 39 attributes_ = src.attributes;
40 description_ = src.description;
41 help_ = src.help;
42 shortcut_ = src.shortcut;
43 role_ = MSAARole(src.role);
44 state_ = MSAAState(src.state);
45 location_ = src.location; 40 location_ = src.location;
41 InitRoleAndState(src.role, src.state);
42
43 // If this object doesn't have a name but it does have a description,
44 // use the description as its name - because some screen readers only
45 // announce the name.
46 if (name_.empty() && HasAttribute(WebAccessibility::ATTR_DESCRIPTION)) {
47 GetAttribute(WebAccessibility::ATTR_DESCRIPTION, &name_);
48 }
46 49
47 instance_active_ = true; 50 instance_active_ = true;
48
49 // Focused is a dynamic state, only one node will be focused at a time.
50 state_ &= ~STATE_SYSTEM_FOCUSED;
51 } 51 }
52 52
53 void BrowserAccessibility::AddChild(BrowserAccessibility* child) { 53 void BrowserAccessibility::AddChild(BrowserAccessibility* child) {
54 children_.push_back(child); 54 children_.push_back(child);
55 } 55 }
56 56
57 void BrowserAccessibility::InactivateTree() { 57 void BrowserAccessibility::InactivateTree() {
58 // Mark this object as inactive, so calls to all COM methods will return 58 // Mark this object as inactive, so calls to all COM methods will return
59 // failure. 59 // failure.
60 instance_active_ = false; 60 instance_active_ = false;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 } 99 }
100 100
101 BrowserAccessibility* BrowserAccessibility::NewReference() { 101 BrowserAccessibility* BrowserAccessibility::NewReference() {
102 AddRef(); 102 AddRef();
103 return this; 103 return this;
104 } 104 }
105 105
106 // 106 //
107 // IAccessible methods. 107 // IAccessible methods.
108 // 108 //
109 // Conventions:
110 // * Always test for instance_active_ first and return E_FAIL if it's false.
111 // * Always check for invalid arguments first, even if they're unused.
112 // * Return S_FALSE if the only output is a string argument and it's empty.
113 //
109 114
110 HRESULT BrowserAccessibility::accDoDefaultAction(VARIANT var_id) { 115 HRESULT BrowserAccessibility::accDoDefaultAction(VARIANT var_id) {
111 if (!instance_active_) { 116 if (!instance_active_)
112 // Instance no longer active, fail gracefully.
113 return E_FAIL; 117 return E_FAIL;
114 }
115 118
116 return E_NOTIMPL; 119 BrowserAccessibility* target = GetTargetFromChildID(var_id);
120 if (!target)
121 return E_INVALIDARG;
122
123 manager_->DoDefaultAction(*target);
124 return S_OK;
117 } 125 }
118 126
119 STDMETHODIMP BrowserAccessibility::accHitTest(LONG x_left, LONG y_top, 127 STDMETHODIMP BrowserAccessibility::accHitTest(LONG x_left, LONG y_top,
120 VARIANT* child) { 128 VARIANT* child) {
121 if (!instance_active_) { 129 if (!instance_active_)
122 // Instance no longer active, fail gracefully.
123 return E_FAIL; 130 return E_FAIL;
124 }
125 131
126 if (!child) 132 if (!child)
127 return E_INVALIDARG; 133 return E_INVALIDARG;
128 134
129 return E_NOTIMPL; 135 return E_NOTIMPL;
130 } 136 }
131 137
132 STDMETHODIMP BrowserAccessibility::accLocation(LONG* x_left, LONG* y_top, 138 STDMETHODIMP BrowserAccessibility::accLocation(LONG* x_left, LONG* y_top,
133 LONG* width, LONG* height, 139 LONG* width, LONG* height,
134 VARIANT var_id) { 140 VARIANT var_id) {
135 if (!instance_active_) { 141 if (!instance_active_)
136 // Instance no longer active, fail gracefully.
137 return E_FAIL; 142 return E_FAIL;
138 }
139 143
140 if (!x_left || !y_top || !width || !height) 144 if (!x_left || !y_top || !width || !height)
141 return E_INVALIDARG; 145 return E_INVALIDARG;
142 146
143 BrowserAccessibility* target = GetTargetFromChildID(var_id); 147 BrowserAccessibility* target = GetTargetFromChildID(var_id);
144 if (!target) 148 if (!target)
145 return E_INVALIDARG; 149 return E_INVALIDARG;
146 150
147 // Find the top left corner of the containing window in screen coords, and 151 // Find the top left corner of the containing window in screen coords, and
148 // adjust the output position by this amount. 152 // adjust the output position by this amount.
(...skipping 14 matching lines...) Expand all
163 BrowserAccessibility* target = GetTargetFromChildID(start); 167 BrowserAccessibility* target = GetTargetFromChildID(start);
164 if (!target) 168 if (!target)
165 return E_INVALIDARG; 169 return E_INVALIDARG;
166 170
167 if ((nav_dir == NAVDIR_LASTCHILD || nav_dir == NAVDIR_FIRSTCHILD) && 171 if ((nav_dir == NAVDIR_LASTCHILD || nav_dir == NAVDIR_FIRSTCHILD) &&
168 start.lVal != CHILDID_SELF) { 172 start.lVal != CHILDID_SELF) {
169 // MSAA states that navigating to first/last child can only be from self. 173 // MSAA states that navigating to first/last child can only be from self.
170 return E_INVALIDARG; 174 return E_INVALIDARG;
171 } 175 }
172 176
173 BrowserAccessibility* result; 177 BrowserAccessibility* result = NULL;
174 switch (nav_dir) { 178 switch (nav_dir) {
175 case NAVDIR_DOWN: 179 case NAVDIR_DOWN:
176 case NAVDIR_UP: 180 case NAVDIR_UP:
177 case NAVDIR_LEFT: 181 case NAVDIR_LEFT:
178 case NAVDIR_RIGHT: 182 case NAVDIR_RIGHT:
179 // These directions are not implemented, matching Mozilla and IE. 183 // These directions are not implemented, matching Mozilla and IE.
180 return E_NOTIMPL; 184 return E_NOTIMPL;
181 case NAVDIR_FIRSTCHILD: 185 case NAVDIR_FIRSTCHILD:
182 if (target->children_.size() > 0) 186 if (target->children_.size() > 0)
183 result = target->children_[0]; 187 result = target->children_[0];
184 break; 188 break;
185 case NAVDIR_LASTCHILD: 189 case NAVDIR_LASTCHILD:
186 if (target->children_.size() > 0) 190 if (target->children_.size() > 0)
187 result = target->children_[target->children_.size() - 1]; 191 result = target->children_[target->children_.size() - 1];
188 break; 192 break;
189 case NAVDIR_NEXT: 193 case NAVDIR_NEXT:
190 result = target->GetNextSibling(); 194 result = target->GetNextSibling();
191 break; 195 break;
192 case NAVDIR_PREVIOUS: 196 case NAVDIR_PREVIOUS:
193 result = target->GetPreviousSibling(); 197 result = target->GetPreviousSibling();
194 break; 198 break;
195 } 199 }
196 200
197 if (!result) { 201 if (!result) {
198 end->vt = VT_EMPTY; 202 end->vt = VT_EMPTY;
199 return S_FALSE; 203 return S_FALSE;
200 } 204 }
201 205
202 end->vt = VT_DISPATCH; 206 end->vt = VT_DISPATCH;
203 end->pdispVal = result->NewReference(); 207 end->pdispVal = result->NewReference();
204 return S_OK; 208 return S_OK;
205 } 209 }
206 210
207 STDMETHODIMP BrowserAccessibility::get_accChild(VARIANT var_child, 211 STDMETHODIMP BrowserAccessibility::get_accChild(VARIANT var_child,
208 IDispatch** disp_child) { 212 IDispatch** disp_child) {
209 if (!instance_active_) { 213 if (!instance_active_)
210 // Instance no longer active, fail gracefully.
211 return E_FAIL; 214 return E_FAIL;
212 }
213 215
214 if (!disp_child) 216 if (!disp_child)
215 return E_INVALIDARG; 217 return E_INVALIDARG;
216 218
217 *disp_child = NULL; 219 *disp_child = NULL;
218 220
219 BrowserAccessibility* target = GetTargetFromChildID(var_child); 221 BrowserAccessibility* target = GetTargetFromChildID(var_child);
220 if (!target) 222 if (!target)
221 return E_INVALIDARG; 223 return E_INVALIDARG;
222 224
223 (*disp_child) = target->NewReference(); 225 (*disp_child) = target->NewReference();
224 return S_OK; 226 return S_OK;
225 } 227 }
226 228
227 STDMETHODIMP BrowserAccessibility::get_accChildCount(LONG* child_count) { 229 STDMETHODIMP BrowserAccessibility::get_accChildCount(LONG* child_count) {
228 if (!instance_active_) { 230 if (!instance_active_)
229 // Instance no longer active, fail gracefully.
230 return E_FAIL; 231 return E_FAIL;
231 }
232 232
233 if (!child_count) 233 if (!child_count)
234 return E_INVALIDARG; 234 return E_INVALIDARG;
235 235
236 *child_count = children_.size(); 236 *child_count = children_.size();
237 return S_OK; 237 return S_OK;
238 } 238 }
239 239
240 STDMETHODIMP BrowserAccessibility::get_accDefaultAction(VARIANT var_id, 240 STDMETHODIMP BrowserAccessibility::get_accDefaultAction(VARIANT var_id,
241 BSTR* def_action) { 241 BSTR* def_action) {
242 if (!instance_active_) { 242 if (!instance_active_)
243 // Instance no longer active, fail gracefully.
244 return E_FAIL; 243 return E_FAIL;
245 }
246 244
247 if (!def_action) 245 if (!def_action)
248 return E_INVALIDARG; 246 return E_INVALIDARG;
249 247
250 BrowserAccessibility* target = GetTargetFromChildID(var_id); 248 BrowserAccessibility* target = GetTargetFromChildID(var_id);
251 if (!target) 249 if (!target)
252 return E_INVALIDARG; 250 return E_INVALIDARG;
253 251
254 // Return false if the string is empty. 252 string16 action;
255 if (target->action_.size() == 0) 253 if (!target->GetAttribute(WebAccessibility::ATTR_SHORTCUT, &action))
256 return S_FALSE; 254 return S_FALSE;
257 255
258 *def_action = SysAllocString(target->action_.c_str()); 256 if (action.empty())
257 return S_FALSE;
258
259 *def_action = SysAllocString(action.c_str());
259 260
260 DCHECK(*def_action); 261 DCHECK(*def_action);
261 return S_OK; 262 return S_OK;
262 } 263 }
263 264
264 STDMETHODIMP BrowserAccessibility::get_accDescription(VARIANT var_id, 265 STDMETHODIMP BrowserAccessibility::get_accDescription(VARIANT var_id,
265 BSTR* desc) { 266 BSTR* desc) {
266 if (!instance_active_) { 267 if (!instance_active_)
267 // Instance no longer active, fail gracefully.
268 return E_FAIL; 268 return E_FAIL;
269 }
270 269
271 if (!desc) 270 if (!desc)
272 return E_INVALIDARG; 271 return E_INVALIDARG;
273 272
274 BrowserAccessibility* target = GetTargetFromChildID(var_id); 273 BrowserAccessibility* target = GetTargetFromChildID(var_id);
275 if (!target) 274 if (!target)
276 return E_INVALIDARG; 275 return E_INVALIDARG;
277 276
278 // Return false if the string is empty. 277 string16 description;
279 if (target->description_.size() == 0) 278 if (!target->GetAttribute(WebAccessibility::ATTR_DESCRIPTION, &description))
280 return S_FALSE; 279 return S_FALSE;
281 280
282 *desc = SysAllocString(target->description_.c_str()); 281 if (description.empty())
282 return S_FALSE;
283
284 *desc = SysAllocString(description.c_str());
283 285
284 DCHECK(*desc); 286 DCHECK(*desc);
285 return S_OK; 287 return S_OK;
286 } 288 }
287 289
288 STDMETHODIMP BrowserAccessibility::get_accFocus(VARIANT* focus_child) { 290 STDMETHODIMP BrowserAccessibility::get_accFocus(VARIANT* focus_child) {
289 if (!instance_active_) { 291 if (!instance_active_)
290 // Instance no longer active, fail gracefully.
291 return E_FAIL; 292 return E_FAIL;
292 }
293 293
294 if (!focus_child) 294 if (!focus_child)
295 return E_INVALIDARG; 295 return E_INVALIDARG;
296 296
297 BrowserAccessibility* focus = manager_->GetFocus(this); 297 BrowserAccessibility* focus = manager_->GetFocus(this);
298 if (focus == this) { 298 if (focus == this) {
299 focus_child->vt = VT_I4; 299 focus_child->vt = VT_I4;
300 focus_child->lVal = CHILDID_SELF; 300 focus_child->lVal = CHILDID_SELF;
301 } else if (focus == NULL) { 301 } else if (focus == NULL) {
302 focus_child->vt = VT_EMPTY; 302 focus_child->vt = VT_EMPTY;
303 } else { 303 } else {
304 focus_child->vt = VT_DISPATCH; 304 focus_child->vt = VT_DISPATCH;
305 focus_child->pdispVal = focus->NewReference(); 305 focus_child->pdispVal = focus->NewReference();
306 } 306 }
307 307
308 return S_OK; 308 return S_OK;
309 } 309 }
310 310
311 STDMETHODIMP BrowserAccessibility::get_accHelp(VARIANT var_id, BSTR* help) { 311 STDMETHODIMP BrowserAccessibility::get_accHelp(VARIANT var_id, BSTR* help) {
312 if (!instance_active_) { 312 if (!instance_active_)
313 // Instance no longer active, fail gracefully.
314 return E_FAIL; 313 return E_FAIL;
315 }
316 314
317 if (!help) 315 if (!help)
318 return E_INVALIDARG; 316 return E_INVALIDARG;
319 317
320 BrowserAccessibility* target = GetTargetFromChildID(var_id); 318 BrowserAccessibility* target = GetTargetFromChildID(var_id);
321 if (!target) 319 if (!target)
322 return E_INVALIDARG; 320 return E_INVALIDARG;
323 321
324 // Return false if the string is empty. 322 string16 help_str;
325 if (target->help_.size() == 0) 323 if (!target->GetAttribute(WebAccessibility::ATTR_HELP, &help_str))
326 return S_FALSE; 324 return S_FALSE;
327 325
328 *help = SysAllocString(target->help_.c_str()); 326 if (help_str.empty())
327 return S_FALSE;
328
329 *help = SysAllocString(help_str.c_str());
329 330
330 DCHECK(*help); 331 DCHECK(*help);
331 return S_OK; 332 return S_OK;
332 } 333 }
333 334
334 STDMETHODIMP BrowserAccessibility::get_accKeyboardShortcut(VARIANT var_id, 335 STDMETHODIMP BrowserAccessibility::get_accKeyboardShortcut(VARIANT var_id,
335 BSTR* acc_key) { 336 BSTR* acc_key) {
336 if (!instance_active_) { 337 if (!instance_active_)
337 // Instance no longer active, fail gracefully.
338 return E_FAIL; 338 return E_FAIL;
339 }
340 339
341 if (!acc_key) 340 if (!acc_key)
342 return E_INVALIDARG; 341 return E_INVALIDARG;
343 342
344 BrowserAccessibility* target = GetTargetFromChildID(var_id); 343 BrowserAccessibility* target = GetTargetFromChildID(var_id);
345 if (!target) 344 if (!target)
346 return E_INVALIDARG; 345 return E_INVALIDARG;
347 346
348 // Return false if the string is empty. 347 string16 shortcut;
349 if (target->shortcut_.size() == 0) 348 if (!target->GetAttribute(WebAccessibility::ATTR_SHORTCUT, &shortcut))
350 return S_FALSE; 349 return S_FALSE;
351 350
352 *acc_key = SysAllocString(target->shortcut_.c_str()); 351 if (shortcut.empty())
352 return S_FALSE;
353
354 *acc_key = SysAllocString(shortcut.c_str());
353 355
354 DCHECK(*acc_key); 356 DCHECK(*acc_key);
355 return S_OK; 357 return S_OK;
356 } 358 }
357 359
358 STDMETHODIMP BrowserAccessibility::get_accName(VARIANT var_id, BSTR* name) { 360 STDMETHODIMP BrowserAccessibility::get_accName(VARIANT var_id, BSTR* name) {
359 if (!instance_active_) { 361 if (!instance_active_)
360 // Instance no longer active, fail gracefully.
361 return E_FAIL; 362 return E_FAIL;
362 }
363 363
364 if (!name) 364 if (!name)
365 return E_INVALIDARG; 365 return E_INVALIDARG;
366 366
367 BrowserAccessibility* target = GetTargetFromChildID(var_id); 367 BrowserAccessibility* target = GetTargetFromChildID(var_id);
368 if (!target) 368 if (!target)
369 return E_INVALIDARG; 369 return E_INVALIDARG;
370 370
371 // Return false if the string is empty. 371 if (target->name_.empty())
372 if (target->name_.size() == 0)
373 return S_FALSE; 372 return S_FALSE;
374 373
375 *name = SysAllocString(target->name_.c_str()); 374 *name = SysAllocString(target->name_.c_str());
376 375
377 DCHECK(*name); 376 DCHECK(*name);
378 return S_OK; 377 return S_OK;
379 } 378 }
380 379
381 STDMETHODIMP BrowserAccessibility::get_accParent(IDispatch** disp_parent) { 380 STDMETHODIMP BrowserAccessibility::get_accParent(IDispatch** disp_parent) {
382 if (!instance_active_) { 381 if (!instance_active_)
383 // Instance no longer active, fail gracefully.
384 return E_FAIL; 382 return E_FAIL;
385 }
386 383
387 if (!disp_parent) 384 if (!disp_parent)
388 return E_INVALIDARG; 385 return E_INVALIDARG;
389 386
390 IAccessible* parent = parent_; 387 IAccessible* parent = parent_;
391 if (parent == NULL) { 388 if (parent == NULL) {
392 // This happens if we're the root of the tree; 389 // This happens if we're the root of the tree;
393 // return the IAccessible for the window. 390 // return the IAccessible for the window.
394 parent = manager_->GetParentWindowIAccessible(); 391 parent = manager_->GetParentWindowIAccessible();
395 } 392 }
396 393
397 parent->AddRef(); 394 parent->AddRef();
398 *disp_parent = parent; 395 *disp_parent = parent;
399 return S_OK; 396 return S_OK;
400 } 397 }
401 398
402 STDMETHODIMP BrowserAccessibility::get_accRole(VARIANT var_id, VARIANT* role) { 399 STDMETHODIMP BrowserAccessibility::get_accRole(VARIANT var_id, VARIANT* role) {
403 if (!instance_active_) { 400 if (!instance_active_)
404 // Instance no longer active, fail gracefully.
405 return E_FAIL; 401 return E_FAIL;
406 }
407 402
408 if (!role) 403 if (!role)
409 return E_INVALIDARG; 404 return E_INVALIDARG;
410 405
411 BrowserAccessibility* target = GetTargetFromChildID(var_id); 406 BrowserAccessibility* target = GetTargetFromChildID(var_id);
412 if (!target) 407 if (!target)
413 return E_INVALIDARG; 408 return E_INVALIDARG;
414 409
415 role->vt = VT_I4; 410 if (!target->role_name_.empty()) {
416 role->lVal = target->role_; 411 role->vt = VT_BSTR;
412 role->bstrVal = SysAllocString(target->role_name_.c_str());
413 } else {
414 role->vt = VT_I4;
415 role->lVal = target->role_;
416 }
417 return S_OK; 417 return S_OK;
418 } 418 }
419 419
420 STDMETHODIMP BrowserAccessibility::get_accState(VARIANT var_id, 420 STDMETHODIMP BrowserAccessibility::get_accState(VARIANT var_id,
421 VARIANT* state) { 421 VARIANT* state) {
422 if (!instance_active_) { 422 if (!instance_active_)
423 // Instance no longer active, fail gracefully.
424 return E_FAIL; 423 return E_FAIL;
425 }
426 424
427 if (!state) 425 if (!state)
428 return E_INVALIDARG; 426 return E_INVALIDARG;
429 427
430 BrowserAccessibility* target = GetTargetFromChildID(var_id); 428 BrowserAccessibility* target = GetTargetFromChildID(var_id);
431 if (!target) 429 if (!target)
432 return E_INVALIDARG; 430 return E_INVALIDARG;
433 431
434 state->vt = VT_I4; 432 state->vt = VT_I4;
435 state->lVal = target->state_; 433 state->lVal = target->state_;
436 if (manager_->GetFocus(NULL) == this) 434 if (manager_->GetFocus(NULL) == this)
437 state->lVal |= STATE_SYSTEM_FOCUSED; 435 state->lVal |= STATE_SYSTEM_FOCUSED;
438 436
439 return S_OK; 437 return S_OK;
440 } 438 }
441 439
442 STDMETHODIMP BrowserAccessibility::get_accValue(VARIANT var_id, BSTR* value) { 440 STDMETHODIMP BrowserAccessibility::get_accValue(VARIANT var_id, BSTR* value) {
443 if (!instance_active_) { 441 if (!instance_active_)
444 // Instance no longer active, fail gracefully.
445 return E_FAIL; 442 return E_FAIL;
446 }
447 443
448 if (!value) 444 if (!value)
449 return E_INVALIDARG; 445 return E_INVALIDARG;
450 446
451 BrowserAccessibility* target = GetTargetFromChildID(var_id); 447 BrowserAccessibility* target = GetTargetFromChildID(var_id);
452 if (!target) 448 if (!target)
453 return E_INVALIDARG; 449 return E_INVALIDARG;
454 450
455 *value = SysAllocString(target->value_.c_str()); 451 *value = SysAllocString(target->value_.c_str());
456 452
457 DCHECK(*value); 453 DCHECK(*value);
458 return S_OK; 454 return S_OK;
459 } 455 }
460 456
461 STDMETHODIMP BrowserAccessibility::get_accHelpTopic(BSTR* help_file, 457 STDMETHODIMP BrowserAccessibility::get_accHelpTopic(BSTR* help_file,
462 VARIANT var_id, 458 VARIANT var_id,
463 LONG* topic_id) { 459 LONG* topic_id) {
464 return E_NOTIMPL; 460 return E_NOTIMPL;
465 } 461 }
466 462
467 STDMETHODIMP BrowserAccessibility::get_accSelection(VARIANT* selected) { 463 STDMETHODIMP BrowserAccessibility::get_accSelection(VARIANT* selected) {
468 if (!instance_active_) { 464 if (!instance_active_)
469 // Instance no longer active, fail gracefully.
470 return E_FAIL; 465 return E_FAIL;
471 }
472 466
473 return E_NOTIMPL; 467 return E_NOTIMPL;
474 } 468 }
475 469
476 STDMETHODIMP BrowserAccessibility::accSelect(LONG flags_sel, VARIANT var_id) { 470 STDMETHODIMP BrowserAccessibility::accSelect(LONG flags_sel, VARIANT var_id) {
477 if (!instance_active_) { 471 if (!instance_active_)
478 // Instance no longer active, fail gracefully.
479 return E_FAIL; 472 return E_FAIL;
473
474 if (flags_sel & SELFLAG_TAKEFOCUS) {
475 manager_->SetFocus(*this);
476 return S_OK;
480 } 477 }
481 478
482 return E_NOTIMPL; 479 return S_FALSE;
483 } 480 }
484 481
485 // 482 //
486 // IAccessible2 methods. 483 // IAccessible2 methods.
487 // 484 //
488 485
489 STDMETHODIMP BrowserAccessibility::role(LONG* role) { 486 STDMETHODIMP BrowserAccessibility::role(LONG* role) {
490 if (!instance_active_) { 487 if (!instance_active_)
491 // Instance no longer active, fail gracefully.
492 return E_FAIL; 488 return E_FAIL;
493 }
494 489
495 if (!role) 490 if (!role)
496 return E_INVALIDARG; 491 return E_INVALIDARG;
497 492
498 *role = role_; 493 *role = ia2_role_;
499 494
500 return S_OK; 495 return S_OK;
501 } 496 }
502 497
498 STDMETHODIMP BrowserAccessibility::get_attributes(BSTR* attributes) {
499 if (!instance_active_)
500 return E_FAIL;
501
502 if (!attributes)
503 return E_INVALIDARG;
504
505 return S_FALSE;
506 }
507
503 STDMETHODIMP BrowserAccessibility::get_states(AccessibleStates* states) { 508 STDMETHODIMP BrowserAccessibility::get_states(AccessibleStates* states) {
504 if (!instance_active_) { 509 if (!instance_active_)
505 // Instance no longer active, fail gracefully.
506 return E_FAIL; 510 return E_FAIL;
507 }
508 511
509 if (!states) 512 if (!states)
510 return E_INVALIDARG; 513 return E_INVALIDARG;
511 514
512 *states = state_; 515 *states = ia2_state_;
513 516
514 return S_OK; 517 return S_OK;
515 } 518 }
516 519
517 STDMETHODIMP BrowserAccessibility::get_uniqueID(LONG* unique_id) { 520 STDMETHODIMP BrowserAccessibility::get_uniqueID(LONG* unique_id) {
518 if (!instance_active_) { 521 if (!instance_active_)
519 // Instance no longer active, fail gracefully.
520 return E_FAIL; 522 return E_FAIL;
521 }
522 523
523 if (!unique_id) 524 if (!unique_id)
524 return E_INVALIDARG; 525 return E_INVALIDARG;
525 526
526 *unique_id = child_id_; 527 *unique_id = child_id_;
527 return S_OK; 528 return S_OK;
528 } 529 }
529 530
530 STDMETHODIMP BrowserAccessibility::get_windowHandle(HWND* window_handle) { 531 STDMETHODIMP BrowserAccessibility::get_windowHandle(HWND* window_handle) {
531 if (!instance_active_) { 532 if (!instance_active_)
532 // Instance no longer active, fail gracefully.
533 return E_FAIL; 533 return E_FAIL;
534 }
535 534
536 if (!window_handle) 535 if (!window_handle)
537 return E_INVALIDARG; 536 return E_INVALIDARG;
538 537
539 *window_handle = manager_->GetParentHWND(); 538 *window_handle = manager_->GetParentHWND();
540 return S_OK; 539 return S_OK;
541 } 540 }
542 541
543 STDMETHODIMP BrowserAccessibility::get_indexInParent(LONG* index_in_parent) { 542 STDMETHODIMP BrowserAccessibility::get_indexInParent(LONG* index_in_parent) {
544 if (!instance_active_) { 543 if (!instance_active_)
545 // Instance no longer active, fail gracefully.
546 return E_FAIL; 544 return E_FAIL;
547 }
548 545
549 if (!index_in_parent) 546 if (!index_in_parent)
550 return E_INVALIDARG; 547 return E_INVALIDARG;
551 548
552 *index_in_parent = index_in_parent_; 549 *index_in_parent = index_in_parent_;
553 return S_OK; 550 return S_OK;
554 } 551 }
555 552
556 // 553 //
554 // IAccessibleImage methods.
555 //
556
557 STDMETHODIMP BrowserAccessibility::get_description(BSTR* desc) {
558 if (!instance_active_)
559 return E_FAIL;
560
561 if (!desc)
562 return E_INVALIDARG;
563
564 string16 description;
565 if (!GetAttribute(WebAccessibility::ATTR_DESCRIPTION, &description))
566 return S_FALSE;
567
568 if (description.empty())
569 return S_FALSE;
570
571 *desc = SysAllocString(description.c_str());
572
573 DCHECK(*desc);
574 return S_OK;
575 }
576
577 STDMETHODIMP BrowserAccessibility::get_imagePosition(
578 enum IA2CoordinateType coordinate_type, long* x, long* y) {
579 if (!instance_active_)
580 return E_FAIL;
581
582 if (!x || !y)
583 return E_INVALIDARG;
584
585 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) {
586 HWND parent_hwnd = manager_->GetParentHWND();
587 POINT top_left = {0, 0};
588 ::ClientToScreen(parent_hwnd, &top_left);
589 *x = location_.x + top_left.x;
590 *y = location_.y + top_left.y;
591 } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) {
592 *x = location_.x;
593 *y = location_.y;
594 if (parent_) {
595 *x -= parent_->location_.x;
596 *y -= parent_->location_.y;
597 }
598 } else {
599 return E_INVALIDARG;
600 }
601
602 return S_OK;
603 }
604
605 STDMETHODIMP BrowserAccessibility::get_imageSize(long* height, long* width) {
606 if (!instance_active_)
607 return E_FAIL;
608
609 if (!height || !width)
610 return E_INVALIDARG;
611
612 *height = location_.height;
613 *width = location_.width;
614 return S_OK;
615 }
616
617 //
618 // IAccessibleText methods.
619 //
620
621 STDMETHODIMP BrowserAccessibility::get_nCharacters(long* n_characters) {
622 if (!instance_active_)
623 return E_FAIL;
624
625 if (!n_characters)
626 return E_INVALIDARG;
627
628 *n_characters = name_.length();
629 return S_OK;
630 }
631
632 STDMETHODIMP BrowserAccessibility::get_text(
633 long start_offset, long end_offset, BSTR* text) {
634 if (!instance_active_)
635 return E_FAIL;
636
637 if (!text)
638 return E_INVALIDARG;
639
640 long len = name_.length();
641 if (start_offset < 0)
642 start_offset = 0;
643 if (end_offset > len)
644 end_offset = len;
645
646 *text = SysAllocString(
647 name_.substr(start_offset, end_offset - start_offset).c_str());
648 return S_OK;
649 }
650
651 STDMETHODIMP BrowserAccessibility::get_caretOffset(long* offset) {
652 *offset = 0;
653 return S_OK;
654 }
655
656 //
557 // IServiceProvider methods. 657 // IServiceProvider methods.
558 // 658 //
559 659
560 STDMETHODIMP BrowserAccessibility::QueryService( 660 STDMETHODIMP BrowserAccessibility::QueryService(
561 REFGUID guidService, REFIID riid, void** object) { 661 REFGUID guidService, REFIID riid, void** object) {
562 if (!instance_active_) { 662 if (!instance_active_)
563 // Instance no longer active, fail gracefully.
564 return E_FAIL; 663 return E_FAIL;
565 }
566 664
567 if (guidService == IID_IAccessible || guidService == IID_IAccessible2) 665 if (guidService == IID_IAccessible || guidService == IID_IAccessible2)
568 return QueryInterface(riid, object); 666 return QueryInterface(riid, object);
569 667
570 *object = NULL; 668 *object = NULL;
571 return E_FAIL; 669 return E_FAIL;
572 } 670 }
573 671
574 // 672 //
673 // CComObjectRootEx methods.
674 //
675
676 HRESULT WINAPI BrowserAccessibility::InternalQueryInterface(
677 void* this_ptr,
678 const _ATL_INTMAP_ENTRY* entries,
679 REFIID iid,
680 void** object) {
681 if (iid == IID_IAccessibleText) {
682 if (role_ != ROLE_SYSTEM_LINK) {
683 *object = NULL;
684 return E_NOINTERFACE;
685 }
686 } else if (iid == IID_IAccessibleImage) {
687 if (role_ != ROLE_SYSTEM_GRAPHIC) {
688 *object = NULL;
689 return E_NOINTERFACE;
690 }
691 }
692
693 return CComObjectRootBase::InternalQueryInterface(
694 this_ptr, entries, iid, object);
695 }
696
697 //
575 // Private methods. 698 // Private methods.
576 // 699 //
577 700
578 BrowserAccessibility* BrowserAccessibility::GetTargetFromChildID( 701 BrowserAccessibility* BrowserAccessibility::GetTargetFromChildID(
579 const VARIANT& var_id) { 702 const VARIANT& var_id) {
580 if (var_id.vt != VT_I4) 703 if (var_id.vt != VT_I4)
581 return NULL; 704 return NULL;
582 705
583 LONG child_id = var_id.lVal; 706 LONG child_id = var_id.lVal;
584 if (child_id == CHILDID_SELF) 707 if (child_id == CHILDID_SELF)
585 return this; 708 return this;
586 709
587 if (child_id >= 1 && child_id <= static_cast<LONG>(children_.size())) 710 if (child_id >= 1 && child_id <= static_cast<LONG>(children_.size()))
588 return children_[child_id - 1]; 711 return children_[child_id - 1];
589 712
590 return manager_->GetFromChildID(child_id); 713 return manager_->GetFromChildID(child_id);
591 } 714 }
592 715
593 LONG BrowserAccessibility::MSAARole(LONG browser_accessibility_role) { 716 bool BrowserAccessibility::HasAttribute(WebAccessibility::Attribute attribute) {
594 switch (browser_accessibility_role) { 717 return (attributes_.find(attribute) != attributes_.end());
718 }
719
720 bool BrowserAccessibility::GetAttribute(
721 WebAccessibility::Attribute attribute, string16* value) {
722 std::map<int32, string16>::iterator iter = attributes_.find(attribute);
723 if (iter != attributes_.end()) {
724 *value = iter->second;
725 return true;
726 }
727
728 return false;
729 }
730
731 void BrowserAccessibility::InitRoleAndState(LONG web_role,
732 LONG web_state) {
733 state_ = 0;
734 ia2_state_ = IA2_STATE_OPAQUE;
735
736 if ((web_state >> WebAccessibility::STATE_CHECKED) & 1)
737 state_ |= STATE_SYSTEM_CHECKED;
738 if ((web_state >> WebAccessibility::STATE_FOCUSABLE) & 1)
739 state_ |= STATE_SYSTEM_FOCUSABLE;
740 if ((web_state >> WebAccessibility::STATE_HOTTRACKED) & 1)
741 state_ |= STATE_SYSTEM_HOTTRACKED;
742 if ((web_state >> WebAccessibility::STATE_INDETERMINATE) & 1)
743 state_ |= STATE_SYSTEM_INDETERMINATE;
744 if ((web_state >> WebAccessibility::STATE_LINKED) & 1)
745 state_ |= STATE_SYSTEM_LINKED;
746 if ((web_state >> WebAccessibility::STATE_MULTISELECTABLE) & 1)
747 state_ |= STATE_SYSTEM_MULTISELECTABLE;
748 if ((web_state >> WebAccessibility::STATE_OFFSCREEN) & 1)
749 state_ |= STATE_SYSTEM_OFFSCREEN;
750 if ((web_state >> WebAccessibility::STATE_PRESSED) & 1)
751 state_ |= STATE_SYSTEM_PRESSED;
752 if ((web_state >> WebAccessibility::STATE_PROTECTED) & 1)
753 state_ |= STATE_SYSTEM_PROTECTED;
754 if ((web_state >> WebAccessibility::STATE_READONLY) & 1)
755 state_ |= STATE_SYSTEM_READONLY;
756 if ((web_state >> WebAccessibility::STATE_TRAVERSED) & 1)
757 state_ |= STATE_SYSTEM_TRAVERSED;
758 if ((web_state >> WebAccessibility::STATE_UNAVAILABLE) & 1)
759 state_ |= STATE_SYSTEM_UNAVAILABLE;
760
761 role_ = 0;
762 ia2_role_ = 0;
763 switch (web_role) {
764 case WebAccessibility::ROLE_ALERT:
765 case WebAccessibility::ROLE_ALERT_DIALOG:
766 role_ = ROLE_SYSTEM_ALERT;
767 break;
595 case WebAccessibility::ROLE_APPLICATION: 768 case WebAccessibility::ROLE_APPLICATION:
596 return ROLE_SYSTEM_APPLICATION; 769 role_ = ROLE_SYSTEM_APPLICATION;
770 break;
771 case WebAccessibility::ROLE_ARTICLE:
772 role_ = ROLE_SYSTEM_GROUPING;
773 ia2_role_ = IA2_ROLE_SECTION;
774 break;
775 case WebAccessibility::ROLE_BUTTON:
776 role_ = ROLE_SYSTEM_PUSHBUTTON;
777 break;
597 case WebAccessibility::ROLE_CELL: 778 case WebAccessibility::ROLE_CELL:
598 return ROLE_SYSTEM_CELL; 779 role_ = ROLE_SYSTEM_CELL;
599 case WebAccessibility::ROLE_CHECKBUTTON: 780 break;
600 return ROLE_SYSTEM_CHECKBUTTON; 781 case WebAccessibility::ROLE_CHECKBOX:
782 role_ = ROLE_SYSTEM_CHECKBUTTON;
783 break;
784 case WebAccessibility::ROLE_COLOR_WELL:
785 role_ = ROLE_SYSTEM_CLIENT;
786 ia2_role_ = IA2_ROLE_COLOR_CHOOSER;
787 break;
601 case WebAccessibility::ROLE_COLUMN: 788 case WebAccessibility::ROLE_COLUMN:
602 return ROLE_SYSTEM_COLUMN; 789 role_ = ROLE_SYSTEM_COLUMN;
603 case WebAccessibility::ROLE_COLUMNHEADER: 790 break;
604 return ROLE_SYSTEM_COLUMNHEADER; 791 case WebAccessibility::ROLE_COLUMN_HEADER:
792 role_ = ROLE_SYSTEM_COLUMNHEADER;
793 break;
794 case WebAccessibility::ROLE_COMBO_BOX:
795 role_ = ROLE_SYSTEM_COMBOBOX;
796 break;
797 case WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION:
798 role_name_ = L"dd";
799 ia2_role_ = IA2_ROLE_PARAGRAPH;
800 break;
801 case WebAccessibility::ROLE_DEFINITION_LIST_TERM:
802 role_ = ROLE_SYSTEM_LISTITEM;
803 break;
804 case WebAccessibility::ROLE_DIALOG:
805 role_ = ROLE_SYSTEM_DIALOG;
806 break;
605 case WebAccessibility::ROLE_DOCUMENT: 807 case WebAccessibility::ROLE_DOCUMENT:
606 return ROLE_SYSTEM_DOCUMENT; 808 case WebAccessibility::ROLE_WEB_AREA:
607 case WebAccessibility::ROLE_GRAPHIC: 809 role_ = ROLE_SYSTEM_DOCUMENT;
608 return ROLE_SYSTEM_GRAPHIC; 810 state_ |= STATE_SYSTEM_READONLY;
609 case WebAccessibility::ROLE_GROUPING: 811 state_ |= STATE_SYSTEM_FOCUSABLE;
610 return ROLE_SYSTEM_GROUPING; 812 break;
813 case WebAccessibility::ROLE_EDITABLE_TEXT:
814 role_ = ROLE_SYSTEM_TEXT;
815 ia2_state_ |= IA2_STATE_SINGLE_LINE;
816 ia2_state_ |= IA2_STATE_EDITABLE;
817 break;
818 case WebAccessibility::ROLE_GRID:
819 role_ = ROLE_SYSTEM_TABLE;
820 break;
821 case WebAccessibility::ROLE_GROUP:
822 role_name_ = L"div";
823 ia2_role_ = IA2_ROLE_SECTION;
824 break;
825 case WebAccessibility::ROLE_HEADING:
826 // TODO(dmazzoni): support all heading levels
827 role_name_ = L"h1";
828 ia2_role_ = IA2_ROLE_HEADING;
829 break;
830 case WebAccessibility::ROLE_IMAGE:
831 role_ = ROLE_SYSTEM_GRAPHIC;
832 break;
833 case WebAccessibility::ROLE_IMAGE_MAP:
834 role_name_ = L"map";
835 ia2_role_ = IA2_ROLE_IMAGE_MAP;
836 break;
837 case WebAccessibility::ROLE_IMAGE_MAP_LINK:
838 role_ = ROLE_SYSTEM_LINK;
839 state_ |= STATE_SYSTEM_LINKED;
840 break;
841 case WebAccessibility::ROLE_LANDMARK_APPLICATION:
842 case WebAccessibility::ROLE_LANDMARK_BANNER:
843 case WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY:
844 case WebAccessibility::ROLE_LANDMARK_CONTENTINFO:
845 case WebAccessibility::ROLE_LANDMARK_MAIN:
846 case WebAccessibility::ROLE_LANDMARK_NAVIGATION:
847 case WebAccessibility::ROLE_LANDMARK_SEARCH:
848 role_ = ROLE_SYSTEM_GROUPING;
849 ia2_role_ = IA2_ROLE_SECTION;
850 break;
611 case WebAccessibility::ROLE_LINK: 851 case WebAccessibility::ROLE_LINK:
612 return ROLE_SYSTEM_LINK; 852 case WebAccessibility::ROLE_WEBCORE_LINK:
853 role_ = ROLE_SYSTEM_LINK;
854 state_ |= STATE_SYSTEM_LINKED;
855 break;
613 case WebAccessibility::ROLE_LIST: 856 case WebAccessibility::ROLE_LIST:
857 role_ = ROLE_SYSTEM_LIST;
858 break;
614 case WebAccessibility::ROLE_LISTBOX: 859 case WebAccessibility::ROLE_LISTBOX:
615 return ROLE_SYSTEM_LIST; 860 role_ = ROLE_SYSTEM_LIST;
616 case WebAccessibility::ROLE_LISTITEM: 861 break;
617 return ROLE_SYSTEM_LISTITEM; 862 case WebAccessibility::ROLE_LISTBOX_OPTION:
618 case WebAccessibility::ROLE_MENUBAR: 863 case WebAccessibility::ROLE_LIST_ITEM:
619 return ROLE_SYSTEM_MENUBAR; 864 case WebAccessibility::ROLE_LIST_MARKER:
620 case WebAccessibility::ROLE_MENUITEM: 865 role_ = ROLE_SYSTEM_LISTITEM;
621 return ROLE_SYSTEM_MENUITEM; 866 break;
622 case WebAccessibility::ROLE_MENUPOPUP: 867 case WebAccessibility::ROLE_MENU:
623 return ROLE_SYSTEM_MENUPOPUP; 868 case WebAccessibility::ROLE_MENU_BUTTON:
869 role_ = ROLE_SYSTEM_MENUPOPUP;
870 break;
871 case WebAccessibility::ROLE_MENU_BAR:
872 role_ = ROLE_SYSTEM_MENUBAR;
873 break;
874 case WebAccessibility::ROLE_MENU_ITEM:
875 case WebAccessibility::ROLE_MENU_LIST_OPTION:
876 role_ = ROLE_SYSTEM_MENUITEM;
877 break;
878 case WebAccessibility::ROLE_MENU_LIST_POPUP:
879 role_ = ROLE_SYSTEM_MENUPOPUP;
880 break;
881 case WebAccessibility::ROLE_NOTE:
882 role_ = ROLE_SYSTEM_GROUPING;
883 ia2_role_ = IA2_ROLE_NOTE;
884 break;
624 case WebAccessibility::ROLE_OUTLINE: 885 case WebAccessibility::ROLE_OUTLINE:
625 return ROLE_SYSTEM_OUTLINE; 886 role_ = ROLE_SYSTEM_OUTLINE;
626 case WebAccessibility::ROLE_PAGETABLIST: 887 break;
627 return ROLE_SYSTEM_PAGETABLIST; 888 case WebAccessibility::ROLE_POPUP_BUTTON:
628 case WebAccessibility::ROLE_PROGRESSBAR: 889 role_ = ROLE_SYSTEM_COMBOBOX;
629 return ROLE_SYSTEM_PROGRESSBAR; 890 break;
630 case WebAccessibility::ROLE_PUSHBUTTON: 891 case WebAccessibility::ROLE_PROGRESS_INDICATOR:
631 return ROLE_SYSTEM_PUSHBUTTON; 892 role_ = ROLE_SYSTEM_PROGRESSBAR;
632 case WebAccessibility::ROLE_RADIOBUTTON: 893 break;
633 return ROLE_SYSTEM_RADIOBUTTON; 894 case WebAccessibility::ROLE_RADIO_BUTTON:
895 role_ = ROLE_SYSTEM_RADIOBUTTON;
896 break;
897 case WebAccessibility::ROLE_RADIO_GROUP:
898 role_ = ROLE_SYSTEM_GROUPING;
899 ia2_role_ = IA2_ROLE_SECTION;
900 break;
901 case WebAccessibility::ROLE_REGION:
902 role_ = ROLE_SYSTEM_GROUPING;
903 ia2_role_ = IA2_ROLE_SECTION;
904 break;
634 case WebAccessibility::ROLE_ROW: 905 case WebAccessibility::ROLE_ROW:
635 return ROLE_SYSTEM_ROW; 906 role_ = ROLE_SYSTEM_ROW;
636 case WebAccessibility::ROLE_ROWHEADER: 907 break;
637 return ROLE_SYSTEM_ROWHEADER; 908 case WebAccessibility::ROLE_ROW_HEADER:
638 case WebAccessibility::ROLE_SEPARATOR: 909 role_ = ROLE_SYSTEM_ROWHEADER;
639 return ROLE_SYSTEM_SEPARATOR; 910 break;
911 case WebAccessibility::ROLE_RULER:
912 role_ = ROLE_SYSTEM_CLIENT;
913 ia2_role_ = IA2_ROLE_RULER;
914 break;
915 case WebAccessibility::ROLE_SCROLLAREA:
916 role_ = ROLE_SYSTEM_CLIENT;
917 ia2_role_ = IA2_ROLE_SCROLL_PANE;
918 break;
919 case WebAccessibility::ROLE_SCROLLBAR:
920 role_ = ROLE_SYSTEM_SCROLLBAR;
921 break;
640 case WebAccessibility::ROLE_SLIDER: 922 case WebAccessibility::ROLE_SLIDER:
641 return ROLE_SYSTEM_SLIDER; 923 role_ = ROLE_SYSTEM_SLIDER;
642 case WebAccessibility::ROLE_STATICTEXT: 924 break;
643 return ROLE_SYSTEM_STATICTEXT; 925 case WebAccessibility::ROLE_SPLIT_GROUP:
644 case WebAccessibility::ROLE_STATUSBAR: 926 role_ = ROLE_SYSTEM_CLIENT;
645 return ROLE_SYSTEM_STATUSBAR; 927 ia2_role_ = IA2_ROLE_SPLIT_PANE;
928 break;
929 case WebAccessibility::ROLE_ANNOTATION:
930 case WebAccessibility::ROLE_STATIC_TEXT:
931 role_ = ROLE_SYSTEM_TEXT;
932 break;
933 case WebAccessibility::ROLE_STATUS:
934 role_ = ROLE_SYSTEM_STATUSBAR;
935 break;
936 case WebAccessibility::ROLE_TAB:
937 role_ = ROLE_SYSTEM_PAGETAB;
938 break;
646 case WebAccessibility::ROLE_TABLE: 939 case WebAccessibility::ROLE_TABLE:
647 return ROLE_SYSTEM_TABLE; 940 role_ = ROLE_SYSTEM_TABLE;
648 case WebAccessibility::ROLE_TEXT: 941 break;
649 return ROLE_SYSTEM_TEXT; 942 case WebAccessibility::ROLE_TABLE_HEADER_CONTAINER:
943 role_ = ROLE_SYSTEM_GROUPING;
944 ia2_role_ = IA2_ROLE_SECTION;
945 break;
946 case WebAccessibility::ROLE_TAB_GROUP:
947 case WebAccessibility::ROLE_TAB_LIST:
948 case WebAccessibility::ROLE_TAB_PANEL:
949 role_ = ROLE_SYSTEM_PAGETABLIST;
950 break;
951 case WebAccessibility::ROLE_TEXTAREA:
952 role_ = ROLE_SYSTEM_TEXT;
953 ia2_state_ |= IA2_STATE_MULTI_LINE;
954 ia2_state_ |= IA2_STATE_EDITABLE;
955 break;
956 case WebAccessibility::ROLE_TEXT_FIELD:
957 role_ = ROLE_SYSTEM_TEXT;
958 ia2_state_ |= IA2_STATE_SINGLE_LINE;
959 ia2_state_ |= IA2_STATE_EDITABLE;
960 break;
650 case WebAccessibility::ROLE_TOOLBAR: 961 case WebAccessibility::ROLE_TOOLBAR:
651 return ROLE_SYSTEM_TOOLBAR; 962 role_ = ROLE_SYSTEM_TOOLBAR;
963 break;
652 case WebAccessibility::ROLE_TOOLTIP: 964 case WebAccessibility::ROLE_TOOLTIP:
653 return ROLE_SYSTEM_TOOLTIP; 965 role_ = ROLE_SYSTEM_TOOLTIP;
654 case WebAccessibility::ROLE_CLIENT: 966 break;
967 case WebAccessibility::ROLE_TREE:
968 role_ = ROLE_SYSTEM_OUTLINE;
969 break;
970 case WebAccessibility::ROLE_TREE_GRID:
971 role_ = ROLE_SYSTEM_OUTLINE;
972 break;
973 case WebAccessibility::ROLE_TREE_ITEM:
974 role_ = ROLE_SYSTEM_OUTLINEITEM;
975 break;
976 case WebAccessibility::ROLE_WINDOW:
977 role_ = ROLE_SYSTEM_WINDOW;
978 break;
979
980 // TODO(dmazzoni): figure out the proper MSAA role for all of these.
981 case WebAccessibility::ROLE_BROWSER:
982 case WebAccessibility::ROLE_BUSY_INDICATOR:
983 case WebAccessibility::ROLE_DIRECTORY:
984 case WebAccessibility::ROLE_DISCLOSURE_TRIANGLE:
985 case WebAccessibility::ROLE_DRAWER:
986 case WebAccessibility::ROLE_GROW_AREA:
987 case WebAccessibility::ROLE_HELP_TAG:
988 case WebAccessibility::ROLE_IGNORED:
989 case WebAccessibility::ROLE_INCREMENTOR:
990 case WebAccessibility::ROLE_LOG:
991 case WebAccessibility::ROLE_MARQUEE:
992 case WebAccessibility::ROLE_MATH:
993 case WebAccessibility::ROLE_MATTE:
994 case WebAccessibility::ROLE_RULER_MARKER:
995 case WebAccessibility::ROLE_SHEET:
996 case WebAccessibility::ROLE_SLIDER_THUMB:
997 case WebAccessibility::ROLE_SPLITTER:
998 case WebAccessibility::ROLE_SYSTEM_WIDE:
999 case WebAccessibility::ROLE_TIMER:
1000 case WebAccessibility::ROLE_VALUE_INDICATOR:
655 default: 1001 default:
656 // This is the default role for MSAA. 1002 role_ = ROLE_SYSTEM_CLIENT;
657 return ROLE_SYSTEM_CLIENT; 1003 break;
658 } 1004 }
1005
1006 // The role should always be set.
1007 DCHECK(!role_name_.empty() || role_);
1008
1009 // If we didn't explicitly set the IAccessible2 role, make it the same
1010 // as the MSAA role.
1011 if (!ia2_role_)
1012 ia2_role_ = role_;
659 } 1013 }
660
661 LONG BrowserAccessibility::MSAAState(LONG browser_accessibility_state) {
662 LONG state = 0;
663
664 if ((browser_accessibility_state >> WebAccessibility::STATE_CHECKED) & 1)
665 state |= STATE_SYSTEM_CHECKED;
666
667 if ((browser_accessibility_state >> WebAccessibility::STATE_FOCUSABLE) & 1)
668 state |= STATE_SYSTEM_FOCUSABLE;
669
670 if ((browser_accessibility_state >> WebAccessibility::STATE_FOCUSED) & 1)
671 state |= STATE_SYSTEM_FOCUSED;
672
673 if ((browser_accessibility_state >> WebAccessibility::STATE_HOTTRACKED) & 1)
674 state |= STATE_SYSTEM_HOTTRACKED;
675
676 if ((browser_accessibility_state >>
677 WebAccessibility::STATE_INDETERMINATE) & 1) {
678 state |= STATE_SYSTEM_INDETERMINATE;
679 }
680
681 if ((browser_accessibility_state >> WebAccessibility::STATE_LINKED) & 1)
682 state |= STATE_SYSTEM_LINKED;
683
684 if ((browser_accessibility_state >>
685 WebAccessibility::STATE_MULTISELECTABLE) & 1) {
686 state |= STATE_SYSTEM_MULTISELECTABLE;
687 }
688
689 if ((browser_accessibility_state >> WebAccessibility::STATE_OFFSCREEN) & 1)
690 state |= STATE_SYSTEM_OFFSCREEN;
691
692 if ((browser_accessibility_state >> WebAccessibility::STATE_PRESSED) & 1)
693 state |= STATE_SYSTEM_PRESSED;
694
695 if ((browser_accessibility_state >> WebAccessibility::STATE_PROTECTED) & 1)
696 state |= STATE_SYSTEM_PROTECTED;
697
698 if ((browser_accessibility_state >> WebAccessibility::STATE_READONLY) & 1)
699 state |= STATE_SYSTEM_READONLY;
700
701 if ((browser_accessibility_state >> WebAccessibility::STATE_TRAVERSED) & 1)
702 state |= STATE_SYSTEM_TRAVERSED;
703
704 if ((browser_accessibility_state >> WebAccessibility::STATE_UNAVAILABLE) & 1)
705 state |= STATE_SYSTEM_UNAVAILABLE;
706
707 return state;
708 }
OLDNEW
« no previous file with comments | « chrome/browser/browser_accessibility.h ('k') | chrome/browser/browser_accessibility_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698