Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008, 2009, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2008, 2009, 2011 Apple 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 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 382 | 382 |
| 383 const AtomicString& AXObject::getAOMPropertyOrARIAAttribute( | 383 const AtomicString& AXObject::getAOMPropertyOrARIAAttribute( |
| 384 AOMStringProperty property) const { | 384 AOMStringProperty property) const { |
| 385 Node* node = this->getNode(); | 385 Node* node = this->getNode(); |
| 386 if (!node || !node->isElementNode()) | 386 if (!node || !node->isElementNode()) |
| 387 return nullAtom; | 387 return nullAtom; |
| 388 | 388 |
| 389 return AccessibleNode::getProperty(toElement(node), property); | 389 return AccessibleNode::getProperty(toElement(node), property); |
| 390 } | 390 } |
| 391 | 391 |
| 392 bool AXObject::getAOMPropertyOrARIAAttribute(AOMBooleanProperty property, | |
|
aboxhall
2017/04/07 05:22:35
Ok, now I see what you were talking about.
This i
dmazzoni
2017/04/21 07:11:37
Thanks for the discussion.
I went with this form:
| |
| 393 bool& result) const { | |
| 394 Node* node = this->getNode(); | |
|
aboxhall
2017/04/07 05:22:35
Would it help to make a convenience protected/priv
dmazzoni
2017/04/21 07:11:37
Good idea. Used it throughout the file.
| |
| 395 if (!node || !node->isElementNode()) | |
| 396 return false; | |
| 397 | |
| 398 bool isNull = true; | |
| 399 result = AccessibleNode::getProperty(toElement(node), property, isNull); | |
| 400 return !isNull; | |
| 401 } | |
| 402 | |
| 403 bool AXObject::hasAOMPropertyOrARIAAttribute( | |
| 404 AOMBooleanProperty property) const { | |
| 405 bool dummyResult; | |
| 406 return getAOMPropertyOrARIAAttribute(property, dummyResult); | |
| 407 } | |
| 408 | |
| 409 bool AXObject::AOMPropertyOrARIAAttributeIsTrue( | |
| 410 AOMBooleanProperty property) const { | |
| 411 bool result; | |
| 412 if (getAOMPropertyOrARIAAttribute(property, result)) | |
| 413 return result; | |
| 414 return false; | |
| 415 } | |
| 416 | |
| 417 bool AXObject::AOMPropertyOrARIAAttributeIsFalse( | |
| 418 AOMBooleanProperty property) const { | |
| 419 bool result; | |
| 420 if (getAOMPropertyOrARIAAttribute(property, result)) | |
| 421 return !result; | |
| 422 return false; | |
| 423 } | |
| 424 | |
| 392 bool AXObject::isARIATextControl() const { | 425 bool AXObject::isARIATextControl() const { |
| 393 return ariaRoleAttribute() == TextFieldRole || | 426 return ariaRoleAttribute() == TextFieldRole || |
| 394 ariaRoleAttribute() == SearchBoxRole || | 427 ariaRoleAttribute() == SearchBoxRole || |
| 395 ariaRoleAttribute() == ComboBoxRole; | 428 ariaRoleAttribute() == ComboBoxRole; |
| 396 } | 429 } |
| 397 | 430 |
| 398 bool AXObject::isButton() const { | 431 bool AXObject::isButton() const { |
| 399 AccessibilityRole role = roleValue(); | 432 AccessibilityRole role = roleValue(); |
| 400 | 433 |
| 401 return role == ButtonRole || role == PopUpButtonRole || | 434 return role == ButtonRole || role == PopUpButtonRole || |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 589 return parent; | 622 return parent; |
| 590 | 623 |
| 591 return parent->leafNodeAncestor(); | 624 return parent->leafNodeAncestor(); |
| 592 } | 625 } |
| 593 | 626 |
| 594 return 0; | 627 return 0; |
| 595 } | 628 } |
| 596 | 629 |
| 597 const AXObject* AXObject::ariaHiddenRoot() const { | 630 const AXObject* AXObject::ariaHiddenRoot() const { |
| 598 for (const AXObject* object = this; object; object = object->parentObject()) { | 631 for (const AXObject* object = this; object; object = object->parentObject()) { |
| 599 if (equalIgnoringASCIICase(object->getAttribute(aria_hiddenAttr), "true")) | 632 if (object->AOMPropertyOrARIAAttributeIsTrue(AOMBooleanProperty::kHidden)) |
| 600 return object; | 633 return object; |
| 601 } | 634 } |
| 602 | 635 |
| 603 return 0; | 636 return 0; |
| 604 } | 637 } |
| 605 | 638 |
| 606 bool AXObject::isDescendantOfDisabledNode() const { | 639 bool AXObject::isDescendantOfDisabledNode() const { |
| 607 updateCachedAttributeValuesIfNeeded(); | 640 updateCachedAttributeValuesIfNeeded(); |
| 608 return m_cachedIsDescendantOfDisabledNode; | 641 return m_cachedIsDescendantOfDisabledNode; |
| 609 } | 642 } |
| 610 | 643 |
| 611 const AXObject* AXObject::disabledAncestor() const { | 644 const AXObject* AXObject::disabledAncestor() const { |
| 612 const AtomicString& disabled = getAttribute(aria_disabledAttr); | 645 bool disabled = false; |
| 613 if (equalIgnoringASCIICase(disabled, "true")) | 646 if (getAOMPropertyOrARIAAttribute(AOMBooleanProperty::kDisabled, disabled)) { |
| 614 return this; | 647 if (disabled) |
| 615 if (equalIgnoringASCIICase(disabled, "false")) | 648 return this; |
| 616 return 0; | 649 return nullptr; |
| 650 } | |
| 617 | 651 |
| 618 if (AXObject* parent = parentObject()) | 652 if (AXObject* parent = parentObject()) |
| 619 return parent->disabledAncestor(); | 653 return parent->disabledAncestor(); |
| 620 | 654 |
| 621 return 0; | 655 return nullptr; |
| 622 } | 656 } |
| 623 | 657 |
| 624 bool AXObject::lastKnownIsIgnoredValue() { | 658 bool AXObject::lastKnownIsIgnoredValue() { |
| 625 if (m_lastKnownIsIgnoredValue == DefaultBehavior) | 659 if (m_lastKnownIsIgnoredValue == DefaultBehavior) |
| 626 m_lastKnownIsIgnoredValue = | 660 m_lastKnownIsIgnoredValue = |
| 627 accessibilityIsIgnored() ? IgnoreObject : IncludeObject; | 661 accessibilityIsIgnored() ? IgnoreObject : IncludeObject; |
| 628 | 662 |
| 629 return m_lastKnownIsIgnoredValue == IgnoreObject; | 663 return m_lastKnownIsIgnoredValue == IgnoreObject; |
| 630 } | 664 } |
| 631 | 665 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 716 AXObjectSet& visited) { | 750 AXObjectSet& visited) { |
| 717 if (visited.contains(&axObj) && !inAriaLabelledByTraversal) | 751 if (visited.contains(&axObj) && !inAriaLabelledByTraversal) |
| 718 return String(); | 752 return String(); |
| 719 | 753 |
| 720 AXNameFrom tmpNameFrom; | 754 AXNameFrom tmpNameFrom; |
| 721 return axObj.textAlternative(true, inAriaLabelledByTraversal, visited, | 755 return axObj.textAlternative(true, inAriaLabelledByTraversal, visited, |
| 722 tmpNameFrom, nullptr, nullptr); | 756 tmpNameFrom, nullptr, nullptr); |
| 723 } | 757 } |
| 724 | 758 |
| 725 bool AXObject::isHiddenForTextAlternativeCalculation() const { | 759 bool AXObject::isHiddenForTextAlternativeCalculation() const { |
| 726 if (equalIgnoringASCIICase(getAttribute(aria_hiddenAttr), "false")) | 760 if (AOMPropertyOrARIAAttributeIsFalse(AOMBooleanProperty::kHidden)) |
| 727 return false; | 761 return false; |
| 728 | 762 |
| 729 if (getLayoutObject()) | 763 if (getLayoutObject()) |
| 730 return getLayoutObject()->style()->visibility() != EVisibility::kVisible; | 764 return getLayoutObject()->style()->visibility() != EVisibility::kVisible; |
| 731 | 765 |
| 732 // This is an obscure corner case: if a node has no LayoutObject, that means | 766 // This is an obscure corner case: if a node has no LayoutObject, that means |
| 733 // it's not rendered, but we still may be exploring it as part of a text | 767 // it's not rendered, but we still may be exploring it as part of a text |
| 734 // alternative calculation, for example if it was explicitly referenced by | 768 // alternative calculation, for example if it was explicitly referenced by |
| 735 // aria-labelledby. So we need to explicitly call the style resolver to check | 769 // aria-labelledby. So we need to explicitly call the style resolver to check |
| 736 // whether it's invisible or display:none, rather than relying on the style | 770 // whether it's invisible or display:none, rather than relying on the style |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 975 | 1009 |
| 976 if (isHTMLTextAreaElement(*node)) | 1010 if (isHTMLTextAreaElement(*node)) |
| 977 return true; | 1011 return true; |
| 978 | 1012 |
| 979 if (hasEditableStyle(*node)) | 1013 if (hasEditableStyle(*node)) |
| 980 return true; | 1014 return true; |
| 981 | 1015 |
| 982 if (!isNativeTextControl() && !isNonNativeTextControl()) | 1016 if (!isNativeTextControl() && !isNonNativeTextControl()) |
| 983 return false; | 1017 return false; |
| 984 | 1018 |
| 985 return equalIgnoringASCIICase(getAttribute(aria_multilineAttr), "true"); | 1019 return AOMPropertyOrARIAAttributeIsTrue(AOMBooleanProperty::kMultiline); |
| 986 } | 1020 } |
| 987 | 1021 |
| 988 bool AXObject::ariaPressedIsPresent() const { | 1022 bool AXObject::ariaPressedIsPresent() const { |
| 989 return !getAttribute(aria_pressedAttr).isEmpty(); | 1023 return !getAttribute(aria_pressedAttr).isEmpty(); |
| 990 } | 1024 } |
| 991 | 1025 |
| 992 bool AXObject::supportsActiveDescendant() const { | 1026 bool AXObject::supportsActiveDescendant() const { |
| 993 // According to the ARIA Spec, all ARIA composite widgets, ARIA text boxes | 1027 // According to the ARIA Spec, all ARIA composite widgets, ARIA text boxes |
| 994 // and ARIA groups should be able to expose an active descendant. | 1028 // and ARIA groups should be able to expose an active descendant. |
| 995 // Implicitly, <input> and <textarea> elements should also have this ability. | 1029 // Implicitly, <input> and <textarea> elements should also have this ability. |
| (...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1787 } | 1821 } |
| 1788 | 1822 |
| 1789 DEFINE_TRACE(AXObject) { | 1823 DEFINE_TRACE(AXObject) { |
| 1790 visitor->trace(m_children); | 1824 visitor->trace(m_children); |
| 1791 visitor->trace(m_parent); | 1825 visitor->trace(m_parent); |
| 1792 visitor->trace(m_cachedLiveRegionRoot); | 1826 visitor->trace(m_cachedLiveRegionRoot); |
| 1793 visitor->trace(m_axObjectCache); | 1827 visitor->trace(m_axObjectCache); |
| 1794 } | 1828 } |
| 1795 | 1829 |
| 1796 } // namespace blink | 1830 } // namespace blink |
| OLD | NEW |