Title: [207314] trunk
Revision
207314
Author
[email protected]
Date
2016-10-13 15:52:17 -0700 (Thu, 13 Oct 2016)

Log Message

AX: [Mac] better accessibility support for Summary elements
https://bugs.webkit.org/show_bug.cgi?id=163367
<rdar://problem/28745010>

Reviewed by Chris Fleizach.

Source/WebCore:

Exposed summary elements as AXButton and used the text node's content
as AXTitle. Also exposed the details parent's expanded status on the summary
element, so that users would see it as a collapsed/expanded button.

Changes are covered in the modified tests.

* accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::parentObjectUnignored):
(WebCore::AccessibilityObject::scrollViewAncestor):
(WebCore::AccessibilityObject::headingElementForNode):
(WebCore::AccessibilityObject::matchedParent):
(WebCore::AccessibilityObject::isDescendantOfObject):
(WebCore::AccessibilityObject::isInsideARIALiveRegion):
(WebCore::AccessibilityObject::elementAccessibilityHitTest):
(WebCore::AccessibilityObject::isExpanded):
(WebCore::AccessibilityObject::isARIAHidden):
(WebCore::AccessibilityObject::focusableAncestor):
(WebCore::AccessibilityObject::editableAncestor):
* accessibility/AccessibilityObject.h:
(WebCore::AccessibilityObject::isSummary):
* accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
(-[WebAccessibilityObjectWrapper _accessibilityListAncestor]):
(-[WebAccessibilityObjectWrapper _accessibilityLandmarkAncestor]):
(-[WebAccessibilityObjectWrapper _accessibilityTableAncestor]):
(-[WebAccessibilityObjectWrapper _accessibilityFieldsetAncestor]):
(-[WebAccessibilityObjectWrapper tableCellParent]):
(-[WebAccessibilityObjectWrapper tableParent]):
(-[WebAccessibilityObjectWrapper convertPointToScreenSpace:]):
(-[WebAccessibilityObjectWrapper convertRectToScreenSpace:]):
(-[WebAccessibilityObjectWrapper detailParentForSummaryObject:]):
(-[WebAccessibilityObjectWrapper detailParentForObject:]):
(matchedParent): Deleted.
* accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(-[WebAccessibilityObjectWrapper additionalAccessibilityAttributeNames]):
(createAccessibilityRoleMap):
(-[WebAccessibilityObjectWrapper roleDescription]):
(-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):

LayoutTests:

* accessibility/mac/details-summary-expected.txt:
* accessibility/mac/details-summary-role-description-expected.txt:
* accessibility/mac/details-summary-role-description.html:
* accessibility/mac/details-summary.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (207313 => 207314)


--- trunk/LayoutTests/ChangeLog	2016-10-13 22:25:00 UTC (rev 207313)
+++ trunk/LayoutTests/ChangeLog	2016-10-13 22:52:17 UTC (rev 207314)
@@ -1,3 +1,16 @@
+2016-10-13  Nan Wang  <[email protected]>
+
+        AX: [Mac] better accessibility support for Summary elements
+        https://bugs.webkit.org/show_bug.cgi?id=163367
+        <rdar://problem/28745010>
+
+        Reviewed by Chris Fleizach.
+
+        * accessibility/mac/details-summary-expected.txt:
+        * accessibility/mac/details-summary-role-description-expected.txt:
+        * accessibility/mac/details-summary-role-description.html:
+        * accessibility/mac/details-summary.html:
+
 2016-10-13  Ryan Haddad  <[email protected]>
 
         Marking inspector/debugger/breakpoints/resolved-dump-each-line.html as flaky on mac.

Modified: trunk/LayoutTests/accessibility/mac/details-summary-expected.txt (207313 => 207314)


--- trunk/LayoutTests/accessibility/mac/details-summary-expected.txt	2016-10-13 22:25:00 UTC (rev 207313)
+++ trunk/LayoutTests/accessibility/mac/details-summary-expected.txt	2016-10-13 22:52:17 UTC (rev 207314)
@@ -10,13 +10,18 @@
 PASS details1.role is 'AXRole: AXGroup'
 PASS details1.subrole is 'AXSubrole: AXDetails'
 PASS details1.isExpanded is true
