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

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

Issue 7745035: Add a big grab bag of missing web accessibility functionality... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 9 years, 4 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "content/browser/accessibility/browser_accessibility_win.h" 5 #include "content/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 "content/browser/accessibility/browser_accessibility_manager_win.h" 10 #include "content/browser/accessibility/browser_accessibility_manager_win.h"
11 #include "content/common/view_messages.h"
11 #include "net/base/escape.h" 12 #include "net/base/escape.h"
12 13
13 using webkit_glue::WebAccessibility; 14 using webkit_glue::WebAccessibility;
14 15
15 // The GUID for the ISimpleDOM service is not defined in the IDL files. 16 // The GUID for the ISimpleDOM service is not defined in the IDL files.
16 // This is taken directly from the Mozilla sources 17 // This is taken directly from the Mozilla sources
17 // (accessible/src/msaa/nsAccessNodeWrap.cpp) and it's also documented at: 18 // (accessible/src/msaa/nsAccessNodeWrap.cpp) and it's also documented at:
18 // http://developer.mozilla.org/en/Accessibility/AT-APIs/ImplementationFeatures/ MSAA 19 // http://developer.mozilla.org/en/Accessibility/AT-APIs/ImplementationFeatures/ MSAA
19 20
20 const GUID GUID_ISimpleDOM = { 21 const GUID GUID_ISimpleDOM = {
21 0x0c539790, 0x12e4, 0x11cf, 22 0x0c539790, 0x12e4, 0x11cf,
22 0xb6, 0x61, 0x00, 0xaa, 0x00, 0x4c, 0xd6, 0xd8}; 23 0xb6, 0x61, 0x00, 0xaa, 0x00, 0x4c, 0xd6, 0xd8};
23 24
24 // static 25 // static
25 BrowserAccessibility* BrowserAccessibility::Create() { 26 BrowserAccessibility* BrowserAccessibility::Create() {
26 CComObject<BrowserAccessibilityWin>* instance; 27 CComObject<BrowserAccessibilityWin>* instance;
27 HRESULT hr = CComObject<BrowserAccessibilityWin>::CreateInstance(&instance); 28 HRESULT hr = CComObject<BrowserAccessibilityWin>::CreateInstance(&instance);
28 DCHECK(SUCCEEDED(hr)); 29 DCHECK(SUCCEEDED(hr));
29 return instance->NewReference(); 30 return instance->NewReference();
30 } 31 }
31 32
32 BrowserAccessibilityWin* BrowserAccessibility::toBrowserAccessibilityWin() { 33 BrowserAccessibilityWin* BrowserAccessibility::toBrowserAccessibilityWin() {
33 return static_cast<BrowserAccessibilityWin*>(this); 34 return static_cast<BrowserAccessibilityWin*>(this);
34 } 35 }
35 36
36 BrowserAccessibilityWin::BrowserAccessibilityWin() 37 BrowserAccessibilityWin::BrowserAccessibilityWin()
37 : ia_role_(0), 38 : ia_role_(0),
38 ia_state_(0), 39 ia_state_(0),
39 ia2_role_(0), 40 ia2_role_(0),
40 ia2_state_(0) { 41 ia2_state_(0),
42 first_time_(true) {
41 } 43 }
David Tseng 2011/08/29 19:05:34 nit: first_time_alert_?
dmazzoni 2011/08/29 19:38:35 It's more generally useful, I think I'll be using
42 44
43 BrowserAccessibilityWin::~BrowserAccessibilityWin() { 45 BrowserAccessibilityWin::~BrowserAccessibilityWin() {
44 } 46 }
45 47
46 // 48 //
47 // IAccessible methods. 49 // IAccessible methods.
48 // 50 //
49 // Conventions: 51 // Conventions:
50 // * Always test for instance_active_ first and return E_FAIL if it's false. 52 // * Always test for instance_active_ first and return E_FAIL if it's false.
51 // * Always check for invalid arguments first, even if they're unused. 53 // * Always check for invalid arguments first, even if they're unused.
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 return S_OK; 416 return S_OK;
415 } 417 }
416 418
417 STDMETHODIMP BrowserAccessibilityWin::get_attributes(BSTR* attributes) { 419 STDMETHODIMP BrowserAccessibilityWin::get_attributes(BSTR* attributes) {
418 if (!instance_active_) 420 if (!instance_active_)
419 return E_FAIL; 421 return E_FAIL;
420 422
421 if (!attributes) 423 if (!attributes)
422 return E_INVALIDARG; 424 return E_INVALIDARG;
423 425
424 // Follow Firefox's convention, which is to return a set of key-value pairs 426 // The iaccessible2 attributes are a set of key-value pairs
425 // separated by semicolons, with a colon between the key and the value. 427 // separated by semicolons, with a colon between the key and the value.
426 string16 str; 428 string16 str;
427 for (unsigned int i = 0; i < html_attributes_.size(); i++) { 429 for (unsigned int i = 0; i < ia2_attributes_.size(); i++) {
David Tseng 2011/08/29 19:05:34 nit: ++i
dmazzoni 2011/08/29 19:38:35 Done.
428 if (i != 0) 430 if (i != 0)
429 str += L';'; 431 str += L';';
430 str += Escape(html_attributes_[i].first); 432 str += ia2_attributes_[i];
431 str += L':';
432 str += Escape(html_attributes_[i].second);
433 } 433 }
434 434
435 if (str.empty()) 435 if (str.empty())
436 return S_FALSE; 436 return S_FALSE;
437 437
438 *attributes = SysAllocString(str.c_str()); 438 *attributes = SysAllocString(str.c_str());
439 DCHECK(*attributes); 439 DCHECK(*attributes);
440 return S_OK; 440 return S_OK;
441 } 441 }
442 442
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 567
568 DCHECK_EQ(columns * rows, static_cast<int>(cell_ids_.size())); 568 DCHECK_EQ(columns * rows, static_cast<int>(cell_ids_.size()));
569 569
570 int cell_id = cell_ids_[row * columns + column]; 570 int cell_id = cell_ids_[row * columns + column];
571 BrowserAccessibilityWin* cell = GetFromRendererID(cell_id); 571 BrowserAccessibilityWin* cell = GetFromRendererID(cell_id);
572 if (cell) { 572 if (cell) {
573 *accessible = static_cast<IAccessible*>(cell->NewReference()); 573 *accessible = static_cast<IAccessible*>(cell->NewReference());
574 return S_OK; 574 return S_OK;
575 } 575 }
576 576
577 return S_FALSE; 577 *accessible = NULL;
578 return E_INVALIDARG;
578 } 579 }
579 580
580 STDMETHODIMP BrowserAccessibilityWin::get_caption(IUnknown** accessible) { 581 STDMETHODIMP BrowserAccessibilityWin::get_caption(IUnknown** accessible) {
581 if (!instance_active_) 582 if (!instance_active_)
582 return E_FAIL; 583 return E_FAIL;
583 584
584 if (!accessible) 585 if (!accessible)
585 return E_INVALIDARG; 586 return E_INVALIDARG;
586 587
587 // TODO(dmazzoni): implement 588 // TODO(dmazzoni): implement
(...skipping 15 matching lines...) Expand all
603 if (!GetIntAttribute(WebAccessibility::ATTR_TABLE_COLUMN_COUNT, &columns) || 604 if (!GetIntAttribute(WebAccessibility::ATTR_TABLE_COLUMN_COUNT, &columns) ||
604 !GetIntAttribute(WebAccessibility::ATTR_TABLE_ROW_COUNT, &rows) || 605 !GetIntAttribute(WebAccessibility::ATTR_TABLE_ROW_COUNT, &rows) ||
605 columns <= 0 || 606 columns <= 0 ||
606 rows <= 0) { 607 rows <= 0) {
607 return S_FALSE; 608 return S_FALSE;
608 } 609 }
609 610
610 if (row < 0 || row >= rows || column < 0 || column >= columns) 611 if (row < 0 || row >= rows || column < 0 || column >= columns)
611 return E_INVALIDARG; 612 return E_INVALIDARG;
612 613
613 *cell_index = row * columns + column; 614 DCHECK_EQ(columns * rows, static_cast<int>(cell_ids_.size()));
615 int cell_id = cell_ids_[row * columns + column];
616 for (size_t i = 0; i < unique_cell_ids_.size(); i++) {
David Tseng 2011/08/29 19:05:34 nit: ++i
dmazzoni 2011/08/29 19:38:35 Done.
617 if (unique_cell_ids_[i] == cell_id) {
618 *cell_index = (long)i;
619 return S_OK;
620 }
621 }
614 622
615 return S_OK; 623 return S_FALSE;
616 } 624 }
617 625
618 STDMETHODIMP BrowserAccessibilityWin::get_columnDescription( 626 STDMETHODIMP BrowserAccessibilityWin::get_columnDescription(
619 long column, 627 long column,
620 BSTR* description) { 628 BSTR* description) {
621 if (!instance_active_) 629 if (!instance_active_)
622 return E_FAIL; 630 return E_FAIL;
623 631
624 if (!description) 632 if (!description)
625 return E_INVALIDARG; 633 return E_INVALIDARG;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 708
701 STDMETHODIMP BrowserAccessibilityWin::get_columnIndex( 709 STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(
702 long cell_index, 710 long cell_index,
703 long* column_index) { 711 long* column_index) {
704 if (!instance_active_) 712 if (!instance_active_)
705 return E_FAIL; 713 return E_FAIL;
706 714
707 if (!column_index) 715 if (!column_index)
708 return E_INVALIDARG; 716 return E_INVALIDARG;
709 717
710 int columns; 718 int cell_id_count = static_cast<int>(unique_cell_ids_.size());
711 int rows; 719 if (cell_index < 0)
712 if (!GetIntAttribute(WebAccessibility::ATTR_TABLE_COLUMN_COUNT, &columns) || 720 return E_INVALIDARG;
713 !GetIntAttribute(WebAccessibility::ATTR_TABLE_ROW_COUNT, &rows) || 721 if (cell_index >= cell_id_count)
714 columns <= 0 ||
715 rows <= 0) {
716 return S_FALSE; 722 return S_FALSE;
723
724 int cell_id = unique_cell_ids_[cell_index];
725 BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>(
726 manager_->GetFromRendererID(cell_id));
727 int col_index;
728 if (cell &&
729 cell->GetIntAttribute(
730 WebAccessibility::ATTR_TABLE_CELL_COLUMN_INDEX, &col_index)) {
731 *column_index = col_index;
732 return S_OK;
717 } 733 }
718 734
719 if (cell_index < 0 || cell_index >= columns * rows) 735 return S_FALSE;
720 return E_INVALIDARG;
721
722 *column_index = cell_index % columns;
723
724 return S_OK;
725 } 736 }
726 737
727 STDMETHODIMP BrowserAccessibilityWin::get_nColumns( 738 STDMETHODIMP BrowserAccessibilityWin::get_nColumns(
728 long* column_count) { 739 long* column_count) {
729 if (!instance_active_) 740 if (!instance_active_)
730 return E_FAIL; 741 return E_FAIL;
731 742
732 if (!column_count) 743 if (!column_count)
733 return E_INVALIDARG; 744 return E_INVALIDARG;
734 745
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
880 891
881 STDMETHODIMP BrowserAccessibilityWin::get_rowIndex( 892 STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(
882 long cell_index, 893 long cell_index,
883 long* row_index) { 894 long* row_index) {
884 if (!instance_active_) 895 if (!instance_active_)
885 return E_FAIL; 896 return E_FAIL;
886 897
887 if (!row_index) 898 if (!row_index)
888 return E_INVALIDARG; 899 return E_INVALIDARG;
889 900
890 int columns; 901 int cell_id_count = static_cast<int>(unique_cell_ids_.size());
891 int rows; 902 if (cell_index < 0)
892 if (!GetIntAttribute(WebAccessibility::ATTR_TABLE_COLUMN_COUNT, &columns) || 903 return E_INVALIDARG;
893 !GetIntAttribute(WebAccessibility::ATTR_TABLE_ROW_COUNT, &rows) || 904 if (cell_index >= cell_id_count)
894 columns <= 0 ||
895 rows <= 0) {
896 return S_FALSE; 905 return S_FALSE;
906
907 int cell_id = unique_cell_ids_[cell_index];
908 BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>(
909 manager_->GetFromRendererID(cell_id));
910 int cell_row_index;
911 if (cell &&
912 cell->GetIntAttribute(
913 WebAccessibility::ATTR_TABLE_CELL_ROW_INDEX, &cell_row_index)) {
914 *row_index = cell_row_index;
915 return S_OK;
897 } 916 }
898 917
899 if (cell_index < 0 || cell_index >= columns * rows) 918 return S_FALSE;
900 return E_INVALIDARG;
901
902 *row_index = cell_index / columns;
903
904 return S_OK;
905 } 919 }
906 920
907 STDMETHODIMP BrowserAccessibilityWin::get_selectedChildren( 921 STDMETHODIMP BrowserAccessibilityWin::get_selectedChildren(
908 long max_children, 922 long max_children,
909 long** children, 923 long** children,
910 long* n_children) { 924 long* n_children) {
911 if (!instance_active_) 925 if (!instance_active_)
912 return E_FAIL; 926 return E_FAIL;
913 927
914 if (!children || !n_children) 928 if (!children || !n_children)
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1004 long* column, 1018 long* column,
1005 long* row_extents, 1019 long* row_extents,
1006 long* column_extents, 1020 long* column_extents,
1007 boolean* is_selected) { 1021 boolean* is_selected) {
1008 if (!instance_active_) 1022 if (!instance_active_)
1009 return E_FAIL; 1023 return E_FAIL;
1010 1024
1011 if (!row || !column || !row_extents || !column_extents || !is_selected) 1025 if (!row || !column || !row_extents || !column_extents || !is_selected)
1012 return E_INVALIDARG; 1026 return E_INVALIDARG;
1013 1027
1014 int columns; 1028 int cell_id_count = static_cast<int>(unique_cell_ids_.size());
1015 int rows; 1029 if (index < 0)
1016 if (!GetIntAttribute(WebAccessibility::ATTR_TABLE_COLUMN_COUNT, &columns) || 1030 return E_INVALIDARG;
1017 !GetIntAttribute(WebAccessibility::ATTR_TABLE_ROW_COUNT, &rows) || 1031 if (index >= cell_id_count)
1018 columns <= 0 ||
1019 rows <= 0) {
1020 return S_FALSE; 1032 return S_FALSE;
1021 }
1022 1033
1023 if (index < 0 || index >= columns * rows) 1034 int cell_id = unique_cell_ids_[index];
1024 return E_INVALIDARG;
1025
1026 *column = index % columns;
1027 *row = index / columns;
1028 int cell_id = cell_ids_[index];
1029 BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>( 1035 BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>(
1030 manager_->GetFromRendererID(cell_id)); 1036 manager_->GetFromRendererID(cell_id));
1031 int rowspan; 1037 int rowspan;
1032 int colspan; 1038 int colspan;
1033 if (cell && 1039 if (cell &&
1034 cell->GetIntAttribute( 1040 cell->GetIntAttribute(
1035 WebAccessibility::ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 1041 WebAccessibility::ATTR_TABLE_CELL_ROW_SPAN, &rowspan) &&
1036 cell->GetIntAttribute( 1042 cell->GetIntAttribute(
1037 WebAccessibility::ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) && 1043 WebAccessibility::ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) &&
1038 rowspan >= 1 && 1044 rowspan >= 1 &&
1039 colspan >= 1) { 1045 colspan >= 1) {
1040 *row_extents = rowspan; 1046 *row_extents = rowspan;
1041 *column_extents = colspan; 1047 *column_extents = colspan;
1042 return S_OK; 1048 return S_OK;
1043 } 1049 }
1044 1050
1045 return S_FALSE; 1051 return S_FALSE;
1046 } 1052 }
1047 1053
1048 // 1054 //
1055 // IAccessibleTable2 methods.
1056 //
1057
1058 STDMETHODIMP BrowserAccessibilityWin::get_cellAt(
1059 long row,
1060 long column,
1061 IUnknown** cell) {
1062 return get_accessibleAt(row, column, cell);
1063 }
1064
1065 STDMETHODIMP BrowserAccessibilityWin::get_nSelectedCells(long* cell_count) {
1066 return get_nSelectedChildren(cell_count);
1067 }
1068
1069 STDMETHODIMP BrowserAccessibilityWin::get_selectedCells(
1070 IUnknown*** cells,
1071 long* n_selected_cells) {
1072 if (!instance_active_)
1073 return E_FAIL;
1074
1075 if (!cells || !n_selected_cells)
1076 return E_INVALIDARG;
1077
1078 *n_selected_cells = 0;
David Tseng 2011/08/29 19:05:34 TODO? cells is an out param?
dmazzoni 2011/08/29 19:38:35 Done.
1079 return S_OK;
1080 }
1081
1082 STDMETHODIMP BrowserAccessibilityWin::get_selectedColumns(
1083 long** columns,
1084 long* n_columns) {
1085 if (!instance_active_)
1086 return E_FAIL;
1087
1088 if (!columns || !n_columns)
1089 return E_INVALIDARG;
1090
1091 *n_columns = 0;
David Tseng 2011/08/29 19:05:34 Same here; TODO.
dmazzoni 2011/08/29 19:38:35 Done.
1092 return S_OK;
1093 }
1094
1095 STDMETHODIMP BrowserAccessibilityWin::get_selectedRows(
1096 long** rows,
1097 long* n_rows) {
1098 if (!instance_active_)
1099 return E_FAIL;
1100
1101 if (!rows || !n_rows)
1102 return E_INVALIDARG;
1103
1104 *n_rows = 0;
David Tseng 2011/08/29 19:05:34 Same here.
dmazzoni 2011/08/29 19:38:35 Done.
1105 return S_OK;
1106 }
1107
1108
1109 //
1049 // IAccessibleTableCell methods. 1110 // IAccessibleTableCell methods.
1050 // 1111 //
1051 1112
1052 STDMETHODIMP BrowserAccessibilityWin::get_columnExtent( 1113 STDMETHODIMP BrowserAccessibilityWin::get_columnExtent(
1053 long* n_columns_spanned) { 1114 long* n_columns_spanned) {
1054 if (!instance_active_) 1115 if (!instance_active_)
1055 return E_FAIL; 1116 return E_FAIL;
1056 1117
1057 if (!n_columns_spanned) 1118 if (!n_columns_spanned)
1058 return E_INVALIDARG; 1119 return E_INVALIDARG;
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
1291 } 1352 }
1292 1353
1293 STDMETHODIMP BrowserAccessibilityWin::get_table( 1354 STDMETHODIMP BrowserAccessibilityWin::get_table(
1294 IUnknown** table) { 1355 IUnknown** table) {
1295 if (!instance_active_) 1356 if (!instance_active_)
1296 return E_FAIL; 1357 return E_FAIL;
1297 1358
1298 if (!table) 1359 if (!table)
1299 return E_INVALIDARG; 1360 return E_INVALIDARG;
1300 1361
1362
1363 int row;
1364 int column;
1365 GetIntAttribute(WebAccessibility::ATTR_TABLE_CELL_ROW_INDEX, &row);
1366 GetIntAttribute(WebAccessibility::ATTR_TABLE_CELL_COLUMN_INDEX, &column);
1367
1301 BrowserAccessibility* find_table = parent(); 1368 BrowserAccessibility* find_table = parent();
1302 while (find_table && find_table->role() != WebAccessibility::ROLE_TABLE) 1369 while (find_table && find_table->role() != WebAccessibility::ROLE_TABLE)
1303 find_table = find_table->parent(); 1370 find_table = find_table->parent();
1304 if (!find_table) 1371 if (!find_table)
1305 return S_FALSE; 1372 return S_FALSE;
1306 1373
1307 *table = static_cast<IAccessible*>( 1374 *table = static_cast<IAccessibleTable*>(
1308 static_cast<BrowserAccessibilityWin*>(find_table)->NewReference()); 1375 static_cast<BrowserAccessibilityWin*>(find_table)->NewReference());
1309 1376
1310 return S_OK; 1377 return S_OK;
1311 } 1378 }
1312 1379
1313 // 1380 //
1314 // IAccessibleText methods. 1381 // IAccessibleText methods.
1315 // 1382 //
1316 1383
1317 STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) { 1384 STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) {
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
1519 return S_FALSE; 1586 return S_FALSE;
1520 } 1587 }
1521 1588
1522 const string16& text_str = TextForIAccessibleText(); 1589 const string16& text_str = TextForIAccessibleText();
1523 1590
1524 *start_offset = offset; 1591 *start_offset = offset;
1525 *end_offset = FindBoundary(text_str, boundary_type, offset, 1); 1592 *end_offset = FindBoundary(text_str, boundary_type, offset, 1);
1526 return get_text(*start_offset, *end_offset, text); 1593 return get_text(*start_offset, *end_offset, text);
1527 } 1594 }
1528 1595
1596 STDMETHODIMP BrowserAccessibilityWin::get_newText(IA2TextSegment* new_text) {
1597 if (!instance_active_)
1598 return E_FAIL;
1599
1600 if (!new_text)
1601 return E_INVALIDARG;
1602
1603 string16 text = TextForIAccessibleText();
1604
1605 new_text->text = SysAllocString(text.c_str());
1606 new_text->start = 0;
1607 new_text->end = static_cast<long>(text.size());
1608 return S_OK;
1609 }
1610
1611 STDMETHODIMP BrowserAccessibilityWin::get_oldText(IA2TextSegment* old_text) {
1612 if (!instance_active_)
1613 return E_FAIL;
1614
1615 if (!old_text)
1616 return E_INVALIDARG;
1617
1618 old_text->text = SysAllocString(old_text_.c_str());
1619 old_text->start = 0;
1620 old_text->end = static_cast<long>(old_text_.size());
1621 return S_OK;
1622 }
1623
1624 STDMETHODIMP BrowserAccessibilityWin::get_offsetAtPoint(
1625 LONG x, LONG y, enum IA2CoordinateType coord_type, LONG* offset) {
1626 if (!instance_active_)
1627 return E_FAIL;
1628
1629 if (!offset)
1630 return E_INVALIDARG;
1631
1632 // TODO(dmazzoni): implement this. We're returning S_OK for now so that
1633 // screen readers still return partially accurate results rather than
1634 // completely failing.
1635 *offset = 0;
1636 return S_OK;
1637 }
1638
1639 //
1640 // IAccessibleValue methods.
1641 //
1642
1643 STDMETHODIMP BrowserAccessibilityWin::get_currentValue(VARIANT* value) {
1644 if (!instance_active_)
1645 return E_FAIL;
1646
1647 if (!value)
1648 return E_INVALIDARG;
1649
1650 float float_val;
1651 if (GetFloatAttribute(WebAccessibility::ATTR_VALUE_FOR_RANGE, &float_val)) {
1652 value->vt = VT_R8;
1653 value->dblVal = float_val;
1654 return S_OK;
1655 }
1656
1657 value->vt = VT_EMPTY;
1658 return S_FALSE;
1659 }
1660
1661 STDMETHODIMP BrowserAccessibilityWin::get_minimumValue(VARIANT* value) {
1662 if (!instance_active_)
1663 return E_FAIL;
1664
1665 if (!value)
1666 return E_INVALIDARG;
1667
1668 float float_val;
1669 if (GetFloatAttribute(WebAccessibility::ATTR_MIN_VALUE_FOR_RANGE,
1670 &float_val)) {
1671 value->vt = VT_R8;
1672 value->dblVal = float_val;
1673 return S_OK;
1674 }
1675
1676 value->vt = VT_EMPTY;
1677 return S_FALSE;
1678 }
1679
1680 STDMETHODIMP BrowserAccessibilityWin::get_maximumValue(VARIANT* value) {
1681 if (!instance_active_)
1682 return E_FAIL;
1683
1684 if (!value)
1685 return E_INVALIDARG;
1686
1687 float float_val;
1688 if (GetFloatAttribute(WebAccessibility::ATTR_MAX_VALUE_FOR_RANGE,
1689 &float_val)) {
1690 value->vt = VT_R8;
1691 value->dblVal = float_val;
1692 return S_OK;
1693 }
1694
1695 value->vt = VT_EMPTY;
1696 return S_FALSE;
1697 }
1698
1699 STDMETHODIMP BrowserAccessibilityWin::setCurrentValue(VARIANT new_value) {
1700 return E_NOTIMPL;
David Tseng 2011/08/29 19:05:34 nit: TODO?
dmazzoni 2011/08/29 19:38:35 Done.
1701 }
1702
1529 // 1703 //
1530 // ISimpleDOMDocument methods. 1704 // ISimpleDOMDocument methods.
1531 // 1705 //
1532 1706
1533 STDMETHODIMP BrowserAccessibilityWin::get_URL(BSTR* url) { 1707 STDMETHODIMP BrowserAccessibilityWin::get_URL(BSTR* url) {
1534 if (!instance_active_) 1708 if (!instance_active_)
1535 return E_FAIL; 1709 return E_FAIL;
1536 1710
1537 if (!url) 1711 if (!url)
1538 return E_INVALIDARG; 1712 return E_INVALIDARG;
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
1846 2020
1847 // 2021 //
1848 // IServiceProvider methods. 2022 // IServiceProvider methods.
1849 // 2023 //
1850 2024
1851 STDMETHODIMP BrowserAccessibilityWin::QueryService( 2025 STDMETHODIMP BrowserAccessibilityWin::QueryService(
1852 REFGUID guidService, REFIID riid, void** object) { 2026 REFGUID guidService, REFIID riid, void** object) {
1853 if (!instance_active_) 2027 if (!instance_active_)
1854 return E_FAIL; 2028 return E_FAIL;
1855 2029
1856 if (guidService == IID_IAccessibleTable) {
1857 printf("iatable");
1858 }
1859 if (guidService == IID_IAccessibleTableCell) {
1860 printf("iatable");
1861 }
1862
1863 if (guidService == IID_IAccessible || 2030 if (guidService == IID_IAccessible ||
1864 guidService == IID_IAccessible2 || 2031 guidService == IID_IAccessible2 ||
1865 guidService == IID_IAccessibleImage || 2032 guidService == IID_IAccessibleImage ||
1866 guidService == IID_IAccessibleTable || 2033 guidService == IID_IAccessibleTable ||
2034 guidService == IID_IAccessibleTable2 ||
1867 guidService == IID_IAccessibleTableCell || 2035 guidService == IID_IAccessibleTableCell ||
1868 guidService == IID_IAccessibleText || 2036 guidService == IID_IAccessibleText ||
2037 guidService == IID_IAccessibleValue ||
1869 guidService == IID_ISimpleDOMDocument || 2038 guidService == IID_ISimpleDOMDocument ||
1870 guidService == IID_ISimpleDOMNode || 2039 guidService == IID_ISimpleDOMNode ||
1871 guidService == IID_ISimpleDOMText || 2040 guidService == IID_ISimpleDOMText ||
1872 guidService == GUID_ISimpleDOM) { 2041 guidService == GUID_ISimpleDOM) {
1873 return QueryInterface(riid, object); 2042 return QueryInterface(riid, object);
1874 } 2043 }
1875 2044
1876 *object = NULL; 2045 *object = NULL;
1877 return E_FAIL; 2046 return E_FAIL;
1878 } 2047 }
(...skipping 10 matching lines...) Expand all
1889 if (iid == IID_IAccessibleText) { 2058 if (iid == IID_IAccessibleText) {
1890 if (ia_role_ != ROLE_SYSTEM_LINK && ia_role_ != ROLE_SYSTEM_TEXT) { 2059 if (ia_role_ != ROLE_SYSTEM_LINK && ia_role_ != ROLE_SYSTEM_TEXT) {
1891 *object = NULL; 2060 *object = NULL;
1892 return E_NOINTERFACE; 2061 return E_NOINTERFACE;
1893 } 2062 }
1894 } else if (iid == IID_IAccessibleImage) { 2063 } else if (iid == IID_IAccessibleImage) {
1895 if (ia_role_ != ROLE_SYSTEM_GRAPHIC) { 2064 if (ia_role_ != ROLE_SYSTEM_GRAPHIC) {
1896 *object = NULL; 2065 *object = NULL;
1897 return E_NOINTERFACE; 2066 return E_NOINTERFACE;
1898 } 2067 }
1899 } else if (iid == IID_IAccessibleTable) { 2068 } else if (iid == IID_IAccessibleTable || iid == IID_IAccessibleTable2) {
1900 if (ia_role_ != ROLE_SYSTEM_TABLE) { 2069 if (ia_role_ != ROLE_SYSTEM_TABLE) {
1901 *object = NULL; 2070 *object = NULL;
1902 return E_NOINTERFACE; 2071 return E_NOINTERFACE;
1903 } 2072 }
1904 } else if (iid == IID_IAccessibleTableCell) { 2073 } else if (iid == IID_IAccessibleTableCell) {
1905 if (ia_role_ != ROLE_SYSTEM_CELL) { 2074 if (ia_role_ != ROLE_SYSTEM_CELL) {
1906 *object = NULL; 2075 *object = NULL;
1907 return E_NOINTERFACE; 2076 return E_NOINTERFACE;
1908 } 2077 }
2078 } else if (iid == IID_IAccessibleValue) {
2079 if (ia_role_ != ROLE_SYSTEM_PROGRESSBAR &&
2080 ia_role_ != ROLE_SYSTEM_SCROLLBAR &&
2081 ia_role_ != ROLE_SYSTEM_SLIDER) {
2082 *object = NULL;
2083 return E_NOINTERFACE;
2084 }
1909 } else if (iid == IID_ISimpleDOMDocument) { 2085 } else if (iid == IID_ISimpleDOMDocument) {
1910 if (ia_role_ != ROLE_SYSTEM_DOCUMENT) { 2086 if (ia_role_ != ROLE_SYSTEM_DOCUMENT) {
1911 *object = NULL; 2087 *object = NULL;
1912 return E_NOINTERFACE; 2088 return E_NOINTERFACE;
1913 } 2089 }
1914 } 2090 }
1915 2091
1916 return CComObjectRootBase::InternalQueryInterface( 2092 return CComObjectRootBase::InternalQueryInterface(
1917 this_ptr, entries, iid, object); 2093 this_ptr, entries, iid, object);
1918 } 2094 }
1919 2095
1920 // 2096 //
1921 // Private methods. 2097 // Private methods.
1922 // 2098 //
1923 2099
1924 // Initialize this object and mark it as active. 2100 // Initialize this object and mark it as active.
1925 void BrowserAccessibilityWin::Initialize() { 2101 void BrowserAccessibilityWin::Initialize() {
1926 BrowserAccessibility::Initialize(); 2102 BrowserAccessibility::Initialize();
1927 2103
1928 InitRoleAndState(); 2104 InitRoleAndState();
1929 2105
1930 // Expose headings levels to NVDA with the "level" object attribute. 2106 // Expose headings levels with the "level" attribute.
1931 if (role_ == WebAccessibility::ROLE_HEADING && role_name_.size() == 2 && 2107 if (role_ == WebAccessibility::ROLE_HEADING && role_name_.size() == 2 &&
1932 IsAsciiDigit(role_name_[1])) { 2108 IsAsciiDigit(role_name_[1])) {
1933 html_attributes_.push_back(std::make_pair(L"level", role_name_.substr(1))); 2109 ia2_attributes_.push_back(string16(L"level:") + role_name_.substr(1));
1934 } 2110 }
1935 2111
1936 // Expose the "display" object attribute. 2112 // Expose the "display" and "tag" attributes.
1937 string16 display; 2113 StringAttributeToIA2(WebAccessibility::ATTR_DISPLAY, "display");
1938 if (GetStringAttribute(WebAccessibility::ATTR_DISPLAY, &display)) 2114 StringAttributeToIA2(WebAccessibility::ATTR_HTML_TAG, "tag");
1939 html_attributes_.push_back(std::make_pair(L"display", display)); 2115 StringAttributeToIA2(WebAccessibility::ATTR_ROLE, "xml-roles");
2116
2117 // Expose "level" attribute for tree nodes.
2118 IntAttributeToIA2(WebAccessibility::ATTR_HIERARCHICAL_LEVEL, "level");
2119
2120 // Expose live region attributes.
2121 StringAttributeToIA2(WebAccessibility::ATTR_LIVE_STATUS, "live");
2122 StringAttributeToIA2(WebAccessibility::ATTR_LIVE_RELEVANT, "relevant");
2123 BoolAttributeToIA2(WebAccessibility::ATTR_LIVE_ATOMIC, "atomic");
2124 BoolAttributeToIA2(WebAccessibility::ATTR_LIVE_BUSY, "busy");
2125
2126 // Expose container live region attributes.
2127 StringAttributeToIA2(WebAccessibility::ATTR_CONTAINER_LIVE_STATUS,
2128 "container-live");
2129 StringAttributeToIA2(WebAccessibility::ATTR_CONTAINER_LIVE_RELEVANT,
2130 "container-relevant");
2131 BoolAttributeToIA2(WebAccessibility::ATTR_CONTAINER_LIVE_ATOMIC,
2132 "container-atomic");
2133 BoolAttributeToIA2(WebAccessibility::ATTR_CONTAINER_LIVE_BUSY,
2134 "container-busy");
2135
2136 // Expose slider value.
2137 if (ia_role_ == ROLE_SYSTEM_PROGRESSBAR ||
2138 ia_role_ == ROLE_SYSTEM_SCROLLBAR ||
2139 ia_role_ == ROLE_SYSTEM_SLIDER) {
2140 float fval;
2141 if (value_.empty() &&
2142 GetFloatAttribute(WebAccessibility::ATTR_VALUE_FOR_RANGE, &fval)) {
2143 // TODO(dmazzoni): Use ICU to localize this?
2144 value_ = UTF8ToUTF16(base::DoubleToString(fval));
2145 }
2146 ia2_attributes_.push_back(L"valuetext:" + value_);
2147 }
2148
2149 // Expose table cell index.
2150 if (ia_role_ == ROLE_SYSTEM_CELL) {
2151 BrowserAccessibility* table = parent();
2152 while (table && table->role() != WebAccessibility::ROLE_TABLE)
David Tseng 2011/08/29 19:05:34 Should this ever happen? Will there ever be a cell
dmazzoni 2011/08/29 19:38:35 The parent should be a row, and the row's parent s
2153 table = table->parent();
2154 if (table) {
2155 const std::vector<int32>& unique_cell_ids = table->unique_cell_ids();
2156 int index = -1;
2157 for (size_t i = 0; i < unique_cell_ids.size(); i++) {
David Tseng 2011/08/29 19:05:34 nit: ++i
David Tseng 2011/08/29 19:05:34 Also, if you change |unique_cell_ids| to a set, yo
dmazzoni 2011/08/29 19:38:35 Done.
dmazzoni 2011/08/29 19:38:35 Yeah, but unfortunately the order matters. I docum
2158 if (unique_cell_ids[i] == renderer_id_) {
2159 index = static_cast<int>(i);
2160 break;
2161 }
2162 }
2163 if (index >= 0) {
2164 ia2_attributes_.push_back(string16(L"table-cell-index:") +
2165 base::IntToString16(index));
2166 }
2167 }
2168 }
1940 2169
1941 // If this is static text, put the text in the name rather than the value. 2170 // If this is static text, put the text in the name rather than the value.
1942 if (role_ == WebAccessibility::ROLE_STATIC_TEXT && name_.empty()) 2171 if (role_ == WebAccessibility::ROLE_STATIC_TEXT && name_.empty())
1943 name_.swap(value_); 2172 name_.swap(value_);
1944 2173
1945 // If this object doesn't have a name but it does have a description, 2174 // If this object doesn't have a name but it does have a description,
1946 // use the description as its name - because some screen readers only 2175 // use the description as its name - because some screen readers only
1947 // announce the name. 2176 // announce the name.
1948 if (name_.empty()) 2177 if (name_.empty())
1949 GetStringAttribute(WebAccessibility::ATTR_DESCRIPTION, &name_); 2178 GetStringAttribute(WebAccessibility::ATTR_DESCRIPTION, &name_);
1950 2179
1951 // If this doesn't have a value and is linked then set its value to the url 2180 // If this doesn't have a value and is linked then set its value to the url
1952 // attribute. This allows screen readers to read an empty link's destination. 2181 // attribute. This allows screen readers to read an empty link's destination.
1953 string16 url; 2182 string16 url;
1954 if (value_.empty() && (ia_state_ & STATE_SYSTEM_LINKED)) 2183 if (value_.empty() && (ia_state_ & STATE_SYSTEM_LINKED))
1955 GetStringAttribute(WebAccessibility::ATTR_URL, &value_); 2184 GetStringAttribute(WebAccessibility::ATTR_URL, &value_);
1956 } 2185 }
1957 2186
2187 void BrowserAccessibilityWin::SendNodeUpdateEvents() {
David Tseng 2011/08/29 19:05:34 nit: new line above?
2188 // Fire an event when an alert first appears.
2189 if (role_ == WebAccessibility::ROLE_ALERT && first_time_) {
2190 manager_->NotifyAccessibilityEvent(
2191 ViewHostMsg_AccessibilityNotification_Type::
2192 NOTIFICATION_TYPE_ALERT,
2193 this);
David Tseng 2011/08/29 19:05:34 nit: re-align -- 4 spaces).
2194 }
2195
2196 // Fire events if text has changed.
2197 string16 text = TextForIAccessibleText();
2198 if (previous_text_ != text) {
2199 if (!previous_text_.empty() && !text.empty()) {
David Tseng 2011/08/29 19:05:34 Is this necessary? What happens when the |previous
dmazzoni 2011/08/29 19:38:35 This is the only way I can get JAWS to announce li
2200 manager_->NotifyAccessibilityEvent(
2201 ViewHostMsg_AccessibilityNotification_Type::
2202 NOTIFICATION_TYPE_OBJECT_SHOW,
2203 this);
2204 }
2205
2206 old_text_ = previous_text_;
2207 previous_text_ = text;
2208 }
2209
2210 first_time_ = false;
2211 }
2212
1958 void BrowserAccessibilityWin::NativeAddReference() { 2213 void BrowserAccessibilityWin::NativeAddReference() {
1959 AddRef(); 2214 AddRef();
1960 } 2215 }
1961 2216
1962 void BrowserAccessibilityWin::NativeReleaseReference() { 2217 void BrowserAccessibilityWin::NativeReleaseReference() {
1963 Release(); 2218 Release();
1964 } 2219 }
1965 2220
1966 BrowserAccessibilityWin* BrowserAccessibilityWin::NewReference() { 2221 BrowserAccessibilityWin* BrowserAccessibilityWin::NewReference() {
1967 AddRef(); 2222 AddRef();
(...skipping 24 matching lines...) Expand all
1992 2247
1993 if (str.empty()) 2248 if (str.empty())
1994 return S_FALSE; 2249 return S_FALSE;
1995 2250
1996 *value_bstr = SysAllocString(str.c_str()); 2251 *value_bstr = SysAllocString(str.c_str());
1997 DCHECK(*value_bstr); 2252 DCHECK(*value_bstr);
1998 2253
1999 return S_OK; 2254 return S_OK;
2000 } 2255 }
2001 2256
2257 void BrowserAccessibilityWin::StringAttributeToIA2(
2258 WebAccessibility::StringAttribute attribute, const char* ia2_attr) {
2259 string16 value;
2260 if (GetStringAttribute(attribute, &value))
2261 ia2_attributes_.push_back(ASCIIToUTF16(ia2_attr) + L":" + value);
2262 }
2263
2264 void BrowserAccessibilityWin::BoolAttributeToIA2(
2265 WebAccessibility::BoolAttribute attribute, const char* ia2_attr) {
2266 bool value;
2267 if (GetBoolAttribute(attribute, &value)) {
2268 ia2_attributes_.push_back((ASCIIToUTF16(ia2_attr) + L":") +
2269 (value ? L"true" : L"false"));
2270 }
2271 }
2272
2273 void BrowserAccessibilityWin::IntAttributeToIA2(
2274 WebAccessibility::IntAttribute attribute, const char* ia2_attr) {
2275 int value;
2276 if (GetIntAttribute(attribute, &value))
2277 ia2_attributes_.push_back(ASCIIToUTF16(ia2_attr) + L":" +
2278 base::IntToString16(value));
2279 }
2280
2002 string16 BrowserAccessibilityWin::Escape(const string16& str) { 2281 string16 BrowserAccessibilityWin::Escape(const string16& str) {
2003 return EscapeQueryParamValueUTF8(str, false); 2282 return EscapeQueryParamValueUTF8(str, false);
2004 } 2283 }
2005 2284
2006 const string16& BrowserAccessibilityWin::TextForIAccessibleText() { 2285 const string16& BrowserAccessibilityWin::TextForIAccessibleText() {
2007 if (role_ == WebAccessibility::ROLE_TEXT_FIELD || 2286 if (IsEditableText()) {
2008 role_ == WebAccessibility::ROLE_TEXTAREA) {
2009 return value_; 2287 return value_;
2010 } else { 2288 } else {
2011 return name_; 2289 return name_;
2012 } 2290 }
2013 } 2291 }
2014 2292
2015 void BrowserAccessibilityWin::HandleSpecialTextOffset( 2293 void BrowserAccessibilityWin::HandleSpecialTextOffset(
2016 const string16& text, LONG* offset) { 2294 const string16& text, LONG* offset) {
2017 if (*offset == IA2_TEXT_OFFSET_LENGTH) { 2295 if (*offset == IA2_TEXT_OFFSET_LENGTH) {
2018 *offset = static_cast<LONG>(text.size()); 2296 *offset = static_cast<LONG>(text.size());
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
2105 } 2383 }
2106 2384
2107 BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromRendererID( 2385 BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromRendererID(
2108 int32 renderer_id) { 2386 int32 renderer_id) {
2109 return manager_->GetFromRendererID(renderer_id)->toBrowserAccessibilityWin(); 2387 return manager_->GetFromRendererID(renderer_id)->toBrowserAccessibilityWin();
2110 } 2388 }
2111 2389
2112 void BrowserAccessibilityWin::InitRoleAndState() { 2390 void BrowserAccessibilityWin::InitRoleAndState() {
2113 ia_state_ = 0; 2391 ia_state_ = 0;
2114 ia2_state_ = IA2_STATE_OPAQUE; 2392 ia2_state_ = IA2_STATE_OPAQUE;
2393 ia2_attributes_.clear();
2115 2394
2395 if ((state_ >> WebAccessibility::STATE_BUSY) & 1)
2396 ia_state_|= STATE_SYSTEM_BUSY;
2116 if ((state_ >> WebAccessibility::STATE_CHECKED) & 1) 2397 if ((state_ >> WebAccessibility::STATE_CHECKED) & 1)
2117 ia_state_ |= STATE_SYSTEM_CHECKED; 2398 ia_state_ |= STATE_SYSTEM_CHECKED;
2118 if ((state_ >> WebAccessibility::STATE_COLLAPSED) & 1) 2399 if ((state_ >> WebAccessibility::STATE_COLLAPSED) & 1)
2119 ia_state_|= STATE_SYSTEM_COLLAPSED; 2400 ia_state_|= STATE_SYSTEM_COLLAPSED;
2120 if ((state_ >> WebAccessibility::STATE_EXPANDED) & 1) 2401 if ((state_ >> WebAccessibility::STATE_EXPANDED) & 1)
2121 ia_state_|= STATE_SYSTEM_EXPANDED; 2402 ia_state_|= STATE_SYSTEM_EXPANDED;
2122 if ((state_ >> WebAccessibility::STATE_FOCUSABLE) & 1) 2403 if ((state_ >> WebAccessibility::STATE_FOCUSABLE) & 1)
2123 ia_state_|= STATE_SYSTEM_FOCUSABLE; 2404 ia_state_|= STATE_SYSTEM_FOCUSABLE;
2124 if ((state_ >> WebAccessibility::STATE_HASPOPUP) & 1) 2405 if ((state_ >> WebAccessibility::STATE_HASPOPUP) & 1)
2125 ia_state_|= STATE_SYSTEM_HASPOPUP; 2406 ia_state_|= STATE_SYSTEM_HASPOPUP;
2126 if ((state_ >> WebAccessibility::STATE_HOTTRACKED) & 1) 2407 if ((state_ >> WebAccessibility::STATE_HOTTRACKED) & 1)
2127 ia_state_|= STATE_SYSTEM_HOTTRACKED; 2408 ia_state_|= STATE_SYSTEM_HOTTRACKED;
2128 if ((state_ >> WebAccessibility::STATE_INDETERMINATE) & 1) 2409 if ((state_ >> WebAccessibility::STATE_INDETERMINATE) & 1)
2129 ia_state_|= STATE_SYSTEM_INDETERMINATE; 2410 ia_state_|= STATE_SYSTEM_INDETERMINATE;
2130 if ((state_ >> WebAccessibility::STATE_INVISIBLE) & 1) 2411 if ((state_ >> WebAccessibility::STATE_INVISIBLE) & 1)
2131 ia_state_|= STATE_SYSTEM_INVISIBLE; 2412 ia_state_|= STATE_SYSTEM_INVISIBLE;
2132 if ((state_ >> WebAccessibility::STATE_LINKED) & 1) 2413 if ((state_ >> WebAccessibility::STATE_LINKED) & 1)
2133 ia_state_|= STATE_SYSTEM_LINKED; 2414 ia_state_|= STATE_SYSTEM_LINKED;
2134 if ((state_ >> WebAccessibility::STATE_MULTISELECTABLE) & 1) 2415 if ((state_ >> WebAccessibility::STATE_MULTISELECTABLE) & 1)
2135 ia_state_|= STATE_SYSTEM_MULTISELECTABLE; 2416 ia_state_|= STATE_SYSTEM_MULTISELECTABLE;
2136 // TODO(ctguil): Support STATE_SYSTEM_EXTSELECTABLE/accSelect. 2417 // TODO(ctguil): Support STATE_SYSTEM_EXTSELECTABLE/accSelect.
2137 if ((state_ >> WebAccessibility::STATE_OFFSCREEN) & 1) 2418 if ((state_ >> WebAccessibility::STATE_OFFSCREEN) & 1)
2138 ia_state_|= STATE_SYSTEM_OFFSCREEN; 2419 ia_state_|= STATE_SYSTEM_OFFSCREEN;
2139 if ((state_ >> WebAccessibility::STATE_PRESSED) & 1) 2420 if ((state_ >> WebAccessibility::STATE_PRESSED) & 1)
2140 ia_state_|= STATE_SYSTEM_PRESSED; 2421 ia_state_|= STATE_SYSTEM_PRESSED;
2141 if ((state_ >> WebAccessibility::STATE_PROTECTED) & 1) 2422 if ((state_ >> WebAccessibility::STATE_PROTECTED) & 1)
2142 ia_state_|= STATE_SYSTEM_PROTECTED; 2423 ia_state_|= STATE_SYSTEM_PROTECTED;
2424 if ((state_ >> WebAccessibility::STATE_READONLY) & 1)
2425 ia_state_|= STATE_SYSTEM_READONLY;
2426 if ((state_ >> WebAccessibility::STATE_REQUIRED) & 1)
2427 ia2_state_|= IA2_STATE_REQUIRED;
2143 if ((state_ >> WebAccessibility::STATE_SELECTABLE) & 1) 2428 if ((state_ >> WebAccessibility::STATE_SELECTABLE) & 1)
2144 ia_state_|= STATE_SYSTEM_SELECTABLE; 2429 ia_state_|= STATE_SYSTEM_SELECTABLE;
2145 if ((state_ >> WebAccessibility::STATE_SELECTED) & 1) 2430 if ((state_ >> WebAccessibility::STATE_SELECTED) & 1)
2146 ia_state_|= STATE_SYSTEM_SELECTED; 2431 ia_state_|= STATE_SYSTEM_SELECTED;
2147 if ((state_ >> WebAccessibility::STATE_READONLY) & 1)
2148 ia_state_|= STATE_SYSTEM_READONLY;
2149 if ((state_ >> WebAccessibility::STATE_TRAVERSED) & 1) 2432 if ((state_ >> WebAccessibility::STATE_TRAVERSED) & 1)
2150 ia_state_|= STATE_SYSTEM_TRAVERSED; 2433 ia_state_|= STATE_SYSTEM_TRAVERSED;
2151 if ((state_ >> WebAccessibility::STATE_BUSY) & 1)
2152 ia_state_|= STATE_SYSTEM_BUSY;
2153 if ((state_ >> WebAccessibility::STATE_UNAVAILABLE) & 1) 2434 if ((state_ >> WebAccessibility::STATE_UNAVAILABLE) & 1)
2154 ia_state_|= STATE_SYSTEM_UNAVAILABLE; 2435 ia_state_|= STATE_SYSTEM_UNAVAILABLE;
2436 if ((state_ >> WebAccessibility::STATE_VERTICAL) & 1) {
2437 ia2_state_|= IA2_STATE_VERTICAL;
2438 } else {
David Tseng 2011/08/29 19:05:34 ;Shouldn't we check for this state explicitly?
dmazzoni 2011/08/29 19:38:35 Isn't everything either horizontal or vertical? Is
David Tseng 2011/08/29 23:57:10 On 2011/08/29 19:38:35, Dominic Mazzoni wrote: Lo
2439 ia2_state_|= IA2_STATE_HORIZONTAL;
2440 }
2441 if ((state_ >> WebAccessibility::STATE_VISITED) & 1)
2442 ia_state_|= STATE_SYSTEM_TRAVERSED;
2443
2444 string16 invalid;
2445 if (GetHtmlAttribute("aria-invalid", &invalid))
2446 ia2_state_|= IA2_STATE_INVALID_ENTRY;
2447
2448 bool mixed = false;
2449 GetBoolAttribute(WebAccessibility::ATTR_BUTTON_MIXED, &mixed);
2450 if (mixed)
2451 ia_state_|= STATE_SYSTEM_MIXED;
2155 2452
2156 string16 html_tag; 2453 string16 html_tag;
2157 GetStringAttribute(WebAccessibility::ATTR_HTML_TAG, &html_tag); 2454 GetStringAttribute(WebAccessibility::ATTR_HTML_TAG, &html_tag);
2158 ia_role_ = 0; 2455 ia_role_ = 0;
2159 ia2_role_ = 0; 2456 ia2_role_ = 0;
2160 switch (role_) { 2457 switch (role_) {
2161 case WebAccessibility::ROLE_ALERT: 2458 case WebAccessibility::ROLE_ALERT:
2459 ia_role_ = ROLE_SYSTEM_ALERT;
2460 break;
2162 case WebAccessibility::ROLE_ALERT_DIALOG: 2461 case WebAccessibility::ROLE_ALERT_DIALOG:
2163 ia_role_ = ROLE_SYSTEM_ALERT; 2462 ia_role_ = ROLE_SYSTEM_DIALOG;
2164 break; 2463 break;
2165 case WebAccessibility::ROLE_APPLICATION: 2464 case WebAccessibility::ROLE_APPLICATION:
2166 ia_role_ = ROLE_SYSTEM_APPLICATION; 2465 ia_role_ = ROLE_SYSTEM_APPLICATION;
2167 break; 2466 break;
2168 case WebAccessibility::ROLE_ARTICLE: 2467 case WebAccessibility::ROLE_ARTICLE:
2169 ia_role_ = ROLE_SYSTEM_GROUPING; 2468 ia_role_ = ROLE_SYSTEM_GROUPING;
2170 ia2_role_ = IA2_ROLE_SECTION; 2469 ia2_role_ = IA2_ROLE_SECTION;
2470 ia_state_|= STATE_SYSTEM_READONLY;
2171 break; 2471 break;
2172 case WebAccessibility::ROLE_BUSY_INDICATOR: 2472 case WebAccessibility::ROLE_BUSY_INDICATOR:
2173 ia_role_ = ROLE_SYSTEM_ANIMATION; 2473 ia_role_ = ROLE_SYSTEM_ANIMATION;
2474 ia_state_|= STATE_SYSTEM_READONLY;
2174 break; 2475 break;
2175 case WebAccessibility::ROLE_BUTTON: 2476 case WebAccessibility::ROLE_BUTTON:
2176 ia_role_ = ROLE_SYSTEM_PUSHBUTTON; 2477 ia_role_ = ROLE_SYSTEM_PUSHBUTTON;
2478 ia_state_|= STATE_SYSTEM_READONLY;
David Tseng 2011/08/29 19:05:34 Should we be setting this state? Some screen reade
dmazzoni 2011/08/29 19:38:35 So actually I was having the opposite problem: I t
David Tseng 2011/08/29 23:57:10 On 2011/08/29 19:38:35, Dominic Mazzoni wrote: We
2177 break; 2479 break;
2178 case WebAccessibility::ROLE_CELL: 2480 case WebAccessibility::ROLE_CELL:
2179 ia_role_ = ROLE_SYSTEM_CELL; 2481 ia_role_ = ROLE_SYSTEM_CELL;
2482 ia_state_|= STATE_SYSTEM_READONLY;
2180 break; 2483 break;
2181 case WebAccessibility::ROLE_CHECKBOX: 2484 case WebAccessibility::ROLE_CHECKBOX:
2182 ia_role_ = ROLE_SYSTEM_CHECKBUTTON; 2485 ia_role_ = ROLE_SYSTEM_CHECKBUTTON;
2183 break; 2486 break;
2184 case WebAccessibility::ROLE_COLOR_WELL: 2487 case WebAccessibility::ROLE_COLOR_WELL:
2185 ia_role_ = ROLE_SYSTEM_CLIENT; 2488 ia_role_ = ROLE_SYSTEM_CLIENT;
2186 ia2_role_ = IA2_ROLE_COLOR_CHOOSER; 2489 ia2_role_ = IA2_ROLE_COLOR_CHOOSER;
2187 break; 2490 break;
2188 case WebAccessibility::ROLE_COLUMN: 2491 case WebAccessibility::ROLE_COLUMN:
2189 ia_role_ = ROLE_SYSTEM_COLUMN; 2492 ia_role_ = ROLE_SYSTEM_COLUMN;
2493 ia_state_|= STATE_SYSTEM_READONLY;
2190 break; 2494 break;
2191 case WebAccessibility::ROLE_COLUMN_HEADER: 2495 case WebAccessibility::ROLE_COLUMN_HEADER:
2192 ia_role_ = ROLE_SYSTEM_COLUMNHEADER; 2496 ia_role_ = ROLE_SYSTEM_COLUMNHEADER;
2497 ia_state_|= STATE_SYSTEM_READONLY;
2193 break; 2498 break;
2194 case WebAccessibility::ROLE_COMBO_BOX: 2499 case WebAccessibility::ROLE_COMBO_BOX:
2195 ia_role_ = ROLE_SYSTEM_COMBOBOX; 2500 ia_role_ = ROLE_SYSTEM_COMBOBOX;
2196 break; 2501 break;
2197 case WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION: 2502 case WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION:
2198 role_name_ = html_tag; 2503 role_name_ = html_tag;
2199 ia2_role_ = IA2_ROLE_PARAGRAPH; 2504 ia2_role_ = IA2_ROLE_PARAGRAPH;
2505 ia_state_|= STATE_SYSTEM_READONLY;
2200 break; 2506 break;
2201 case WebAccessibility::ROLE_DEFINITION_LIST_TERM: 2507 case WebAccessibility::ROLE_DEFINITION_LIST_TERM:
2202 ia_role_ = ROLE_SYSTEM_LISTITEM; 2508 ia_role_ = ROLE_SYSTEM_LISTITEM;
2509 ia_state_|= STATE_SYSTEM_READONLY;
2203 break; 2510 break;
2204 case WebAccessibility::ROLE_DIALOG: 2511 case WebAccessibility::ROLE_DIALOG:
2205 ia_role_ = ROLE_SYSTEM_DIALOG; 2512 ia_role_ = ROLE_SYSTEM_DIALOG;
2513 ia_state_|= STATE_SYSTEM_READONLY;
2206 break; 2514 break;
2207 case WebAccessibility::ROLE_DISCLOSURE_TRIANGLE: 2515 case WebAccessibility::ROLE_DISCLOSURE_TRIANGLE:
2208 ia_role_ = ROLE_SYSTEM_OUTLINEBUTTON; 2516 ia_role_ = ROLE_SYSTEM_OUTLINEBUTTON;
2517 ia_state_|= STATE_SYSTEM_READONLY;
2209 break; 2518 break;
2210 case WebAccessibility::ROLE_DOCUMENT: 2519 case WebAccessibility::ROLE_DOCUMENT:
2211 case WebAccessibility::ROLE_WEB_AREA: 2520 case WebAccessibility::ROLE_WEB_AREA:
2212 ia_role_ = ROLE_SYSTEM_DOCUMENT; 2521 ia_role_ = ROLE_SYSTEM_DOCUMENT;
2213 ia_state_|= STATE_SYSTEM_READONLY; 2522 ia_state_|= STATE_SYSTEM_READONLY;
2214 ia_state_|= STATE_SYSTEM_FOCUSABLE; 2523 ia_state_|= STATE_SYSTEM_FOCUSABLE;
2215 break; 2524 break;
2216 case WebAccessibility::ROLE_EDITABLE_TEXT: 2525 case WebAccessibility::ROLE_EDITABLE_TEXT:
2217 ia_role_ = ROLE_SYSTEM_TEXT; 2526 ia_role_ = ROLE_SYSTEM_TEXT;
2218 ia2_state_ |= IA2_STATE_SINGLE_LINE; 2527 ia2_state_ |= IA2_STATE_SINGLE_LINE;
2219 ia2_state_ |= IA2_STATE_EDITABLE; 2528 ia2_state_ |= IA2_STATE_EDITABLE;
2220 break; 2529 break;
2221 case WebAccessibility::ROLE_GRID: 2530 case WebAccessibility::ROLE_GRID:
2222 ia_role_ = ROLE_SYSTEM_TABLE; 2531 ia_role_ = ROLE_SYSTEM_TABLE;
2532 ia_state_|= STATE_SYSTEM_READONLY;
2223 break; 2533 break;
2224 case WebAccessibility::ROLE_GROUP: 2534 case WebAccessibility::ROLE_GROUP:
2225 if (html_tag == L"li") { 2535 if (html_tag == L"li") {
2226 ia_role_ = ROLE_SYSTEM_LISTITEM; 2536 ia_role_ = ROLE_SYSTEM_LISTITEM;
2537 } else if (html_tag == L"form") {
2538 role_name_ = html_tag;
2539 ia2_role_ = IA2_ROLE_FORM;
2540 } else if (html_tag == L"p") {
2541 role_name_ = html_tag;
2542 ia2_role_ = IA2_ROLE_PARAGRAPH;
2227 } else { 2543 } else {
2228 if (html_tag.empty()) 2544 if (html_tag.empty())
2229 role_name_ = L"div"; 2545 role_name_ = L"div";
2230 else 2546 else
2231 role_name_ = html_tag; 2547 role_name_ = html_tag;
2232 ia2_role_ = IA2_ROLE_SECTION; 2548 ia2_role_ = IA2_ROLE_SECTION;
2233 } 2549 }
2550 ia_state_|= STATE_SYSTEM_READONLY;
2234 break; 2551 break;
2235 case WebAccessibility::ROLE_GROW_AREA: 2552 case WebAccessibility::ROLE_GROW_AREA:
2236 ia_role_ = ROLE_SYSTEM_GRIP; 2553 ia_role_ = ROLE_SYSTEM_GRIP;
2554 ia_state_|= STATE_SYSTEM_READONLY;
2237 break; 2555 break;
2238 case WebAccessibility::ROLE_HEADING: 2556 case WebAccessibility::ROLE_HEADING:
2239 role_name_ = html_tag; 2557 role_name_ = html_tag;
2240 ia2_role_ = IA2_ROLE_HEADING; 2558 ia2_role_ = IA2_ROLE_HEADING;
2559 ia_state_|= STATE_SYSTEM_READONLY;
2241 break; 2560 break;
2242 case WebAccessibility::ROLE_IMAGE: 2561 case WebAccessibility::ROLE_IMAGE:
2243 ia_role_ = ROLE_SYSTEM_GRAPHIC; 2562 ia_role_ = ROLE_SYSTEM_GRAPHIC;
2563 ia_state_|= STATE_SYSTEM_READONLY;
2244 break; 2564 break;
2245 case WebAccessibility::ROLE_IMAGE_MAP: 2565 case WebAccessibility::ROLE_IMAGE_MAP:
2246 role_name_ = html_tag; 2566 role_name_ = html_tag;
2247 ia2_role_ = IA2_ROLE_IMAGE_MAP; 2567 ia2_role_ = IA2_ROLE_IMAGE_MAP;
2568 ia_state_|= STATE_SYSTEM_READONLY;
2248 break; 2569 break;
2249 case WebAccessibility::ROLE_IMAGE_MAP_LINK: 2570 case WebAccessibility::ROLE_IMAGE_MAP_LINK:
2250 ia_role_ = ROLE_SYSTEM_LINK; 2571 ia_role_ = ROLE_SYSTEM_LINK;
2251 ia_state_|= STATE_SYSTEM_LINKED; 2572 ia_state_|= STATE_SYSTEM_LINKED;
2573 ia_state_|= STATE_SYSTEM_READONLY;
2252 break; 2574 break;
2253 case WebAccessibility::ROLE_LANDMARK_APPLICATION: 2575 case WebAccessibility::ROLE_LANDMARK_APPLICATION:
2254 case WebAccessibility::ROLE_LANDMARK_BANNER: 2576 case WebAccessibility::ROLE_LANDMARK_BANNER:
2255 case WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY: 2577 case WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY:
2256 case WebAccessibility::ROLE_LANDMARK_CONTENTINFO: 2578 case WebAccessibility::ROLE_LANDMARK_CONTENTINFO:
2257 case WebAccessibility::ROLE_LANDMARK_MAIN: 2579 case WebAccessibility::ROLE_LANDMARK_MAIN:
2258 case WebAccessibility::ROLE_LANDMARK_NAVIGATION: 2580 case WebAccessibility::ROLE_LANDMARK_NAVIGATION:
2259 case WebAccessibility::ROLE_LANDMARK_SEARCH: 2581 case WebAccessibility::ROLE_LANDMARK_SEARCH:
2260 ia_role_ = ROLE_SYSTEM_GROUPING; 2582 ia_role_ = ROLE_SYSTEM_GROUPING;
2261 ia2_role_ = IA2_ROLE_SECTION; 2583 ia2_role_ = IA2_ROLE_SECTION;
2584 ia_state_|= STATE_SYSTEM_READONLY;
2262 break; 2585 break;
2263 case WebAccessibility::ROLE_LINK: 2586 case WebAccessibility::ROLE_LINK:
2264 case WebAccessibility::ROLE_WEBCORE_LINK: 2587 case WebAccessibility::ROLE_WEBCORE_LINK:
2265 ia_role_ = ROLE_SYSTEM_LINK; 2588 ia_role_ = ROLE_SYSTEM_LINK;
2266 ia_state_|= STATE_SYSTEM_LINKED; 2589 ia_state_|= STATE_SYSTEM_LINKED;
2590 ia_state_|= STATE_SYSTEM_READONLY;
2267 break; 2591 break;
2268 case WebAccessibility::ROLE_LIST: 2592 case WebAccessibility::ROLE_LIST:
2269 ia_role_ = ROLE_SYSTEM_LIST; 2593 ia_role_ = ROLE_SYSTEM_LIST;
2594 ia_state_|= STATE_SYSTEM_READONLY;
2270 break; 2595 break;
2271 case WebAccessibility::ROLE_LISTBOX: 2596 case WebAccessibility::ROLE_LISTBOX:
2272 ia_role_ = ROLE_SYSTEM_LIST; 2597 ia_role_ = ROLE_SYSTEM_LIST;
2273 break; 2598 break;
2274 case WebAccessibility::ROLE_LISTBOX_OPTION: 2599 case WebAccessibility::ROLE_LISTBOX_OPTION:
2600 ia_role_ = ROLE_SYSTEM_LISTITEM;
2601 break;
2275 case WebAccessibility::ROLE_LIST_ITEM: 2602 case WebAccessibility::ROLE_LIST_ITEM:
2603 ia_role_ = ROLE_SYSTEM_LISTITEM;
2604 ia_state_|= STATE_SYSTEM_READONLY;
2605 break;
2276 case WebAccessibility::ROLE_LIST_MARKER: 2606 case WebAccessibility::ROLE_LIST_MARKER:
2277 ia_role_ = ROLE_SYSTEM_LISTITEM; 2607 ia_role_ = ROLE_SYSTEM_TEXT;
2608 ia_state_|= STATE_SYSTEM_READONLY;
2278 break; 2609 break;
2279 case WebAccessibility::ROLE_MATH: 2610 case WebAccessibility::ROLE_MATH:
2280 ia_role_ = ROLE_SYSTEM_EQUATION; 2611 ia_role_ = ROLE_SYSTEM_EQUATION;
2612 ia_state_|= STATE_SYSTEM_READONLY;
2281 break; 2613 break;
2282 case WebAccessibility::ROLE_MENU: 2614 case WebAccessibility::ROLE_MENU:
2283 case WebAccessibility::ROLE_MENU_BUTTON: 2615 case WebAccessibility::ROLE_MENU_BUTTON:
2284 ia_role_ = ROLE_SYSTEM_MENUPOPUP; 2616 ia_role_ = ROLE_SYSTEM_MENUPOPUP;
2285 break; 2617 break;
2286 case WebAccessibility::ROLE_MENU_BAR: 2618 case WebAccessibility::ROLE_MENU_BAR:
2287 ia_role_ = ROLE_SYSTEM_MENUBAR; 2619 ia_role_ = ROLE_SYSTEM_MENUBAR;
2288 break; 2620 break;
2289 case WebAccessibility::ROLE_MENU_ITEM: 2621 case WebAccessibility::ROLE_MENU_ITEM:
2290 case WebAccessibility::ROLE_MENU_LIST_OPTION: 2622 case WebAccessibility::ROLE_MENU_LIST_OPTION:
2291 ia_role_ = ROLE_SYSTEM_MENUITEM; 2623 ia_role_ = ROLE_SYSTEM_MENUITEM;
2292 break; 2624 break;
2293 case WebAccessibility::ROLE_MENU_LIST_POPUP: 2625 case WebAccessibility::ROLE_MENU_LIST_POPUP:
2294 ia_role_ = ROLE_SYSTEM_MENUPOPUP; 2626 ia_role_ = ROLE_SYSTEM_MENUPOPUP;
2295 break; 2627 break;
2296 case WebAccessibility::ROLE_NOTE: 2628 case WebAccessibility::ROLE_NOTE:
2297 ia_role_ = ROLE_SYSTEM_GROUPING; 2629 ia_role_ = ROLE_SYSTEM_GROUPING;
2298 ia2_role_ = IA2_ROLE_NOTE; 2630 ia2_role_ = IA2_ROLE_NOTE;
2631 ia_state_|= STATE_SYSTEM_READONLY;
2299 break; 2632 break;
2300 case WebAccessibility::ROLE_OUTLINE: 2633 case WebAccessibility::ROLE_OUTLINE:
2301 ia_role_ = ROLE_SYSTEM_OUTLINE; 2634 ia_role_ = ROLE_SYSTEM_OUTLINE;
2635 ia_state_|= STATE_SYSTEM_READONLY;
2302 break; 2636 break;
2303 case WebAccessibility::ROLE_POPUP_BUTTON: 2637 case WebAccessibility::ROLE_POPUP_BUTTON:
2304 ia_role_ = ROLE_SYSTEM_COMBOBOX; 2638 if (html_tag == L"select") {
2639 ia_role_ = ROLE_SYSTEM_COMBOBOX;
2640 } else {
2641 ia_role_ = ROLE_SYSTEM_BUTTONMENU;
2642 }
2643 ia_state_|= STATE_SYSTEM_READONLY;
2305 break; 2644 break;
2306 case WebAccessibility::ROLE_PROGRESS_INDICATOR: 2645 case WebAccessibility::ROLE_PROGRESS_INDICATOR:
2307 ia_role_ = ROLE_SYSTEM_PROGRESSBAR; 2646 ia_role_ = ROLE_SYSTEM_PROGRESSBAR;
2647 ia_state_|= STATE_SYSTEM_READONLY;
2308 break; 2648 break;
2309 case WebAccessibility::ROLE_RADIO_BUTTON: 2649 case WebAccessibility::ROLE_RADIO_BUTTON:
2310 ia_role_ = ROLE_SYSTEM_RADIOBUTTON; 2650 ia_role_ = ROLE_SYSTEM_RADIOBUTTON;
2311 break; 2651 break;
2312 case WebAccessibility::ROLE_RADIO_GROUP: 2652 case WebAccessibility::ROLE_RADIO_GROUP:
2313 ia_role_ = ROLE_SYSTEM_GROUPING; 2653 ia_role_ = ROLE_SYSTEM_GROUPING;
2314 ia2_role_ = IA2_ROLE_SECTION; 2654 ia2_role_ = IA2_ROLE_SECTION;
2315 break; 2655 break;
2316 case WebAccessibility::ROLE_REGION: 2656 case WebAccessibility::ROLE_REGION:
2317 ia_role_ = ROLE_SYSTEM_GROUPING; 2657 ia_role_ = ROLE_SYSTEM_GROUPING;
2318 ia2_role_ = IA2_ROLE_SECTION; 2658 ia2_role_ = IA2_ROLE_SECTION;
2659 ia_state_|= STATE_SYSTEM_READONLY;
2319 break; 2660 break;
2320 case WebAccessibility::ROLE_ROW: 2661 case WebAccessibility::ROLE_ROW:
2321 ia_role_ = ROLE_SYSTEM_ROW; 2662 ia_role_ = ROLE_SYSTEM_ROW;
2663 ia_state_|= STATE_SYSTEM_READONLY;
2322 break; 2664 break;
2323 case WebAccessibility::ROLE_ROW_HEADER: 2665 case WebAccessibility::ROLE_ROW_HEADER:
2324 ia_role_ = ROLE_SYSTEM_ROWHEADER; 2666 ia_role_ = ROLE_SYSTEM_ROWHEADER;
2667 ia_state_|= STATE_SYSTEM_READONLY;
2325 break; 2668 break;
2326 case WebAccessibility::ROLE_RULER: 2669 case WebAccessibility::ROLE_RULER:
2327 ia_role_ = ROLE_SYSTEM_CLIENT; 2670 ia_role_ = ROLE_SYSTEM_CLIENT;
2328 ia2_role_ = IA2_ROLE_RULER; 2671 ia2_role_ = IA2_ROLE_RULER;
2672 ia_state_|= STATE_SYSTEM_READONLY;
2329 break; 2673 break;
2330 case WebAccessibility::ROLE_SCROLLAREA: 2674 case WebAccessibility::ROLE_SCROLLAREA:
2331 ia_role_ = ROLE_SYSTEM_CLIENT; 2675 ia_role_ = ROLE_SYSTEM_CLIENT;
2332 ia2_role_ = IA2_ROLE_SCROLL_PANE; 2676 ia2_role_ = IA2_ROLE_SCROLL_PANE;
2677 ia_state_|= STATE_SYSTEM_READONLY;
2333 break; 2678 break;
2334 case WebAccessibility::ROLE_SCROLLBAR: 2679 case WebAccessibility::ROLE_SCROLLBAR:
2335 ia_role_ = ROLE_SYSTEM_SCROLLBAR; 2680 ia_role_ = ROLE_SYSTEM_SCROLLBAR;
2336 break; 2681 break;
2337 case WebAccessibility::ROLE_SLIDER: 2682 case WebAccessibility::ROLE_SLIDER:
2338 ia_role_ = ROLE_SYSTEM_SLIDER; 2683 ia_role_ = ROLE_SYSTEM_SLIDER;
2339 break; 2684 break;
2340 case WebAccessibility::ROLE_SPLIT_GROUP: 2685 case WebAccessibility::ROLE_SPLIT_GROUP:
2341 ia_role_ = ROLE_SYSTEM_CLIENT; 2686 ia_role_ = ROLE_SYSTEM_CLIENT;
2342 ia2_role_ = IA2_ROLE_SPLIT_PANE; 2687 ia2_role_ = IA2_ROLE_SPLIT_PANE;
2688 ia_state_|= STATE_SYSTEM_READONLY;
2343 break; 2689 break;
2344 case WebAccessibility::ROLE_ANNOTATION: 2690 case WebAccessibility::ROLE_ANNOTATION:
2345 case WebAccessibility::ROLE_STATIC_TEXT: 2691 case WebAccessibility::ROLE_STATIC_TEXT:
2346 ia_role_ = ROLE_SYSTEM_TEXT; 2692 ia_role_ = ROLE_SYSTEM_TEXT;
2693 ia_state_|= STATE_SYSTEM_READONLY;
2347 break; 2694 break;
2348 case WebAccessibility::ROLE_STATUS: 2695 case WebAccessibility::ROLE_STATUS:
2349 ia_role_ = ROLE_SYSTEM_STATUSBAR; 2696 ia_role_ = ROLE_SYSTEM_STATUSBAR;
2697 ia_state_|= STATE_SYSTEM_READONLY;
2350 break; 2698 break;
2351 case WebAccessibility::ROLE_SPLITTER: 2699 case WebAccessibility::ROLE_SPLITTER:
2352 ia_role_ = ROLE_SYSTEM_SEPARATOR; 2700 ia_role_ = ROLE_SYSTEM_SEPARATOR;
2353 break; 2701 break;
2354 case WebAccessibility::ROLE_TAB: 2702 case WebAccessibility::ROLE_TAB:
2355 ia_role_ = ROLE_SYSTEM_PAGETAB; 2703 ia_role_ = ROLE_SYSTEM_PAGETAB;
2356 break; 2704 break;
2357 case WebAccessibility::ROLE_TABLE: 2705 case WebAccessibility::ROLE_TABLE:
2358 ia_role_ = ROLE_SYSTEM_TABLE; 2706 ia_role_ = ROLE_SYSTEM_TABLE;
2707 ia_state_|= STATE_SYSTEM_READONLY;
2359 break; 2708 break;
2360 case WebAccessibility::ROLE_TABLE_HEADER_CONTAINER: 2709 case WebAccessibility::ROLE_TABLE_HEADER_CONTAINER:
2361 ia_role_ = ROLE_SYSTEM_GROUPING; 2710 ia_role_ = ROLE_SYSTEM_GROUPING;
2362 ia2_role_ = IA2_ROLE_SECTION; 2711 ia2_role_ = IA2_ROLE_SECTION;
2712 ia_state_|= STATE_SYSTEM_READONLY;
2363 break; 2713 break;
2364 case WebAccessibility::ROLE_TAB_GROUP: 2714 case WebAccessibility::ROLE_TAB_GROUP:
2365 case WebAccessibility::ROLE_TAB_LIST: 2715 case WebAccessibility::ROLE_TAB_LIST:
2366 case WebAccessibility::ROLE_TAB_PANEL: 2716 case WebAccessibility::ROLE_TAB_PANEL:
2367 ia_role_ = ROLE_SYSTEM_PAGETABLIST; 2717 ia_role_ = ROLE_SYSTEM_PAGETABLIST;
2368 break; 2718 break;
2369 case WebAccessibility::ROLE_TEXTAREA: 2719 case WebAccessibility::ROLE_TEXTAREA:
2370 ia_role_ = ROLE_SYSTEM_TEXT; 2720 ia_role_ = ROLE_SYSTEM_TEXT;
2371 ia2_state_ |= IA2_STATE_MULTI_LINE; 2721 ia2_state_ |= IA2_STATE_MULTI_LINE;
2372 ia2_state_ |= IA2_STATE_EDITABLE; 2722 ia2_state_ |= IA2_STATE_EDITABLE;
2373 ia2_state_ |= IA2_STATE_SELECTABLE_TEXT; 2723 ia2_state_ |= IA2_STATE_SELECTABLE_TEXT;
2374 break; 2724 break;
2375 case WebAccessibility::ROLE_TEXT_FIELD: 2725 case WebAccessibility::ROLE_TEXT_FIELD:
2376 ia_role_ = ROLE_SYSTEM_TEXT; 2726 ia_role_ = ROLE_SYSTEM_TEXT;
2377 ia2_state_ |= IA2_STATE_SINGLE_LINE; 2727 ia2_state_ |= IA2_STATE_SINGLE_LINE;
2378 ia2_state_ |= IA2_STATE_EDITABLE; 2728 ia2_state_ |= IA2_STATE_EDITABLE;
2379 ia2_state_ |= IA2_STATE_SELECTABLE_TEXT; 2729 ia2_state_ |= IA2_STATE_SELECTABLE_TEXT;
2380 break; 2730 break;
2381 case WebAccessibility::ROLE_TIMER: 2731 case WebAccessibility::ROLE_TIMER:
2382 ia_role_ = ROLE_SYSTEM_CLOCK; 2732 ia_role_ = ROLE_SYSTEM_CLOCK;
2733 ia_state_|= STATE_SYSTEM_READONLY;
2383 break; 2734 break;
2384 case WebAccessibility::ROLE_TOOLBAR: 2735 case WebAccessibility::ROLE_TOOLBAR:
2385 ia_role_ = ROLE_SYSTEM_TOOLBAR; 2736 ia_role_ = ROLE_SYSTEM_TOOLBAR;
2737 ia_state_|= STATE_SYSTEM_READONLY;
2386 break; 2738 break;
2387 case WebAccessibility::ROLE_TOOLTIP: 2739 case WebAccessibility::ROLE_TOOLTIP:
2388 ia_role_ = ROLE_SYSTEM_TOOLTIP; 2740 ia_role_ = ROLE_SYSTEM_TOOLTIP;
2741 ia_state_|= STATE_SYSTEM_READONLY;
2389 break; 2742 break;
2390 case WebAccessibility::ROLE_TREE: 2743 case WebAccessibility::ROLE_TREE:
2391 ia_role_ = ROLE_SYSTEM_OUTLINE; 2744 ia_role_ = ROLE_SYSTEM_OUTLINE;
2745 ia_state_|= STATE_SYSTEM_READONLY;
2392 break; 2746 break;
2393 case WebAccessibility::ROLE_TREE_GRID: 2747 case WebAccessibility::ROLE_TREE_GRID:
2394 ia_role_ = ROLE_SYSTEM_OUTLINE; 2748 ia_role_ = ROLE_SYSTEM_OUTLINE;
2749 ia_state_|= STATE_SYSTEM_READONLY;
2395 break; 2750 break;
2396 case WebAccessibility::ROLE_TREE_ITEM: 2751 case WebAccessibility::ROLE_TREE_ITEM:
2397 ia_role_ = ROLE_SYSTEM_OUTLINEITEM; 2752 ia_role_ = ROLE_SYSTEM_OUTLINEITEM;
2753 ia_state_|= STATE_SYSTEM_READONLY;
2398 break; 2754 break;
2399 case WebAccessibility::ROLE_WINDOW: 2755 case WebAccessibility::ROLE_WINDOW:
2400 ia_role_ = ROLE_SYSTEM_WINDOW; 2756 ia_role_ = ROLE_SYSTEM_WINDOW;
2401 break; 2757 break;
2402 2758
2403 // TODO(dmazzoni): figure out the proper MSAA role for all of these. 2759 // TODO(dmazzoni): figure out the proper MSAA role for all of these.
2404 case WebAccessibility::ROLE_BROWSER: 2760 case WebAccessibility::ROLE_BROWSER:
2405 case WebAccessibility::ROLE_DIRECTORY: 2761 case WebAccessibility::ROLE_DIRECTORY:
2406 case WebAccessibility::ROLE_DRAWER: 2762 case WebAccessibility::ROLE_DRAWER:
2407 case WebAccessibility::ROLE_HELP_TAG: 2763 case WebAccessibility::ROLE_HELP_TAG:
(...skipping 13 matching lines...) Expand all
2421 } 2777 }
2422 2778
2423 // The role should always be set. 2779 // The role should always be set.
2424 DCHECK(!role_name_.empty() || ia_role_); 2780 DCHECK(!role_name_.empty() || ia_role_);
2425 2781
2426 // If we didn't explicitly set the IAccessible2 role, make it the same 2782 // If we didn't explicitly set the IAccessible2 role, make it the same
2427 // as the MSAA role. 2783 // as the MSAA role.
2428 if (!ia2_role_) 2784 if (!ia2_role_)
2429 ia2_role_ = ia_role_; 2785 ia2_role_ = ia_role_;
2430 } 2786 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698