Changeset 208929 in webkit


Ignore:
Timestamp:
Nov 19, 2016 1:12:24 PM (7 years ago)
Author:
jdiggs@igalia.com
Message:

AX: [ATK] Implement selection interface and states for elements supporting aria-selected and for menu roles
https://bugs.webkit.org/show_bug.cgi?id=164865

Reviewed by Chris Fleizach.

Source/WebCore:

Implement AtkSelection and support ATK_STATE_SELECTABLE and ATK_STATE_SELECTED
for elements supporting aria-selected and for menu-related roles. Also enable the
equivalent support for the Mac because NSAccessibilitySelectedChildrenAttribute is
included as supported on the same roles.

In addition, fix several bugs discovered along the way: Call isSelected() on role
tab, because tab supports aria-selected; not aria-checked. Correct ATK mapping
of ListBoxRole and ListBoxOptionRole for combobox descendants. Always defer to
WebCore for inclusion/exclusion decisions related to elements with an explicit
ARIA role.

Tests: accessibility/aria-combobox-hierarchy.html

accessibility/aria-selected-menu-items.html
accessibility/aria-selected.html

  • accessibility/AccessibilityNodeObject.cpp:

(WebCore::AccessibilityNodeObject::selectedTabItem):
(WebCore::AccessibilityNodeObject::canSetSelectedAttribute):

  • accessibility/AccessibilityObject.cpp:

(WebCore::AccessibilityObject::isDescendantOfRole):

  • accessibility/AccessibilityObject.h:

(WebCore::AccessibilityObject::canHaveSelectedChildren):

  • accessibility/AccessibilityRenderObject.cpp:

(WebCore::AccessibilityRenderObject::isSelected):
(WebCore::AccessibilityRenderObject::canHaveSelectedChildren):
(WebCore::AccessibilityRenderObject::selectedChildren):

  • accessibility/AccessibilityRenderObject.h:
  • accessibility/atk/AccessibilityObjectAtk.cpp:

(WebCore::AccessibilityObject::accessibilityPlatformIncludesObject):

  • accessibility/atk/WebKitAccessibleInterfaceSelection.cpp:

(webkitAccessibleSelectionGetSelectionCount):

  • accessibility/atk/WebKitAccessibleWrapperAtk.cpp:

(atkRole):
(getInterfaceMaskFromObject):

  • accessibility/mac/WebAccessibilityObjectWrapperMac.mm:

(-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):

LayoutTests:

New tests for the added support. In addition, update the expectations for
aria-combobox.html to reflect the corrected ATK mapping of ListBoxRole for
combobox descendants.

  • accessibility/aria-combobox-expected.txt: Updated.
  • accessibility/aria-combobox-hierarchy.html: Added.
  • accessibility/aria-selected-menu-items.html: Added.
  • accessibility/aria-selected.html: Added.
  • platform/gtk/accessibility/aria-combobox-hierarchy-expected.txt: Added.
  • platform/gtk/accessibility/aria-selected-expected.txt: Added.
  • platform/gtk/accessibility/aria-selected-menu-items-expected.txt: Added.
  • platform/mac/accessibility/aria-combobox-hierarchy-expected.txt: Added.
  • platform/mac/accessibility/aria-selected-expected.txt: Added.
  • platform/mac/accessibility/aria-selected-menu-items-expected.txt: Added.