-PASS details1.childAtIndex(0).role is 'AXRole: AXGroup'
-PASS details1.childAtIndex(0).subrole is 'AXSubrole: AXSummary'
+PASS summary1.role is 'AXRole: AXButton'
+PASS summary1.subrole is 'AXSubrole: AXSummary'
+PASS summary1.title is 'AXTitle: Some open info'
 PASS details1.isAttributeSettable('AXExpanded') is true
 PASS details1.isExpanded is false
+PASS summary1.isExpanded is false
 PASS details1.isExpanded is false
+PASS summary1.isExpanded is false
 PASS details1.isExpanded is true
+PASS summary1.isExpanded is true
 PASS details1.isExpanded is true
+PASS summary1.isExpanded is true
 PASS details2.subrole is 'AXSubrole: AXDetails'
 PASS details2.isExpanded is false
 Received AXExpandedChanged notification 

Modified: trunk/LayoutTests/accessibility/mac/details-summary-role-description-expected.txt (207313 => 207314)


--- trunk/LayoutTests/accessibility/mac/details-summary-role-description-expected.txt	2016-10-13 22:25:00 UTC (rev 207313)
+++ trunk/LayoutTests/accessibility/mac/details-summary-role-description-expected.txt	2016-10-13 22:52:17 UTC (rev 207314)
@@ -6,7 +6,7 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS summary.role is 'AXRole: AXGroup'
+PASS summary.role is 'AXRole: AXButton'
 PASS details.role is 'AXRole: AXGroup'
 PASS summary.subrole is 'AXSubrole: AXSummary'
 PASS details.subrole is 'AXSubrole: AXDetails'

Modified: trunk/LayoutTests/accessibility/mac/details-summary-role-description.html (207313 => 207314)


--- trunk/LayoutTests/accessibility/mac/details-summary-role-description.html	2016-10-13 22:25:00 UTC (rev 207313)
+++ trunk/LayoutTests/accessibility/mac/details-summary-role-description.html	2016-10-13 22:52:17 UTC (rev 207314)
@@ -19,7 +19,7 @@
           var summary = accessibilityController.accessibleElementById("summary");
           var details = accessibilityController.accessibleElementById("details");
          
-          shouldBe("summary.role", "'AXRole: AXGroup'");
+          shouldBe("summary.role", "'AXRole: AXButton'");
           shouldBe("details.role", "'AXRole: AXGroup'");
           shouldBe("summary.subrole", "'AXSubrole: AXSummary'");
           shouldBe("details.subrole", "'AXSubrole: AXDetails'");

Modified: trunk/LayoutTests/accessibility/mac/details-summary.html (207313 => 207314)


--- trunk/LayoutTests/accessibility/mac/details-summary.html	2016-10-13 22:25:00 UTC (rev 207313)
+++ trunk/LayoutTests/accessibility/mac/details-summary.html	2016-10-13 22:52:17 UTC (rev 207314)
@@ -6,7 +6,7 @@
 <body id="body">
 
 <details open id="details1">
-  <summary>Some open info</summary>
+  <summary id="summary1">Some open info</summary>
   <p>Details about the open topic.</p>
 </details>
 
@@ -39,32 +39,42 @@
         });
 
         var details1 = accessibilityController.accessibleElementById("details1");
+        var summary1 = accessibilityController.accessibleElementById("summary1");
         shouldBe("details1.role", "'AXRole: AXGroup'");
         shouldBe("details1.subrole", "'AXSubrole: AXDetails'");
         shouldBeTrue("details1.isExpanded");
-        shouldBe("details1.childAtIndex(0).role", "'AXRole: AXGroup'");
-        shouldBe("details1.childAtIndex(0).subrole", "'AXSubrole: AXSummary'");
+        shouldBe("summary1.role", "'AXRole: AXButton'");
+        shouldBe("summary1.subrole", "'AXSubrole: AXSummary'");
+        shouldBe("summary1.title", "'AXTitle: Some open info'");
         shouldBeTrue("details1.isAttributeSettable('AXExpanded')");
 
         // Toggle the expanded state.
         details1.setBoolAttributeValue("AXExpanded", false);
         details1 = accessibilityController.accessibleElementById("details1");
+        summary1 = accessibilityController.accessibleElementById("summary1");
         shouldBeFalse("details1.isExpanded");
