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

Side by Side Diff: chrome/browser/accessibility/browser_accessibility_win.cc

Issue 3582015: Revert 61704 - Make BrowserAccessibilityManager cross platform. Step 2. In Pr... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 10 years, 2 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
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/accessibility/browser_accessibility_win.h" 5 #include "chrome/browser/accessibility/browser_accessibility_win.h"
6 6
7 #include "base/string_number_conversions.h" 7 #include "base/string_number_conversions.h"
8 #include "base/string_util.h" 8 #include "base/string_util.h"
9 #include "base/utf_string_conversions.h" 9 #include "base/utf_string_conversions.h"
10 #include "chrome/browser/accessibility/browser_accessibility_manager_win.h" 10 #include "chrome/browser/accessibility/browser_accessibility_manager_win.h"
11 #include "net/base/escape.h" 11 #include "net/base/escape.h"
12 12
13 using webkit_glue::WebAccessibility; 13 using webkit_glue::WebAccessibility;
14 14
15 // static
16 BrowserAccessibility* BrowserAccessibility::Create() {
17 CComObject<BrowserAccessibilityWin>* instance;
18 HRESULT hr = CComObject<BrowserAccessibilityWin>::CreateInstance(&instance);
19 DCHECK(SUCCEEDED(hr));
20 return instance->NewReference();
21 }
22
23 BrowserAccessibilityWin* BrowserAccessibility::toBrowserAccessibilityWin() {
24 return static_cast<BrowserAccessibilityWin*>(this);
25 }
26
27 BrowserAccessibilityWin::BrowserAccessibilityWin() 15 BrowserAccessibilityWin::BrowserAccessibilityWin()
28 : instance_active_(false) { 16 : manager_(NULL),
17 parent_(NULL),
18 child_id_(-1),
19 index_in_parent_(-1),
20 renderer_id_(-1),
21 instance_active_(false) {
29 } 22 }
30 23
31 BrowserAccessibilityWin::~BrowserAccessibilityWin() { 24 BrowserAccessibilityWin::~BrowserAccessibilityWin() {
32 ReleaseTree(); 25 InactivateTree();
26 }
27
28 void BrowserAccessibilityWin::Initialize(
29 BrowserAccessibilityManagerWin* manager,
30 BrowserAccessibilityWin* parent,
31 LONG child_id,
32 LONG index_in_parent,
33 const webkit_glue::WebAccessibility& src) {
34 manager_ = manager;
35 parent_ = parent;
36 child_id_ = child_id;
37 index_in_parent_ = index_in_parent;
38
39 renderer_id_ = src.id;
40 name_ = src.name;
41 value_ = src.value;
42 attributes_ = src.attributes;
43 html_attributes_ = src.html_attributes;
44 location_ = src.location;
45 src_role_ = src.role;
46 InitRoleAndState(src.role, src.state);
47
48 // Expose headings levels to NVDA with the "level" object attribute.
49 if (src.role == WebAccessibility::ROLE_HEADING && role_name_.size() == 2 &&
50 IsAsciiDigit(role_name_[1])) {
51 html_attributes_.push_back(std::make_pair(L"level", role_name_.substr(1)));
52 }
53
54 // If this object doesn't have a name but it does have a description,
55 // use the description as its name - because some screen readers only
56 // announce the name.
57 if (name_.empty() && HasAttribute(WebAccessibility::ATTR_DESCRIPTION)) {
58 GetAttribute(WebAccessibility::ATTR_DESCRIPTION, &name_);
59 }
60
61 instance_active_ = true;
62 }
63
64 void BrowserAccessibilityWin::AddChild(BrowserAccessibilityWin* child) {
65 children_.push_back(child);
66 }
67
68 void BrowserAccessibilityWin::InactivateTree() {
69 if (!instance_active_)
70 return;
71
72 // Mark this object as inactive, so calls to all COM methods will return
73 // failure.
74 instance_active_ = false;
75
76 // Now we can safely call InactivateTree on our children and remove
77 // references to them, so that as much of the tree as possible will be
78 // destroyed now - however, nodes that still have references to them
79 // might stick around a while until all clients have released them.
80 for (std::vector<BrowserAccessibilityWin*>::iterator iter =
81 children_.begin();
82 iter != children_.end(); ++iter) {
83 (*iter)->InactivateTree();
84 (*iter)->Release();
85 }
86 children_.clear();
87 manager_->Remove(child_id_);
88 }
89
90 bool BrowserAccessibilityWin::IsDescendantOf(
91 BrowserAccessibilityWin* ancestor) {
92 if (this == ancestor) {
93 return true;
94 } else if (parent_) {
95 return parent_->IsDescendantOf(ancestor);
96 }
97
98 return false;
99 }
100
101 BrowserAccessibilityWin* BrowserAccessibilityWin::GetParent() {
102 return parent_;
103 }
104
105 uint32 BrowserAccessibilityWin::GetChildCount() {
106 return children_.size();
107 }
108
109 BrowserAccessibilityWin* BrowserAccessibilityWin::GetChild(uint32 child_index) {
110 DCHECK(child_index >= 0 && child_index < children_.size());
111 return children_[child_index];
112 }
113
114 BrowserAccessibilityWin* BrowserAccessibilityWin::GetPreviousSibling() {
115 if (parent_ && index_in_parent_ > 0)
116 return parent_->children_[index_in_parent_ - 1];
117
118 return NULL;
119 }
120
121 BrowserAccessibilityWin* BrowserAccessibilityWin::GetNextSibling() {
122 if (parent_ &&
123 index_in_parent_ >= 0 &&
124 index_in_parent_ < static_cast<int>(parent_->children_.size() - 1)) {
125 return parent_->children_[index_in_parent_ + 1];
126 }
127
128 return NULL;
129 }
130
131 void BrowserAccessibilityWin::ReplaceChild(
132 const BrowserAccessibilityWin* old_acc, BrowserAccessibilityWin* new_acc) {
133 DCHECK_EQ(children_[old_acc->index_in_parent_], old_acc);
134
135 old_acc = children_[old_acc->index_in_parent_];
136 children_[old_acc->index_in_parent_] = new_acc;
137 }
138
139 BrowserAccessibilityWin* BrowserAccessibilityWin::NewReference() {
140 AddRef();
141 return this;
33 } 142 }
34 143
35 // 144 //
36 // IAccessible methods. 145 // IAccessible methods.
37 // 146 //
38 // Conventions: 147 // Conventions:
39 // * Always test for instance_active_ first and return E_FAIL if it's false. 148 // * Always test for instance_active_ first and return E_FAIL if it's false.
40 // * Always check for invalid arguments first, even if they're unused. 149 // * Always check for invalid arguments first, even if they're unused.
41 // * Return S_FALSE if the only output is a string argument and it's empty. 150 // * Return S_FALSE if the only output is a string argument and it's empty.
42 // 151 //
(...skipping 29 matching lines...) Expand all
72 181
73 if (!x_left || !y_top || !width || !height) 182 if (!x_left || !y_top || !width || !height)
74 return E_INVALIDARG; 183 return E_INVALIDARG;
75 184
76 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 185 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
77 if (!target) 186 if (!target)
78 return E_INVALIDARG; 187 return E_INVALIDARG;
79 188
80 // Find the top left corner of the containing window in screen coords, and 189 // Find the top left corner of the containing window in screen coords, and
81 // adjust the output position by this amount. 190 // adjust the output position by this amount.
82 HWND parent_hwnd = manager_->GetParentView(); 191 HWND parent_hwnd = manager_->GetParentWindow();
83 POINT top_left = {0, 0}; 192 POINT top_left = {0, 0};
84 ::ClientToScreen(parent_hwnd, &top_left); 193 ::ClientToScreen(parent_hwnd, &top_left);
85 194
86 *x_left = target->location_.x + top_left.x; 195 *x_left = target->location_.x + top_left.x;
87 *y_top = target->location_.y + top_left.y; 196 *y_top = target->location_.y + top_left.y;
88 *width = target->location_.width; 197 *width = target->location_.width;
89 *height = target->location_.height; 198 *height = target->location_.height;
90 199
91 return S_OK; 200 return S_OK;
92 } 201 }
93 202
94 STDMETHODIMP BrowserAccessibilityWin::accNavigate( 203 STDMETHODIMP BrowserAccessibilityWin::accNavigate(
95 LONG nav_dir, VARIANT start, VARIANT* end) { 204 LONG nav_dir, VARIANT start, VARIANT* end) {
96 BrowserAccessibilityWin* target = GetTargetFromChildID(start); 205 BrowserAccessibilityWin* target = GetTargetFromChildID(start);
97 if (!target) 206 if (!target)
98 return E_INVALIDARG; 207 return E_INVALIDARG;
99 208
100 if ((nav_dir == NAVDIR_LASTCHILD || nav_dir == NAVDIR_FIRSTCHILD) && 209 if ((nav_dir == NAVDIR_LASTCHILD || nav_dir == NAVDIR_FIRSTCHILD) &&
101 start.lVal != CHILDID_SELF) { 210 start.lVal != CHILDID_SELF) {
102 // MSAA states that navigating to first/last child can only be from self. 211 // MSAA states that navigating to first/last child can only be from self.
103 return E_INVALIDARG; 212 return E_INVALIDARG;
104 } 213 }
105 214
106 BrowserAccessibility* result = NULL; 215 BrowserAccessibilityWin* result = NULL;
107 switch (nav_dir) { 216 switch (nav_dir) {
108 case NAVDIR_DOWN: 217 case NAVDIR_DOWN:
109 case NAVDIR_UP: 218 case NAVDIR_UP:
110 case NAVDIR_LEFT: 219 case NAVDIR_LEFT:
111 case NAVDIR_RIGHT: 220 case NAVDIR_RIGHT:
112 // These directions are not implemented, matching Mozilla and IE. 221 // These directions are not implemented, matching Mozilla and IE.
113 return E_NOTIMPL; 222 return E_NOTIMPL;
114 case NAVDIR_FIRSTCHILD: 223 case NAVDIR_FIRSTCHILD:
115 if (target->children_.size() > 0) 224 if (target->children_.size() > 0)
116 result = target->children_[0]; 225 result = target->children_[0];
117 break; 226 break;
118 case NAVDIR_LASTCHILD: 227 case NAVDIR_LASTCHILD:
119 if (target->children_.size() > 0) 228 if (target->children_.size() > 0)
120 result = target->children_[target->children_.size() - 1]; 229 result = target->children_[target->children_.size() - 1];
121 break; 230 break;
122 case NAVDIR_NEXT: 231 case NAVDIR_NEXT:
123 result = target->GetNextSibling(); 232 result = target->GetNextSibling();
124 break; 233 break;
125 case NAVDIR_PREVIOUS: 234 case NAVDIR_PREVIOUS:
126 result = target->GetPreviousSibling(); 235 result = target->GetPreviousSibling();
127 break; 236 break;
128 } 237 }
129 238
130 if (!result) { 239 if (!result) {
131 end->vt = VT_EMPTY; 240 end->vt = VT_EMPTY;
132 return S_FALSE; 241 return S_FALSE;
133 } 242 }
134 243
135 end->vt = VT_DISPATCH; 244 end->vt = VT_DISPATCH;
136 end->pdispVal = result->toBrowserAccessibilityWin()->NewReference(); 245 end->pdispVal = result->NewReference();
137 return S_OK; 246 return S_OK;
138 } 247 }
139 248
140 STDMETHODIMP BrowserAccessibilityWin::get_accChild(VARIANT var_child, 249 STDMETHODIMP BrowserAccessibilityWin::get_accChild(VARIANT var_child,
141 IDispatch** disp_child) { 250 IDispatch** disp_child) {
142 if (!instance_active_) 251 if (!instance_active_)
143 return E_FAIL; 252 return E_FAIL;
144 253
145 if (!disp_child) 254 if (!disp_child)
146 return E_INVALIDARG; 255 return E_INVALIDARG;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 return S_OK; 377 return S_OK;
269 } 378 }
270 379
271 STDMETHODIMP BrowserAccessibilityWin::get_accParent(IDispatch** disp_parent) { 380 STDMETHODIMP BrowserAccessibilityWin::get_accParent(IDispatch** disp_parent) {
272 if (!instance_active_) 381 if (!instance_active_)
273 return E_FAIL; 382 return E_FAIL;
274 383
275 if (!disp_parent) 384 if (!disp_parent)
276 return E_INVALIDARG; 385 return E_INVALIDARG;
277 386
278 IAccessible* parent = parent_->toBrowserAccessibilityWin(); 387 IAccessible* parent = parent_;
279 if (parent == NULL) { 388 if (parent == NULL) {
280 // This happens if we're the root of the tree; 389 // This happens if we're the root of the tree;
281 // return the IAccessible for the window. 390 // return the IAccessible for the window.
282 parent = manager_->toBrowserAccessibilityManagerWin()-> 391 parent = manager_->GetParentWindowIAccessible();
283 GetParentWindowIAccessible();
284 } 392 }
285 393
286 parent->AddRef(); 394 parent->AddRef();
287 *disp_parent = parent; 395 *disp_parent = parent;
288 return S_OK; 396 return S_OK;
289 } 397 }
290 398
291 STDMETHODIMP BrowserAccessibilityWin::get_accRole( 399 STDMETHODIMP BrowserAccessibilityWin::get_accRole(
292 VARIANT var_id, VARIANT* role) { 400 VARIANT var_id, VARIANT* role) {
293 if (!instance_active_) 401 if (!instance_active_)
294 return E_FAIL; 402 return E_FAIL;
295 403
296 if (!role) 404 if (!role)
297 return E_INVALIDARG; 405 return E_INVALIDARG;
298 406
299 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 407 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
300 if (!target) 408 if (!target)
301 return E_INVALIDARG; 409 return E_INVALIDARG;
302 410
303 if (!target->role_name_.empty()) { 411 if (!target->role_name_.empty()) {
304 role->vt = VT_BSTR; 412 role->vt = VT_BSTR;
305 role->bstrVal = SysAllocString(target->role_name_.c_str()); 413 role->bstrVal = SysAllocString(target->role_name_.c_str());
306 } else { 414 } else {
307 role->vt = VT_I4; 415 role->vt = VT_I4;
308 role->lVal = target->ia_role_; 416 role->lVal = target->role_;
309 } 417 }
310 return S_OK; 418 return S_OK;
311 } 419 }
312 420
313 STDMETHODIMP BrowserAccessibilityWin::get_accState(VARIANT var_id, 421 STDMETHODIMP BrowserAccessibilityWin::get_accState(VARIANT var_id,
314 VARIANT* state) { 422 VARIANT* state) {
315 if (!instance_active_) 423 if (!instance_active_)
316 return E_FAIL; 424 return E_FAIL;
317 425
318 if (!state) 426 if (!state)
319 return E_INVALIDARG; 427 return E_INVALIDARG;
320 428
321 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 429 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
322 if (!target) 430 if (!target)
323 return E_INVALIDARG; 431 return E_INVALIDARG;
324 432
325 state->vt = VT_I4; 433 state->vt = VT_I4;
326 state->lVal = target->ia_state_; 434 state->lVal = target->state_;
327 if (manager_->GetFocus(NULL) == this) 435 if (manager_->GetFocus(NULL) == this)
328 state->lVal |= STATE_SYSTEM_FOCUSED; 436 state->lVal |= STATE_SYSTEM_FOCUSED;
329 437
330 return S_OK; 438 return S_OK;
331 } 439 }
332 440
333 STDMETHODIMP BrowserAccessibilityWin::get_accValue( 441 STDMETHODIMP BrowserAccessibilityWin::get_accValue(
334 VARIANT var_id, BSTR* value) { 442 VARIANT var_id, BSTR* value) {
335 if (!instance_active_) 443 if (!instance_active_)
336 return E_FAIL; 444 return E_FAIL;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 return S_OK; 546 return S_OK;
439 } 547 }
440 548
441 STDMETHODIMP BrowserAccessibilityWin::get_windowHandle(HWND* window_handle) { 549 STDMETHODIMP BrowserAccessibilityWin::get_windowHandle(HWND* window_handle) {
442 if (!instance_active_) 550 if (!instance_active_)
443 return E_FAIL; 551 return E_FAIL;
444 552
445 if (!window_handle) 553 if (!window_handle)
446 return E_INVALIDARG; 554 return E_INVALIDARG;
447 555
448 *window_handle = manager_->GetParentView(); 556 *window_handle = manager_->GetParentWindow();
449 return S_OK; 557 return S_OK;
450 } 558 }
451 559
452 STDMETHODIMP BrowserAccessibilityWin::get_indexInParent(LONG* index_in_parent) { 560 STDMETHODIMP BrowserAccessibilityWin::get_indexInParent(LONG* index_in_parent) {
453 if (!instance_active_) 561 if (!instance_active_)
454 return E_FAIL; 562 return E_FAIL;
455 563
456 if (!index_in_parent) 564 if (!index_in_parent)
457 return E_INVALIDARG; 565 return E_INVALIDARG;
458 566
(...skipping 17 matching lines...) Expand all
476 584
477 STDMETHODIMP BrowserAccessibilityWin::get_imagePosition( 585 STDMETHODIMP BrowserAccessibilityWin::get_imagePosition(
478 enum IA2CoordinateType coordinate_type, LONG* x, LONG* y) { 586 enum IA2CoordinateType coordinate_type, LONG* x, LONG* y) {
479 if (!instance_active_) 587 if (!instance_active_)
480 return E_FAIL; 588 return E_FAIL;
481 589
482 if (!x || !y) 590 if (!x || !y)
483 return E_INVALIDARG; 591 return E_INVALIDARG;
484 592
485 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 593 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) {
486 HWND parent_hwnd = manager_->GetParentView(); 594 HWND parent_hwnd = manager_->GetParentWindow();
487 POINT top_left = {0, 0}; 595 POINT top_left = {0, 0};
488 ::ClientToScreen(parent_hwnd, &top_left); 596 ::ClientToScreen(parent_hwnd, &top_left);
489 *x = location_.x + top_left.x; 597 *x = location_.x + top_left.x;
490 *y = location_.y + top_left.y; 598 *y = location_.y + top_left.y;
491 } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 599 } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) {
492 *x = location_.x; 600 *x = location_.x;
493 *y = location_.y; 601 *y = location_.y;
494 if (parent_) { 602 if (parent_) {
495 *x -= parent_->location().x; 603 *x -= parent_->location_.x;
496 *y -= parent_->location().y; 604 *y -= parent_->location_.y;
497 } 605 }
498 } else { 606 } else {
499 return E_INVALIDARG; 607 return E_INVALIDARG;
500 } 608 }
501 609
502 return S_OK; 610 return S_OK;
503 } 611 }
504 612
505 STDMETHODIMP BrowserAccessibilityWin::get_imageSize(LONG* height, LONG* width) { 613 STDMETHODIMP BrowserAccessibilityWin::get_imageSize(LONG* height, LONG* width) {
506 if (!instance_active_) 614 if (!instance_active_)
(...skipping 11 matching lines...) Expand all
518 // IAccessibleText methods. 626 // IAccessibleText methods.
519 // 627 //
520 628
521 STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) { 629 STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) {
522 if (!instance_active_) 630 if (!instance_active_)
523 return E_FAIL; 631 return E_FAIL;
524 632
525 if (!n_characters) 633 if (!n_characters)
526 return E_INVALIDARG; 634 return E_INVALIDARG;
527 635
528 if (role_ == WebAccessibility::ROLE_TEXT_FIELD) { 636 if (src_role_ == WebAccessibility::ROLE_TEXT_FIELD) {
529 *n_characters = value_.length(); 637 *n_characters = value_.length();
530 } else { 638 } else {
531 *n_characters = name_.length(); 639 *n_characters = name_.length();
532 } 640 }
533 641
534 return S_OK; 642 return S_OK;
535 } 643 }
536 644
537 STDMETHODIMP BrowserAccessibilityWin::get_text( 645 STDMETHODIMP BrowserAccessibilityWin::get_text(
538 LONG start_offset, LONG end_offset, BSTR* text) { 646 LONG start_offset, LONG end_offset, BSTR* text) {
539 if (!instance_active_) 647 if (!instance_active_)
540 return E_FAIL; 648 return E_FAIL;
541 649
542 if (!text) 650 if (!text)
543 return E_INVALIDARG; 651 return E_INVALIDARG;
544 652
545 string16 text_str; 653 string16 text_str;
546 if (role_ == WebAccessibility::ROLE_TEXT_FIELD) { 654 if (src_role_ == WebAccessibility::ROLE_TEXT_FIELD) {
547 text_str = value_; 655 text_str = value_;
548 } else { 656 } else {
549 text_str = name_; 657 text_str = name_;
550 } 658 }
551 659
552 // The spec allows the arguments to be reversed. 660 // The spec allows the arguments to be reversed.
553 if (start_offset > end_offset) { 661 if (start_offset > end_offset) {
554 LONG tmp = start_offset; 662 LONG tmp = start_offset;
555 start_offset = end_offset; 663 start_offset = end_offset;
556 end_offset = tmp; 664 end_offset = tmp;
(...skipping 16 matching lines...) Expand all
573 return S_OK; 681 return S_OK;
574 } 682 }
575 683
576 STDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) { 684 STDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) {
577 if (!instance_active_) 685 if (!instance_active_)
578 return E_FAIL; 686 return E_FAIL;
579 687
580 if (!offset) 688 if (!offset)
581 return E_INVALIDARG; 689 return E_INVALIDARG;
582 690
583 if (role_ == WebAccessibility::ROLE_TEXT_FIELD) { 691 if (src_role_ == WebAccessibility::ROLE_TEXT_FIELD) {
584 int sel_start = 0; 692 int sel_start = 0;
585 if (GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_START, &sel_start)) { 693 if (GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_START, &sel_start)) {
586 *offset = sel_start; 694 *offset = sel_start;
587 } else { 695 } else {
588 *offset = 0; 696 *offset = 0;
589 } 697 }
590 } else { 698 } else {
591 *offset = 0; 699 *offset = 0;
592 } 700 }
593 701
594 return S_OK; 702 return S_OK;
595 } 703 }
596 704
597 STDMETHODIMP BrowserAccessibilityWin::get_nSelections(LONG* n_selections) { 705 STDMETHODIMP BrowserAccessibilityWin::get_nSelections(LONG* n_selections) {
598 if (!instance_active_) 706 if (!instance_active_)
599 return E_FAIL; 707 return E_FAIL;
600 708
601 if (!n_selections) 709 if (!n_selections)
602 return E_INVALIDARG; 710 return E_INVALIDARG;
603 711
604 if (role_ == WebAccessibility::ROLE_TEXT_FIELD) { 712 if (src_role_ == WebAccessibility::ROLE_TEXT_FIELD) {
605 int sel_start = 0; 713 int sel_start = 0;
606 int sel_end = 0; 714 int sel_end = 0;
607 if (GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_START, &sel_start) && 715 if (GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_START, &sel_start) &&
608 GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_END, &sel_end) && 716 GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_END, &sel_end) &&
609 sel_start != sel_end) { 717 sel_start != sel_end) {
610 *n_selections = 1; 718 *n_selections = 1;
611 } else { 719 } else {
612 *n_selections = 0; 720 *n_selections = 0;
613 } 721 }
614 } else { 722 } else {
615 *n_selections = 0; 723 *n_selections = 0;
616 } 724 }
617 725
618 return S_OK; 726 return S_OK;
619 } 727 }
620 728
621 STDMETHODIMP BrowserAccessibilityWin::get_selection(LONG selection_index, 729 STDMETHODIMP BrowserAccessibilityWin::get_selection(LONG selection_index,
622 LONG* start_offset, 730 LONG* start_offset,
623 LONG* end_offset) { 731 LONG* end_offset) {
624 if (!instance_active_) 732 if (!instance_active_)
625 return E_FAIL; 733 return E_FAIL;
626 734
627 if (!start_offset || !end_offset || selection_index != 0) 735 if (!start_offset || !end_offset || selection_index != 0)
628 return E_INVALIDARG; 736 return E_INVALIDARG;
629 737
630 if (role_ == WebAccessibility::ROLE_TEXT_FIELD) { 738 if (src_role_ == WebAccessibility::ROLE_TEXT_FIELD) {
631 int sel_start = 0; 739 int sel_start = 0;
632 int sel_end = 0; 740 int sel_end = 0;
633 if (GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_START, &sel_start) && 741 if (GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_START, &sel_start) &&
634 GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_END, &sel_end)) { 742 GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_END, &sel_end)) {
635 *start_offset = sel_start; 743 *start_offset = sel_start;
636 *end_offset = sel_end; 744 *end_offset = sel_end;
637 } else { 745 } else {
638 *start_offset = 0; 746 *start_offset = 0;
639 *end_offset = 0; 747 *end_offset = 0;
640 } 748 }
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 if (GetAttribute(WebAccessibility::ATTR_HTML_TAG, &tag)) 821 if (GetAttribute(WebAccessibility::ATTR_HTML_TAG, &tag))
714 *node_name = SysAllocString(tag.c_str()); 822 *node_name = SysAllocString(tag.c_str());
715 else 823 else
716 *node_name = NULL; 824 *node_name = NULL;
717 825
718 *name_space_id = 0; 826 *name_space_id = 0;
719 *node_value = SysAllocString(value_.c_str()); 827 *node_value = SysAllocString(value_.c_str());
720 *num_children = children_.size(); 828 *num_children = children_.size();
721 *unique_id = child_id_; 829 *unique_id = child_id_;
722 830
723 if (ia_role_ == ROLE_SYSTEM_DOCUMENT) { 831 if (role_ == ROLE_SYSTEM_DOCUMENT) {
724 *node_type = NODETYPE_DOCUMENT; 832 *node_type = NODETYPE_DOCUMENT;
725 } else if (ia_role_ == ROLE_SYSTEM_TEXT && 833 } else if (role_ == ROLE_SYSTEM_TEXT &&
726 ((ia2_state_ & IA2_STATE_EDITABLE) == 0)) { 834 ((ia2_state_ & IA2_STATE_EDITABLE) == 0)) {
727 *node_type = NODETYPE_TEXT; 835 *node_type = NODETYPE_TEXT;
728 } else { 836 } else {
729 *node_type = NODETYPE_ELEMENT; 837 *node_type = NODETYPE_ELEMENT;
730 } 838 }
731 839
732 return S_OK; 840 return S_OK;
733 } 841 }
734 842
735 STDMETHODIMP BrowserAccessibilityWin::get_attributes( 843 STDMETHODIMP BrowserAccessibilityWin::get_attributes(
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 return E_NOTIMPL; 954 return E_NOTIMPL;
847 } 955 }
848 956
849 STDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) { 957 STDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) {
850 if (!instance_active_) 958 if (!instance_active_)
851 return E_FAIL; 959 return E_FAIL;
852 960
853 if (!node) 961 if (!node)
854 return E_INVALIDARG; 962 return E_INVALIDARG;
855 963
856 *node = parent_->toBrowserAccessibilityWin()->NewReference(); 964 *node = parent_->NewReference();
857 return S_OK; 965 return S_OK;
858 } 966 }
859 967
860 STDMETHODIMP BrowserAccessibilityWin::get_firstChild(ISimpleDOMNode** node) { 968 STDMETHODIMP BrowserAccessibilityWin::get_firstChild(ISimpleDOMNode** node) {
861 if (!instance_active_) 969 if (!instance_active_)
862 return E_FAIL; 970 return E_FAIL;
863 971
864 if (!node) 972 if (!node)
865 return E_INVALIDARG; 973 return E_INVALIDARG;
866 974
867 if (children_.size()) { 975 if (children_.size()) {
868 *node = children_[0]->toBrowserAccessibilityWin()->NewReference(); 976 *node = children_[0]->NewReference();
869 return S_OK; 977 return S_OK;
870 } else { 978 } else {
871 *node = NULL; 979 *node = NULL;
872 return S_FALSE; 980 return S_FALSE;
873 } 981 }
874 } 982 }
875 983
876 STDMETHODIMP BrowserAccessibilityWin::get_lastChild(ISimpleDOMNode** node) { 984 STDMETHODIMP BrowserAccessibilityWin::get_lastChild(ISimpleDOMNode** node) {
877 if (!instance_active_) 985 if (!instance_active_)
878 return E_FAIL; 986 return E_FAIL;
879 987
880 if (!node) 988 if (!node)
881 return E_INVALIDARG; 989 return E_INVALIDARG;
882 990
883 if (children_.size()) { 991 if (children_.size()) {
884 *node = children_[children_.size() - 1]->toBrowserAccessibilityWin()-> 992 *node = children_[children_.size() - 1]->NewReference();
885 NewReference();
886 return S_OK; 993 return S_OK;
887 } else { 994 } else {
888 *node = NULL; 995 *node = NULL;
889 return S_FALSE; 996 return S_FALSE;
890 } 997 }
891 } 998 }
892 999
893 STDMETHODIMP BrowserAccessibilityWin::get_previousSibling( 1000 STDMETHODIMP BrowserAccessibilityWin::get_previousSibling(
894 ISimpleDOMNode** node) { 1001 ISimpleDOMNode** node) {
895 if (!instance_active_) 1002 if (!instance_active_)
896 return E_FAIL; 1003 return E_FAIL;
897 1004
898 if (!node) 1005 if (!node)
899 return E_INVALIDARG; 1006 return E_INVALIDARG;
900 1007
901 if (parent_ && index_in_parent_ > 0) { 1008 if (parent_ && index_in_parent_ > 0) {
902 *node = parent_->children()[index_in_parent_ - 1]-> 1009 *node = parent_->children_[index_in_parent_ - 1]->NewReference();
903 toBrowserAccessibilityWin()->NewReference();
904 return S_OK; 1010 return S_OK;
905 } else { 1011 } else {
906 *node = NULL; 1012 *node = NULL;
907 return S_FALSE; 1013 return S_FALSE;
908 } 1014 }
909 } 1015 }
910 1016
911 STDMETHODIMP BrowserAccessibilityWin::get_nextSibling(ISimpleDOMNode** node) { 1017 STDMETHODIMP BrowserAccessibilityWin::get_nextSibling(ISimpleDOMNode** node) {
912 if (!instance_active_) 1018 if (!instance_active_)
913 return E_FAIL; 1019 return E_FAIL;
914 1020
915 if (!node) 1021 if (!node)
916 return E_INVALIDARG; 1022 return E_INVALIDARG;
917 1023
918 if (parent_ && 1024 if (parent_ &&
919 index_in_parent_ >= 0 && 1025 index_in_parent_ >= 0 &&
920 index_in_parent_ < static_cast<int>(parent_->children().size()) - 1) { 1026 index_in_parent_ < static_cast<int>(parent_->children_.size()) - 1) {
921 *node = parent_->children()[index_in_parent_ + 1]-> 1027 *node = parent_->children_[index_in_parent_ + 1]->NewReference();
922 toBrowserAccessibilityWin()->NewReference();
923 return S_OK; 1028 return S_OK;
924 } else { 1029 } else {
925 *node = NULL; 1030 *node = NULL;
926 return S_FALSE; 1031 return S_FALSE;
927 } 1032 }
928 } 1033 }
929 1034
930 STDMETHODIMP BrowserAccessibilityWin::get_childAt( 1035 STDMETHODIMP BrowserAccessibilityWin::get_childAt(
931 unsigned int child_index, 1036 unsigned int child_index,
932 ISimpleDOMNode** node) { 1037 ISimpleDOMNode** node) {
933 if (!instance_active_) 1038 if (!instance_active_)
934 return E_FAIL; 1039 return E_FAIL;
935 1040
936 if (!node) 1041 if (!node)
937 return E_INVALIDARG; 1042 return E_INVALIDARG;
938 1043
939 if (child_index < children_.size()) { 1044 if (child_index < children_.size()) {
940 *node = children_[child_index]->toBrowserAccessibilityWin()->NewReference(); 1045 *node = children_[child_index]->NewReference();
941 return S_OK; 1046 return S_OK;
942 } else { 1047 } else {
943 *node = NULL; 1048 *node = NULL;
944 return S_FALSE; 1049 return S_FALSE;
945 } 1050 }
946 } 1051 }
947 1052
948 // 1053 //
949 // ISimpleDOMText methods. 1054 // ISimpleDOMText methods.
950 // 1055 //
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
990 // 1095 //
991 // CComObjectRootEx methods. 1096 // CComObjectRootEx methods.
992 // 1097 //
993 1098
994 HRESULT WINAPI BrowserAccessibilityWin::InternalQueryInterface( 1099 HRESULT WINAPI BrowserAccessibilityWin::InternalQueryInterface(
995 void* this_ptr, 1100 void* this_ptr,
996 const _ATL_INTMAP_ENTRY* entries, 1101 const _ATL_INTMAP_ENTRY* entries,
997 REFIID iid, 1102 REFIID iid,
998 void** object) { 1103 void** object) {
999 if (iid == IID_IAccessibleText) { 1104 if (iid == IID_IAccessibleText) {
1000 if (ia_role_ != ROLE_SYSTEM_LINK && ia_role_ != ROLE_SYSTEM_TEXT) { 1105 if (role_ != ROLE_SYSTEM_LINK && role_ != ROLE_SYSTEM_TEXT) {
1001 *object = NULL; 1106 *object = NULL;
1002 return E_NOINTERFACE; 1107 return E_NOINTERFACE;
1003 } 1108 }
1004 } else if (iid == IID_IAccessibleImage) { 1109 } else if (iid == IID_IAccessibleImage) {
1005 if (ia_role_ != ROLE_SYSTEM_GRAPHIC) { 1110 if (role_ != ROLE_SYSTEM_GRAPHIC) {
1006 *object = NULL; 1111 *object = NULL;
1007 return E_NOINTERFACE; 1112 return E_NOINTERFACE;
1008 } 1113 }
1009 } else if (iid == IID_ISimpleDOMDocument) { 1114 } else if (iid == IID_ISimpleDOMDocument) {
1010 if (ia_role_ != ROLE_SYSTEM_DOCUMENT) { 1115 if (role_ != ROLE_SYSTEM_DOCUMENT) {
1011 *object = NULL; 1116 *object = NULL;
1012 return E_NOINTERFACE; 1117 return E_NOINTERFACE;
1013 } 1118 }
1014 } 1119 }
1015 1120
1016 return CComObjectRootBase::InternalQueryInterface( 1121 return CComObjectRootBase::InternalQueryInterface(
1017 this_ptr, entries, iid, object); 1122 this_ptr, entries, iid, object);
1018 } 1123 }
1019 1124
1020 // 1125 //
1021 // Private methods. 1126 // Private methods.
1022 // 1127 //
1023 1128
1024 void BrowserAccessibilityWin::Initialize() {
1025 InitRoleAndState();
1026
1027 // Expose headings levels to NVDA with the "level" object attribute.
1028 if (role_ == WebAccessibility::ROLE_HEADING && role_name_.size() == 2 &&
1029 IsAsciiDigit(role_name_[1])) {
1030 html_attributes_.push_back(std::make_pair(L"level", role_name_.substr(1)));
1031 }
1032
1033 // If this object doesn't have a name but it does have a description,
1034 // use the description as its name - because some screen readers only
1035 // announce the name.
1036 if (name_.empty() && HasAttribute(WebAccessibility::ATTR_DESCRIPTION)) {
1037 GetAttribute(WebAccessibility::ATTR_DESCRIPTION, &name_);
1038 }
1039
1040 instance_active_ = true;
1041 }
1042
1043 void BrowserAccessibilityWin::ReleaseTree() {
1044 if (!instance_active_)
1045 return;
1046
1047 // Mark this object as inactive, so calls to all COM methods will return
1048 // failure.
1049 instance_active_ = false;
1050
1051 BrowserAccessibility::ReleaseTree();
1052 }
1053
1054 void BrowserAccessibilityWin::ReleaseReference() {
1055 Release();
1056 }
1057
1058
1059 BrowserAccessibilityWin* BrowserAccessibilityWin::NewReference() {
1060 AddRef();
1061 return this;
1062 }
1063
1064 BrowserAccessibilityWin* BrowserAccessibilityWin::GetTargetFromChildID( 1129 BrowserAccessibilityWin* BrowserAccessibilityWin::GetTargetFromChildID(
1065 const VARIANT& var_id) { 1130 const VARIANT& var_id) {
1066 if (var_id.vt != VT_I4) 1131 if (var_id.vt != VT_I4)
1067 return NULL; 1132 return NULL;
1068 1133
1069 LONG child_id = var_id.lVal; 1134 LONG child_id = var_id.lVal;
1070 if (child_id == CHILDID_SELF) 1135 if (child_id == CHILDID_SELF)
1071 return this; 1136 return this;
1072 1137
1073 if (child_id >= 1 && child_id <= static_cast<LONG>(children_.size())) 1138 if (child_id >= 1 && child_id <= static_cast<LONG>(children_.size()))
1074 return children_[child_id - 1]->toBrowserAccessibilityWin(); 1139 return children_[child_id - 1];
1075 1140
1076 return manager_->GetFromChildID(child_id)->toBrowserAccessibilityWin(); 1141 return manager_->GetFromChildID(child_id);
1077 } 1142 }
1078 1143
1079 bool BrowserAccessibilityWin::HasAttribute( 1144 bool BrowserAccessibilityWin::HasAttribute(
1080 WebAccessibility::Attribute attribute) { 1145 WebAccessibility::Attribute attribute) {
1081 return (attributes_.find(attribute) != attributes_.end()); 1146 return (attributes_.find(attribute) != attributes_.end());
1082 } 1147 }
1083 1148
1084 bool BrowserAccessibilityWin::GetAttribute( 1149 bool BrowserAccessibilityWin::GetAttribute(
1085 WebAccessibility::Attribute attribute, string16* value) { 1150 WebAccessibility::Attribute attribute, string16* value) {
1086 std::map<int32, string16>::iterator iter = attributes_.find(attribute); 1151 std::map<int32, string16>::iterator iter = attributes_.find(attribute);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1118 if (!base::StringToInt(value_str, value_int)) 1183 if (!base::StringToInt(value_str, value_int))
1119 return false; 1184 return false;
1120 1185
1121 return true; 1186 return true;
1122 } 1187 }
1123 1188
1124 string16 BrowserAccessibilityWin::Escape(string16 str) { 1189 string16 BrowserAccessibilityWin::Escape(string16 str) {
1125 return EscapeQueryParamValueUTF8(str, false); 1190 return EscapeQueryParamValueUTF8(str, false);
1126 } 1191 }
1127 1192
1128 void BrowserAccessibilityWin::InitRoleAndState() { 1193 void BrowserAccessibilityWin::InitRoleAndState(LONG web_role,
1129 ia_state_ = 0; 1194 LONG web_state) {
1195 state_ = 0;
1130 ia2_state_ = IA2_STATE_OPAQUE; 1196 ia2_state_ = IA2_STATE_OPAQUE;
1131 1197
1132 if ((state_ >> WebAccessibility::STATE_CHECKED) & 1) 1198 if ((web_state >> WebAccessibility::STATE_CHECKED) & 1)
1133 ia_state_ |= STATE_SYSTEM_CHECKED; 1199 state_ |= STATE_SYSTEM_CHECKED;
1134 if ((state_ >> WebAccessibility::STATE_COLLAPSED) & 1) 1200 if ((web_state >> WebAccessibility::STATE_COLLAPSED) & 1)
1135 ia_state_|= STATE_SYSTEM_COLLAPSED; 1201 state_ |= STATE_SYSTEM_COLLAPSED;
1136 if ((state_ >> WebAccessibility::STATE_EXPANDED) & 1) 1202 if ((web_state >> WebAccessibility::STATE_EXPANDED) & 1)
1137 ia_state_|= STATE_SYSTEM_EXPANDED; 1203 state_ |= STATE_SYSTEM_EXPANDED;
1138 if ((state_ >> WebAccessibility::STATE_FOCUSABLE) & 1) 1204 if ((web_state >> WebAccessibility::STATE_FOCUSABLE) & 1)
1139 ia_state_|= STATE_SYSTEM_FOCUSABLE; 1205 state_ |= STATE_SYSTEM_FOCUSABLE;
1140 if ((state_ >> WebAccessibility::STATE_HASPOPUP) & 1) 1206 if ((web_state >> WebAccessibility::STATE_HASPOPUP) & 1)
1141 ia_state_|= STATE_SYSTEM_HASPOPUP; 1207 state_ |= STATE_SYSTEM_HASPOPUP;
1142 if ((state_ >> WebAccessibility::STATE_HOTTRACKED) & 1) 1208 if ((web_state >> WebAccessibility::STATE_HOTTRACKED) & 1)
1143 ia_state_|= STATE_SYSTEM_HOTTRACKED; 1209 state_ |= STATE_SYSTEM_HOTTRACKED;
1144 if ((state_ >> WebAccessibility::STATE_INDETERMINATE) & 1) 1210 if ((web_state >> WebAccessibility::STATE_INDETERMINATE) & 1)
1145 ia_state_|= STATE_SYSTEM_INDETERMINATE; 1211 state_ |= STATE_SYSTEM_INDETERMINATE;
1146 if ((state_ >> WebAccessibility::STATE_INVISIBLE) & 1) 1212 if ((web_state >> WebAccessibility::STATE_INVISIBLE) & 1)
1147 ia_state_|= STATE_SYSTEM_INVISIBLE; 1213 state_ |= STATE_SYSTEM_INVISIBLE;
1148 if ((state_ >> WebAccessibility::STATE_LINKED) & 1) 1214 if ((web_state >> WebAccessibility::STATE_LINKED) & 1)
1149 ia_state_|= STATE_SYSTEM_LINKED; 1215 state_ |= STATE_SYSTEM_LINKED;
1150 if ((state_ >> WebAccessibility::STATE_MULTISELECTABLE) & 1) 1216 if ((web_state >> WebAccessibility::STATE_MULTISELECTABLE) & 1)
1151 ia_state_|= STATE_SYSTEM_MULTISELECTABLE; 1217 state_ |= STATE_SYSTEM_MULTISELECTABLE;
1152 // TODO(ctguil): Support STATE_SYSTEM_EXTSELECTABLE/accSelect. 1218 // TODO(ctguil): Support STATE_SYSTEM_EXTSELECTABLE/accSelect.
1153 if ((state_ >> WebAccessibility::STATE_OFFSCREEN) & 1) 1219 if ((web_state >> WebAccessibility::STATE_OFFSCREEN) & 1)
1154 ia_state_|= STATE_SYSTEM_OFFSCREEN; 1220 state_ |= STATE_SYSTEM_OFFSCREEN;
1155 if ((state_ >> WebAccessibility::STATE_PRESSED) & 1) 1221 if ((web_state >> WebAccessibility::STATE_PRESSED) & 1)
1156 ia_state_|= STATE_SYSTEM_PRESSED; 1222 state_ |= STATE_SYSTEM_PRESSED;
1157 if ((state_ >> WebAccessibility::STATE_PROTECTED) & 1) 1223 if ((web_state >> WebAccessibility::STATE_PROTECTED) & 1)
1158 ia_state_|= STATE_SYSTEM_PROTECTED; 1224 state_ |= STATE_SYSTEM_PROTECTED;
1159 if ((state_ >> WebAccessibility::STATE_SELECTABLE) & 1) 1225 if ((web_state >> WebAccessibility::STATE_SELECTABLE) & 1)
1160 ia_state_|= STATE_SYSTEM_SELECTABLE; 1226 state_ |= STATE_SYSTEM_SELECTABLE;
1161 if ((state_ >> WebAccessibility::STATE_SELECTED) & 1) 1227 if ((web_state >> WebAccessibility::STATE_SELECTED) & 1)
1162 ia_state_|= STATE_SYSTEM_SELECTED; 1228 state_ |= STATE_SYSTEM_SELECTED;
1163 if ((state_ >> WebAccessibility::STATE_READONLY) & 1) 1229 if ((web_state >> WebAccessibility::STATE_READONLY) & 1)
1164 ia_state_|= STATE_SYSTEM_READONLY; 1230 state_ |= STATE_SYSTEM_READONLY;
1165 if ((state_ >> WebAccessibility::STATE_TRAVERSED) & 1) 1231 if ((web_state >> WebAccessibility::STATE_TRAVERSED) & 1)
1166 ia_state_|= STATE_SYSTEM_TRAVERSED; 1232 state_ |= STATE_SYSTEM_TRAVERSED;
1167 if ((state_ >> WebAccessibility::STATE_BUSY) & 1) 1233 if ((web_state >> WebAccessibility::STATE_BUSY) & 1)
1168 ia_state_|= STATE_SYSTEM_BUSY; 1234 state_ |= STATE_SYSTEM_BUSY;
1169 if ((state_ >> WebAccessibility::STATE_UNAVAILABLE) & 1) 1235 if ((web_state >> WebAccessibility::STATE_UNAVAILABLE) & 1)
1170 ia_state_|= STATE_SYSTEM_UNAVAILABLE; 1236 state_ |= STATE_SYSTEM_UNAVAILABLE;
1171 1237
1172 ia_role_ = 0; 1238 role_ = 0;
1173 ia2_role_ = 0; 1239 ia2_role_ = 0;
1174 switch (role_) { 1240 switch (web_role) {
1175 case WebAccessibility::ROLE_ALERT: 1241 case WebAccessibility::ROLE_ALERT:
1176 case WebAccessibility::ROLE_ALERT_DIALOG: 1242 case WebAccessibility::ROLE_ALERT_DIALOG:
1177 ia_role_ = ROLE_SYSTEM_ALERT; 1243 role_ = ROLE_SYSTEM_ALERT;
1178 break; 1244 break;
1179 case WebAccessibility::ROLE_APPLICATION: 1245 case WebAccessibility::ROLE_APPLICATION:
1180 ia_role_ = ROLE_SYSTEM_APPLICATION; 1246 role_ = ROLE_SYSTEM_APPLICATION;
1181 break; 1247 break;
1182 case WebAccessibility::ROLE_ARTICLE: 1248 case WebAccessibility::ROLE_ARTICLE:
1183 ia_role_ = ROLE_SYSTEM_GROUPING; 1249 role_ = ROLE_SYSTEM_GROUPING;
1184 ia2_role_ = IA2_ROLE_SECTION; 1250 ia2_role_ = IA2_ROLE_SECTION;
1185 break; 1251 break;
1186 case WebAccessibility::ROLE_BUTTON: 1252 case WebAccessibility::ROLE_BUTTON:
1187 ia_role_ = ROLE_SYSTEM_PUSHBUTTON; 1253 role_ = ROLE_SYSTEM_PUSHBUTTON;
1188 break; 1254 break;
1189 case WebAccessibility::ROLE_CELL: 1255 case WebAccessibility::ROLE_CELL:
1190 ia_role_ = ROLE_SYSTEM_CELL; 1256 role_ = ROLE_SYSTEM_CELL;
1191 break; 1257 break;
1192 case WebAccessibility::ROLE_CHECKBOX: 1258 case WebAccessibility::ROLE_CHECKBOX:
1193 ia_role_ = ROLE_SYSTEM_CHECKBUTTON; 1259 role_ = ROLE_SYSTEM_CHECKBUTTON;
1194 break; 1260 break;
1195 case WebAccessibility::ROLE_COLOR_WELL: 1261 case WebAccessibility::ROLE_COLOR_WELL:
1196 ia_role_ = ROLE_SYSTEM_CLIENT; 1262 role_ = ROLE_SYSTEM_CLIENT;
1197 ia2_role_ = IA2_ROLE_COLOR_CHOOSER; 1263 ia2_role_ = IA2_ROLE_COLOR_CHOOSER;
1198 break; 1264 break;
1199 case WebAccessibility::ROLE_COLUMN: 1265 case WebAccessibility::ROLE_COLUMN:
1200 ia_role_ = ROLE_SYSTEM_COLUMN; 1266 role_ = ROLE_SYSTEM_COLUMN;
1201 break; 1267 break;
1202 case WebAccessibility::ROLE_COLUMN_HEADER: 1268 case WebAccessibility::ROLE_COLUMN_HEADER:
1203 ia_role_ = ROLE_SYSTEM_COLUMNHEADER; 1269 role_ = ROLE_SYSTEM_COLUMNHEADER;
1204 break; 1270 break;
1205 case WebAccessibility::ROLE_COMBO_BOX: 1271 case WebAccessibility::ROLE_COMBO_BOX:
1206 ia_role_ = ROLE_SYSTEM_COMBOBOX; 1272 role_ = ROLE_SYSTEM_COMBOBOX;
1207 break; 1273 break;
1208 case WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION: 1274 case WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION:
1209 GetAttribute(WebAccessibility::ATTR_HTML_TAG, &role_name_); 1275 GetAttribute(WebAccessibility::ATTR_HTML_TAG, &role_name_);
1210 ia2_role_ = IA2_ROLE_PARAGRAPH; 1276 ia2_role_ = IA2_ROLE_PARAGRAPH;
1211 break; 1277 break;
1212 case WebAccessibility::ROLE_DEFINITION_LIST_TERM: 1278 case WebAccessibility::ROLE_DEFINITION_LIST_TERM:
1213 ia_role_ = ROLE_SYSTEM_LISTITEM; 1279 role_ = ROLE_SYSTEM_LISTITEM;
1214 break; 1280 break;
1215 case WebAccessibility::ROLE_DIALOG: 1281 case WebAccessibility::ROLE_DIALOG:
1216 ia_role_ = ROLE_SYSTEM_DIALOG; 1282 role_ = ROLE_SYSTEM_DIALOG;
1217 break; 1283 break;
1218 case WebAccessibility::ROLE_DOCUMENT: 1284 case WebAccessibility::ROLE_DOCUMENT:
1219 case WebAccessibility::ROLE_WEB_AREA: 1285 case WebAccessibility::ROLE_WEB_AREA:
1220 ia_role_ = ROLE_SYSTEM_DOCUMENT; 1286 role_ = ROLE_SYSTEM_DOCUMENT;
1221 ia_state_|= STATE_SYSTEM_READONLY; 1287 state_ |= STATE_SYSTEM_READONLY;
1222 ia_state_|= STATE_SYSTEM_FOCUSABLE; 1288 state_ |= STATE_SYSTEM_FOCUSABLE;
1223 break; 1289 break;
1224 case WebAccessibility::ROLE_EDITABLE_TEXT: 1290 case WebAccessibility::ROLE_EDITABLE_TEXT:
1225 ia_role_ = ROLE_SYSTEM_TEXT; 1291 role_ = ROLE_SYSTEM_TEXT;
1226 ia2_state_ |= IA2_STATE_SINGLE_LINE; 1292 ia2_state_ |= IA2_STATE_SINGLE_LINE;
1227 ia2_state_ |= IA2_STATE_EDITABLE; 1293 ia2_state_ |= IA2_STATE_EDITABLE;
1228 break; 1294 break;
1229 case WebAccessibility::ROLE_GRID: 1295 case WebAccessibility::ROLE_GRID:
1230 ia_role_ = ROLE_SYSTEM_TABLE; 1296 role_ = ROLE_SYSTEM_TABLE;
1231 break; 1297 break;
1232 case WebAccessibility::ROLE_GROUP: 1298 case WebAccessibility::ROLE_GROUP:
1233 GetAttribute(WebAccessibility::ATTR_HTML_TAG, &role_name_); 1299 GetAttribute(WebAccessibility::ATTR_HTML_TAG, &role_name_);
1234 if (role_name_.empty()) 1300 if (role_name_.empty())
1235 role_name_ = L"div"; 1301 role_name_ = L"div";
1236 ia2_role_ = IA2_ROLE_SECTION; 1302 ia2_role_ = IA2_ROLE_SECTION;
1237 break; 1303 break;
1238 case WebAccessibility::ROLE_HEADING: 1304 case WebAccessibility::ROLE_HEADING:
1239 GetAttribute(WebAccessibility::ATTR_HTML_TAG, &role_name_); 1305 GetAttribute(WebAccessibility::ATTR_HTML_TAG, &role_name_);
1240 ia2_role_ = IA2_ROLE_HEADING; 1306 ia2_role_ = IA2_ROLE_HEADING;
1241 break; 1307 break;
1242 case WebAccessibility::ROLE_IMAGE: 1308 case WebAccessibility::ROLE_IMAGE:
1243 ia_role_ = ROLE_SYSTEM_GRAPHIC; 1309 role_ = ROLE_SYSTEM_GRAPHIC;
1244 break; 1310 break;
1245 case WebAccessibility::ROLE_IMAGE_MAP: 1311 case WebAccessibility::ROLE_IMAGE_MAP:
1246 GetAttribute(WebAccessibility::ATTR_HTML_TAG, &role_name_); 1312 GetAttribute(WebAccessibility::ATTR_HTML_TAG, &role_name_);
1247 ia2_role_ = IA2_ROLE_IMAGE_MAP; 1313 ia2_role_ = IA2_ROLE_IMAGE_MAP;
1248 break; 1314 break;
1249 case WebAccessibility::ROLE_IMAGE_MAP_LINK: 1315 case WebAccessibility::ROLE_IMAGE_MAP_LINK:
1250 ia_role_ = ROLE_SYSTEM_LINK; 1316 role_ = ROLE_SYSTEM_LINK;
1251 ia_state_|= STATE_SYSTEM_LINKED; 1317 state_ |= STATE_SYSTEM_LINKED;
1252 break; 1318 break;
1253 case WebAccessibility::ROLE_LANDMARK_APPLICATION: 1319 case WebAccessibility::ROLE_LANDMARK_APPLICATION:
1254 case WebAccessibility::ROLE_LANDMARK_BANNER: 1320 case WebAccessibility::ROLE_LANDMARK_BANNER:
1255 case WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY: 1321 case WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY:
1256 case WebAccessibility::ROLE_LANDMARK_CONTENTINFO: 1322 case WebAccessibility::ROLE_LANDMARK_CONTENTINFO:
1257 case WebAccessibility::ROLE_LANDMARK_MAIN: 1323 case WebAccessibility::ROLE_LANDMARK_MAIN:
1258 case WebAccessibility::ROLE_LANDMARK_NAVIGATION: 1324 case WebAccessibility::ROLE_LANDMARK_NAVIGATION:
1259 case WebAccessibility::ROLE_LANDMARK_SEARCH: 1325 case WebAccessibility::ROLE_LANDMARK_SEARCH:
1260 ia_role_ = ROLE_SYSTEM_GROUPING; 1326 role_ = ROLE_SYSTEM_GROUPING;
1261 ia2_role_ = IA2_ROLE_SECTION; 1327 ia2_role_ = IA2_ROLE_SECTION;
1262 break; 1328 break;
1263 case WebAccessibility::ROLE_LINK: 1329 case WebAccessibility::ROLE_LINK:
1264 case WebAccessibility::ROLE_WEBCORE_LINK: 1330 case WebAccessibility::ROLE_WEBCORE_LINK:
1265 ia_role_ = ROLE_SYSTEM_LINK; 1331 role_ = ROLE_SYSTEM_LINK;
1266 ia_state_|= STATE_SYSTEM_LINKED; 1332 state_ |= STATE_SYSTEM_LINKED;
1267 break; 1333 break;
1268 case WebAccessibility::ROLE_LIST: 1334 case WebAccessibility::ROLE_LIST:
1269 ia_role_ = ROLE_SYSTEM_LIST; 1335 role_ = ROLE_SYSTEM_LIST;
1270 break; 1336 break;
1271 case WebAccessibility::ROLE_LISTBOX: 1337 case WebAccessibility::ROLE_LISTBOX:
1272 ia_role_ = ROLE_SYSTEM_LIST; 1338 role_ = ROLE_SYSTEM_LIST;
1273 break; 1339 break;
1274 case WebAccessibility::ROLE_LISTBOX_OPTION: 1340 case WebAccessibility::ROLE_LISTBOX_OPTION:
1275 case WebAccessibility::ROLE_LIST_ITEM: 1341 case WebAccessibility::ROLE_LIST_ITEM:
1276 case WebAccessibility::ROLE_LIST_MARKER: 1342 case WebAccessibility::ROLE_LIST_MARKER:
1277 ia_role_ = ROLE_SYSTEM_LISTITEM; 1343 role_ = ROLE_SYSTEM_LISTITEM;
1278 break; 1344 break;
1279 case WebAccessibility::ROLE_MENU: 1345 case WebAccessibility::ROLE_MENU:
1280 case WebAccessibility::ROLE_MENU_BUTTON: 1346 case WebAccessibility::ROLE_MENU_BUTTON:
1281 ia_role_ = ROLE_SYSTEM_MENUPOPUP; 1347 role_ = ROLE_SYSTEM_MENUPOPUP;
1282 break; 1348 break;
1283 case WebAccessibility::ROLE_MENU_BAR: 1349 case WebAccessibility::ROLE_MENU_BAR:
1284 ia_role_ = ROLE_SYSTEM_MENUBAR; 1350 role_ = ROLE_SYSTEM_MENUBAR;
1285 break; 1351 break;
1286 case WebAccessibility::ROLE_MENU_ITEM: 1352 case WebAccessibility::ROLE_MENU_ITEM:
1287 case WebAccessibility::ROLE_MENU_LIST_OPTION: 1353 case WebAccessibility::ROLE_MENU_LIST_OPTION:
1288 ia_role_ = ROLE_SYSTEM_MENUITEM; 1354 role_ = ROLE_SYSTEM_MENUITEM;
1289 break; 1355 break;
1290 case WebAccessibility::ROLE_MENU_LIST_POPUP: 1356 case WebAccessibility::ROLE_MENU_LIST_POPUP:
1291 ia_role_ = ROLE_SYSTEM_MENUPOPUP; 1357 role_ = ROLE_SYSTEM_MENUPOPUP;
1292 break; 1358 break;
1293 case WebAccessibility::ROLE_NOTE: 1359 case WebAccessibility::ROLE_NOTE:
1294 ia_role_ = ROLE_SYSTEM_GROUPING; 1360 role_ = ROLE_SYSTEM_GROUPING;
1295 ia2_role_ = IA2_ROLE_NOTE; 1361 ia2_role_ = IA2_ROLE_NOTE;
1296 break; 1362 break;
1297 case WebAccessibility::ROLE_OUTLINE: 1363 case WebAccessibility::ROLE_OUTLINE:
1298 ia_role_ = ROLE_SYSTEM_OUTLINE; 1364 role_ = ROLE_SYSTEM_OUTLINE;
1299 break; 1365 break;
1300 case WebAccessibility::ROLE_POPUP_BUTTON: 1366 case WebAccessibility::ROLE_POPUP_BUTTON:
1301 ia_role_ = ROLE_SYSTEM_COMBOBOX; 1367 role_ = ROLE_SYSTEM_COMBOBOX;
1302 break; 1368 break;
1303 case WebAccessibility::ROLE_PROGRESS_INDICATOR: 1369 case WebAccessibility::ROLE_PROGRESS_INDICATOR:
1304 ia_role_ = ROLE_SYSTEM_PROGRESSBAR; 1370 role_ = ROLE_SYSTEM_PROGRESSBAR;
1305 break; 1371 break;
1306 case WebAccessibility::ROLE_RADIO_BUTTON: 1372 case WebAccessibility::ROLE_RADIO_BUTTON:
1307 ia_role_ = ROLE_SYSTEM_RADIOBUTTON; 1373 role_ = ROLE_SYSTEM_RADIOBUTTON;
1308 break; 1374 break;
1309 case WebAccessibility::ROLE_RADIO_GROUP: 1375 case WebAccessibility::ROLE_RADIO_GROUP:
1310 ia_role_ = ROLE_SYSTEM_GROUPING; 1376 role_ = ROLE_SYSTEM_GROUPING;
1311 ia2_role_ = IA2_ROLE_SECTION; 1377 ia2_role_ = IA2_ROLE_SECTION;
1312 break; 1378 break;
1313 case WebAccessibility::ROLE_REGION: 1379 case WebAccessibility::ROLE_REGION:
1314 ia_role_ = ROLE_SYSTEM_GROUPING; 1380 role_ = ROLE_SYSTEM_GROUPING;
1315 ia2_role_ = IA2_ROLE_SECTION; 1381 ia2_role_ = IA2_ROLE_SECTION;
1316 break; 1382 break;
1317 case WebAccessibility::ROLE_ROW: 1383 case WebAccessibility::ROLE_ROW:
1318 ia_role_ = ROLE_SYSTEM_ROW; 1384 role_ = ROLE_SYSTEM_ROW;
1319 break; 1385 break;
1320 case WebAccessibility::ROLE_ROW_HEADER: 1386 case WebAccessibility::ROLE_ROW_HEADER:
1321 ia_role_ = ROLE_SYSTEM_ROWHEADER; 1387 role_ = ROLE_SYSTEM_ROWHEADER;
1322 break; 1388 break;
1323 case WebAccessibility::ROLE_RULER: 1389 case WebAccessibility::ROLE_RULER:
1324 ia_role_ = ROLE_SYSTEM_CLIENT; 1390 role_ = ROLE_SYSTEM_CLIENT;
1325 ia2_role_ = IA2_ROLE_RULER; 1391 ia2_role_ = IA2_ROLE_RULER;
1326 break; 1392 break;
1327 case WebAccessibility::ROLE_SCROLLAREA: 1393 case WebAccessibility::ROLE_SCROLLAREA:
1328 ia_role_ = ROLE_SYSTEM_CLIENT; 1394 role_ = ROLE_SYSTEM_CLIENT;
1329 ia2_role_ = IA2_ROLE_SCROLL_PANE; 1395 ia2_role_ = IA2_ROLE_SCROLL_PANE;
1330 break; 1396 break;
1331 case WebAccessibility::ROLE_SCROLLBAR: 1397 case WebAccessibility::ROLE_SCROLLBAR:
1332 ia_role_ = ROLE_SYSTEM_SCROLLBAR; 1398 role_ = ROLE_SYSTEM_SCROLLBAR;
1333 break; 1399 break;
1334 case WebAccessibility::ROLE_SLIDER: 1400 case WebAccessibility::ROLE_SLIDER:
1335 ia_role_ = ROLE_SYSTEM_SLIDER; 1401 role_ = ROLE_SYSTEM_SLIDER;
1336 break; 1402 break;
1337 case WebAccessibility::ROLE_SPLIT_GROUP: 1403 case WebAccessibility::ROLE_SPLIT_GROUP:
1338 ia_role_ = ROLE_SYSTEM_CLIENT; 1404 role_ = ROLE_SYSTEM_CLIENT;
1339 ia2_role_ = IA2_ROLE_SPLIT_PANE; 1405 ia2_role_ = IA2_ROLE_SPLIT_PANE;
1340 break; 1406 break;
1341 case WebAccessibility::ROLE_ANNOTATION: 1407 case WebAccessibility::ROLE_ANNOTATION:
1342 case WebAccessibility::ROLE_STATIC_TEXT: 1408 case WebAccessibility::ROLE_STATIC_TEXT:
1343 ia_role_ = ROLE_SYSTEM_TEXT; 1409 role_ = ROLE_SYSTEM_TEXT;
1344 break; 1410 break;
1345 case WebAccessibility::ROLE_STATUS: 1411 case WebAccessibility::ROLE_STATUS:
1346 ia_role_ = ROLE_SYSTEM_STATUSBAR; 1412 role_ = ROLE_SYSTEM_STATUSBAR;
1347 break; 1413 break;
1348 case WebAccessibility::ROLE_TAB: 1414 case WebAccessibility::ROLE_TAB:
1349 ia_role_ = ROLE_SYSTEM_PAGETAB; 1415 role_ = ROLE_SYSTEM_PAGETAB;
1350 break; 1416 break;
1351 case WebAccessibility::ROLE_TABLE: 1417 case WebAccessibility::ROLE_TABLE:
1352 ia_role_ = ROLE_SYSTEM_TABLE; 1418 role_ = ROLE_SYSTEM_TABLE;
1353 break; 1419 break;
1354 case WebAccessibility::ROLE_TABLE_HEADER_CONTAINER: 1420 case WebAccessibility::ROLE_TABLE_HEADER_CONTAINER:
1355 ia_role_ = ROLE_SYSTEM_GROUPING; 1421 role_ = ROLE_SYSTEM_GROUPING;
1356 ia2_role_ = IA2_ROLE_SECTION; 1422 ia2_role_ = IA2_ROLE_SECTION;
1357 break; 1423 break;
1358 case WebAccessibility::ROLE_TAB_GROUP: 1424 case WebAccessibility::ROLE_TAB_GROUP:
1359 case WebAccessibility::ROLE_TAB_LIST: 1425 case WebAccessibility::ROLE_TAB_LIST:
1360 case WebAccessibility::ROLE_TAB_PANEL: 1426 case WebAccessibility::ROLE_TAB_PANEL:
1361 ia_role_ = ROLE_SYSTEM_PAGETABLIST; 1427 role_ = ROLE_SYSTEM_PAGETABLIST;
1362 break; 1428 break;
1363 case WebAccessibility::ROLE_TEXTAREA: 1429 case WebAccessibility::ROLE_TEXTAREA:
1364 ia_role_ = ROLE_SYSTEM_TEXT; 1430 role_ = ROLE_SYSTEM_TEXT;
1365 ia2_state_ |= IA2_STATE_MULTI_LINE; 1431 ia2_state_ |= IA2_STATE_MULTI_LINE;
1366 ia2_state_ |= IA2_STATE_EDITABLE; 1432 ia2_state_ |= IA2_STATE_EDITABLE;
1367 break; 1433 break;
1368 case WebAccessibility::ROLE_TEXT_FIELD: 1434 case WebAccessibility::ROLE_TEXT_FIELD:
1369 ia_role_ = ROLE_SYSTEM_TEXT; 1435 role_ = ROLE_SYSTEM_TEXT;
1370 ia2_state_ |= IA2_STATE_SINGLE_LINE; 1436 ia2_state_ |= IA2_STATE_SINGLE_LINE;
1371 ia2_state_ |= IA2_STATE_EDITABLE; 1437 ia2_state_ |= IA2_STATE_EDITABLE;
1372 break; 1438 break;
1373 case WebAccessibility::ROLE_TOOLBAR: 1439 case WebAccessibility::ROLE_TOOLBAR:
1374 ia_role_ = ROLE_SYSTEM_TOOLBAR; 1440 role_ = ROLE_SYSTEM_TOOLBAR;
1375 break; 1441 break;
1376 case WebAccessibility::ROLE_TOOLTIP: 1442 case WebAccessibility::ROLE_TOOLTIP:
1377 ia_role_ = ROLE_SYSTEM_TOOLTIP; 1443 role_ = ROLE_SYSTEM_TOOLTIP;
1378 break; 1444 break;
1379 case WebAccessibility::ROLE_TREE: 1445 case WebAccessibility::ROLE_TREE:
1380 ia_role_ = ROLE_SYSTEM_OUTLINE; 1446 role_ = ROLE_SYSTEM_OUTLINE;
1381 break; 1447 break;
1382 case WebAccessibility::ROLE_TREE_GRID: 1448 case WebAccessibility::ROLE_TREE_GRID:
1383 ia_role_ = ROLE_SYSTEM_OUTLINE; 1449 role_ = ROLE_SYSTEM_OUTLINE;
1384 break; 1450 break;
1385 case WebAccessibility::ROLE_TREE_ITEM: 1451 case WebAccessibility::ROLE_TREE_ITEM:
1386 ia_role_ = ROLE_SYSTEM_OUTLINEITEM; 1452 role_ = ROLE_SYSTEM_OUTLINEITEM;
1387 break; 1453 break;
1388 case WebAccessibility::ROLE_WINDOW: 1454 case WebAccessibility::ROLE_WINDOW:
1389 ia_role_ = ROLE_SYSTEM_WINDOW; 1455 role_ = ROLE_SYSTEM_WINDOW;
1390 break; 1456 break;
1391 1457
1392 // TODO(dmazzoni): figure out the proper MSAA role for all of these. 1458 // TODO(dmazzoni): figure out the proper MSAA role for all of these.
1393 case WebAccessibility::ROLE_BROWSER: 1459 case WebAccessibility::ROLE_BROWSER:
1394 case WebAccessibility::ROLE_BUSY_INDICATOR: 1460 case WebAccessibility::ROLE_BUSY_INDICATOR:
1395 case WebAccessibility::ROLE_DIRECTORY: 1461 case WebAccessibility::ROLE_DIRECTORY:
1396 case WebAccessibility::ROLE_DISCLOSURE_TRIANGLE: 1462 case WebAccessibility::ROLE_DISCLOSURE_TRIANGLE:
1397 case WebAccessibility::ROLE_DRAWER: 1463 case WebAccessibility::ROLE_DRAWER:
1398 case WebAccessibility::ROLE_GROW_AREA: 1464 case WebAccessibility::ROLE_GROW_AREA:
1399 case WebAccessibility::ROLE_HELP_TAG: 1465 case WebAccessibility::ROLE_HELP_TAG:
1400 case WebAccessibility::ROLE_IGNORED: 1466 case WebAccessibility::ROLE_IGNORED:
1401 case WebAccessibility::ROLE_INCREMENTOR: 1467 case WebAccessibility::ROLE_INCREMENTOR:
1402 case WebAccessibility::ROLE_LOG: 1468 case WebAccessibility::ROLE_LOG:
1403 case WebAccessibility::ROLE_MARQUEE: 1469 case WebAccessibility::ROLE_MARQUEE:
1404 case WebAccessibility::ROLE_MATH: 1470 case WebAccessibility::ROLE_MATH:
1405 case WebAccessibility::ROLE_MATTE: 1471 case WebAccessibility::ROLE_MATTE:
1406 case WebAccessibility::ROLE_RULER_MARKER: 1472 case WebAccessibility::ROLE_RULER_MARKER:
1407 case WebAccessibility::ROLE_SHEET: 1473 case WebAccessibility::ROLE_SHEET:
1408 case WebAccessibility::ROLE_SLIDER_THUMB: 1474 case WebAccessibility::ROLE_SLIDER_THUMB:
1409 case WebAccessibility::ROLE_SPLITTER: 1475 case WebAccessibility::ROLE_SPLITTER:
1410 case WebAccessibility::ROLE_SYSTEM_WIDE: 1476 case WebAccessibility::ROLE_SYSTEM_WIDE:
1411 case WebAccessibility::ROLE_TIMER: 1477 case WebAccessibility::ROLE_TIMER:
1412 case WebAccessibility::ROLE_VALUE_INDICATOR: 1478 case WebAccessibility::ROLE_VALUE_INDICATOR:
1413 default: 1479 default:
1414 ia_role_ = ROLE_SYSTEM_CLIENT; 1480 role_ = ROLE_SYSTEM_CLIENT;
1415 break; 1481 break;
1416 } 1482 }
1417 1483
1418 // The role should always be set. 1484 // The role should always be set.
1419 DCHECK(!role_name_.empty() || ia_role_); 1485 DCHECK(!role_name_.empty() || role_);
1420 1486
1421 // If we didn't explicitly set the IAccessible2 role, make it the same 1487 // If we didn't explicitly set the IAccessible2 role, make it the same
1422 // as the MSAA role. 1488 // as the MSAA role.
1423 if (!ia2_role_) 1489 if (!ia2_role_)
1424 ia2_role_ = ia_role_; 1490 ia2_role_ = role_;
1425 } 1491 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698