Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012, Google Inc. All rights reserved. | 2 * Copyright (C) 2012, Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 533 if (type == InputTypeNames::time) | 533 if (type == InputTypeNames::time) |
| 534 return kInputTimeRole; | 534 return kInputTimeRole; |
| 535 return kTextFieldRole; | 535 return kTextFieldRole; |
| 536 } | 536 } |
| 537 | 537 |
| 538 if (isHTMLSelectElement(*GetNode())) { | 538 if (isHTMLSelectElement(*GetNode())) { |
| 539 HTMLSelectElement& select_element = toHTMLSelectElement(*GetNode()); | 539 HTMLSelectElement& select_element = toHTMLSelectElement(*GetNode()); |
| 540 return select_element.IsMultiple() ? kListBoxRole : kPopUpButtonRole; | 540 return select_element.IsMultiple() ? kListBoxRole : kPopUpButtonRole; |
| 541 } | 541 } |
| 542 | 542 |
| 543 if (isHTMLOptionElement(*GetNode())) { | |
| 544 HTMLSelectElement* select_element = | |
| 545 toHTMLOptionElement(GetNode())->OwnerSelectElement(); | |
| 546 return select_element->IsMultiple() ? kListBoxOptionRole | |
| 547 : kMenuListOptionRole; | |
| 548 } | |
| 549 | |
| 543 if (isHTMLTextAreaElement(*GetNode())) | 550 if (isHTMLTextAreaElement(*GetNode())) |
| 544 return kTextFieldRole; | 551 return kTextFieldRole; |
| 545 | 552 |
| 546 if (HeadingLevel()) | 553 if (HeadingLevel()) |
| 547 return kHeadingRole; | 554 return kHeadingRole; |
| 548 | 555 |
| 549 if (isHTMLDivElement(*GetNode())) | 556 if (isHTMLDivElement(*GetNode())) |
| 550 return kGenericContainerRole; | 557 return kGenericContainerRole; |
| 551 | 558 |
| 552 if (isHTMLMeterElement(*GetNode())) | 559 if (isHTMLMeterElement(*GetNode())) |
| (...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1282 if (!IsPresentational() && AriaRoleAttribute() != kUnknownRole && | 1289 if (!IsPresentational() && AriaRoleAttribute() != kUnknownRole && |
| 1283 AncestorExposesActiveDescendant()) | 1290 AncestorExposesActiveDescendant()) |
| 1284 return true; | 1291 return true; |
| 1285 | 1292 |
| 1286 // NOTE: It would be more accurate to ask the document whether | 1293 // NOTE: It would be more accurate to ask the document whether |
| 1287 // setFocusedNode() would do anything. For example, setFocusedNode() will do | 1294 // setFocusedNode() would do anything. For example, setFocusedNode() will do |
| 1288 // nothing if the current focused node will not relinquish the focus. | 1295 // nothing if the current focused node will not relinquish the focus. |
| 1289 if (IsDisabledFormControl(node)) | 1296 if (IsDisabledFormControl(node)) |
| 1290 return false; | 1297 return false; |
| 1291 | 1298 |
| 1299 // Check for options here because AXListBoxOption and AXMenuListOption | |
| 1300 // don't help when the <option> is canvas fallback, and because | |
| 1301 // a common case for aria-owns from a textbox that points to a list | |
| 1302 // does not change the hierarchy (textboxes don't suport children) | |
| 1303 if ((RoleValue() == kListBoxOptionRole || | |
| 1304 RoleValue() == kMenuListOptionRole) && | |
| 1305 IsEnabled()) | |
| 1306 return true; | |
| 1307 | |
| 1292 return node->IsElementNode() && ToElement(node)->SupportsFocus(); | 1308 return node->IsElementNode() && ToElement(node)->SupportsFocus(); |
| 1293 } | 1309 } |
| 1294 | 1310 |
| 1295 bool AXNodeObject::CanSetValueAttribute() const { | 1311 bool AXNodeObject::CanSetValueAttribute() const { |
| 1296 if (AOMPropertyOrARIAAttributeIsTrue(AOMBooleanProperty::kReadOnly)) | 1312 if (AOMPropertyOrARIAAttributeIsTrue(AOMBooleanProperty::kReadOnly)) |
| 1297 return false; | 1313 return false; |
| 1298 | 1314 |
| 1299 if (IsProgressIndicator() || IsSlider()) | 1315 if (IsProgressIndicator() || IsSlider()) |
| 1300 return true; | 1316 return true; |
| 1301 | 1317 |
| 1302 if (IsTextControl() && !IsNativeTextControl()) | 1318 if (IsTextControl() && !IsNativeTextControl()) |
| 1303 return true; | 1319 return true; |
| 1304 | 1320 |
| 1305 // Any node could be contenteditable, so isReadOnly should be relied upon | 1321 // Any node could be contenteditable, so isReadOnly should be relied upon |
| 1306 // for this information for all elements. | 1322 // for this information for all elements. |
| 1307 return !IsReadOnly(); | 1323 return !IsReadOnly(); |
| 1308 } | 1324 } |
| 1309 | 1325 |
| 1310 bool AXNodeObject::CanSetSelectedAttribute() const { | 1326 bool AXNodeObject::CanSetSelectedAttribute() const { |
| 1311 // ARIA list box options can be selected if they are children of an element | 1327 const AccessibilityRole role = AriaRoleAttribute(); |
| 1312 // with an aria-activedescendant attribute. | 1328 // These elements can be selected if not disabled (native or ARIA) |
| 1313 if (AriaRoleAttribute() == kListBoxOptionRole && | 1329 if ((role == kListBoxOptionRole || role == kMenuListOptionRole || |
| 1314 AncestorExposesActiveDescendant()) | 1330 role == kTreeItemRole || role == kCellRole || role == kTabRole) && |
|
David Tseng
2017/06/06 21:28:47
The spec includes the roles:
gridcell
option
row
| |
| 1331 IsEnabled() && CanSetFocusAttribute()) { | |
| 1315 return true; | 1332 return true; |
| 1333 } | |
| 1316 return AXObjectImpl::CanSetSelectedAttribute(); | 1334 return AXObjectImpl::CanSetSelectedAttribute(); |
| 1317 } | 1335 } |
| 1318 | 1336 |
| 1319 bool AXNodeObject::CanvasHasFallbackContent() const { | 1337 bool AXNodeObject::CanvasHasFallbackContent() const { |
| 1320 Node* node = this->GetNode(); | 1338 Node* node = this->GetNode(); |
| 1321 if (!isHTMLCanvasElement(node)) | 1339 if (!isHTMLCanvasElement(node)) |
| 1322 return false; | 1340 return false; |
| 1323 | 1341 |
| 1324 // If it has any children that are elements, we'll assume it might be fallback | 1342 // If it has any children that are elements, we'll assume it might be fallback |
| 1325 // content. If it has no children or its only children are not elements | 1343 // content. If it has no children or its only children are not elements |
| (...skipping 906 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2232 // If an element has an ARIA role of presentation, we need to consider the | 2250 // If an element has an ARIA role of presentation, we need to consider the |
| 2233 // native role when deciding whether it can have children or not - otherwise | 2251 // native role when deciding whether it can have children or not - otherwise |
| 2234 // giving something a role of presentation could expose inner implementation | 2252 // giving something a role of presentation could expose inner implementation |
| 2235 // details. | 2253 // details. |
| 2236 if (IsPresentational()) | 2254 if (IsPresentational()) |
| 2237 role = NativeAccessibilityRoleIgnoringAria(); | 2255 role = NativeAccessibilityRoleIgnoringAria(); |
| 2238 | 2256 |
| 2239 switch (role) { | 2257 switch (role) { |
| 2240 case kImageRole: | 2258 case kImageRole: |
| 2241 case kButtonRole: | 2259 case kButtonRole: |
| 2242 case kPopUpButtonRole: | |
| 2243 case kCheckBoxRole: | 2260 case kCheckBoxRole: |
| 2244 case kRadioButtonRole: | 2261 case kRadioButtonRole: |
| 2245 case kSwitchRole: | 2262 case kSwitchRole: |
| 2246 case kTabRole: | 2263 case kTabRole: |
| 2247 case kToggleButtonRole: | 2264 case kToggleButtonRole: |
| 2248 case kListBoxOptionRole: | 2265 case kListBoxOptionRole: |
| 2266 case kMenuButtonRole: | |
| 2267 case kMenuListOptionRole: | |
| 2249 case kScrollBarRole: | 2268 case kScrollBarRole: |
| 2250 return false; | 2269 return false; |
| 2270 case kPopUpButtonRole: | |
| 2271 return isHTMLSelectElement(GetNode()); | |
| 2251 case kStaticTextRole: | 2272 case kStaticTextRole: |
| 2252 if (!AxObjectCache().InlineTextBoxAccessibilityEnabled()) | 2273 if (!AxObjectCache().InlineTextBoxAccessibilityEnabled()) |
| 2253 return false; | 2274 return false; |
| 2254 default: | 2275 default: |
| 2255 return true; | 2276 return true; |
| 2256 } | 2277 } |
| 2257 } | 2278 } |
| 2258 | 2279 |
| 2259 Element* AXNodeObject::ActionElement() const { | 2280 Element* AXNodeObject::ActionElement() const { |
| 2260 Node* node = this->GetNode(); | 2281 Node* node = this->GetNode(); |
| (...skipping 968 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3229 return String(); | 3250 return String(); |
| 3230 return ToTextControlElement(node)->StrippedPlaceholder(); | 3251 return ToTextControlElement(node)->StrippedPlaceholder(); |
| 3231 } | 3252 } |
| 3232 | 3253 |
| 3233 DEFINE_TRACE(AXNodeObject) { | 3254 DEFINE_TRACE(AXNodeObject) { |
| 3234 visitor->Trace(node_); | 3255 visitor->Trace(node_); |
| 3235 AXObjectImpl::Trace(visitor); | 3256 AXObjectImpl::Trace(visitor); |
| 3236 } | 3257 } |
| 3237 | 3258 |
| 3238 } // namespace blink | 3259 } // namespace blink |
| OLD | NEW |