+        shouldBeFalse("summary1.isExpanded");
 
         // Give it the same value to make sure we don't expand.
         details1.setBoolAttributeValue("AXExpanded", false);
         details1 = accessibilityController.accessibleElementById("details1");
+        summary1 = accessibilityController.accessibleElementById("summary1");
         shouldBeFalse("details1.isExpanded");
+        shouldBeFalse("summary1.isExpanded");
 
         // Set to expand again.
         details1.setBoolAttributeValue("AXExpanded", true);
         details1 = accessibilityController.accessibleElementById("details1");
+        summary1 = accessibilityController.accessibleElementById("summary1");
         shouldBeTrue("details1.isExpanded");
+        shouldBeTrue("summary1.isExpanded");
 
         // And duplicate the true state to make sure it doesn't toggle off.
         details1.setBoolAttributeValue("AXExpanded", true);
         details1 = accessibilityController.accessibleElementById("details1");
+        summary1 = accessibilityController.accessibleElementById("summary1");
         shouldBeTrue("details1.isExpanded");
+        shouldBeTrue("summary1.isExpanded");
 
         var details2 = accessibilityController.accessibleElementById("details2");
         shouldBe("details2.subrole", "'AXSubrole: AXDetails'");

Modified: trunk/Source/WebCore/ChangeLog (207313 => 207314)


--- trunk/Source/WebCore/ChangeLog	2016-10-13 22:25:00 UTC (rev 207313)
+++ trunk/Source/WebCore/ChangeLog	2016-10-13 22:52:17 UTC (rev 207314)
@@ -1,3 +1,49 @@
+2016-10-13  Nan Wang  <[email protected]>
+
+        AX: [Mac] better accessibility support for Summary elements
+        https://bugs.webkit.org/show_bug.cgi?id=163367
+        <rdar://problem/28745010>
+
+        Reviewed by Chris Fleizach.
+
+        Exposed summary elements as AXButton and used the text node's content
+        as AXTitle. Also exposed the details parent's expanded status on the summary
+        element, so that users would see it as a collapsed/expanded button.
+
+        Changes are covered in the modified tests.
+
+        * accessibility/AccessibilityObject.cpp:
+        (WebCore::AccessibilityObject::parentObjectUnignored):
+        (WebCore::AccessibilityObject::scrollViewAncestor):
+        (WebCore::AccessibilityObject::headingElementForNode):
+        (WebCore::AccessibilityObject::matchedParent):
+        (WebCore::AccessibilityObject::isDescendantOfObject):
+        (WebCore::AccessibilityObject::isInsideARIALiveRegion):
+        (WebCore::AccessibilityObject::elementAccessibilityHitTest):
+        (WebCore::AccessibilityObject::isExpanded):
+        (WebCore::AccessibilityObject::isARIAHidden):
+        (WebCore::AccessibilityObject::focusableAncestor):
+        (WebCore::AccessibilityObject::editableAncestor):
+        * accessibility/AccessibilityObject.h:
+        (WebCore::AccessibilityObject::isSummary):
+        * accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
+        (-[WebAccessibilityObjectWrapper _accessibilityListAncestor]):
+        (-[WebAccessibilityObjectWrapper _accessibilityLandmarkAncestor]):
+        (-[WebAccessibilityObjectWrapper _accessibilityTableAncestor]):
+        (-[WebAccessibilityObjectWrapper _accessibilityFieldsetAncestor]):
+        (-[WebAccessibilityObjectWrapper tableCellParent]):
+        (-[WebAccessibilityObjectWrapper tableParent]):
+        (-[WebAccessibilityObjectWrapper convertPointToScreenSpace:]):
+        (-[WebAccessibilityObjectWrapper convertRectToScreenSpace:]):
+        (-[WebAccessibilityObjectWrapper detailParentForSummaryObject:]):
+        (-[WebAccessibilityObjectWrapper detailParentForObject:]):
+        (matchedParent): Deleted.
+        * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
+        (-[WebAccessibilityObjectWrapper additionalAccessibilityAttributeNames]):
+        (createAccessibilityRoleMap):
+        (-[WebAccessibilityObjectWrapper roleDescription]):
+        (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
+
 2016-10-13  Zalan Bujtas  <[email protected]>
 
         [Clean RenderTree] LayoutTests/imported/blink/fast/table/crash-bad-child-table-continuation.html fails.

Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.cpp (207313 => 207314)


--- trunk/Source/WebCore/accessibility/AccessibilityObject.cpp	2016-10-13 22:25:00 UTC (rev 207313)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.cpp	2016-10-13 22:52:17 UTC (rev 207314)
@@ -457,11 +457,9 @@
 
 AccessibilityObject* AccessibilityObject::parentObjectUnignored() const
 {
-    AccessibilityObject* parent;
-    for (parent = parentObject(); parent && parent->accessibilityIsIgnored(); parent = parent->parentObject()) {
-    }
-    
-    return parent;
+    return const_cast<AccessibilityObject*>(AccessibilityObject::matchedParent(*this, false, [] (const AccessibilityObject& object) {
+        return !object.accessibilityIsIgnored();
+    }));
 }
 
 AccessibilityObject* AccessibilityObject::previousSiblingUnignored(int limit) const
@@ -1696,10 +1694,10 @@
     
 ScrollView* AccessibilityObject::scrollViewAncestor() const
 {
-    for (const AccessibilityObject* scrollParent = this; scrollParent; scrollParent = scrollParent->parentObject()) {
-        if (is<AccessibilityScrollView>(*scrollParent))
-            return downcast<AccessibilityScrollView>(*scrollParent).scrollView();
-    }
+    if (const AccessibilityObject* scrollParent = AccessibilityObject::matchedParent(*this, true, [] (const AccessibilityObject& object) {
+        return is<AccessibilityScrollView>(object);
+    }))
+        return downcast<AccessibilityScrollView>(*scrollParent).scrollView();
     
     return nullptr;
 }
@@ -1790,11 +1788,22 @@
         return nullptr;
     
     AccessibilityObject* axObject = renderObject->document().axObjectCache()->getOrCreate(renderObject);
-    for (; axObject && axObject->roleValue() != HeadingRole; axObject = axObject->parentObject()) { }
     
-    return axObject;
+    return const_cast<AccessibilityObject*>(AccessibilityObject::matchedParent(*axObject, true, [] (const AccessibilityObject& object) {
+        return object.roleValue() == HeadingRole;
+    }));
 }
 
