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];
}