Diff
Modified: trunk/LayoutTests/ChangeLog (206942 => 206943)
--- trunk/LayoutTests/ChangeLog 2016-10-07 23:06:32 UTC (rev 206942)
+++ trunk/LayoutTests/ChangeLog 2016-10-07 23:30:16 UTC (rev 206943)
@@ -1,3 +1,13 @@
+2016-10-07 Nan Wang <n_w...@apple.com>
+
+ AX: <figcaption> should be AXTitleUIElement for other content inside the <figure>
+ https://bugs.webkit.org/show_bug.cgi?id=108996
+
+ Reviewed by Chris Fleizach.
+
+ * accessibility/mac/figure-element-expected.txt: Added.
+ * accessibility/mac/figure-element.html: Added.
+
2016-10-07 Ryan Haddad <ryanhad...@apple.com>
Marking inspector/debugger/stepping tests as flaky.
Added: trunk/LayoutTests/accessibility/mac/figure-element-expected.txt (0 => 206943)
--- trunk/LayoutTests/accessibility/mac/figure-element-expected.txt (rev 0)
+++ trunk/LayoutTests/accessibility/mac/figure-element-expected.txt 2016-10-07 23:30:16 UTC (rev 206943)
@@ -0,0 +1,44 @@
+This tests that the 'figure' element is accessible on the Mac.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Test figure with aria-label.
+figure1 role: AXRole: AXGroup
+figure1 roleDescription: AXRoleDescription: figure
+figure1 description: AXDescription: aria-label attribute
+figure1 helpText: AXHelp:
+PASS !titleUIElement is true
+
+Test figure with title attribute.
+figure2 role: AXRole: AXGroup
+figure2 roleDescription: AXRoleDescription: figure
+figure2 description: AXDescription: title attribute
+figure2 helpText: AXHelp:
+PASS !titleUIElement is true
+
+Test figure with aria-describedby.
+figure3 role: AXRole: AXGroup
+figure3 roleDescription: AXRoleDescription: figure
+figure3 description: AXDescription:
+figure3 helpText: AXHelp: p referenced by aria-describedby
+PASS !titleUIElement is true
+
+Test figure with figcaption element.
+figure4 role: AXRole: AXGroup
+figure4 roleDescription: AXRoleDescription: figure
+figure4 description: AXDescription: Figcaption element
+figure4 helpText: AXHelp:
+PASS titleUIElement.isEqual(figureCaption) is true
+
+Test figure with figcaption element and title attribute.
+figure5 role: AXRole: AXGroup
+figure5 roleDescription: AXRoleDescription: figure
+figure5 description: AXDescription: Figcaption element
+figure5 helpText: AXHelp: title attribute
+PASS titleUIElement.isEqual(figureCaption) is true
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/accessibility/mac/figure-element.html (0 => 206943)
--- trunk/LayoutTests/accessibility/mac/figure-element.html (rev 0)
+++ trunk/LayoutTests/accessibility/mac/figure-element.html 2016-10-07 23:30:16 UTC (rev 206943)
@@ -0,0 +1,72 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src=""
+</head>
+<body id="body">
+
+<div id="content">
+
+<p id="p1">Test figure with aria-label.</p>
+<figure id="figure1" aria-label="aria-label attribute">
+ <img src="" alt="image alt" width="20" height="20"/>
+</figure>
+
+<p id="p2">Test figure with title attribute.</p>
+<figure id="figure2" title="title attribute">
+ <img src="" alt="image alt" width="20" height="20"/>
+</figure>
+
+<p id="p3">Test figure with aria-describedby.</p>
+<figure id="figure3" aria-describedby="fg-describedby">
+ <img src="" alt="image alt" width="20" height="20"/>
+ <p id="fg-describedby">p referenced by aria-describedby</p>
+</figure>
+
+<p id="p4">Test figure with figcaption element.</p>
+<figure id="figure4">
+ <img src="" alt="image alt" width="20" height="20"/>
+ <figcaption id="figCaption4">Figcaption element</figcaption>
+</figure>
+
+<p id="p5">Test figure with figcaption element and title attribute.</p>
+<figure id="figure5" title="title attribute">
+ <img src="" alt="image alt" width="20" height="20"/>
+ <figcaption id="figCaption5">Figcaption element</figcaption>
+</figure>
+
+</div>
+
+<p id="description"></p>
+<div id="console"></div>
+
+<script>
+
+ description("This tests that the 'figure' element is accessible on the Mac.");
+
+ if (window.accessibilityController) {
+
+ for (var k = 1; k <= 5; k++) {
+ var figure = accessibilityController.accessibleElementById("figure" + k);
+ var p = document.getElementById("p" + k);
+ debug(p.innerText);
+ debug("figure" + k + " role: " + figure.role);
+ debug("figure" + k + " roleDescription: " + figure.roleDescription);
+ debug("figure" + k + " description: " + figure.description);
+ debug("figure" + k + " helpText: " + figure.helpText);
+ var titleUIElement = figure.titleUIElement();
+ if (k >= 4) {
+ var figureCaption = accessibilityController.accessibleElementById("figCaption" + k);
+ shouldBeTrue("titleUIElement.isEqual(figureCaption)");
+ } else
+ shouldBeTrue("!titleUIElement");
+ debug("");
+ }
+ document.getElementById("content").innerText = "";
+ }
+
+</script>
+
+<script src=""
+</body>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (206942 => 206943)
--- trunk/Source/WebCore/ChangeLog 2016-10-07 23:06:32 UTC (rev 206942)
+++ trunk/Source/WebCore/ChangeLog 2016-10-07 23:30:16 UTC (rev 206943)
@@ -1,3 +1,41 @@
+2016-10-07 Nan Wang <n_w...@apple.com>
+
+ AX: <figcaption> should be AXTitleUIElement for other content inside the <figure>
+ https://bugs.webkit.org/show_bug.cgi?id=108996
+
+ Reviewed by Chris Fleizach.
+
+ Exposed the figcaption element to be the AXTitleUIElement for the figure element. And used
+ the figcaption's content as the accessible name of the figure. Also, updated the figure element's
+ role description on Mac.
+ Accessible name and description calculation for figure elements:
+ https://w3c.github.io/html-aam/#figure-and-figcaption-elements
+
+ Test: accessibility/mac/figure-element.html
+
+ * English.lproj/Localizable.strings:
+ * accessibility/AccessibilityNodeObject.cpp:
+ (WebCore::AccessibilityNodeObject::captionForFigure):
+ (WebCore::AccessibilityNodeObject::alternativeText):
+ * accessibility/AccessibilityNodeObject.h:
+ * accessibility/AccessibilityObject.cpp:
+ (WebCore::AccessibilityObject::isFigure):
+ (WebCore::AccessibilityObject::isSuperscriptStyleGroup): Deleted.
+ * accessibility/AccessibilityObject.h:
+ * accessibility/AccessibilityRenderObject.cpp:
+ (WebCore::AccessibilityRenderObject::exposesTitleUIElement):
+ (WebCore::AccessibilityRenderObject::titleUIElement):
+ (WebCore::AccessibilityRenderObject::computeAccessibilityIsIgnored):
+ * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
+ (-[WebAccessibilityObjectWrapper roleDescription]):
+ * platform/LocalizedStrings.cpp:
+ (WebCore::AXFigureText):
+ * platform/LocalizedStrings.h:
+ * platform/efl/LocalizedStringsEfl.cpp:
+ (WebCore::AXFigureText):
+ * platform/gtk/LocalizedStringsGtk.cpp:
+ (WebCore::AXFigureText):
+
2016-10-07 Alex Christensen <achristen...@webkit.org>
Non-special URL fragments should percent-encode non-ASCII characters
Modified: trunk/Source/WebCore/English.lproj/Localizable.strings (206942 => 206943)
--- trunk/Source/WebCore/English.lproj/Localizable.strings 2016-10-07 23:06:32 UTC (rev 206942)
+++ trunk/Source/WebCore/English.lproj/Localizable.strings 2016-10-07 23:30:16 UTC (rev 206943)
@@ -259,6 +259,9 @@
/* menu item */
"Exit Picture in Picture" = "Exit Picture in Picture";
+/* accessibility role description for a figure element */
+"figure" = "figure";
+
/* Default application name for Open With context menu */
"Finder" = "Finder";
Modified: trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp (206942 => 206943)
--- trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp 2016-10-07 23:06:32 UTC (rev 206942)
+++ trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp 2016-10-07 23:30:16 UTC (rev 206943)
@@ -1226,6 +1226,23 @@
return nullptr;
}
+AccessibilityObject* AccessibilityNodeObject::captionForFigure() const
+{
+ if (!isFigure())
+ return nullptr;
+
+ AXObjectCache* cache = axObjectCache();
+ if (!cache)
+ return nullptr;
+
+ Node* node = this->node();
+ for (Node* child = node->firstChild(); child; child = child->nextSibling()) {
+ if (child->hasTagName(figcaptionTag))
+ return cache->getOrCreate(child);
+ }
+ return nullptr;
+}
+
bool AccessibilityNodeObject::usesAltTagForTextComputation() const
{
return isImage() || isInputImage() || isNativeImage() || isCanvas() || (node() && node()->hasTagName(imgTag));
@@ -1324,6 +1341,13 @@
textOrder.append(AccessibilityText(accessibleNameForNode(object->node()), AlternativeText));
}
+ // The figure element derives its alternative text from the first associated figcaption element if one is available.
+ if (isFigure()) {
+ AccessibilityObject* captionForFigure = this->captionForFigure();
+ if (captionForFigure && !captionForFigure->isHidden())
+ textOrder.append(AccessibilityText(accessibleNameForNode(captionForFigure->node()), AlternativeText));
+ }
+
#if ENABLE(MATHML)
if (node->isMathMLElement())
textOrder.append(AccessibilityText(getAttribute(MathMLNames::alttextAttr), AlternativeText));
Modified: trunk/Source/WebCore/accessibility/AccessibilityNodeObject.h (206942 => 206943)
--- trunk/Source/WebCore/accessibility/AccessibilityNodeObject.h 2016-10-07 23:06:32 UTC (rev 206942)
+++ trunk/Source/WebCore/accessibility/AccessibilityNodeObject.h 2016-10-07 23:30:16 UTC (rev 206943)
@@ -195,6 +195,7 @@
Element* menuElementForMenuButton() const;
Element* menuItemElementForMenu() const;
AccessibilityObject* menuButtonForMenu() const;
+ AccessibilityObject* captionForFigure() const;
private:
bool isAccessibilityNodeObject() const final { return true; }
Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.cpp (206942 => 206943)
--- trunk/Source/WebCore/accessibility/AccessibilityObject.cpp 2016-10-07 23:06:32 UTC (rev 206942)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.cpp 2016-10-07 23:30:16 UTC (rev 206943)
@@ -3088,6 +3088,12 @@
Node* node = this->node();
return node && node->hasTagName(supTag);
}
+
+bool AccessibilityObject::isFigure() const
+{
+ Node* node = this->node();
+ return node && node->hasTagName(figureTag);
+}
bool AccessibilityObject::isContainedByPasswordField() const
{
Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.h (206942 => 206943)
--- trunk/Source/WebCore/accessibility/AccessibilityObject.h 2016-10-07 23:06:32 UTC (rev 206942)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.h 2016-10-07 23:30:16 UTC (rev 206943)
@@ -560,6 +560,7 @@
bool isStyleFormatGroup() const;
bool isSubscriptStyleGroup() const;
bool isSuperscriptStyleGroup() const;
+ bool isFigure() const;
virtual bool isChecked() const { return false; }
virtual bool isEnabled() const { return false; }
Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp (206942 => 206943)
--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp 2016-10-07 23:06:32 UTC (rev 206942)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp 2016-10-07 23:30:16 UTC (rev 206943)
@@ -1045,7 +1045,7 @@
bool AccessibilityRenderObject::exposesTitleUIElement() const
{
- if (!isControl())
+ if (!isControl() && !isFigure())
return false;
// If this control is ignored (because it's invisible),
@@ -1082,6 +1082,9 @@
if (isFieldset())
return axObjectCache()->getOrCreate(downcast<RenderFieldset>(*m_renderer).findLegend(RenderFieldset::IncludeFloatingOrOutOfFlow));
+ if (isFigure())
+ return captionForFigure();
+
Node* node = m_renderer->node();
if (!is<Element>(node))
return nullptr;
@@ -1245,6 +1248,9 @@
// all controls are accessible
if (isControl())
return false;
+
+ if (isFigure())
+ return false;
switch (roleValue()) {
case AudioRole:
Modified: trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm (206942 => 206943)
--- trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm 2016-10-07 23:06:32 UTC (rev 206942)
+++ trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm 2016-10-07 23:30:16 UTC (rev 206943)
@@ -2478,6 +2478,9 @@
if (ariaLandmarkRoleDescription)
return ariaLandmarkRoleDescription;
+ if (m_object->isFigure())
+ return AXFigureText();
+
switch (m_object->roleValue()) {
case AudioRole:
return localizedMediaControlElementString("AudioElement");
Modified: trunk/Source/WebCore/platform/LocalizedStrings.cpp (206942 => 206943)
--- trunk/Source/WebCore/platform/LocalizedStrings.cpp 2016-10-07 23:06:32 UTC (rev 206942)
+++ trunk/Source/WebCore/platform/LocalizedStrings.cpp 2016-10-07 23:30:16 UTC (rev 206943)
@@ -635,6 +635,11 @@
return WEB_UI_STRING("cancel", "accessibility description for a search field cancel button");
}
+String AXFigureText()
+{
+ return WEB_UI_STRING("figure", "accessibility role description for a figure element.");
+}
+
String AXButtonActionVerb()
{
return WEB_UI_STRING("press", "Verb stating the action that will occur when a button is pressed, as used by accessibility");
Modified: trunk/Source/WebCore/platform/LocalizedStrings.h (206942 => 206943)
--- trunk/Source/WebCore/platform/LocalizedStrings.h 2016-10-07 23:06:32 UTC (rev 206942)
+++ trunk/Source/WebCore/platform/LocalizedStrings.h 2016-10-07 23:30:16 UTC (rev 206943)
@@ -170,6 +170,7 @@
String AXAttachmentRoleText();
String AXDetailsText();
String AXSummaryText();
+ String AXFigureText();
String AXButtonActionVerb();
String AXRadioButtonActionVerb();
Modified: trunk/Source/WebCore/platform/efl/LocalizedStringsEfl.cpp (206942 => 206943)
--- trunk/Source/WebCore/platform/efl/LocalizedStringsEfl.cpp 2016-10-07 23:06:32 UTC (rev 206942)
+++ trunk/Source/WebCore/platform/efl/LocalizedStringsEfl.cpp 2016-10-07 23:30:16 UTC (rev 206943)
@@ -408,6 +408,11 @@
return String::fromUTF8("summary");
}
+String AXFigureText()
+{
+ return String::fromUTF8("figure");
+}
+
String AXFooterRoleDescriptionText()
{
return String::fromUTF8("footer");
Modified: trunk/Source/WebCore/platform/gtk/LocalizedStringsGtk.cpp (206942 => 206943)
--- trunk/Source/WebCore/platform/gtk/LocalizedStringsGtk.cpp 2016-10-07 23:06:32 UTC (rev 206942)
+++ trunk/Source/WebCore/platform/gtk/LocalizedStringsGtk.cpp 2016-10-07 23:30:16 UTC (rev 206943)
@@ -456,6 +456,11 @@
return String::fromUTF8(_("summary"));
}
+String AXFigureText()
+{
+ return String::fromUTF8(_("figure"));
+}
+
String AXFooterRoleDescriptionText()
{
return String::fromUTF8(_("footer"));