+const AccessibilityObject* AccessibilityObject::matchedParent(const AccessibilityObject& object, bool includeSelf, const std::function<bool(const AccessibilityObject&)>& matches)
+{
+    const AccessibilityObject* parent = includeSelf ? &object : object.parentObject();
+    for (; parent; parent = parent->parentObject()) {
+        if (matches(*parent))
+            return parent;
+    }
+    return nullptr;
+}
+
 void AccessibilityObject::ariaTreeRows(AccessibilityChildrenVector& result)
 {
     for (const auto& child : children()) {
@@ -2034,12 +2043,10 @@
 {
     if (!axObject || !axObject->hasChildren())
         return false;
-
-    for (const AccessibilityObject* parent = parentObject(); parent; parent = parent->parentObject()) {
-        if (parent == axObject)
-            return true;
-    }
-    return false;
+    
+    return AccessibilityObject::matchedParent(*this, false, [axObject] (const AccessibilityObject& object) {
+        return &object == axObject;
+    }) != nullptr;
 }
 
 bool AccessibilityObject::isAncestorOfObject(const AccessibilityObject* axObject) const
@@ -2307,12 +2314,9 @@
     if (supportsARIALiveRegion())
         return true;
     
-    for (AccessibilityObject* axParent = parentObject(); axParent; axParent = axParent->parentObject()) {
-        if (axParent->supportsARIALiveRegion())
-            return true;
-    }
-    
-    return false;
+    return AccessibilityObject::matchedParent(*this, false, [] (const AccessibilityObject& object) {
+        return object.supportsARIALiveRegion();
+    }) != nullptr;
 }
 
 bool AccessibilityObject::supportsARIAAttributes() const
@@ -2364,7 +2368,7 @@
             return child->elementAccessibilityHitTest(point);
     }
 
-    return const_cast<AccessibilityObject*>(this); 
+    return const_cast<AccessibilityObject*>(this);
 }
     
 AXObjectCache* AccessibilityObject::axObjectCache() const
@@ -2478,6 +2482,14 @@
     if (is<HTMLDetailsElement>(node()))
         return downcast<HTMLDetailsElement>(node())->isOpen();
     
