Changeset 272390 in webkit


Ignore:
Timestamp:
Feb 4, 2021 2:33:13 PM (18 months ago)
Author:
Chris Fleizach
Message:

AX: expose focusable elements even if element or ancestor has aria-hidden=true
https://bugs.webkit.org/show_bug.cgi?id=220534
<rdar://problem/71865875>

Reviewed by Zalan Bujtas.

Source/WebCore:

ARIA states that if an item is focused, then it should override aria-hidden status.
https://github.com/w3c/aria/pull/1387/files

Test: accessibility/focusable-inside-hidden.html

  • accessibility/AXObjectCache.cpp:

(WebCore::isNodeAriaVisible):

  • accessibility/AccessibilityObject.cpp:

(WebCore::AccessibilityObject::isAXHidden const):
(WebCore::AccessibilityObject::setIsIgnoredFromParentDataForChild):

LayoutTests:

  • accessibility/focusable-inside-hidden-expected.txt: Added.
  • accessibility/focusable-inside-hidden.html: Added.
Location:
trunk
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r272379 r272390  
     12021-02-04  Chris Fleizach  <cfleizach@apple.com>
     2
     3        AX: expose focusable elements even if element or ancestor has aria-hidden=true
     4        https://bugs.webkit.org/show_bug.cgi?id=220534
     5        <rdar://problem/71865875>
     6
     7        Reviewed by Zalan Bujtas.
     8
     9        * accessibility/focusable-inside-hidden-expected.txt: Added.
     10        * accessibility/focusable-inside-hidden.html: Added.
     11
    1122021-02-04  Myles C. Maxfield  <mmaxfield@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r272379 r272390  
     12021-02-04  Chris Fleizach  <cfleizach@apple.com>
     2
     3        AX: expose focusable elements even if element or ancestor has aria-hidden=true
     4        https://bugs.webkit.org/show_bug.cgi?id=220534
     5        <rdar://problem/71865875>
     6
     7        Reviewed by Zalan Bujtas.
     8
     9        ARIA states that if an item is focused, then it should override aria-hidden status.
     10        https://github.com/w3c/aria/pull/1387/files
     11
     12        Test: accessibility/focusable-inside-hidden.html
     13
     14        * accessibility/AXObjectCache.cpp:
     15        (WebCore::isNodeAriaVisible):
     16        * accessibility/AccessibilityObject.cpp:
     17        (WebCore::AccessibilityObject::isAXHidden const):
     18        (WebCore::AccessibilityObject::setIsIgnoredFromParentDataForChild):
     19
    1202021-02-04  Myles C. Maxfield  <mmaxfield@apple.com>
    221
  • trunk/Source/WebCore/accessibility/AXObjectCache.cpp

    r272067 r272390  
    18281828}
    18291829
     1830void AXObjectCache::recomputeIsIgnored(Node* node)
     1831{
     1832    if (AccessibilityObject* obj = get(node))
     1833        obj->notifyIfIgnoredValueChanged();
     1834}
     1835
    18301836void AXObjectCache::startCachingComputedObjectAttributesUntilTreeMutates()
    18311837{
     
    31523158    m_deferredAttributeChange.clear();
    31533159   
    3154     for (auto& deferredFocusedChangeContext : m_deferredFocusedNodeChange)
     3160    for (auto& deferredFocusedChangeContext : m_deferredFocusedNodeChange) {
    31553161        handleFocusedUIElementChanged(deferredFocusedChangeContext.first, deferredFocusedChangeContext.second);
     3162        // Recompute isIgnored after a focus change in case that altered visibility.
     3163        recomputeIsIgnored(deferredFocusedChangeContext.first);
     3164        recomputeIsIgnored(deferredFocusedChangeContext.second);
     3165    }
    31563166    m_deferredFocusedNodeChange.clear();
    31573167
     
    33503360        return false;
    33513361
     3362    // If an element is focused, it should not be hidden.
     3363    if (is<Element>(*node) && downcast<Element>(*node).focused())
     3364        return true;
     3365
    33523366    // ARIA Node visibility is controlled by aria-hidden
    33533367    //  1) if aria-hidden=true, the whole subtree is hidden
  • trunk/Source/WebCore/accessibility/AXObjectCache.h

    r272067 r272390  
    194194
    195195    void deferAttributeChangeIfNeeded(const QualifiedName&, Element*);
    196     void recomputeIsIgnored(RenderObject* renderer);
     196    void recomputeIsIgnored(RenderObject*);
     197    void recomputeIsIgnored(Node*);
    197198
    198199#if ENABLE(ACCESSIBILITY)
  • trunk/Source/WebCore/accessibility/AccessibilityObject.cpp

    r271415 r272390  
    31983198bool AccessibilityObject::isAXHidden() const
    31993199{
     3200    if (isFocused())
     3201        return false;
     3202   
    32003203    return Accessibility::findAncestor<AccessibilityObject>(*this, true, [] (const AccessibilityObject& object) {
    3201         return equalLettersIgnoringASCIICase(object.getAttribute(aria_hiddenAttr), "true");
     3204        return equalLettersIgnoringASCIICase(object.getAttribute(aria_hiddenAttr), "true") && !object.isFocused();
    32023205    }) != nullptr;
    32033206}
     
    35683571    AccessibilityIsIgnoredFromParentData result = AccessibilityIsIgnoredFromParentData(this);
    35693572    if (!m_isIgnoredFromParentData.isNull()) {
    3570         result.isAXHidden = m_isIgnoredFromParentData.isAXHidden || equalLettersIgnoringASCIICase(child->getAttribute(aria_hiddenAttr), "true");
     3573        result.isAXHidden = (m_isIgnoredFromParentData.isAXHidden || equalLettersIgnoringASCIICase(child->getAttribute(aria_hiddenAttr), "true")) && !child->isFocused();
    35713574        result.isPresentationalChildOfAriaRole = m_isIgnoredFromParentData.isPresentationalChildOfAriaRole || ariaRoleHasPresentationalChildren();
    35723575        result.isDescendantOfBarrenParent = m_isIgnoredFromParentData.isDescendantOfBarrenParent || !canHaveChildren();
Note: See TracChangeset for help on using the changeset viewer.