OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <atlbase.h> | 5 #include <atlbase.h> |
6 #include <atlcom.h> | 6 #include <atlcom.h> |
7 #include <limits.h> | 7 #include <limits.h> |
8 #include <oleacc.h> | 8 #include <oleacc.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 1097 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1108 if (state & (1 << ui::AX_STATE_COLLAPSED)) | 1108 if (state & (1 << ui::AX_STATE_COLLAPSED)) |
1109 msaa_state |= STATE_SYSTEM_COLLAPSED; | 1109 msaa_state |= STATE_SYSTEM_COLLAPSED; |
1110 if (state & (1 << ui::AX_STATE_DEFAULT)) | 1110 if (state & (1 << ui::AX_STATE_DEFAULT)) |
1111 msaa_state |= STATE_SYSTEM_DEFAULT; | 1111 msaa_state |= STATE_SYSTEM_DEFAULT; |
1112 if (state & (1 << ui::AX_STATE_EXPANDED)) | 1112 if (state & (1 << ui::AX_STATE_EXPANDED)) |
1113 msaa_state |= STATE_SYSTEM_EXPANDED; | 1113 msaa_state |= STATE_SYSTEM_EXPANDED; |
1114 if (state & (1 << ui::AX_STATE_FOCUSABLE)) | 1114 if (state & (1 << ui::AX_STATE_FOCUSABLE)) |
1115 msaa_state |= STATE_SYSTEM_FOCUSABLE; | 1115 msaa_state |= STATE_SYSTEM_FOCUSABLE; |
1116 if (state & (1 << ui::AX_STATE_HASPOPUP)) | 1116 if (state & (1 << ui::AX_STATE_HASPOPUP)) |
1117 msaa_state |= STATE_SYSTEM_HASPOPUP; | 1117 msaa_state |= STATE_SYSTEM_HASPOPUP; |
1118 if (state & (1 << ui::AX_STATE_HOVERED)) | 1118 |
1119 msaa_state |= STATE_SYSTEM_HOTTRACKED; | |
1120 if (state & (1 << ui::AX_STATE_INVISIBLE) || | 1119 if (state & (1 << ui::AX_STATE_INVISIBLE) || |
1121 GetData().role == ui::AX_ROLE_IGNORED) { | 1120 GetData().role == ui::AX_ROLE_IGNORED) { |
1122 msaa_state |= STATE_SYSTEM_INVISIBLE; | 1121 msaa_state |= STATE_SYSTEM_INVISIBLE; |
1123 } | 1122 } |
1124 if (state & (1 << ui::AX_STATE_LINKED)) | 1123 if (state & (1 << ui::AX_STATE_LINKED)) |
1125 msaa_state |= STATE_SYSTEM_LINKED; | 1124 msaa_state |= STATE_SYSTEM_LINKED; |
1126 if (state & (1 << ui::AX_STATE_OFFSCREEN)) | 1125 if (state & (1 << ui::AX_STATE_OFFSCREEN)) |
1127 msaa_state |= STATE_SYSTEM_OFFSCREEN; | 1126 msaa_state |= STATE_SYSTEM_OFFSCREEN; |
1128 if (state & (1 << ui::AX_STATE_PRESSED)) | 1127 if (state & (1 << ui::AX_STATE_PRESSED)) |
1129 msaa_state |= STATE_SYSTEM_PRESSED; | 1128 msaa_state |= STATE_SYSTEM_PRESSED; |
1130 if (state & (1 << ui::AX_STATE_PROTECTED)) | 1129 if (state & (1 << ui::AX_STATE_PROTECTED)) |
1131 msaa_state |= STATE_SYSTEM_PROTECTED; | 1130 msaa_state |= STATE_SYSTEM_PROTECTED; |
1132 if (state & (1 << ui::AX_STATE_READ_ONLY)) | 1131 if (state & (1 << ui::AX_STATE_READ_ONLY)) |
1133 msaa_state |= STATE_SYSTEM_READONLY; | 1132 msaa_state |= STATE_SYSTEM_READONLY; |
1134 if (state & (1 << ui::AX_STATE_SELECTABLE)) | 1133 if (state & (1 << ui::AX_STATE_SELECTABLE)) |
1135 msaa_state |= STATE_SYSTEM_SELECTABLE; | 1134 msaa_state |= STATE_SYSTEM_SELECTABLE; |
1136 if (state & (1 << ui::AX_STATE_SELECTED)) | 1135 if (state & (1 << ui::AX_STATE_SELECTED)) |
1137 msaa_state |= STATE_SYSTEM_SELECTED; | 1136 msaa_state |= STATE_SYSTEM_SELECTED; |
1138 if (state & (1 << ui::AX_STATE_DISABLED)) | 1137 if (state & (1 << ui::AX_STATE_DISABLED)) |
1139 msaa_state |= STATE_SYSTEM_UNAVAILABLE; | 1138 msaa_state |= STATE_SYSTEM_UNAVAILABLE; |
| 1139 if (state & (1 << ui::AX_STATE_BUSY)) |
| 1140 msaa_state |= STATE_SYSTEM_BUSY; |
| 1141 if (state & (1 << ui::AX_STATE_VISITED)) |
| 1142 msaa_state |= STATE_SYSTEM_TRAVERSED; |
| 1143 |
| 1144 if (state & (1 << ui::AX_STATE_MULTISELECTABLE)) { |
| 1145 msaa_state |= STATE_SYSTEM_EXTSELECTABLE; |
| 1146 msaa_state |= STATE_SYSTEM_MULTISELECTABLE; |
| 1147 } |
| 1148 |
| 1149 // Expose whether or not the mouse is over an element, but suppress |
| 1150 // this for tests because it can make the test results flaky depending |
| 1151 // on the position of the mouse. |
| 1152 if (!delegate_->IsHotTrackingOn()) { |
| 1153 if (state & (1 << ui::AX_STATE_HOVERED)) |
| 1154 msaa_state |= STATE_SYSTEM_HOTTRACKED; |
| 1155 } |
1140 | 1156 |
1141 // Checked state | 1157 // Checked state |
1142 const auto checked_state = static_cast<ui::AXCheckedState>( | 1158 const auto checked_state = static_cast<ui::AXCheckedState>( |
1143 GetIntAttribute(ui::AX_ATTR_CHECKED_STATE)); | 1159 GetIntAttribute(ui::AX_ATTR_CHECKED_STATE)); |
1144 switch (checked_state) { | 1160 switch (checked_state) { |
1145 case ui::AX_CHECKED_STATE_TRUE: | 1161 case ui::AX_CHECKED_STATE_TRUE: |
1146 msaa_state |= STATE_SYSTEM_CHECKED; | 1162 msaa_state |= STATE_SYSTEM_CHECKED; |
1147 break; | 1163 break; |
1148 case ui::AX_CHECKED_STATE_MIXED: | 1164 case ui::AX_CHECKED_STATE_MIXED: |
1149 msaa_state |= STATE_SYSTEM_MIXED; | 1165 msaa_state |= STATE_SYSTEM_MIXED; |
(...skipping 10 matching lines...) Expand all Loading... |
1160 // menu bars, when visible. | 1176 // menu bars, when visible. |
1161 // | 1177 // |
1162 // TODO(dmazzoni): this should probably check if focus is actually inside | 1178 // TODO(dmazzoni): this should probably check if focus is actually inside |
1163 // the menu bar, but we don't currently track focus inside menu pop-ups, | 1179 // the menu bar, but we don't currently track focus inside menu pop-ups, |
1164 // and Chrome only has one menu visible at a time so this works for now. | 1180 // and Chrome only has one menu visible at a time so this works for now. |
1165 if (data.role == ui::AX_ROLE_MENU_BAR && | 1181 if (data.role == ui::AX_ROLE_MENU_BAR && |
1166 !(state & (1 << ui::AX_STATE_INVISIBLE))) { | 1182 !(state & (1 << ui::AX_STATE_INVISIBLE))) { |
1167 msaa_state |= STATE_SYSTEM_FOCUSED; | 1183 msaa_state |= STATE_SYSTEM_FOCUSED; |
1168 } | 1184 } |
1169 | 1185 |
| 1186 switch (GetData().role) { |
| 1187 case ui::AX_ROLE_ARTICLE: |
| 1188 case ui::AX_ROLE_BUSY_INDICATOR: |
| 1189 case ui::AX_ROLE_DEFINITION: |
| 1190 case ui::AX_ROLE_DESCRIPTION_LIST: |
| 1191 case ui::AX_ROLE_DESCRIPTION_LIST_TERM: |
| 1192 case ui::AX_ROLE_IFRAME: |
| 1193 case ui::AX_ROLE_IMAGE: |
| 1194 case ui::AX_ROLE_IMAGE_MAP: |
| 1195 case ui::AX_ROLE_LIST: |
| 1196 case ui::AX_ROLE_LIST_ITEM: |
| 1197 case ui::AX_ROLE_PROGRESS_INDICATOR: |
| 1198 case ui::AX_ROLE_RULER: |
| 1199 case ui::AX_ROLE_SCROLL_AREA: |
| 1200 case ui::AX_ROLE_TABLE_HEADER_CONTAINER: |
| 1201 case ui::AX_ROLE_TERM: |
| 1202 case ui::AX_ROLE_TIMER: |
| 1203 case ui::AX_ROLE_TOOLBAR: |
| 1204 case ui::AX_ROLE_TOOLTIP: |
| 1205 msaa_state |= STATE_SYSTEM_READONLY; |
| 1206 break; |
| 1207 |
| 1208 case ui::AX_ROLE_DOCUMENT: |
| 1209 case ui::AX_ROLE_ROOT_WEB_AREA: |
| 1210 case ui::AX_ROLE_WEB_AREA: |
| 1211 msaa_state |= STATE_SYSTEM_READONLY; |
| 1212 msaa_state |= STATE_SYSTEM_FOCUSABLE; |
| 1213 break; |
| 1214 |
| 1215 case ui::AX_ROLE_GRID: |
| 1216 // TODO(aleventhal) this changed between ARIA 1.0 and 1.1, |
| 1217 // need to determine whether grids/treegrids should really be readonly |
| 1218 // or editable by default |
| 1219 // msaa_state |= STATE_SYSTEM_READONLY; |
| 1220 break; |
| 1221 |
| 1222 case ui::AX_ROLE_IMAGE_MAP_LINK: |
| 1223 msaa_state |= STATE_SYSTEM_LINKED; |
| 1224 msaa_state |= STATE_SYSTEM_READONLY; |
| 1225 break; |
| 1226 |
| 1227 case ui::AX_ROLE_LINK: |
| 1228 msaa_state |= STATE_SYSTEM_LINKED; |
| 1229 break; |
| 1230 |
| 1231 case ui::AX_ROLE_LIST_BOX_OPTION: |
| 1232 if (msaa_state & STATE_SYSTEM_SELECTABLE) { |
| 1233 msaa_state |= STATE_SYSTEM_FOCUSABLE; |
| 1234 } |
| 1235 break; |
| 1236 |
| 1237 case ui::AX_ROLE_MENU_LIST_OPTION: |
| 1238 if (msaa_state & STATE_SYSTEM_SELECTABLE) { |
| 1239 msaa_state |= STATE_SYSTEM_FOCUSABLE; |
| 1240 } |
| 1241 break; |
| 1242 |
| 1243 case ui::AX_ROLE_TEXT_FIELD: |
| 1244 case ui::AX_ROLE_SEARCH_BOX: |
| 1245 if (state & (1 << ui::AX_STATE_READ_ONLY)) |
| 1246 msaa_state |= STATE_SYSTEM_READONLY; |
| 1247 break; |
| 1248 default: |
| 1249 break; |
| 1250 } |
| 1251 |
| 1252 // Compute the final value of READONLY for MSAA. |
| 1253 // |
| 1254 // We always set the READONLY state for elements that have the |
| 1255 // aria-readonly attribute and for a few roles (in the switch above), |
| 1256 // including read-only text fields. |
| 1257 // The majority of focusable controls should not have the read-only state set. |
| 1258 if (state & (1 << ui::AX_STATE_FOCUSABLE) && |
| 1259 GetData().role != ROLE_SYSTEM_DOCUMENT && |
| 1260 GetData().role != ROLE_SYSTEM_TEXT) { |
| 1261 msaa_state &= ~(STATE_SYSTEM_READONLY); |
| 1262 } |
| 1263 if (!(state & (1 << ui::AX_STATE_READ_ONLY))) |
| 1264 msaa_state &= ~(STATE_SYSTEM_READONLY); |
| 1265 |
| 1266 if (GetData().GetBoolAttribute(ui::AX_ATTR_ARIA_READONLY)) |
| 1267 msaa_state |= STATE_SYSTEM_READONLY; |
| 1268 |
1170 return msaa_state; | 1269 return msaa_state; |
1171 } | 1270 } |
1172 | 1271 |
1173 int AXPlatformNodeWin::MSAAEvent(ui::AXEvent event) { | 1272 int AXPlatformNodeWin::MSAAEvent(ui::AXEvent event) { |
1174 switch (event) { | 1273 switch (event) { |
1175 case ui::AX_EVENT_ALERT: | 1274 case ui::AX_EVENT_ALERT: |
1176 return EVENT_SYSTEM_ALERT; | 1275 return EVENT_SYSTEM_ALERT; |
1177 case ui::AX_EVENT_FOCUS: | 1276 case ui::AX_EVENT_FOCUS: |
1178 return EVENT_OBJECT_FOCUS; | 1277 return EVENT_OBJECT_FOCUS; |
1179 case ui::AX_EVENT_MENU_START: | 1278 case ui::AX_EVENT_MENU_START: |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1293 | 1392 |
1294 AXPlatformNodeBase* base = | 1393 AXPlatformNodeBase* base = |
1295 FromNativeViewAccessible(node->GetNativeViewAccessible()); | 1394 FromNativeViewAccessible(node->GetNativeViewAccessible()); |
1296 if (base && !IsDescendant(base)) | 1395 if (base && !IsDescendant(base)) |
1297 base = nullptr; | 1396 base = nullptr; |
1298 | 1397 |
1299 return static_cast<AXPlatformNodeWin*>(base); | 1398 return static_cast<AXPlatformNodeWin*>(base); |
1300 } | 1399 } |
1301 | 1400 |
1302 } // namespace ui | 1401 } // namespace ui |
OLD | NEW |