+    // Summary element should use its details parent's expanded status.
+    if (isSummary()) {
+        if (const AccessibilityObject* parent = AccessibilityObject::matchedParent(*this, false, [] (const AccessibilityObject& object) {
+            return object.roleValue() == DetailsRole;
+        }))
+            return parent->isExpanded();
+    }
+    
     return false;  
 }
 
@@ -2934,11 +2946,9 @@
 // http://www.w3.org/TR/wai-aria/terms#def_hidden
 bool AccessibilityObject::isARIAHidden() const
 {
-    for (const AccessibilityObject* object = this; object; object = object->parentObject()) {
-        if (equalLettersIgnoringASCIICase(object->getAttribute(aria_hiddenAttr), "true"))
-            return true;
-    }
-    return false;
+    return AccessibilityObject::matchedParent(*this, true, [] (const AccessibilityObject& object) {
+        return equalLettersIgnoringASCIICase(object.getAttribute(aria_hiddenAttr), "true");
+    }) != nullptr;
 }
 
 // DOM component of hidden definition.
@@ -3035,26 +3045,16 @@
 
 AccessibilityObject* AccessibilityObject::focusableAncestor()
 {
-    AccessibilityObject* potentialFocusableAncestor = this;
-    while (potentialFocusableAncestor) {
-        if (potentialFocusableAncestor->canSetFocusAttribute())
-            return potentialFocusableAncestor;
-        potentialFocusableAncestor = potentialFocusableAncestor->parentObject();
-    }
-
-    return nullptr;
+    return const_cast<AccessibilityObject*>(AccessibilityObject::matchedParent(*this, true, [] (const AccessibilityObject& object) {
+        return object.canSetFocusAttribute();
+    }));
 }
 
 AccessibilityObject* AccessibilityObject::editableAncestor()
 {
-    AccessibilityObject* potentialEditableAncestor = this;
-    while (potentialEditableAncestor) {
-        if (potentialEditableAncestor->isTextControl())
-            return potentialEditableAncestor;
-        potentialEditableAncestor = potentialEditableAncestor->parentObject();
-    }
-
-    return nullptr;
+    return const_cast<AccessibilityObject*>(AccessibilityObject::matchedParent(*this, true, [] (const AccessibilityObject& object) {
+        return object.isTextControl();
+    }));
 }
 
 AccessibilityObject* AccessibilityObject::highestEditableAncestor()

Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.h (207313 => 207314)


--- trunk/Source/WebCore/accessibility/AccessibilityObject.h	2016-10-13 22:25:00 UTC (rev 207313)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.h	2016-10-13 22:52:17 UTC (rev 207314)
@@ -561,6 +561,7 @@
     bool isSubscriptStyleGroup() const;
     bool isSuperscriptStyleGroup() const;
     bool isFigure() const;
+    bool isSummary() const { return roleValue() == SummaryRole; }
     
     virtual bool isChecked() const { return false; }
     virtual bool isEnabled() const { return false; }
@@ -1062,6 +1063,8 @@
     AccessibilityObject* editableAncestor();
     AccessibilityObject* highestEditableAncestor();
     
+    static const AccessibilityObject* matchedParent(const AccessibilityObject&, bool includeSelf, const std::function<bool(const AccessibilityObject&)>&);
+    
 protected:
     AXID m_id;
     AccessibilityChildrenVector m_children;

Modified: trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm (207313 => 207314)


--- trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm	2016-10-13 22:25:00 UTC (rev 207313)
+++ trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm	2016-10-13 22:52:17 UTC (rev 207314)
@@ -131,22 +131,6 @@
     return wrapper;
 }
 
-template<typename MatchFunction>
-static AccessibilityObject* matchedParent(AccessibilityObject* object, bool includeSelf, const MatchFunction& matches)
-{
-    if (!object)
-        return nullptr;
-
-    AccessibilityObject* parent = includeSelf ? object : object->parentObject();
-    for (; parent; parent = parent->parentObject()) {
-        if (matches(parent))
-            return parent;
-    }
-    
-    return nullptr;
-}
-
-
 #pragma mark Accessibility Text Marker
 
 @interface WebAccessibilityTextMarker : NSObject
