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

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

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

Powered by Google App Engine
This is Rietveld 408576698