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

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

Issue 11359177: Cleanup, no functional change. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « content/browser/accessibility/browser_accessibility_win.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <UIAutomationClient.h> 7 #include <UIAutomationClient.h>
8 #include <UIAutomationCoreApi.h> 8 #include <UIAutomationCoreApi.h>
9 9
10 #include "base/string_number_conversions.h" 10 #include "base/string_number_conversions.h"
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 for (long i = *n_targets - 1; i >= 0; --i) { 107 for (long i = *n_targets - 1; i >= 0; --i) {
108 BrowserAccessibility* result = manager->GetFromRendererID(target_ids_[i]); 108 BrowserAccessibility* result = manager->GetFromRendererID(target_ids_[i]);
109 if (!result || !result->instance_active()) { 109 if (!result || !result->instance_active()) {
110 *n_targets = 0; 110 *n_targets = 0;
111 break; 111 break;
112 } 112 }
113 } 113 }
114 return S_OK; 114 return S_OK;
115 } 115 }
116 116
117 STDMETHODIMP BrowserAccessibilityRelation::get_target( 117 STDMETHODIMP BrowserAccessibilityRelation::get_target(long target_index,
118 long target_index, IUnknown** target) { 118 IUnknown** target) {
119 if (!target) 119 if (!target)
120 return E_INVALIDARG; 120 return E_INVALIDARG;
121 121
122 if (!owner_->instance_active()) 122 if (!owner_->instance_active())
123 return E_FAIL; 123 return E_FAIL;
124 124
125 if (target_index < 0 || 125 if (target_index < 0 ||
126 target_index >= static_cast<long>(target_ids_.size())) { 126 target_index >= static_cast<long>(target_ids_.size())) {
127 return E_INVALIDARG; 127 return E_INVALIDARG;
128 } 128 }
129 129
130 BrowserAccessibilityManager* manager = owner_->manager(); 130 BrowserAccessibilityManager* manager = owner_->manager();
131 BrowserAccessibility* result = 131 BrowserAccessibility* result =
132 manager->GetFromRendererID(target_ids_[target_index]); 132 manager->GetFromRendererID(target_ids_[target_index]);
133 if (!result || !result->instance_active()) 133 if (!result || !result->instance_active())
134 return E_FAIL; 134 return E_FAIL;
135 135
136 *target = static_cast<IAccessible*>( 136 *target = static_cast<IAccessible*>(
137 result->ToBrowserAccessibilityWin()->NewReference()); 137 result->ToBrowserAccessibilityWin()->NewReference());
138 return S_OK; 138 return S_OK;
139 } 139 }
140 140
141 STDMETHODIMP BrowserAccessibilityRelation::get_targets( 141 STDMETHODIMP BrowserAccessibilityRelation::get_targets(long max_targets,
142 long max_targets, IUnknown** targets, long* n_targets) { 142 IUnknown** targets,
143 long* n_targets) {
143 if (!targets || !n_targets) 144 if (!targets || !n_targets)
144 return E_INVALIDARG; 145 return E_INVALIDARG;
145 146
146 if (!owner_->instance_active()) 147 if (!owner_->instance_active())
147 return E_FAIL; 148 return E_FAIL;
148 149
149 long count = static_cast<long>(target_ids_.size()); 150 long count = static_cast<long>(target_ids_.size());
150 if (count > max_targets) 151 if (count > max_targets)
151 count = max_targets; 152 count = max_targets;
152 153
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 // Point is within this object. 236 // Point is within this object.
236 child->vt = VT_I4; 237 child->vt = VT_I4;
237 child->lVal = CHILDID_SELF; 238 child->lVal = CHILDID_SELF;
238 } else { 239 } else {
239 child->vt = VT_DISPATCH; 240 child->vt = VT_DISPATCH;
240 child->pdispVal = result->ToBrowserAccessibilityWin()->NewReference(); 241 child->pdispVal = result->ToBrowserAccessibilityWin()->NewReference();
241 } 242 }
242 return S_OK; 243 return S_OK;
243 } 244 }
244 245
245 STDMETHODIMP BrowserAccessibilityWin::accLocation(LONG* x_left, LONG* y_top, 246 STDMETHODIMP BrowserAccessibilityWin::accLocation(LONG* x_left,
dmazzoni 2012/11/13 03:54:02 The style guide used to allow this, oh well.
246 LONG* width, LONG* height, 247 LONG* y_top,
248 LONG* width,
249 LONG* height,
247 VARIANT var_id) { 250 VARIANT var_id) {
248 if (!instance_active_) 251 if (!instance_active_)
249 return E_FAIL; 252 return E_FAIL;
250 253
251 if (!x_left || !y_top || !width || !height) 254 if (!x_left || !y_top || !width || !height)
252 return E_INVALIDARG; 255 return E_INVALIDARG;
253 256
254 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 257 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
255 if (!target) 258 if (!target)
256 return E_INVALIDARG; 259 return E_INVALIDARG;
257 260
258 gfx::Rect bounds = target->GetGlobalBoundsRect(); 261 gfx::Rect bounds = target->GetGlobalBoundsRect();
259 *x_left = bounds.x(); 262 *x_left = bounds.x();
260 *y_top = bounds.y(); 263 *y_top = bounds.y();
261 *width = bounds.width(); 264 *width = bounds.width();
262 *height = bounds.height(); 265 *height = bounds.height();
263 266
264 return S_OK; 267 return S_OK;
265 } 268 }
266 269
267 STDMETHODIMP BrowserAccessibilityWin::accNavigate( 270 STDMETHODIMP BrowserAccessibilityWin::accNavigate(LONG nav_dir,
268 LONG nav_dir, VARIANT start, VARIANT* end) { 271 VARIANT start,
272 VARIANT* end) {
269 BrowserAccessibilityWin* target = GetTargetFromChildID(start); 273 BrowserAccessibilityWin* target = GetTargetFromChildID(start);
270 if (!target) 274 if (!target)
271 return E_INVALIDARG; 275 return E_INVALIDARG;
272 276
273 if ((nav_dir == NAVDIR_LASTCHILD || nav_dir == NAVDIR_FIRSTCHILD) && 277 if ((nav_dir == NAVDIR_LASTCHILD || nav_dir == NAVDIR_FIRSTCHILD) &&
274 start.lVal != CHILDID_SELF) { 278 start.lVal != CHILDID_SELF) {
275 // MSAA states that navigating to first/last child can only be from self. 279 // MSAA states that navigating to first/last child can only be from self.
276 return E_INVALIDARG; 280 return E_INVALIDARG;
277 } 281 }
278 282
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 // return the IAccessible for the window. 475 // return the IAccessible for the window.
472 parent = manager_->ToBrowserAccessibilityManagerWin()-> 476 parent = manager_->ToBrowserAccessibilityManagerWin()->
473 GetParentWindowIAccessible(); 477 GetParentWindowIAccessible();
474 } 478 }
475 479
476 parent->AddRef(); 480 parent->AddRef();
477 *disp_parent = parent; 481 *disp_parent = parent;
478 return S_OK; 482 return S_OK;
479 } 483 }
480 484
481 STDMETHODIMP BrowserAccessibilityWin::get_accRole( 485 STDMETHODIMP BrowserAccessibilityWin::get_accRole(VARIANT var_id,
482 VARIANT var_id, VARIANT* role) { 486 VARIANT* role) {
483 if (!instance_active_) 487 if (!instance_active_)
484 return E_FAIL; 488 return E_FAIL;
485 489
486 if (!role) 490 if (!role)
487 return E_INVALIDARG; 491 return E_INVALIDARG;
488 492
489 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 493 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
490 if (!target) 494 if (!target)
491 return E_INVALIDARG; 495 return E_INVALIDARG;
492 496
(...skipping 20 matching lines...) Expand all
513 return E_INVALIDARG; 517 return E_INVALIDARG;
514 518
515 state->vt = VT_I4; 519 state->vt = VT_I4;
516 state->lVal = target->ia_state_; 520 state->lVal = target->ia_state_;
517 if (manager_->GetFocus(NULL) == this) 521 if (manager_->GetFocus(NULL) == this)
518 state->lVal |= STATE_SYSTEM_FOCUSED; 522 state->lVal |= STATE_SYSTEM_FOCUSED;
519 523
520 return S_OK; 524 return S_OK;
521 } 525 }
522 526
523 STDMETHODIMP BrowserAccessibilityWin::get_accValue( 527 STDMETHODIMP BrowserAccessibilityWin::get_accValue(VARIANT var_id,
524 VARIANT var_id, BSTR* value) { 528 BSTR* value) {
525 if (!instance_active_) 529 if (!instance_active_)
526 return E_FAIL; 530 return E_FAIL;
527 531
528 if (!value) 532 if (!value)
529 return E_INVALIDARG; 533 return E_INVALIDARG;
530 534
531 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 535 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
532 if (!target) 536 if (!target)
533 return E_INVALIDARG; 537 return E_INVALIDARG;
534 538
535 *value = SysAllocString(target->value_.c_str()); 539 *value = SysAllocString(target->value_.c_str());
536 540
537 DCHECK(*value); 541 DCHECK(*value);
538 return S_OK; 542 return S_OK;
539 } 543 }
540 544
541 STDMETHODIMP BrowserAccessibilityWin::get_accHelpTopic( 545 STDMETHODIMP BrowserAccessibilityWin::get_accHelpTopic(BSTR* help_file,
542 BSTR* help_file, VARIANT var_id, LONG* topic_id) { 546 VARIANT var_id,
547 LONG* topic_id) {
543 return E_NOTIMPL; 548 return E_NOTIMPL;
544 } 549 }
545 550
546 STDMETHODIMP BrowserAccessibilityWin::get_accSelection(VARIANT* selected) { 551 STDMETHODIMP BrowserAccessibilityWin::get_accSelection(VARIANT* selected) {
547 if (!instance_active_) 552 if (!instance_active_)
548 return E_FAIL; 553 return E_FAIL;
549 554
550 if (role_ != AccessibilityNodeData::ROLE_LISTBOX) 555 if (role_ != AccessibilityNodeData::ROLE_LISTBOX)
551 return E_NOTIMPL; 556 return E_NOTIMPL;
552 557
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
840 return E_FAIL; 845 return E_FAIL;
841 846
842 if (!desc) 847 if (!desc)
843 return E_INVALIDARG; 848 return E_INVALIDARG;
844 849
845 return GetStringAttributeAsBstr( 850 return GetStringAttributeAsBstr(
846 AccessibilityNodeData::ATTR_DESCRIPTION, desc); 851 AccessibilityNodeData::ATTR_DESCRIPTION, desc);
847 } 852 }
848 853
849 STDMETHODIMP BrowserAccessibilityWin::get_imagePosition( 854 STDMETHODIMP BrowserAccessibilityWin::get_imagePosition(
850 enum IA2CoordinateType coordinate_type, LONG* x, LONG* y) { 855 enum IA2CoordinateType coordinate_type,
856 LONG* x,
857 LONG* y) {
851 if (!instance_active_) 858 if (!instance_active_)
852 return E_FAIL; 859 return E_FAIL;
853 860
854 if (!x || !y) 861 if (!x || !y)
855 return E_INVALIDARG; 862 return E_INVALIDARG;
856 863
857 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 864 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) {
858 HWND parent_hwnd = manager_->GetParentView(); 865 HWND parent_hwnd = manager_->GetParentView();
859 POINT top_left = {0, 0}; 866 POINT top_left = {0, 0};
860 ::ClientToScreen(parent_hwnd, &top_left); 867 ::ClientToScreen(parent_hwnd, &top_left);
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
931 if (!instance_active_) 938 if (!instance_active_)
932 return E_FAIL; 939 return E_FAIL;
933 940
934 if (!accessible) 941 if (!accessible)
935 return E_INVALIDARG; 942 return E_INVALIDARG;
936 943
937 // TODO(dmazzoni): implement 944 // TODO(dmazzoni): implement
938 return S_FALSE; 945 return S_FALSE;
939 } 946 }
940 947
941 STDMETHODIMP BrowserAccessibilityWin::get_childIndex( 948 STDMETHODIMP BrowserAccessibilityWin::get_childIndex(long row,
942 long row, 949 long column,
943 long column, 950 long* cell_index) {
944 long* cell_index) {
945 if (!instance_active_) 951 if (!instance_active_)
946 return E_FAIL; 952 return E_FAIL;
947 953
948 if (!cell_index) 954 if (!cell_index)
949 return E_INVALIDARG; 955 return E_INVALIDARG;
950 956
951 int columns; 957 int columns;
952 int rows; 958 int rows;
953 if (!GetIntAttribute( 959 if (!GetIntAttribute(
954 AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 960 AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) ||
(...skipping 12 matching lines...) Expand all
967 for (size_t i = 0; i < unique_cell_ids_.size(); ++i) { 973 for (size_t i = 0; i < unique_cell_ids_.size(); ++i) {
968 if (unique_cell_ids_[i] == cell_id) { 974 if (unique_cell_ids_[i] == cell_id) {
969 *cell_index = (long)i; 975 *cell_index = (long)i;
970 return S_OK; 976 return S_OK;
971 } 977 }
972 } 978 }
973 979
974 return S_FALSE; 980 return S_FALSE;
975 } 981 }
976 982
977 STDMETHODIMP BrowserAccessibilityWin::get_columnDescription( 983 STDMETHODIMP BrowserAccessibilityWin::get_columnDescription(long column,
978 long column, 984 BSTR* description) {
979 BSTR* description) {
980 if (!instance_active_) 985 if (!instance_active_)
981 return E_FAIL; 986 return E_FAIL;
982 987
983 if (!description) 988 if (!description)
984 return E_INVALIDARG; 989 return E_INVALIDARG;
985 990
986 int columns; 991 int columns;
987 int rows; 992 int rows;
988 if (!GetIntAttribute( 993 if (!GetIntAttribute(
989 AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 994 AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) ||
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1052 return S_FALSE; 1057 return S_FALSE;
1053 } 1058 }
1054 1059
1055 STDMETHODIMP BrowserAccessibilityWin::get_columnHeader( 1060 STDMETHODIMP BrowserAccessibilityWin::get_columnHeader(
1056 IAccessibleTable** accessible_table, 1061 IAccessibleTable** accessible_table,
1057 long* starting_row_index) { 1062 long* starting_row_index) {
1058 // TODO(dmazzoni): implement 1063 // TODO(dmazzoni): implement
1059 return E_NOTIMPL; 1064 return E_NOTIMPL;
1060 } 1065 }
1061 1066
1062 STDMETHODIMP BrowserAccessibilityWin::get_columnIndex( 1067 STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long cell_index,
1063 long cell_index, 1068 long* column_index) {
1064 long* column_index) {
1065 if (!instance_active_) 1069 if (!instance_active_)
1066 return E_FAIL; 1070 return E_FAIL;
1067 1071
1068 if (!column_index) 1072 if (!column_index)
1069 return E_INVALIDARG; 1073 return E_INVALIDARG;
1070 1074
1071 int cell_id_count = static_cast<int>(unique_cell_ids_.size()); 1075 int cell_id_count = static_cast<int>(unique_cell_ids_.size());
1072 if (cell_index < 0) 1076 if (cell_index < 0)
1073 return E_INVALIDARG; 1077 return E_INVALIDARG;
1074 if (cell_index >= cell_id_count) 1078 if (cell_index >= cell_id_count)
1075 return S_FALSE; 1079 return S_FALSE;
1076 1080
1077 int cell_id = unique_cell_ids_[cell_index]; 1081 int cell_id = unique_cell_ids_[cell_index];
1078 BrowserAccessibilityWin* cell = 1082 BrowserAccessibilityWin* cell =
1079 manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 1083 manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
1080 int col_index; 1084 int col_index;
1081 if (cell && 1085 if (cell &&
1082 cell->GetIntAttribute( 1086 cell->GetIntAttribute(
1083 AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, &col_index)) { 1087 AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, &col_index)) {
1084 *column_index = col_index; 1088 *column_index = col_index;
1085 return S_OK; 1089 return S_OK;
1086 } 1090 }
1087 1091
1088 return S_FALSE; 1092 return S_FALSE;
1089 } 1093 }
1090 1094
1091 STDMETHODIMP BrowserAccessibilityWin::get_nColumns( 1095 STDMETHODIMP BrowserAccessibilityWin::get_nColumns(long* column_count) {
1092 long* column_count) {
1093 if (!instance_active_) 1096 if (!instance_active_)
1094 return E_FAIL; 1097 return E_FAIL;
1095 1098
1096 if (!column_count) 1099 if (!column_count)
1097 return E_INVALIDARG; 1100 return E_INVALIDARG;
1098 1101
1099 int columns; 1102 int columns;
1100 if (GetIntAttribute( 1103 if (GetIntAttribute(
1101 AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns)) { 1104 AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns)) {
1102 *column_count = columns; 1105 *column_count = columns;
1103 return S_OK; 1106 return S_OK;
1104 } 1107 }
1105 1108
1106 return S_FALSE; 1109 return S_FALSE;
1107 } 1110 }
1108 1111
1109 STDMETHODIMP BrowserAccessibilityWin::get_nRows( 1112 STDMETHODIMP BrowserAccessibilityWin::get_nRows(long* row_count) {
1110 long* row_count) {
1111 if (!instance_active_) 1113 if (!instance_active_)
1112 return E_FAIL; 1114 return E_FAIL;
1113 1115
1114 if (!row_count) 1116 if (!row_count)
1115 return E_INVALIDARG; 1117 return E_INVALIDARG;
1116 1118
1117 int rows; 1119 int rows;
1118 if (GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows)) { 1120 if (GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows)) {
1119 *row_count = rows; 1121 *row_count = rows;
1120 return S_OK; 1122 return S_OK;
1121 } 1123 }
1122 1124
1123 return S_FALSE; 1125 return S_FALSE;
1124 } 1126 }
1125 1127
1126 STDMETHODIMP BrowserAccessibilityWin::get_nSelectedChildren( 1128 STDMETHODIMP BrowserAccessibilityWin::get_nSelectedChildren(long* cell_count) {
1127 long* cell_count) {
1128 if (!instance_active_) 1129 if (!instance_active_)
1129 return E_FAIL; 1130 return E_FAIL;
1130 1131
1131 if (!cell_count) 1132 if (!cell_count)
1132 return E_INVALIDARG; 1133 return E_INVALIDARG;
1133 1134
1134 // TODO(dmazzoni): add support for selected cells/rows/columns in tables. 1135 // TODO(dmazzoni): add support for selected cells/rows/columns in tables.
1135 *cell_count = 0; 1136 *cell_count = 0;
1136 return S_OK; 1137 return S_OK;
1137 } 1138 }
1138 1139
1139 STDMETHODIMP BrowserAccessibilityWin::get_nSelectedColumns( 1140 STDMETHODIMP BrowserAccessibilityWin::get_nSelectedColumns(long* column_count) {
1140 long* column_count) {
1141 if (!instance_active_) 1141 if (!instance_active_)
1142 return E_FAIL; 1142 return E_FAIL;
1143 1143
1144 if (!column_count) 1144 if (!column_count)
1145 return E_INVALIDARG; 1145 return E_INVALIDARG;
1146 1146
1147 *column_count = 0; 1147 *column_count = 0;
1148 return S_OK; 1148 return S_OK;
1149 } 1149 }
1150 1150
1151 STDMETHODIMP BrowserAccessibilityWin::get_nSelectedRows( 1151 STDMETHODIMP BrowserAccessibilityWin::get_nSelectedRows(long* row_count) {
1152 long* row_count) {
1153 if (!instance_active_) 1152 if (!instance_active_)
1154 return E_FAIL; 1153 return E_FAIL;
1155 1154
1156 if (!row_count) 1155 if (!row_count)
1157 return E_INVALIDARG; 1156 return E_INVALIDARG;
1158 1157
1159 *row_count = 0; 1158 *row_count = 0;
1160 return S_OK; 1159 return S_OK;
1161 } 1160 }
1162 1161
1163 STDMETHODIMP BrowserAccessibilityWin::get_rowDescription( 1162 STDMETHODIMP BrowserAccessibilityWin::get_rowDescription(long row,
1164 long row, 1163 BSTR* description) {
1165 BSTR* description) {
1166 if (!instance_active_) 1164 if (!instance_active_)
1167 return E_FAIL; 1165 return E_FAIL;
1168 1166
1169 if (!description) 1167 if (!description)
1170 return E_INVALIDARG; 1168 return E_INVALIDARG;
1171 1169
1172 int columns; 1170 int columns;
1173 int rows; 1171 int rows;
1174 if (!GetIntAttribute( 1172 if (!GetIntAttribute(
1175 AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 1173 AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) ||
(...skipping 17 matching lines...) Expand all
1193 } 1191 }
1194 1192
1195 return cell->GetStringAttributeAsBstr( 1193 return cell->GetStringAttributeAsBstr(
1196 AccessibilityNodeData::ATTR_DESCRIPTION, description); 1194 AccessibilityNodeData::ATTR_DESCRIPTION, description);
1197 } 1195 }
1198 } 1196 }
1199 1197
1200 return S_FALSE; 1198 return S_FALSE;
1201 } 1199 }
1202 1200
1203 STDMETHODIMP BrowserAccessibilityWin::get_rowExtentAt( 1201 STDMETHODIMP BrowserAccessibilityWin::get_rowExtentAt(long row,
1204 long row, 1202 long column,
1205 long column, 1203 long* n_rows_spanned) {
1206 long* n_rows_spanned) {
1207 if (!instance_active_) 1204 if (!instance_active_)
1208 return E_FAIL; 1205 return E_FAIL;
1209 1206
1210 if (!n_rows_spanned) 1207 if (!n_rows_spanned)
1211 return E_INVALIDARG; 1208 return E_INVALIDARG;
1212 1209
1213 int columns; 1210 int columns;
1214 int rows; 1211 int rows;
1215 if (!GetIntAttribute( 1212 if (!GetIntAttribute(
1216 AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 1213 AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) ||
(...skipping 15 matching lines...) Expand all
1232 AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 1229 AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN, &rowspan) &&
1233 rowspan >= 1) { 1230 rowspan >= 1) {
1234 *n_rows_spanned = rowspan; 1231 *n_rows_spanned = rowspan;
1235 return S_OK; 1232 return S_OK;
1236 } 1233 }
1237 1234
1238 return S_FALSE; 1235 return S_FALSE;
1239 } 1236 }
1240 1237
1241 STDMETHODIMP BrowserAccessibilityWin::get_rowHeader( 1238 STDMETHODIMP BrowserAccessibilityWin::get_rowHeader(
1242 IAccessibleTable **accessible_table, 1239 IAccessibleTable** accessible_table,
1243 long* starting_column_index) { 1240 long* starting_column_index) {
1244 // TODO(dmazzoni): implement 1241 // TODO(dmazzoni): implement
1245 return E_NOTIMPL; 1242 return E_NOTIMPL;
1246 } 1243 }
1247 1244
1248 STDMETHODIMP BrowserAccessibilityWin::get_rowIndex( 1245 STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long cell_index,
1249 long cell_index, 1246 long* row_index) {
1250 long* row_index) {
1251 if (!instance_active_) 1247 if (!instance_active_)
1252 return E_FAIL; 1248 return E_FAIL;
1253 1249
1254 if (!row_index) 1250 if (!row_index)
1255 return E_INVALIDARG; 1251 return E_INVALIDARG;
1256 1252
1257 int cell_id_count = static_cast<int>(unique_cell_ids_.size()); 1253 int cell_id_count = static_cast<int>(unique_cell_ids_.size());
1258 if (cell_index < 0) 1254 if (cell_index < 0)
1259 return E_INVALIDARG; 1255 return E_INVALIDARG;
1260 if (cell_index >= cell_id_count) 1256 if (cell_index >= cell_id_count)
1261 return S_FALSE; 1257 return S_FALSE;
1262 1258
1263 int cell_id = unique_cell_ids_[cell_index]; 1259 int cell_id = unique_cell_ids_[cell_index];
1264 BrowserAccessibilityWin* cell = 1260 BrowserAccessibilityWin* cell =
1265 manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 1261 manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
1266 int cell_row_index; 1262 int cell_row_index;
1267 if (cell && 1263 if (cell &&
1268 cell->GetIntAttribute( 1264 cell->GetIntAttribute(
1269 AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &cell_row_index)) { 1265 AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &cell_row_index)) {
1270 *row_index = cell_row_index; 1266 *row_index = cell_row_index;
1271 return S_OK; 1267 return S_OK;
1272 } 1268 }
1273 1269
1274 return S_FALSE; 1270 return S_FALSE;
1275 } 1271 }
1276 1272
1277 STDMETHODIMP BrowserAccessibilityWin::get_selectedChildren( 1273 STDMETHODIMP BrowserAccessibilityWin::get_selectedChildren(long max_children,
1278 long max_children, 1274 long** children,
1279 long** children, 1275 long* n_children) {
1280 long* n_children) {
1281 if (!instance_active_) 1276 if (!instance_active_)
1282 return E_FAIL; 1277 return E_FAIL;
1283 1278
1284 if (!children || !n_children) 1279 if (!children || !n_children)
1285 return E_INVALIDARG; 1280 return E_INVALIDARG;
1286 1281
1287 // TODO(dmazzoni): Implement this. 1282 // TODO(dmazzoni): Implement this.
1288 *n_children = 0; 1283 *n_children = 0;
1289 return S_OK; 1284 return S_OK;
1290 } 1285 }
1291 1286
1292 STDMETHODIMP BrowserAccessibilityWin::get_selectedColumns( 1287 STDMETHODIMP BrowserAccessibilityWin::get_selectedColumns(long max_columns,
1293 long max_columns, 1288 long** columns,
1294 long** columns, 1289 long* n_columns) {
1295 long* n_columns) {
1296 if (!instance_active_) 1290 if (!instance_active_)
1297 return E_FAIL; 1291 return E_FAIL;
1298 1292
1299 if (!columns || !n_columns) 1293 if (!columns || !n_columns)
1300 return E_INVALIDARG; 1294 return E_INVALIDARG;
1301 1295
1302 // TODO(dmazzoni): Implement this. 1296 // TODO(dmazzoni): Implement this.
1303 *n_columns = 0; 1297 *n_columns = 0;
1304 return S_OK; 1298 return S_OK;
1305 } 1299 }
1306 1300
1307 STDMETHODIMP BrowserAccessibilityWin::get_selectedRows( 1301 STDMETHODIMP BrowserAccessibilityWin::get_selectedRows(long max_rows,
1308 long max_rows, 1302 long** rows,
1309 long** rows, 1303 long* n_rows) {
1310 long* n_rows) {
1311 if (!instance_active_) 1304 if (!instance_active_)
1312 return E_FAIL; 1305 return E_FAIL;
1313 1306
1314 if (!rows || !n_rows) 1307 if (!rows || !n_rows)
1315 return E_INVALIDARG; 1308 return E_INVALIDARG;
1316 1309
1317 // TODO(dmazzoni): Implement this. 1310 // TODO(dmazzoni): Implement this.
1318 *n_rows = 0; 1311 *n_rows = 0;
1319 return S_OK; 1312 return S_OK;
1320 } 1313 }
1321 1314
1322 STDMETHODIMP BrowserAccessibilityWin::get_summary( 1315 STDMETHODIMP BrowserAccessibilityWin::get_summary(IUnknown** accessible) {
1323 IUnknown** accessible) {
1324 if (!instance_active_) 1316 if (!instance_active_)
1325 return E_FAIL; 1317 return E_FAIL;
1326 1318
1327 if (!accessible) 1319 if (!accessible)
1328 return E_INVALIDARG; 1320 return E_INVALIDARG;
1329 1321
1330 // TODO(dmazzoni): implement 1322 // TODO(dmazzoni): implement
1331 return S_FALSE; 1323 return S_FALSE;
1332 } 1324 }
1333 1325
1334 STDMETHODIMP BrowserAccessibilityWin::get_isColumnSelected( 1326 STDMETHODIMP BrowserAccessibilityWin::get_isColumnSelected(
1335 long column, 1327 long column,
1336 boolean* is_selected) { 1328 boolean* is_selected) {
1337 if (!instance_active_) 1329 if (!instance_active_)
1338 return E_FAIL; 1330 return E_FAIL;
1339 1331
1340 if (!is_selected) 1332 if (!is_selected)
1341 return E_INVALIDARG; 1333 return E_INVALIDARG;
1342 1334
1343 // TODO(dmazzoni): Implement this. 1335 // TODO(dmazzoni): Implement this.
1344 *is_selected = false; 1336 *is_selected = false;
1345 return S_OK; 1337 return S_OK;
1346 } 1338 }
1347 1339
1348 STDMETHODIMP BrowserAccessibilityWin::get_isRowSelected( 1340 STDMETHODIMP BrowserAccessibilityWin::get_isRowSelected(long row,
1349 long row, 1341 boolean* is_selected) {
1350 boolean* is_selected) {
1351 if (!instance_active_) 1342 if (!instance_active_)
1352 return E_FAIL; 1343 return E_FAIL;
1353 1344
1354 if (!is_selected) 1345 if (!is_selected)
1355 return E_INVALIDARG; 1346 return E_INVALIDARG;
1356 1347
1357 // TODO(dmazzoni): Implement this. 1348 // TODO(dmazzoni): Implement this.
1358 *is_selected = false; 1349 *is_selected = false;
1359 return S_OK; 1350 return S_OK;
1360 } 1351 }
1361 1352
1362 STDMETHODIMP BrowserAccessibilityWin::get_isSelected( 1353 STDMETHODIMP BrowserAccessibilityWin::get_isSelected(long row,
1363 long row, 1354 long column,
1364 long column, 1355 boolean* is_selected) {
1365 boolean* is_selected) {
1366 if (!instance_active_) 1356 if (!instance_active_)
1367 return E_FAIL; 1357 return E_FAIL;
1368 1358
1369 if (!is_selected) 1359 if (!is_selected)
1370 return E_INVALIDARG; 1360 return E_INVALIDARG;
1371 1361
1372 // TODO(dmazzoni): Implement this. 1362 // TODO(dmazzoni): Implement this.
1373 *is_selected = false; 1363 *is_selected = false;
1374 return S_OK; 1364 return S_OK;
1375 } 1365 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1410 return S_OK; 1400 return S_OK;
1411 } 1401 }
1412 1402
1413 return S_FALSE; 1403 return S_FALSE;
1414 } 1404 }
1415 1405
1416 // 1406 //
1417 // IAccessibleTable2 methods. 1407 // IAccessibleTable2 methods.
1418 // 1408 //
1419 1409
1420 STDMETHODIMP BrowserAccessibilityWin::get_cellAt( 1410 STDMETHODIMP BrowserAccessibilityWin::get_cellAt(long row,
1421 long row, 1411 long column,
1422 long column, 1412 IUnknown** cell) {
1423 IUnknown** cell) {
1424 return get_accessibleAt(row, column, cell); 1413 return get_accessibleAt(row, column, cell);
1425 } 1414 }
1426 1415
1427 STDMETHODIMP BrowserAccessibilityWin::get_nSelectedCells(long* cell_count) { 1416 STDMETHODIMP BrowserAccessibilityWin::get_nSelectedCells(long* cell_count) {
1428 return get_nSelectedChildren(cell_count); 1417 return get_nSelectedChildren(cell_count);
1429 } 1418 }
1430 1419
1431 STDMETHODIMP BrowserAccessibilityWin::get_selectedCells( 1420 STDMETHODIMP BrowserAccessibilityWin::get_selectedCells(
1432 IUnknown*** cells, 1421 IUnknown*** cells,
1433 long* n_selected_cells) { 1422 long* n_selected_cells) {
1434 if (!instance_active_) 1423 if (!instance_active_)
1435 return E_FAIL; 1424 return E_FAIL;
1436 1425
1437 if (!cells || !n_selected_cells) 1426 if (!cells || !n_selected_cells)
1438 return E_INVALIDARG; 1427 return E_INVALIDARG;
1439 1428
1440 // TODO(dmazzoni): Implement this. 1429 // TODO(dmazzoni): Implement this.
1441 *n_selected_cells = 0; 1430 *n_selected_cells = 0;
1442 return S_OK; 1431 return S_OK;
1443 } 1432 }
1444 1433
1445 STDMETHODIMP BrowserAccessibilityWin::get_selectedColumns( 1434 STDMETHODIMP BrowserAccessibilityWin::get_selectedColumns(long** columns,
1446 long** columns, 1435 long* n_columns) {
1447 long* n_columns) {
1448 if (!instance_active_) 1436 if (!instance_active_)
1449 return E_FAIL; 1437 return E_FAIL;
1450 1438
1451 if (!columns || !n_columns) 1439 if (!columns || !n_columns)
1452 return E_INVALIDARG; 1440 return E_INVALIDARG;
1453 1441
1454 // TODO(dmazzoni): Implement this. 1442 // TODO(dmazzoni): Implement this.
1455 *n_columns = 0; 1443 *n_columns = 0;
1456 return S_OK; 1444 return S_OK;
1457 } 1445 }
1458 1446
1459 STDMETHODIMP BrowserAccessibilityWin::get_selectedRows( 1447 STDMETHODIMP BrowserAccessibilityWin::get_selectedRows(long** rows,
1460 long** rows, 1448 long* n_rows) {
1461 long* n_rows) {
1462 if (!instance_active_) 1449 if (!instance_active_)
1463 return E_FAIL; 1450 return E_FAIL;
1464 1451
1465 if (!rows || !n_rows) 1452 if (!rows || !n_rows)
1466 return E_INVALIDARG; 1453 return E_INVALIDARG;
1467 1454
1468 // TODO(dmazzoni): Implement this. 1455 // TODO(dmazzoni): Implement this.
1469 *n_rows = 0; 1456 *n_rows = 0;
1470 return S_OK; 1457 return S_OK;
1471 } 1458 }
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1548 if (cell && cell->role_ == AccessibilityNodeData::ROLE_COLUMN_HEADER) { 1535 if (cell && cell->role_ == AccessibilityNodeData::ROLE_COLUMN_HEADER) {
1549 (*cell_accessibles)[index] = 1536 (*cell_accessibles)[index] =
1550 static_cast<IAccessible*>(cell->NewReference()); 1537 static_cast<IAccessible*>(cell->NewReference());
1551 ++index; 1538 ++index;
1552 } 1539 }
1553 } 1540 }
1554 1541
1555 return S_OK; 1542 return S_OK;
1556 } 1543 }
1557 1544
1558 STDMETHODIMP BrowserAccessibilityWin::get_columnIndex( 1545 STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long* column_index) {
1559 long* column_index) {
1560 if (!instance_active_) 1546 if (!instance_active_)
1561 return E_FAIL; 1547 return E_FAIL;
1562 1548
1563 if (!column_index) 1549 if (!column_index)
1564 return E_INVALIDARG; 1550 return E_INVALIDARG;
1565 1551
1566 int column; 1552 int column;
1567 if (GetIntAttribute( 1553 if (GetIntAttribute(
1568 AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, &column)) { 1554 AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, &column)) {
1569 *column_index = column; 1555 *column_index = column;
1570 return S_OK; 1556 return S_OK;
1571 } 1557 }
1572 1558
1573 return S_FALSE; 1559 return S_FALSE;
1574 } 1560 }
1575 1561
1576 STDMETHODIMP BrowserAccessibilityWin::get_rowExtent( 1562 STDMETHODIMP BrowserAccessibilityWin::get_rowExtent(long* n_rows_spanned) {
1577 long* n_rows_spanned) {
1578 if (!instance_active_) 1563 if (!instance_active_)
1579 return E_FAIL; 1564 return E_FAIL;
1580 1565
1581 if (!n_rows_spanned) 1566 if (!n_rows_spanned)
1582 return E_INVALIDARG; 1567 return E_INVALIDARG;
1583 1568
1584 int rowspan; 1569 int rowspan;
1585 if (GetIntAttribute( 1570 if (GetIntAttribute(
1586 AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 1571 AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN, &rowspan) &&
1587 rowspan >= 1) { 1572 rowspan >= 1) {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1646 if (cell && cell->role_ == AccessibilityNodeData::ROLE_ROW_HEADER) { 1631 if (cell && cell->role_ == AccessibilityNodeData::ROLE_ROW_HEADER) {
1647 (*cell_accessibles)[index] = 1632 (*cell_accessibles)[index] =
1648 static_cast<IAccessible*>(cell->NewReference()); 1633 static_cast<IAccessible*>(cell->NewReference());
1649 ++index; 1634 ++index;
1650 } 1635 }
1651 } 1636 }
1652 1637
1653 return S_OK; 1638 return S_OK;
1654 } 1639 }
1655 1640
1656 STDMETHODIMP BrowserAccessibilityWin::get_rowIndex( 1641 STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long* row_index) {
1657 long* row_index) {
1658 if (!instance_active_) 1642 if (!instance_active_)
1659 return E_FAIL; 1643 return E_FAIL;
1660 1644
1661 if (!row_index) 1645 if (!row_index)
1662 return E_INVALIDARG; 1646 return E_INVALIDARG;
1663 1647
1664 int row; 1648 int row;
1665 if (GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &row)) { 1649 if (GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &row)) {
1666 *row_index = row; 1650 *row_index = row;
1667 return S_OK; 1651 return S_OK;
1668 } 1652 }
1669 return S_FALSE; 1653 return S_FALSE;
1670 } 1654 }
1671 1655
1672 STDMETHODIMP BrowserAccessibilityWin::get_isSelected( 1656 STDMETHODIMP BrowserAccessibilityWin::get_isSelected(boolean* is_selected) {
1673 boolean* is_selected) {
1674 if (!instance_active_) 1657 if (!instance_active_)
1675 return E_FAIL; 1658 return E_FAIL;
1676 1659
1677 if (!is_selected) 1660 if (!is_selected)
1678 return E_INVALIDARG; 1661 return E_INVALIDARG;
1679 1662
1680 *is_selected = false; 1663 *is_selected = false;
1681 return S_OK; 1664 return S_OK;
1682 } 1665 }
1683 1666
(...skipping 29 matching lines...) Expand all
1713 *column_index = column; 1696 *column_index = column;
1714 *row_extents = rowspan; 1697 *row_extents = rowspan;
1715 *column_extents = colspan; 1698 *column_extents = colspan;
1716 *is_selected = false; 1699 *is_selected = false;
1717 return S_OK; 1700 return S_OK;
1718 } 1701 }
1719 1702
1720 return S_FALSE; 1703 return S_FALSE;
1721 } 1704 }
1722 1705
1723 STDMETHODIMP BrowserAccessibilityWin::get_table( 1706 STDMETHODIMP BrowserAccessibilityWin::get_table(IUnknown** table) {
1724 IUnknown** table) {
1725 if (!instance_active_) 1707 if (!instance_active_)
1726 return E_FAIL; 1708 return E_FAIL;
1727 1709
1728 if (!table) 1710 if (!table)
1729 return E_INVALIDARG; 1711 return E_INVALIDARG;
1730 1712
1731 1713
1732 int row; 1714 int row;
1733 int column; 1715 int column;
1734 GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &row); 1716 GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &row);
(...skipping 28 matching lines...) Expand all
1763 return S_OK; 1745 return S_OK;
1764 } 1746 }
1765 1747
1766 STDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) { 1748 STDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) {
1767 if (!instance_active_) 1749 if (!instance_active_)
1768 return E_FAIL; 1750 return E_FAIL;
1769 1751
1770 if (!offset) 1752 if (!offset)
1771 return E_INVALIDARG; 1753 return E_INVALIDARG;
1772 1754
1755 *offset = 0;
1773 if (role_ == AccessibilityNodeData::ROLE_TEXT_FIELD || 1756 if (role_ == AccessibilityNodeData::ROLE_TEXT_FIELD ||
1774 role_ == AccessibilityNodeData::ROLE_TEXTAREA) { 1757 role_ == AccessibilityNodeData::ROLE_TEXTAREA) {
1775 int sel_start = 0; 1758 int sel_start = 0;
1776 if (GetIntAttribute( 1759 if (GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_START,
1777 AccessibilityNodeData::ATTR_TEXT_SEL_START, &sel_start)) { 1760 &sel_start))
1778 *offset = sel_start; 1761 *offset = sel_start;
1779 } else {
1780 *offset = 0;
1781 }
1782 } else {
1783 *offset = 0;
1784 } 1762 }
1785 1763
1786 return S_OK; 1764 return S_OK;
1787 } 1765 }
1788 1766
1789 STDMETHODIMP BrowserAccessibilityWin::get_nSelections(LONG* n_selections) { 1767 STDMETHODIMP BrowserAccessibilityWin::get_nSelections(LONG* n_selections) {
1790 if (!instance_active_) 1768 if (!instance_active_)
1791 return E_FAIL; 1769 return E_FAIL;
1792 1770
1793 if (!n_selections) 1771 if (!n_selections)
1794 return E_INVALIDARG; 1772 return E_INVALIDARG;
1795 1773
1774 *n_selections = 0;
1796 if (role_ == AccessibilityNodeData::ROLE_TEXT_FIELD || 1775 if (role_ == AccessibilityNodeData::ROLE_TEXT_FIELD ||
1797 role_ == AccessibilityNodeData::ROLE_TEXTAREA) { 1776 role_ == AccessibilityNodeData::ROLE_TEXTAREA) {
1798 int sel_start = 0; 1777 int sel_start = 0;
1799 int sel_end = 0; 1778 int sel_end = 0;
1800 if (GetIntAttribute( 1779 if (GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_START,
1801 AccessibilityNodeData::ATTR_TEXT_SEL_START, &sel_start) && 1780 &sel_start) &&
1802 GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &sel_end) && 1781 GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &sel_end) &&
1803 sel_start != sel_end) { 1782 sel_start != sel_end)
1804 *n_selections = 1; 1783 *n_selections = 1;
1805 } else {
1806 *n_selections = 0;
1807 }
1808 } else {
1809 *n_selections = 0;
1810 } 1784 }
1811 1785
1812 return S_OK; 1786 return S_OK;
1813 } 1787 }
1814 1788
1815 STDMETHODIMP BrowserAccessibilityWin::get_selection(LONG selection_index, 1789 STDMETHODIMP BrowserAccessibilityWin::get_selection(LONG selection_index,
1816 LONG* start_offset, 1790 LONG* start_offset,
1817 LONG* end_offset) { 1791 LONG* end_offset) {
1818 if (!instance_active_) 1792 if (!instance_active_)
1819 return E_FAIL; 1793 return E_FAIL;
1820 1794
1821 if (!start_offset || !end_offset || selection_index != 0) 1795 if (!start_offset || !end_offset || selection_index != 0)
1822 return E_INVALIDARG; 1796 return E_INVALIDARG;
1823 1797
1798 *start_offset = 0;
1799 *end_offset = 0;
1824 if (role_ == AccessibilityNodeData::ROLE_TEXT_FIELD || 1800 if (role_ == AccessibilityNodeData::ROLE_TEXT_FIELD ||
1825 role_ == AccessibilityNodeData::ROLE_TEXTAREA) { 1801 role_ == AccessibilityNodeData::ROLE_TEXTAREA) {
1826 int sel_start = 0; 1802 int sel_start = 0;
1827 int sel_end = 0; 1803 int sel_end = 0;
1828 if (GetIntAttribute( 1804 if (GetIntAttribute(
1829 AccessibilityNodeData::ATTR_TEXT_SEL_START, &sel_start) && 1805 AccessibilityNodeData::ATTR_TEXT_SEL_START, &sel_start) &&
1830 GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &sel_end)) { 1806 GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &sel_end)) {
1831 *start_offset = sel_start; 1807 *start_offset = sel_start;
1832 *end_offset = sel_end; 1808 *end_offset = sel_end;
1833 } else {
1834 *start_offset = 0;
1835 *end_offset = 0;
1836 } 1809 }
1837 } else {
1838 *start_offset = 0;
1839 *end_offset = 0;
1840 } 1810 }
1841 1811
1842 return S_OK; 1812 return S_OK;
1843 } 1813 }
1844 1814
1845 STDMETHODIMP BrowserAccessibilityWin::get_text( 1815 STDMETHODIMP BrowserAccessibilityWin::get_text(LONG start_offset,
1846 LONG start_offset, LONG end_offset, BSTR* text) { 1816 LONG end_offset,
1817 BSTR* text) {
1847 if (!instance_active_) 1818 if (!instance_active_)
1848 return E_FAIL; 1819 return E_FAIL;
1849 1820
1850 if (!text) 1821 if (!text)
1851 return E_INVALIDARG; 1822 return E_INVALIDARG;
1852 1823
1853 const string16& text_str = TextForIAccessibleText(); 1824 const string16& text_str = TextForIAccessibleText();
1854 1825
1855 // Handle special text offsets. 1826 // Handle special text offsets.
1856 HandleSpecialTextOffset(text_str, &start_offset); 1827 HandleSpecialTextOffset(text_str, &start_offset);
(...skipping 19 matching lines...) Expand all
1876 return S_FALSE; 1847 return S_FALSE;
1877 1848
1878 *text = SysAllocString(substr.c_str()); 1849 *text = SysAllocString(substr.c_str());
1879 DCHECK(*text); 1850 DCHECK(*text);
1880 return S_OK; 1851 return S_OK;
1881 } 1852 }
1882 1853
1883 STDMETHODIMP BrowserAccessibilityWin::get_textAtOffset( 1854 STDMETHODIMP BrowserAccessibilityWin::get_textAtOffset(
1884 LONG offset, 1855 LONG offset,
1885 enum IA2TextBoundaryType boundary_type, 1856 enum IA2TextBoundaryType boundary_type,
1886 LONG* start_offset, LONG* end_offset, 1857 LONG* start_offset,
1858 LONG* end_offset,
1887 BSTR* text) { 1859 BSTR* text) {
1888 if (!instance_active_) 1860 if (!instance_active_)
1889 return E_FAIL; 1861 return E_FAIL;
1890 1862
1891 if (!start_offset || !end_offset || !text) 1863 if (!start_offset || !end_offset || !text)
1892 return E_INVALIDARG; 1864 return E_INVALIDARG;
1893 1865
1894 // The IAccessible2 spec says we don't have to implement the "sentence" 1866 // The IAccessible2 spec says we don't have to implement the "sentence"
1895 // boundary type, we can just let the screenreader handle it. 1867 // boundary type, we can just let the screenreader handle it.
1896 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 1868 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) {
1897 *start_offset = 0; 1869 *start_offset = 0;
1898 *end_offset = 0; 1870 *end_offset = 0;
1899 *text = NULL; 1871 *text = NULL;
1900 return S_FALSE; 1872 return S_FALSE;
1901 } 1873 }
1902 1874
1903 const string16& text_str = TextForIAccessibleText(); 1875 const string16& text_str = TextForIAccessibleText();
1904 1876
1905 *start_offset = FindBoundary( 1877 *start_offset = FindBoundary(
1906 text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION); 1878 text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION);
1907 *end_offset = FindBoundary( 1879 *end_offset = FindBoundary(
1908 text_str, boundary_type, offset, ui::FORWARDS_DIRECTION); 1880 text_str, boundary_type, offset, ui::FORWARDS_DIRECTION);
1909 return get_text(*start_offset, *end_offset, text); 1881 return get_text(*start_offset, *end_offset, text);
1910 } 1882 }
1911 1883
1912 STDMETHODIMP BrowserAccessibilityWin::get_textBeforeOffset( 1884 STDMETHODIMP BrowserAccessibilityWin::get_textBeforeOffset(
1913 LONG offset, 1885 LONG offset,
1914 enum IA2TextBoundaryType boundary_type, 1886 enum IA2TextBoundaryType boundary_type,
1915 LONG* start_offset, LONG* end_offset, 1887 LONG* start_offset,
1888 LONG* end_offset,
1916 BSTR* text) { 1889 BSTR* text) {
1917 if (!instance_active_) 1890 if (!instance_active_)
1918 return E_FAIL; 1891 return E_FAIL;
1919 1892
1920 if (!start_offset || !end_offset || !text) 1893 if (!start_offset || !end_offset || !text)
1921 return E_INVALIDARG; 1894 return E_INVALIDARG;
1922 1895
1923 // The IAccessible2 spec says we don't have to implement the "sentence" 1896 // The IAccessible2 spec says we don't have to implement the "sentence"
1924 // boundary type, we can just let the screenreader handle it. 1897 // boundary type, we can just let the screenreader handle it.
1925 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 1898 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) {
1926 *start_offset = 0; 1899 *start_offset = 0;
1927 *end_offset = 0; 1900 *end_offset = 0;
1928 *text = NULL; 1901 *text = NULL;
1929 return S_FALSE; 1902 return S_FALSE;
1930 } 1903 }
1931 1904
1932 const string16& text_str = TextForIAccessibleText(); 1905 const string16& text_str = TextForIAccessibleText();
1933 1906
1934 *start_offset = FindBoundary( 1907 *start_offset = FindBoundary(
1935 text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION); 1908 text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION);
1936 *end_offset = offset; 1909 *end_offset = offset;
1937 return get_text(*start_offset, *end_offset, text); 1910 return get_text(*start_offset, *end_offset, text);
1938 } 1911 }
1939 1912
1940 STDMETHODIMP BrowserAccessibilityWin::get_textAfterOffset( 1913 STDMETHODIMP BrowserAccessibilityWin::get_textAfterOffset(
1941 LONG offset, 1914 LONG offset,
1942 enum IA2TextBoundaryType boundary_type, 1915 enum IA2TextBoundaryType boundary_type,
1943 LONG* start_offset, LONG* end_offset, 1916 LONG* start_offset,
1917 LONG* end_offset,
1944 BSTR* text) { 1918 BSTR* text) {
1945 if (!instance_active_) 1919 if (!instance_active_)
1946 return E_FAIL; 1920 return E_FAIL;
1947 1921
1948 if (!start_offset || !end_offset || !text) 1922 if (!start_offset || !end_offset || !text)
1949 return E_INVALIDARG; 1923 return E_INVALIDARG;
1950 1924
1951 // The IAccessible2 spec says we don't have to implement the "sentence" 1925 // The IAccessible2 spec says we don't have to implement the "sentence"
1952 // boundary type, we can just let the screenreader handle it. 1926 // boundary type, we can just let the screenreader handle it.
1953 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 1927 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1987 if (!old_text) 1961 if (!old_text)
1988 return E_INVALIDARG; 1962 return E_INVALIDARG;
1989 1963
1990 old_text->text = SysAllocString(old_text_.c_str()); 1964 old_text->text = SysAllocString(old_text_.c_str());
1991 old_text->start = 0; 1965 old_text->start = 0;
1992 old_text->end = static_cast<long>(old_text_.size()); 1966 old_text->end = static_cast<long>(old_text_.size());
1993 return S_OK; 1967 return S_OK;
1994 } 1968 }
1995 1969
1996 STDMETHODIMP BrowserAccessibilityWin::get_offsetAtPoint( 1970 STDMETHODIMP BrowserAccessibilityWin::get_offsetAtPoint(
1997 LONG x, LONG y, enum IA2CoordinateType coord_type, LONG* offset) { 1971 LONG x,
1972 LONG y,
1973 enum IA2CoordinateType coord_type,
1974 LONG* offset) {
1998 if (!instance_active_) 1975 if (!instance_active_)
1999 return E_FAIL; 1976 return E_FAIL;
2000 1977
2001 if (!offset) 1978 if (!offset)
2002 return E_INVALIDARG; 1979 return E_INVALIDARG;
2003 1980
2004 // TODO(dmazzoni): implement this. We're returning S_OK for now so that 1981 // TODO(dmazzoni): implement this. We're returning S_OK for now so that
2005 // screen readers still return partially accurate results rather than 1982 // screen readers still return partially accurate results rather than
2006 // completely failing. 1983 // completely failing.
2007 *offset = 0; 1984 *offset = 0;
(...skipping 10 matching lines...) Expand all
2018 1995
2019 STDMETHODIMP BrowserAccessibilityWin::scrollSubstringToPoint( 1996 STDMETHODIMP BrowserAccessibilityWin::scrollSubstringToPoint(
2020 LONG start_index, 1997 LONG start_index,
2021 LONG end_index, 1998 LONG end_index,
2022 enum IA2CoordinateType coordinate_type, 1999 enum IA2CoordinateType coordinate_type,
2023 LONG x, LONG y) { 2000 LONG x, LONG y) {
2024 // TODO(dmazzoni): adjust this for the start and end index, too. 2001 // TODO(dmazzoni): adjust this for the start and end index, too.
2025 return scrollToPoint(coordinate_type, x, y); 2002 return scrollToPoint(coordinate_type, x, y);
2026 } 2003 }
2027 2004
2028 STDMETHODIMP BrowserAccessibilityWin::addSelection( 2005 STDMETHODIMP BrowserAccessibilityWin::addSelection(LONG start_offset,
2029 LONG start_offset, LONG end_offset) { 2006 LONG end_offset) {
2030 if (!instance_active_) 2007 if (!instance_active_)
2031 return E_FAIL; 2008 return E_FAIL;
2032 2009
2033 const string16& text_str = TextForIAccessibleText(); 2010 const string16& text_str = TextForIAccessibleText();
2034 HandleSpecialTextOffset(text_str, &start_offset); 2011 HandleSpecialTextOffset(text_str, &start_offset);
2035 HandleSpecialTextOffset(text_str, &end_offset); 2012 HandleSpecialTextOffset(text_str, &end_offset);
2036 2013
2037 manager_->SetTextSelection(*this, start_offset, end_offset); 2014 manager_->SetTextSelection(*this, start_offset, end_offset);
2038 return S_OK; 2015 return S_OK;
2039 } 2016 }
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
2335 if (!found) { 2312 if (!found) {
2336 attrib_values[i] = NULL; 2313 attrib_values[i] = NULL;
2337 } 2314 }
2338 } 2315 }
2339 return S_OK; 2316 return S_OK;
2340 } 2317 }
2341 2318
2342 STDMETHODIMP BrowserAccessibilityWin::get_computedStyle( 2319 STDMETHODIMP BrowserAccessibilityWin::get_computedStyle(
2343 unsigned short max_style_properties, 2320 unsigned short max_style_properties,
2344 boolean use_alternate_view, 2321 boolean use_alternate_view,
2345 BSTR *style_properties, 2322 BSTR* style_properties,
2346 BSTR *style_values, 2323 BSTR* style_values,
2347 unsigned short *num_style_properties) { 2324 unsigned short *num_style_properties) {
2348 if (!instance_active_) 2325 if (!instance_active_)
2349 return E_FAIL; 2326 return E_FAIL;
2350 2327
2351 if (!style_properties || !style_values) 2328 if (!style_properties || !style_values)
2352 return E_INVALIDARG; 2329 return E_INVALIDARG;
2353 2330
2354 // We only cache a single style property for now: DISPLAY 2331 // We only cache a single style property for now: DISPLAY
2355 2332
2356 string16 display; 2333 string16 display;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2390 } else { 2367 } else {
2391 style_values[i] = NULL; 2368 style_values[i] = NULL;
2392 } 2369 }
2393 } 2370 }
2394 2371
2395 return S_OK; 2372 return S_OK;
2396 } 2373 }
2397 2374
2398 STDMETHODIMP BrowserAccessibilityWin::scrollTo(boolean placeTopLeft) { 2375 STDMETHODIMP BrowserAccessibilityWin::scrollTo(boolean placeTopLeft) {
2399 return scrollTo(placeTopLeft ? 2376 return scrollTo(placeTopLeft ?
2400 IA2_SCROLL_TYPE_TOP_LEFT : 2377 IA2_SCROLL_TYPE_TOP_LEFT : IA2_SCROLL_TYPE_ANYWHERE);
2401 IA2_SCROLL_TYPE_ANYWHERE);
2402 } 2378 }
2403 2379
2404 STDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) { 2380 STDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) {
2405 if (!instance_active_) 2381 if (!instance_active_)
2406 return E_FAIL; 2382 return E_FAIL;
2407 2383
2408 if (!node) 2384 if (!node)
2409 return E_INVALIDARG; 2385 return E_INVALIDARG;
2410 2386
2411 *node = parent_->ToBrowserAccessibilityWin()->NewReference(); 2387 *node = parent_->ToBrowserAccessibilityWin()->NewReference();
2412 return S_OK; 2388 return S_OK;
2413 } 2389 }
2414 2390
2415 STDMETHODIMP BrowserAccessibilityWin::get_firstChild(ISimpleDOMNode** node) { 2391 STDMETHODIMP BrowserAccessibilityWin::get_firstChild(ISimpleDOMNode** node) {
2416 if (!instance_active_) 2392 if (!instance_active_)
2417 return E_FAIL; 2393 return E_FAIL;
2418 2394
2419 if (!node) 2395 if (!node)
2420 return E_INVALIDARG; 2396 return E_INVALIDARG;
2421 2397
2422 if (children_.size()) { 2398 if (children_.empty()) {
2423 *node = children_[0]->ToBrowserAccessibilityWin()->NewReference();
2424 return S_OK;
2425 } else {
2426 *node = NULL; 2399 *node = NULL;
2427 return S_FALSE; 2400 return S_FALSE;
2428 } 2401 }
2402
2403 *node = children_[0]->ToBrowserAccessibilityWin()->NewReference();
2404 return S_OK;
2429 } 2405 }
2430 2406
2431 STDMETHODIMP BrowserAccessibilityWin::get_lastChild(ISimpleDOMNode** node) { 2407 STDMETHODIMP BrowserAccessibilityWin::get_lastChild(ISimpleDOMNode** node) {
2432 if (!instance_active_) 2408 if (!instance_active_)
2433 return E_FAIL; 2409 return E_FAIL;
2434 2410
2435 if (!node) 2411 if (!node)
2436 return E_INVALIDARG; 2412 return E_INVALIDARG;
2437 2413
2438 if (children_.size()) { 2414 if (children_.empty()) {
2439 *node = children_[children_.size() - 1]->ToBrowserAccessibilityWin()->
2440 NewReference();
2441 return S_OK;
2442 } else {
2443 *node = NULL; 2415 *node = NULL;
2444 return S_FALSE; 2416 return S_FALSE;
2445 } 2417 }
2418
2419 *node = (*children_.rbegin())->ToBrowserAccessibilityWin()->NewReference();
2420 return S_OK;
2446 } 2421 }
2447 2422
2448 STDMETHODIMP BrowserAccessibilityWin::get_previousSibling( 2423 STDMETHODIMP BrowserAccessibilityWin::get_previousSibling(
2449 ISimpleDOMNode** node) { 2424 ISimpleDOMNode** node) {
2450 if (!instance_active_) 2425 if (!instance_active_)
2451 return E_FAIL; 2426 return E_FAIL;
2452 2427
2453 if (!node) 2428 if (!node)
2454 return E_INVALIDARG; 2429 return E_INVALIDARG;
2455 2430
2456 if (parent_ && index_in_parent_ > 0) { 2431 if (!parent_ || index_in_parent_ <= 0) {
2457 *node = parent_->children()[index_in_parent_ - 1]->
2458 ToBrowserAccessibilityWin()->NewReference();
2459 return S_OK;
2460 } else {
2461 *node = NULL; 2432 *node = NULL;
2462 return S_FALSE; 2433 return S_FALSE;
2463 } 2434 }
2435
2436 *node = parent_->children()[index_in_parent_ - 1]->
2437 ToBrowserAccessibilityWin()->NewReference();
2438 return S_OK;
2464 } 2439 }
2465 2440
2466 STDMETHODIMP BrowserAccessibilityWin::get_nextSibling(ISimpleDOMNode** node) { 2441 STDMETHODIMP BrowserAccessibilityWin::get_nextSibling(ISimpleDOMNode** node) {
2467 if (!instance_active_) 2442 if (!instance_active_)
2468 return E_FAIL; 2443 return E_FAIL;
2469 2444
2470 if (!node) 2445 if (!node)
2471 return E_INVALIDARG; 2446 return E_INVALIDARG;
2472 2447
2473 if (parent_ && 2448 if (!parent_ ||
2474 index_in_parent_ >= 0 && 2449 index_in_parent_ < 0 ||
2475 index_in_parent_ < static_cast<int>(parent_->children().size()) - 1) { 2450 index_in_parent_ >= static_cast<int>(parent_->children().size()) - 1) {
2476 *node = parent_->children()[index_in_parent_ + 1]->
2477 ToBrowserAccessibilityWin()->NewReference();
2478 return S_OK;
2479 } else {
2480 *node = NULL; 2451 *node = NULL;
2481 return S_FALSE; 2452 return S_FALSE;
2482 } 2453 }
2454
2455 *node = parent_->children()[index_in_parent_ + 1]->
2456 ToBrowserAccessibilityWin()->NewReference();
2457 return S_OK;
2483 } 2458 }
2484 2459
2485 STDMETHODIMP BrowserAccessibilityWin::get_childAt( 2460 STDMETHODIMP BrowserAccessibilityWin::get_childAt(
2486 unsigned int child_index, 2461 unsigned int child_index,
2487 ISimpleDOMNode** node) { 2462 ISimpleDOMNode** node) {
2488 if (!instance_active_) 2463 if (!instance_active_)
2489 return E_FAIL; 2464 return E_FAIL;
2490 2465
2491 if (!node) 2466 if (!node)
2492 return E_INVALIDARG; 2467 return E_INVALIDARG;
2493 2468
2494 if (child_index < children_.size()) { 2469 if (child_index < children_.size()) {
2495 *node = children_[child_index]->ToBrowserAccessibilityWin()->NewReference();
2496 return S_OK;
2497 } else {
2498 *node = NULL; 2470 *node = NULL;
2499 return S_FALSE; 2471 return S_FALSE;
2500 } 2472 }
2473
2474 *node = children_[child_index]->ToBrowserAccessibilityWin()->NewReference();
2475 return S_OK;
2501 } 2476 }
2502 2477
2503 // 2478 //
2504 // ISimpleDOMText methods. 2479 // ISimpleDOMText methods.
2505 // 2480 //
2506 2481
2507 STDMETHODIMP BrowserAccessibilityWin::get_domText(BSTR* dom_text) { 2482 STDMETHODIMP BrowserAccessibilityWin::get_domText(BSTR* dom_text) {
2508 if (!instance_active_) 2483 if (!instance_active_)
2509 return E_FAIL; 2484 return E_FAIL;
2510 2485
2511 if (!dom_text) 2486 if (!dom_text)
2512 return E_INVALIDARG; 2487 return E_INVALIDARG;
2513 2488
2514 if (name_.empty()) 2489 if (name_.empty())
2515 return S_FALSE; 2490 return S_FALSE;
2516 2491
2517 *dom_text = SysAllocString(name_.c_str()); 2492 *dom_text = SysAllocString(name_.c_str());
2518 DCHECK(*dom_text); 2493 DCHECK(*dom_text);
2519 return S_OK; 2494 return S_OK;
2520 } 2495 }
2521 2496
2522 // 2497 //
2523 // IServiceProvider methods. 2498 // IServiceProvider methods.
2524 // 2499 //
2525 2500
2526 STDMETHODIMP BrowserAccessibilityWin::QueryService( 2501 STDMETHODIMP BrowserAccessibilityWin::QueryService(REFGUID guidService,
2527 REFGUID guidService, REFIID riid, void** object) { 2502 REFIID riid,
2503 void** object) {
2528 if (!instance_active_) 2504 if (!instance_active_)
2529 return E_FAIL; 2505 return E_FAIL;
2530 2506
2531 if (guidService == IID_IAccessible || 2507 if (guidService == IID_IAccessible ||
2532 guidService == IID_IAccessible2 || 2508 guidService == IID_IAccessible2 ||
2533 guidService == IID_IAccessibleAction || 2509 guidService == IID_IAccessibleAction ||
2534 guidService == IID_IAccessibleHyperlink || 2510 guidService == IID_IAccessibleHyperlink ||
2535 guidService == IID_IAccessibleHypertext || 2511 guidService == IID_IAccessibleHypertext ||
2536 guidService == IID_IAccessibleImage || 2512 guidService == IID_IAccessibleImage ||
2537 guidService == IID_IAccessibleTable || 2513 guidService == IID_IAccessibleTable ||
(...skipping 14 matching lines...) Expand all
2552 // All methods in the IAccessibleEx interface are unimplemented. 2528 // All methods in the IAccessibleEx interface are unimplemented.
2553 if (riid == IID_IAccessibleEx && 2529 if (riid == IID_IAccessibleEx &&
2554 base::win::GetVersion() >= base::win::VERSION_WIN8) { 2530 base::win::GetVersion() >= base::win::VERSION_WIN8) {
2555 return QueryInterface(riid, object); 2531 return QueryInterface(riid, object);
2556 } 2532 }
2557 2533
2558 *object = NULL; 2534 *object = NULL;
2559 return E_FAIL; 2535 return E_FAIL;
2560 } 2536 }
2561 2537
2562 STDMETHODIMP BrowserAccessibilityWin::GetPatternProvider( 2538 STDMETHODIMP BrowserAccessibilityWin::GetPatternProvider(PATTERNID id,
2563 PATTERNID id, IUnknown** provider) { 2539 IUnknown** provider) {
2564 DVLOG(1) << "In Function: " 2540 DVLOG(1) << "In Function: "
2565 << __FUNCTION__ 2541 << __FUNCTION__
2566 << " for pattern id: " 2542 << " for pattern id: "
2567 << id; 2543 << id;
2568 if (id == UIA_ValuePatternId || id == UIA_TextPatternId) { 2544 if (id == UIA_ValuePatternId || id == UIA_TextPatternId) {
2569 if (IsEditableText()) { 2545 if (IsEditableText()) {
2570 // The BrowserAccessibilityManager keeps track of instances when 2546 // The BrowserAccessibilityManager keeps track of instances when
2571 // we don't want to show the on-screen keyboard. 2547 // we don't want to show the on-screen keyboard.
2572 if (!manager_->IsOSKAllowed(GetGlobalBoundsRect())) 2548 if (!manager_->IsOSKAllowed(GetGlobalBoundsRect()))
2573 return E_NOTIMPL; 2549 return E_NOTIMPL;
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
2702 value_ = UTF8ToUTF16(base::DoubleToString(fval)); 2678 value_ = UTF8ToUTF16(base::DoubleToString(fval));
2703 } 2679 }
2704 ia2_attributes_.push_back(L"valuetext:" + value_); 2680 ia2_attributes_.push_back(L"valuetext:" + value_);
2705 } 2681 }
2706 2682
2707 // Expose table cell index. 2683 // Expose table cell index.
2708 if (ia_role_ == ROLE_SYSTEM_CELL) { 2684 if (ia_role_ == ROLE_SYSTEM_CELL) {
2709 BrowserAccessibility* table = parent(); 2685 BrowserAccessibility* table = parent();
2710 while (table && table->role() != AccessibilityNodeData::ROLE_TABLE) 2686 while (table && table->role() != AccessibilityNodeData::ROLE_TABLE)
2711 table = table->parent(); 2687 table = table->parent();
2712 if (table) { 2688 DCHECK(table);
dmazzoni 2012/11/13 03:54:02 This isn't safe; it's possible for a web author to
Peter Kasting 2012/11/13 04:02:08 Then the old code was wrong to NOTREACHED(). NOTR
dmazzoni 2012/11/13 04:12:13 You're right, that was a poor choice. Please elimi
2713 const std::vector<int32>& unique_cell_ids = table->unique_cell_ids(); 2689 const std::vector<int32>& unique_cell_ids = table->unique_cell_ids();
2714 int index = -1; 2690 for (size_t i = 0; i < unique_cell_ids.size(); ++i) {
2715 for (size_t i = 0; i < unique_cell_ids.size(); ++i) { 2691 if (unique_cell_ids[i] == renderer_id_) {
2716 if (unique_cell_ids[i] == renderer_id_) { 2692 ia2_attributes_.push_back(
2717 index = static_cast<int>(i); 2693 string16(L"table-cell-index:") + base::IntToString16(i));
2718 break;
2719 }
2720 } 2694 }
2721 if (index >= 0) {
2722 ia2_attributes_.push_back(string16(L"table-cell-index:") +
2723 base::IntToString16(index));
2724 }
2725 } else {
2726 NOTREACHED();
2727 } 2695 }
2728 } 2696 }
2729 2697
2730 // The calculation of the accessible name of an element has been 2698 // The calculation of the accessible name of an element has been
2731 // standardized in the HTML to Platform Accessibility APIs Implementation 2699 // standardized in the HTML to Platform Accessibility APIs Implementation
2732 // Guide (http://www.w3.org/TR/html-aapi/). In order to return the 2700 // Guide (http://www.w3.org/TR/html-aapi/). In order to return the
2733 // appropriate accessible name on Windows, we need to apply some logic 2701 // appropriate accessible name on Windows, we need to apply some logic
2734 // to the fields we get from WebKit. 2702 // to the fields we get from WebKit.
2735 // 2703 //
2736 // TODO(dmazzoni): move most of this logic into WebKit. 2704 // TODO(dmazzoni): move most of this logic into WebKit.
(...skipping 17 matching lines...) Expand all
2754 GetStringAttribute(AccessibilityNodeData::ATTR_DESCRIPTION, &description); 2722 GetStringAttribute(AccessibilityNodeData::ATTR_DESCRIPTION, &description);
2755 GetStringAttribute(AccessibilityNodeData::ATTR_HELP, &help); 2723 GetStringAttribute(AccessibilityNodeData::ATTR_HELP, &help);
2756 2724
2757 // WebKit annoyingly puts the title in the description if there's no other 2725 // WebKit annoyingly puts the title in the description if there's no other
2758 // description, which just confuses the rest of the logic. Put it back. 2726 // description, which just confuses the rest of the logic. Put it back.
2759 // Now "help" is always the value of the "title" attribute, if present. 2727 // Now "help" is always the value of the "title" attribute, if present.
2760 if (GetHtmlAttribute("title", &title_attr) && 2728 if (GetHtmlAttribute("title", &title_attr) &&
2761 description == title_attr && 2729 description == title_attr &&
2762 help.empty()) { 2730 help.empty()) {
2763 help = description; 2731 help = description;
2764 description = L""; 2732 description.clear();
2765 string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION] = L""; 2733 string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION].clear();
2766 string_attributes_[AccessibilityNodeData::ATTR_HELP] = help; 2734 string_attributes_[AccessibilityNodeData::ATTR_HELP] = help;
2767 } 2735 }
2768 2736
2769 // Now implement the main logic: the descripion should become the name if 2737 // Now implement the main logic: the descripion should become the name if
2770 // it's nonempty, and the help should become the description if 2738 // it's nonempty, and the help should become the description if
2771 // there's no description - or the name if there's no name or description. 2739 // there's no description - or the name if there's no name or description.
2772 if (!description.empty()) { 2740 if (!description.empty()) {
2773 name_ = description; 2741 name_ = description;
2774 description = L""; 2742 description.clear();
2775 string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION] = description; 2743 string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION] = description;
2776 } 2744 }
2777 if (!help.empty() && description.empty()) { 2745 if (!help.empty() && description.empty()) {
2778 description = help; 2746 description = help;
2779 string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION] = help; 2747 string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION] = help;
2780 string_attributes_[AccessibilityNodeData::ATTR_HELP] = L""; 2748 string_attributes_[AccessibilityNodeData::ATTR_HELP].clear();
2781 } 2749 }
2782 if (!description.empty() && name_.empty() && !title_elem_id) { 2750 if (!description.empty() && name_.empty() && !title_elem_id) {
2783 name_ = description; 2751 name_ = description;
2784 description = L""; 2752 description.clear();
2785 string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION] = L""; 2753 string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION].clear();
2786 } 2754 }
2787 2755
2788 // If it's a text field, also consider the placeholder. 2756 // If it's a text field, also consider the placeholder.
2789 string16 placeholder; 2757 string16 placeholder;
2790 if (role_ == AccessibilityNodeData::ROLE_TEXT_FIELD && 2758 if (role_ == AccessibilityNodeData::ROLE_TEXT_FIELD &&
2791 HasState(AccessibilityNodeData::STATE_FOCUSABLE) && 2759 HasState(AccessibilityNodeData::STATE_FOCUSABLE) &&
2792 GetHtmlAttribute("placeholder", &placeholder)) { 2760 GetHtmlAttribute("placeholder", &placeholder)) {
2793 if (name_.empty() && !title_elem_id) { 2761 if (name_.empty() && !title_elem_id) {
2794 name_ = placeholder; 2762 name_ = placeholder;
2795 } else if (description.empty()) { 2763 } else if (description.empty()) {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
2874 if (!first_time_ && ia_state_ != old_ia_state_) { 2842 if (!first_time_ && ia_state_ != old_ia_state_) {
2875 // Normally focus events are handled elsewhere, however 2843 // Normally focus events are handled elsewhere, however
2876 // focus for managed descendants is platform-specific. 2844 // focus for managed descendants is platform-specific.
2877 // Fire a focus event if the focused descendant in a multi-select 2845 // Fire a focus event if the focused descendant in a multi-select
2878 // list box changes. 2846 // list box changes.
2879 if (role_ == AccessibilityNodeData::ROLE_LISTBOX_OPTION && 2847 if (role_ == AccessibilityNodeData::ROLE_LISTBOX_OPTION &&
2880 (ia_state_ & STATE_SYSTEM_FOCUSABLE) && 2848 (ia_state_ & STATE_SYSTEM_FOCUSABLE) &&
2881 (ia_state_ & STATE_SYSTEM_SELECTABLE) && 2849 (ia_state_ & STATE_SYSTEM_SELECTABLE) &&
2882 (ia_state_ & STATE_SYSTEM_FOCUSED) && 2850 (ia_state_ & STATE_SYSTEM_FOCUSED) &&
2883 !(old_ia_state_ & STATE_SYSTEM_FOCUSED)) { 2851 !(old_ia_state_ & STATE_SYSTEM_FOCUSED)) {
2884 ::NotifyWinEvent(EVENT_OBJECT_FOCUS, 2852 ::NotifyWinEvent(EVENT_OBJECT_FOCUS, manager_->GetParentView(),
2885 manager_->GetParentView(), 2853 OBJID_CLIENT, child_id());
2886 OBJID_CLIENT,
2887 child_id());
2888 } 2854 }
2889 2855
2890 if ((ia_state_ & STATE_SYSTEM_SELECTED) && 2856 if ((ia_state_ & STATE_SYSTEM_SELECTED) &&
2891 !(old_ia_state_ & STATE_SYSTEM_SELECTED)) { 2857 !(old_ia_state_ & STATE_SYSTEM_SELECTED)) {
2892 ::NotifyWinEvent(EVENT_OBJECT_SELECTIONADD, 2858 ::NotifyWinEvent(EVENT_OBJECT_SELECTIONADD, manager_->GetParentView(),
2893 manager_->GetParentView(), 2859 OBJID_CLIENT, child_id());
2894 OBJID_CLIENT,
2895 child_id());
2896 } else if (!(ia_state_ & STATE_SYSTEM_SELECTED) && 2860 } else if (!(ia_state_ & STATE_SYSTEM_SELECTED) &&
2897 (old_ia_state_ & STATE_SYSTEM_SELECTED)) { 2861 (old_ia_state_ & STATE_SYSTEM_SELECTED)) {
2898 ::NotifyWinEvent(EVENT_OBJECT_SELECTIONREMOVE, 2862 ::NotifyWinEvent(EVENT_OBJECT_SELECTIONREMOVE, manager_->GetParentView(),
2899 manager_->GetParentView(), 2863 OBJID_CLIENT, child_id());
2900 OBJID_CLIENT,
2901 child_id());
2902 } 2864 }
2903 2865
2904 old_ia_state_ = ia_state_; 2866 old_ia_state_ = ia_state_;
2905 } 2867 }
2906 2868
2907 first_time_ = false; 2869 first_time_ = false;
2908 } 2870 }
2909 2871
2910 void BrowserAccessibilityWin::NativeAddReference() { 2872 void BrowserAccessibilityWin::NativeAddReference() {
2911 AddRef(); 2873 AddRef();
(...skipping 21 matching lines...) Expand all
2933 if (child_id == CHILDID_SELF) 2895 if (child_id == CHILDID_SELF)
2934 return this; 2896 return this;
2935 2897
2936 if (child_id >= 1 && child_id <= static_cast<LONG>(children_.size())) 2898 if (child_id >= 1 && child_id <= static_cast<LONG>(children_.size()))
2937 return children_[child_id - 1]->ToBrowserAccessibilityWin(); 2899 return children_[child_id - 1]->ToBrowserAccessibilityWin();
2938 2900
2939 return manager_->GetFromChildID(child_id)->ToBrowserAccessibilityWin(); 2901 return manager_->GetFromChildID(child_id)->ToBrowserAccessibilityWin();
2940 } 2902 }
2941 2903
2942 HRESULT BrowserAccessibilityWin::GetStringAttributeAsBstr( 2904 HRESULT BrowserAccessibilityWin::GetStringAttributeAsBstr(
2943 AccessibilityNodeData::StringAttribute attribute, BSTR* value_bstr) { 2905 AccessibilityNodeData::StringAttribute attribute,
2906 BSTR* value_bstr) {
2944 string16 str; 2907 string16 str;
2945 2908
2946 if (!GetStringAttribute(attribute, &str)) 2909 if (!GetStringAttribute(attribute, &str))
2947 return S_FALSE; 2910 return S_FALSE;
2948 2911
2949 if (str.empty()) 2912 if (str.empty())
2950 return S_FALSE; 2913 return S_FALSE;
2951 2914
2952 *value_bstr = SysAllocString(str.c_str()); 2915 *value_bstr = SysAllocString(str.c_str());
2953 DCHECK(*value_bstr); 2916 DCHECK(*value_bstr);
2954 2917
2955 return S_OK; 2918 return S_OK;
2956 } 2919 }
2957 2920
2958 void BrowserAccessibilityWin::StringAttributeToIA2( 2921 void BrowserAccessibilityWin::StringAttributeToIA2(
2959 AccessibilityNodeData::StringAttribute attribute, const char* ia2_attr) { 2922 AccessibilityNodeData::StringAttribute attribute,
2923 const char* ia2_attr) {
2960 string16 value; 2924 string16 value;
2961 if (GetStringAttribute(attribute, &value)) 2925 if (GetStringAttribute(attribute, &value))
2962 ia2_attributes_.push_back(ASCIIToUTF16(ia2_attr) + L":" + value); 2926 ia2_attributes_.push_back(ASCIIToUTF16(ia2_attr) + L":" + value);
2963 } 2927 }
2964 2928
2965 void BrowserAccessibilityWin::BoolAttributeToIA2( 2929 void BrowserAccessibilityWin::BoolAttributeToIA2(
2966 AccessibilityNodeData::BoolAttribute attribute, const char* ia2_attr) { 2930 AccessibilityNodeData::BoolAttribute attribute,
2931 const char* ia2_attr) {
2967 bool value; 2932 bool value;
2968 if (GetBoolAttribute(attribute, &value)) { 2933 if (GetBoolAttribute(attribute, &value)) {
2969 ia2_attributes_.push_back((ASCIIToUTF16(ia2_attr) + L":") + 2934 ia2_attributes_.push_back((ASCIIToUTF16(ia2_attr) + L":") +
2970 (value ? L"true" : L"false")); 2935 (value ? L"true" : L"false"));
2971 } 2936 }
2972 } 2937 }
2973 2938
2974 void BrowserAccessibilityWin::IntAttributeToIA2( 2939 void BrowserAccessibilityWin::IntAttributeToIA2(
2975 AccessibilityNodeData::IntAttribute attribute, const char* ia2_attr) { 2940 AccessibilityNodeData::IntAttribute attribute,
2941 const char* ia2_attr) {
2976 int value; 2942 int value;
2977 if (GetIntAttribute(attribute, &value)) 2943 if (GetIntAttribute(attribute, &value))
2978 ia2_attributes_.push_back(ASCIIToUTF16(ia2_attr) + L":" + 2944 ia2_attributes_.push_back(ASCIIToUTF16(ia2_attr) + L":" +
2979 base::IntToString16(value)); 2945 base::IntToString16(value));
2980 } 2946 }
2981 2947
2982 const string16& BrowserAccessibilityWin::TextForIAccessibleText() { 2948 const string16& BrowserAccessibilityWin::TextForIAccessibleText() {
2983 if (IsEditableText()) { 2949 if (IsEditableText())
2984 return value_; 2950 return value_;
2985 } else if (role_ == AccessibilityNodeData::ROLE_STATIC_TEXT) { 2951 return (role_ == AccessibilityNodeData::ROLE_STATIC_TEXT) ?
2986 return name_; 2952 name_ : hypertext_;
2987 } else {
2988 return hypertext_;
2989 }
2990 } 2953 }
2991 2954
2992 void BrowserAccessibilityWin::HandleSpecialTextOffset( 2955 void BrowserAccessibilityWin::HandleSpecialTextOffset(const string16& text,
2993 const string16& text, LONG* offset) { 2956 LONG* offset) {
2994 if (*offset == IA2_TEXT_OFFSET_LENGTH) { 2957 if (*offset == IA2_TEXT_OFFSET_LENGTH)
2995 *offset = static_cast<LONG>(text.size()); 2958 *offset = static_cast<LONG>(text.size());
2996 } else if (*offset == IA2_TEXT_OFFSET_CARET) { 2959 else if (*offset == IA2_TEXT_OFFSET_CARET)
2997 get_caretOffset(offset); 2960 get_caretOffset(offset);
2998 }
2999 } 2961 }
3000 2962
3001 ui::TextBoundaryType BrowserAccessibilityWin::IA2TextBoundaryToTextBoundary( 2963 ui::TextBoundaryType BrowserAccessibilityWin::IA2TextBoundaryToTextBoundary(
3002 IA2TextBoundaryType ia2_boundary) { 2964 IA2TextBoundaryType ia2_boundary) {
3003 switch(ia2_boundary) { 2965 switch(ia2_boundary) {
3004 case IA2_TEXT_BOUNDARY_CHAR: return ui::CHAR_BOUNDARY; 2966 case IA2_TEXT_BOUNDARY_CHAR: return ui::CHAR_BOUNDARY;
3005 case IA2_TEXT_BOUNDARY_WORD: return ui::WORD_BOUNDARY; 2967 case IA2_TEXT_BOUNDARY_WORD: return ui::WORD_BOUNDARY;
3006 case IA2_TEXT_BOUNDARY_LINE: return ui::LINE_BOUNDARY; 2968 case IA2_TEXT_BOUNDARY_LINE: return ui::LINE_BOUNDARY;
3007 case IA2_TEXT_BOUNDARY_SENTENCE: return ui::SENTENCE_BOUNDARY; 2969 case IA2_TEXT_BOUNDARY_SENTENCE: return ui::SENTENCE_BOUNDARY;
3008 case IA2_TEXT_BOUNDARY_PARAGRAPH: return ui::PARAGRAPH_BOUNDARY; 2970 case IA2_TEXT_BOUNDARY_PARAGRAPH: return ui::PARAGRAPH_BOUNDARY;
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after
3511 // The role should always be set. 3473 // The role should always be set.
3512 DCHECK(!role_name_.empty() || ia_role_); 3474 DCHECK(!role_name_.empty() || ia_role_);
3513 3475
3514 // If we didn't explicitly set the IAccessible2 role, make it the same 3476 // If we didn't explicitly set the IAccessible2 role, make it the same
3515 // as the MSAA role. 3477 // as the MSAA role.
3516 if (!ia2_role_) 3478 if (!ia2_role_)
3517 ia2_role_ = ia_role_; 3479 ia2_role_ = ia_role_;
3518 } 3480 }
3519 3481
3520 } // namespace content 3482 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/accessibility/browser_accessibility_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698