@@ -549,12 +533,12 @@
 
 - (AccessibilityObjectWrapper*)_accessibilityListAncestor
 {
-    auto matchFunc = [] (AccessibilityObject* object) {
-        AccessibilityRole role = object->roleValue();
+    auto matchFunc = [] (const AccessibilityObject& object) {
+        AccessibilityRole role = object.roleValue();
         return role == ListRole || role == ListBoxRole;
     };
     
-    if (AccessibilityObject* parent = matchedParent(m_object, false, matchFunc))
+    if (const AccessibilityObject* parent = AccessibilityObject::matchedParent(*m_object, false, matchFunc))
         return parent->wrapper();
     return nil;
 }
@@ -561,11 +545,9 @@
 
 - (AccessibilityObjectWrapper*)_accessibilityLandmarkAncestor
 {
-    auto matchFunc = [self] (AccessibilityObject* object) {
-        return [self _accessibilityIsLandmarkRole:object->roleValue()];
-    };
-    
-    if (AccessibilityObject* parent = matchedParent(m_object, false, matchFunc))
+    if (const AccessibilityObject* parent = AccessibilityObject::matchedParent(*m_object, false, [self] (const AccessibilityObject& object) {
+        return [self _accessibilityIsLandmarkRole:object.roleValue()];
+    }))
         return parent->wrapper();
     return nil;
 }
@@ -572,11 +554,10 @@
 
 - (AccessibilityObjectWrapper*)_accessibilityTableAncestor
 {
-    auto matchFunc = [] (AccessibilityObject* object) {
-        return object->roleValue() == TableRole || object->roleValue() == GridRole;
-    };
     
-    if (AccessibilityObject* parent = matchedParent(m_object, false, matchFunc))
+    if (const AccessibilityObject* parent = AccessibilityObject::matchedParent(*m_object, false, [] (const AccessibilityObject& object) {
+        return object.roleValue() == TableRole || object.roleValue() == GridRole;
+    }))
         return parent->wrapper();
     return nil;
 }
@@ -583,11 +564,9 @@
 
 - (AccessibilityObjectWrapper*)_accessibilityFieldsetAncestor
 {
-    auto matchFunc = [] (AccessibilityObject* object) {
-        return object->isFieldset();
-    };
-    
-    if (AccessibilityObject* parent = matchedParent(m_object, false, matchFunc))
+    if (const AccessibilityObject* parent = AccessibilityObject::matchedParent(*m_object, false, [] (const AccessibilityObject& object) {
+        return object.isFieldset();
+    }))
         return parent->wrapper();
     return nil;
 }
@@ -1041,11 +1020,9 @@
 - (AccessibilityTableCell*)tableCellParent
 {
     // Find if this element is in a table cell.
-    auto matchFunc = [] (AccessibilityObject* object) {
-        return object->isTableCell();
-    };
-    
-    if (AccessibilityObject* parent = matchedParent(m_object, true, matchFunc))
+    if (AccessibilityObject* parent = const_cast<AccessibilityObject*>(AccessibilityObject::matchedParent(*m_object, true, [] (const AccessibilityObject& object) {
+        return object.isTableCell();
+    })))
         return static_cast<AccessibilityTableCell*>(parent);
     return nil;
 }
@@ -1053,11 +1030,9 @@
 - (AccessibilityTable*)tableParent
 {
     // Find if the parent table for the table cell.
-    auto matchFunc = [] (AccessibilityObject* object) {
-        return is<AccessibilityTable>(*object) && downcast<AccessibilityTable>(*object).isExposableThroughAccessibility();
-    };
-    
-    if (AccessibilityObject* parent = matchedParent(m_object, true, matchFunc))
+    if (AccessibilityObject* parent = const_cast<AccessibilityObject*>(AccessibilityObject::matchedParent(*m_object, true, [] (const AccessibilityObject& object) {
+        return is<AccessibilityTable>(object) && downcast<AccessibilityTable>(object).isExposableThroughAccessibility();
+    })))
         return static_cast<AccessibilityTable*>(parent);
     return nil;
 }
@@ -1426,12 +1401,10 @@
     }
     else {
         // Find the appropriate scroll view to use to convert the contents to the window.
-        auto matchFunc = [] (AccessibilityObject* object) {
-            return is<AccessibilityScrollView>(*object);
-        };
-        
         ScrollView* scrollView = nullptr;
-        AccessibilityObject* parent = matchedParent(m_object, false, matchFunc);
+        const AccessibilityObject* parent = AccessibilityObject::matchedParent(*m_object, false, [] (const AccessibilityObject& object) {
+            return is<AccessibilityScrollView>(object);
+        });
         if (parent)
             scrollView = downcast<AccessibilityScrollView>(*parent).scrollView();
         
@@ -1480,12 +1453,10 @@
         
     } else {
         // Find the appropriate scroll view to use to convert the contents to the window.
-        auto matchFunc = [] (AccessibilityObject* object) {
-            return is<AccessibilityScrollView>(*object);
-        };
-
         ScrollView* scrollView = nullptr;
-        AccessibilityObject* parent = matchedParent(m_object, false, matchFunc);
+        const AccessibilityObject* parent = AccessibilityObject::matchedParent(*m_object, false, [] (const AccessibilityObject& object) {
+            return is<AccessibilityScrollView>(object);
+        });
         if (parent)
             scrollView = downcast<AccessibilityScrollView>(*parent).scrollView();
         
@@ -1855,11 +1826,9 @@
 {
     // Use this to check if an object is the child of a summary object.
     // And return the summary's parent, which is the expandable details object.
-    auto matchFunc = [] (AccessibilityObject* object) {
-        return object->hasTagName(summaryTag);
-    };
-    
-    if (AccessibilityObject* summary = matchedParent(object, true, matchFunc))
+    if (const AccessibilityObject* summary = AccessibilityObject::matchedParent(*object, true, [] (const AccessibilityObject& object) {
+        return object.hasTagName(summaryTag);
+    }))
         return summary->parentObject();
     return nil;
 }
@@ -1867,12 +1836,10 @@
 - (AccessibilityObject*)detailParentForObject:(AccessibilityObject*)object
 {
     // Use this to check if an object is inside a details object.
-    auto matchFunc = [] (AccessibilityObject* object) {
-        return object->hasTagName(detailsTag);
-    };
-    
-    if (AccessibilityObject* details = matchedParent(object, true, matchFunc))
-        return details;
+    if (const AccessibilityObject* details = AccessibilityObject::matchedParent(*object, true, [] (const AccessibilityObject& object) {
+        return object.hasTagName(detailsTag);
+    }))
+        return const_cast<AccessibilityObject*>(details);
     return nil;
 }
 

Modified: trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm (207313 => 207314)


--- trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm	2016-10-13 22:25:00 UTC (rev 207313)
+++ trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm	2016-10-13 22:52:17 UTC (rev 207314)
@@ -1410,7 +1410,7 @@
     if (m_object->isToggleButton())
         [additional addObject:NSAccessibilityValueAttribute];
     
-    if (m_object->supportsExpanded())
+    if (m_object->supportsExpanded() || m_object->isSummary())
         [additional addObject:NSAccessibilityExpandedAttribute];
     
     if (m_object->isScrollbar()
@@ -2207,7 +2207,7 @@
         { RubyRunRole, NSAccessibilityGroupRole },
         { RubyTextRole, NSAccessibilityGroupRole },
         { DetailsRole, NSAccessibilityGroupRole },
-        { SummaryRole, NSAccessibilityGroupRole },
+        { SummaryRole, NSAccessibilityButtonRole },
         { SVGTextPathRole, NSAccessibilityGroupRole },
         { SVGTextRole, NSAccessibilityGroupRole },
         { SVGTSpanRole, NSAccessibilityGroupRole },
@@ -2494,8 +2494,6 @@
             return AXDetailsText();
         case FooterRole:
             return AXFooterRoleDescriptionText();
-        case SummaryRole:
-            return AXSummaryText();
         case VideoRole:
             return localizedMediaControlElementString("VideoElement");
         default:
@@ -2535,6 +2533,9 @@
     if (m_object->isTabItem())
         return NSAccessibilityRoleDescription(@"AXTab", nil);
     
+    if (m_object->isSummary())
+        return AXSummaryText();
+    
     // We should try the system default role description for all other roles.
     // If we get the same string back, then as a last resort, return unknown.
     NSString* defaultRoleDescription = NSAccessibilityRoleDescription(axRole, [self subrole]);
@@ -2757,6 +2758,10 @@
         if (m_object->isMeter())
             return [NSString string];
         
+        // Summary element should use its text node as AXTitle.
+        if (m_object->isSummary())
+            return m_object->textUnderElement();
+        
         return [self baseAccessibilityTitle];
     }
     
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to