Location:
trunk
Files:
9 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r208926 r208929  
     12016-11-19  Joanmarie Diggs  <jdiggs@igalia.com>
     2
     3        AX: [ATK] Implement selection interface and states for elements supporting aria-selected and for menu roles
     4        https://bugs.webkit.org/show_bug.cgi?id=164865
     5
     6        Reviewed by Chris Fleizach.
     7
     8        New tests for the added support. In addition, update the expectations for
     9        aria-combobox.html to reflect the corrected ATK mapping of ListBoxRole for
     10        combobox descendants.
     11
     12        * accessibility/aria-combobox-expected.txt: Updated.
     13        * accessibility/aria-combobox-hierarchy.html: Added.
     14        * accessibility/aria-selected-menu-items.html: Added.
     15        * accessibility/aria-selected.html: Added.
     16        * platform/gtk/accessibility/aria-combobox-hierarchy-expected.txt: Added.
     17        * platform/gtk/accessibility/aria-selected-expected.txt: Added.
     18        * platform/gtk/accessibility/aria-selected-menu-items-expected.txt: Added.
     19        * platform/mac/accessibility/aria-combobox-hierarchy-expected.txt: Added.
     20        * platform/mac/accessibility/aria-selected-expected.txt: Added.
     21        * platform/mac/accessibility/aria-selected-menu-items-expected.txt: Added.
     22
    1232016-11-18  Simon Fraser  <simon.fraser@apple.com>
    224
  • trunk/LayoutTests/accessibility/aria-combobox-expected.txt

    r158810 r208929  
    99PASS combobox.isExpanded is false
    1010PASS combobox.isExpanded is false
    11 Role: AXRole: AXListItem
     11Role: AXRole: AXMenu
    1212PASS successfullyParsed is true
    1313
  • trunk/Source/WebCore/ChangeLog

    r208927 r208929  
     12016-11-19  Joanmarie Diggs  <jdiggs@igalia.com>
     2
     3        AX: [ATK] Implement selection interface and states for elements supporting aria-selected and for menu roles
     4        https://bugs.webkit.org/show_bug.cgi?id=164865
     5
     6        Reviewed by Chris Fleizach.
     7
     8        Implement AtkSelection and support ATK_STATE_SELECTABLE and ATK_STATE_SELECTED
     9        for elements supporting aria-selected and for menu-related roles. Also enable the
     10        equivalent support for the Mac because NSAccessibilitySelectedChildrenAttribute is
     11        included as supported on the same roles.
     12
     13        In addition, fix several bugs discovered along the way: Call isSelected() on role
     14        tab, because tab supports aria-selected; not aria-checked. Correct ATK mapping
     15        of ListBoxRole and ListBoxOptionRole for combobox descendants. Always defer to
     16        WebCore for inclusion/exclusion decisions related to elements with an explicit
     17        ARIA role.
     18
     19        Tests: accessibility/aria-combobox-hierarchy.html
     20               accessibility/aria-selected-menu-items.html
     21               accessibility/aria-selected.html
     22
     23        * accessibility/AccessibilityNodeObject.cpp:
     24        (WebCore::AccessibilityNodeObject::selectedTabItem):
     25        (WebCore::AccessibilityNodeObject::canSetSelectedAttribute):
     26        * accessibility/AccessibilityObject.cpp:
     27        (WebCore::AccessibilityObject::isDescendantOfRole):
     28        * accessibility/AccessibilityObject.h:
     29        (WebCore::AccessibilityObject::canHaveSelectedChildren):
     30        * accessibility/AccessibilityRenderObject.cpp:
     31        (WebCore::AccessibilityRenderObject::isSelected):
     32        (WebCore::AccessibilityRenderObject::canHaveSelectedChildren):
     33        (WebCore::AccessibilityRenderObject::selectedChildren):
     34        * accessibility/AccessibilityRenderObject.h:
     35        * accessibility/atk/AccessibilityObjectAtk.cpp:
     36        (WebCore::AccessibilityObject::accessibilityPlatformIncludesObject):
     37        * accessibility/atk/WebKitAccessibleInterfaceSelection.cpp:
     38        (webkitAccessibleSelectionGetSelectionCount):
     39        * accessibility/atk/WebKitAccessibleWrapperAtk.cpp:
     40        (atkRole):
     41        (getInterfaceMaskFromObject):
     42        * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
     43        (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
     44
    1452016-11-19  Simon Fraser  <simon.fraser@apple.com>
    246
  • trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp

    r208739 r208929  
    934934        return nullptr;
    935935
     936    // FIXME: Is this valid? ARIA tab items support aria-selected; not aria-checked.
    936937    // Find the child tab item that is selected (ie. the intValue == 1).
    937938    AccessibilityObject::AccessibilityChildrenVector tabs;
     
    939940
    940941    for (const auto& child : children()) {
    941         if (child->isTabItem() && child->isChecked())
     942        if (child->isTabItem() && (child->isChecked() || child->isSelected()))
    942943            return child.get();
    943944    }
     
    21772178    case TreeItemRole:
    21782179    case TreeRole:
     2180    case MenuItemCheckboxRole:
     2181    case MenuItemRadioRole:
     2182    case MenuItemRole:
    21792183        return isEnabled();
    21802184    default:
  • trunk/Source/WebCore/accessibility/AccessibilityObject.cpp

    r208839 r208929  
    510510
    511511    return accessibleObject;
     512}
     513
     514bool AccessibilityObject::isDescendantOfRole(AccessibilityRole role) const
     515{
     516    return AccessibilityObject::matchedParent(*this, false, [&role] (const AccessibilityObject& object) {
     517        return object.roleValue() == role;
     518    }) != nullptr;
    512519}
    513520
  • trunk/Source/WebCore/accessibility/AccessibilityObject.h

    r208924 r208929  
    687687    void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
    688688    virtual bool isDescendantOfBarrenParent() const { return false; }
     689
     690    bool isDescendantOfRole(AccessibilityRole) const;
    689691   
    690692    // Text selection
     
    819821    virtual bool isDetachedFromParent() { return false; }
    820822
     823    virtual bool canHaveSelectedChildren() const { return false; }
    821824    virtual void selectedChildren(AccessibilityChildrenVector&) { }
    822825    virtual void visibleChildren(AccessibilityChildrenVector&) { }
  • trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp

    r208924 r208929  
    16221622        return true;
    16231623
     1624    // Menu items are considered selectable by assistive technologies
     1625    if (isMenuItem())
     1626        return isFocused() || parentObjectUnignored()->activeDescendant() == this;
     1627
    16241628    return false;
    16251629}
     
    32753279    return elementAttributeValue(aria_busyAttr);   
    32763280}
     3281
     3282bool AccessibilityRenderObject::canHaveSelectedChildren() const
     3283{
     3284    switch (roleValue()) {
     3285    // These roles are containers whose children support aria-selected:
     3286    case GridRole:
     3287    case ListBoxRole:
     3288    case TabListRole:
     3289    case TreeRole:
     3290    case TreeGridRole:
     3291    // These roles are containers whose children are treated as selected by assistive
     3292    // technologies. We can get the "selected" item via aria-activedescendant or the
     3293    // focused element.
     3294    case MenuRole:
     3295    case MenuBarRole:
     3296        return true;
     3297    default:
     3298        return false;
     3299    }
     3300}
    32773301   
    32783302void AccessibilityRenderObject::ariaSelectedRows(AccessibilityChildrenVector& result)
     
    33283352    ASSERT(result.isEmpty());
    33293353
    3330     // only listboxes should be asked for their selected children.
    3331     AccessibilityRole role = roleValue();
    3332     if (role == ListBoxRole) // native list boxes would be AccessibilityListBoxes, so only check for aria list boxes
     3354    if (!canHaveSelectedChildren())
     3355        return;
     3356
     3357    switch (roleValue()) {
     3358    case ListBoxRole:
     3359        // native list boxes would be AccessibilityListBoxes, so only check for aria list boxes
    33333360        ariaListboxSelectedChildren(result);
    3334     else if (role == TreeRole || role == TreeGridRole || role == TableRole || role == GridRole)
     3361        return;
     3362    case GridRole:
     3363    case TreeRole:
    33353364        ariaSelectedRows(result);
     3365        return;
     3366    case TabListRole:
     3367        if (AccessibilityObject* selectedTab = selectedTabItem())
     3368            result.append(selectedTab);
     3369        return;
     3370    case MenuRole:
     3371    case MenuBarRole:
     3372        if (AccessibilityObject* descendant = activeDescendant()) {
     3373            result.append(descendant);
     3374            return;
     3375        }
     3376        if (AccessibilityObject* focusedElement = focusedUIElement()) {
     3377            result.append(focusedElement);
     3378            return;
     3379        }
     3380        return;
     3381    default:
     3382        ASSERT_NOT_REACHED();
     3383    }
    33363384}
    33373385
  • trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h

    r208924 r208929  
    153153    void addChildren() override;
    154154    bool canHaveChildren() const override;
     155    bool canHaveSelectedChildren() const override;
    155156    void selectedChildren(AccessibilityChildrenVector&) override;
    156157    void visibleChildren(AccessibilityChildrenVector&) override;
  • trunk/Source/WebCore/accessibility/atk/AccessibilityObjectAtk.cpp

    r200244 r208929  
    4646        return DefaultBehavior;
    4747
     48    // If the author has provided a role, platform-specific inclusion likely doesn't apply.
     49    if (ariaRoleAttribute() != UnknownRole)
     50        return DefaultBehavior;
     51
    4852    AccessibilityRole role = roleValue();
    4953    // We expose the slider as a whole but not its value indicator.
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceSelection.cpp

    r208442 r208929  
    176176        return 0;
    177177
    178     if (coreSelection->isListBox()) {
    179         AccessibilityObject::AccessibilityChildrenVector selectedItems;
    180         coreSelection->selectedChildren(selectedItems);
    181         return static_cast<gint>(selectedItems.size());
    182     }
    183 
    184178    if (coreSelection->isMenuList()) {
    185179        RenderObject* renderer = coreSelection->renderer();
     
    191185    }
    192186
    193     return 0;
     187    AccessibilityObject::AccessibilityChildrenVector selectedItems;
     188    coreSelection->selectedChildren(selectedItems);
     189    return static_cast<gint>(selectedItems.size());
    194190}
    195191
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp

    r208924 r208929  
    583583        return ATK_ROLE_HEADING;
    584584    case ListBoxRole:
    585         return ATK_ROLE_LIST_BOX;
     585        // https://rawgit.com/w3c/aria/master/core-aam/core-aam.html#role-map-listbox
     586        return coreObject->isDescendantOfRole(ComboBoxRole) ? ATK_ROLE_MENU : ATK_ROLE_LIST_BOX;
    586587    case ListItemRole:
    587588        return coreObject->inheritsPresentationalRole() ? ATK_ROLE_SECTION : ATK_ROLE_LIST_ITEM;
    588589    case ListBoxOptionRole:
    589         return ATK_ROLE_LIST_ITEM;
     590        return coreObject->isDescendantOfRole(ComboBoxRole) ? ATK_ROLE_MENU_ITEM : ATK_ROLE_LIST_ITEM;
    590591    case ParagraphRole:
    591592        return ATK_ROLE_PARAGRAPH;
     
    10861087
    10871088    // Selection
    1088     if (coreObject->isListBox() || coreObject->isMenuList())
     1089    if (coreObject->canHaveSelectedChildren() || coreObject->isMenuList())
    10891090        interfaceMask |= 1 << WAISelection;
    10901091
  • trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm

    r208924 r208929  
    27052705   
    27062706    if ([attributeName isEqualToString: NSAccessibilitySelectedChildrenAttribute]) {
    2707         if (m_object->isListBox()) {
     2707        if (m_object->canHaveSelectedChildren()) {
    27082708            AccessibilityObject::AccessibilityChildrenVector selectedChildrenCopy;
    27092709            m_object->selectedChildren(selectedChildrenCopy);
Note: See TracChangeset for help on using the changeset viewer.