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 578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
589 return parent; | 589 return parent; |
590 | 590 |
591 return parent->leafNodeAncestor(); | 591 return parent->leafNodeAncestor(); |
592 } | 592 } |
593 | 593 |
594 return 0; | 594 return 0; |
595 } | 595 } |
596 | 596 |
597 const AXObject* AXObject::ariaHiddenRoot() const { | 597 const AXObject* AXObject::ariaHiddenRoot() const { |
598 for (const AXObject* object = this; object; object = object->parentObject()) { | 598 for (const AXObject* object = this; object; object = object->parentObject()) { |
599 if (equalIgnoringCase(object->getAttribute(aria_hiddenAttr), "true")) | 599 if (equalIgnoringASCIICase(object->getAttribute(aria_hiddenAttr), "true")) |
600 return object; | 600 return object; |
601 } | 601 } |
602 | 602 |
603 return 0; | 603 return 0; |
604 } | 604 } |
605 | 605 |
606 bool AXObject::isDescendantOfDisabledNode() const { | 606 bool AXObject::isDescendantOfDisabledNode() const { |
607 updateCachedAttributeValuesIfNeeded(); | 607 updateCachedAttributeValuesIfNeeded(); |
608 return m_cachedIsDescendantOfDisabledNode; | 608 return m_cachedIsDescendantOfDisabledNode; |
609 } | 609 } |
610 | 610 |
611 const AXObject* AXObject::disabledAncestor() const { | 611 const AXObject* AXObject::disabledAncestor() const { |
612 const AtomicString& disabled = getAttribute(aria_disabledAttr); | 612 const AtomicString& disabled = getAttribute(aria_disabledAttr); |
613 if (equalIgnoringCase(disabled, "true")) | 613 if (equalIgnoringASCIICase(disabled, "true")) |
614 return this; | 614 return this; |
615 if (equalIgnoringCase(disabled, "false")) | 615 if (equalIgnoringASCIICase(disabled, "false")) |
616 return 0; | 616 return 0; |
617 | 617 |
618 if (AXObject* parent = parentObject()) | 618 if (AXObject* parent = parentObject()) |
619 return parent->disabledAncestor(); | 619 return parent->disabledAncestor(); |
620 | 620 |
621 return 0; | 621 return 0; |
622 } | 622 } |
623 | 623 |
624 bool AXObject::lastKnownIsIgnoredValue() { | 624 bool AXObject::lastKnownIsIgnoredValue() { |
625 if (m_lastKnownIsIgnoredValue == DefaultBehavior) | 625 if (m_lastKnownIsIgnoredValue == DefaultBehavior) |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 AXObjectSet& visited) { | 716 AXObjectSet& visited) { |
717 if (visited.contains(&axObj) && !inAriaLabelledByTraversal) | 717 if (visited.contains(&axObj) && !inAriaLabelledByTraversal) |
718 return String(); | 718 return String(); |
719 | 719 |
720 AXNameFrom tmpNameFrom; | 720 AXNameFrom tmpNameFrom; |
721 return axObj.textAlternative(true, inAriaLabelledByTraversal, visited, | 721 return axObj.textAlternative(true, inAriaLabelledByTraversal, visited, |
722 tmpNameFrom, nullptr, nullptr); | 722 tmpNameFrom, nullptr, nullptr); |
723 } | 723 } |
724 | 724 |
725 bool AXObject::isHiddenForTextAlternativeCalculation() const { | 725 bool AXObject::isHiddenForTextAlternativeCalculation() const { |
726 if (equalIgnoringCase(getAttribute(aria_hiddenAttr), "false")) | 726 if (equalIgnoringASCIICase(getAttribute(aria_hiddenAttr), "false")) |
727 return false; | 727 return false; |
728 | 728 |
729 if (getLayoutObject()) | 729 if (getLayoutObject()) |
730 return getLayoutObject()->style()->visibility() != EVisibility::kVisible; | 730 return getLayoutObject()->style()->visibility() != EVisibility::kVisible; |
731 | 731 |
732 // This is an obscure corner case: if a node has no LayoutObject, that means | 732 // 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 | 733 // 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 | 734 // alternative calculation, for example if it was explicitly referenced by |
735 // aria-labelledby. So we need to explicitly call the style resolver to check | 735 // 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 | 736 // whether it's invisible or display:none, rather than relying on the style |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
948 case PopUpButtonRole: | 948 case PopUpButtonRole: |
949 return AXSupportedAction::Open; | 949 return AXSupportedAction::Open; |
950 default: | 950 default: |
951 return AXSupportedAction::Click; | 951 return AXSupportedAction::Click; |
952 } | 952 } |
953 } | 953 } |
954 | 954 |
955 AccessibilityButtonState AXObject::checkboxOrRadioValue() const { | 955 AccessibilityButtonState AXObject::checkboxOrRadioValue() const { |
956 const AtomicString& checkedAttribute = | 956 const AtomicString& checkedAttribute = |
957 getAOMPropertyOrARIAAttribute(AOMStringProperty::kChecked); | 957 getAOMPropertyOrARIAAttribute(AOMStringProperty::kChecked); |
958 if (equalIgnoringCase(checkedAttribute, "true")) | 958 if (equalIgnoringASCIICase(checkedAttribute, "true")) |
959 return ButtonStateOn; | 959 return ButtonStateOn; |
960 | 960 |
961 if (equalIgnoringCase(checkedAttribute, "mixed")) { | 961 if (equalIgnoringASCIICase(checkedAttribute, "mixed")) { |
962 // Only checkboxes should support the mixed state. | 962 // Only checkboxes should support the mixed state. |
963 AccessibilityRole role = ariaRoleAttribute(); | 963 AccessibilityRole role = ariaRoleAttribute(); |
964 if (role == CheckBoxRole || role == MenuItemCheckBoxRole) | 964 if (role == CheckBoxRole || role == MenuItemCheckBoxRole) |
965 return ButtonStateMixed; | 965 return ButtonStateMixed; |
966 } | 966 } |
967 | 967 |
968 return ButtonStateOff; | 968 return ButtonStateOff; |
969 } | 969 } |
970 | 970 |
971 bool AXObject::isMultiline() const { | 971 bool AXObject::isMultiline() const { |
972 Node* node = this->getNode(); | 972 Node* node = this->getNode(); |
973 if (!node) | 973 if (!node) |
974 return false; | 974 return false; |
975 | 975 |
976 if (isHTMLTextAreaElement(*node)) | 976 if (isHTMLTextAreaElement(*node)) |
977 return true; | 977 return true; |
978 | 978 |
979 if (hasEditableStyle(*node)) | 979 if (hasEditableStyle(*node)) |
980 return true; | 980 return true; |
981 | 981 |
982 if (!isNativeTextControl() && !isNonNativeTextControl()) | 982 if (!isNativeTextControl() && !isNonNativeTextControl()) |
983 return false; | 983 return false; |
984 | 984 |
985 return equalIgnoringCase(getAttribute(aria_multilineAttr), "true"); | 985 return equalIgnoringASCIICase(getAttribute(aria_multilineAttr), "true"); |
986 } | 986 } |
987 | 987 |
988 bool AXObject::ariaPressedIsPresent() const { | 988 bool AXObject::ariaPressedIsPresent() const { |
989 return !getAttribute(aria_pressedAttr).isEmpty(); | 989 return !getAttribute(aria_pressedAttr).isEmpty(); |
990 } | 990 } |
991 | 991 |
992 bool AXObject::supportsActiveDescendant() const { | 992 bool AXObject::supportsActiveDescendant() const { |
993 // According to the ARIA Spec, all ARIA composite widgets, ARIA text boxes | 993 // According to the ARIA Spec, all ARIA composite widgets, ARIA text boxes |
994 // and ARIA groups should be able to expose an active descendant. | 994 // and ARIA groups should be able to expose an active descendant. |
995 // Implicitly, <input> and <textarea> elements should also have this ability. | 995 // Implicitly, <input> and <textarea> elements should also have this ability. |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1056 for (int index = 0; index < childCount; ++index) { | 1056 for (int index = 0; index < childCount; ++index) { |
1057 if (siblings[index].get() == this) { | 1057 if (siblings[index].get() == this) { |
1058 return index; | 1058 return index; |
1059 } | 1059 } |
1060 } | 1060 } |
1061 return 0; | 1061 return 0; |
1062 } | 1062 } |
1063 | 1063 |
1064 bool AXObject::isLiveRegion() const { | 1064 bool AXObject::isLiveRegion() const { |
1065 const AtomicString& liveRegion = liveRegionStatus(); | 1065 const AtomicString& liveRegion = liveRegionStatus(); |
1066 return equalIgnoringCase(liveRegion, "polite") || | 1066 return equalIgnoringASCIICase(liveRegion, "polite") || |
1067 equalIgnoringCase(liveRegion, "assertive"); | 1067 equalIgnoringASCIICase(liveRegion, "assertive"); |
1068 } | 1068 } |
1069 | 1069 |
1070 AXObject* AXObject::liveRegionRoot() const { | 1070 AXObject* AXObject::liveRegionRoot() const { |
1071 updateCachedAttributeValuesIfNeeded(); | 1071 updateCachedAttributeValuesIfNeeded(); |
1072 return m_cachedLiveRegionRoot; | 1072 return m_cachedLiveRegionRoot; |
1073 } | 1073 } |
1074 | 1074 |
1075 const AtomicString& AXObject::containerLiveRegionStatus() const { | 1075 const AtomicString& AXObject::containerLiveRegionStatus() const { |
1076 updateCachedAttributeValuesIfNeeded(); | 1076 updateCachedAttributeValuesIfNeeded(); |
1077 return m_cachedLiveRegionRoot ? m_cachedLiveRegionRoot->liveRegionStatus() | 1077 return m_cachedLiveRegionRoot ? m_cachedLiveRegionRoot->liveRegionStatus() |
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1787 } | 1787 } |
1788 | 1788 |
1789 DEFINE_TRACE(AXObject) { | 1789 DEFINE_TRACE(AXObject) { |
1790 visitor->trace(m_children); | 1790 visitor->trace(m_children); |
1791 visitor->trace(m_parent); | 1791 visitor->trace(m_parent); |
1792 visitor->trace(m_cachedLiveRegionRoot); | 1792 visitor->trace(m_cachedLiveRegionRoot); |
1793 visitor->trace(m_axObjectCache); | 1793 visitor->trace(m_axObjectCache); |
1794 } | 1794 } |
1795 | 1795 |
1796 } // namespace blink | 1796 } // namespace blink |
OLD | NEW |