Title: [206943] trunk
Revision
206943
Author
n_w...@apple.com
Date
2016-10-07 16:30:16 -0700 (Fri, 07 Oct 2016)

Log Message

AX: <figcaption> should be AXTitleUIElement for other content inside the <figure>
https://bugs.webkit.org/show_bug.cgi?id=108996

Reviewed by Chris Fleizach.

Source/WebCore:

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):

LayoutTests:

* accessibility/mac/figure-element-expected.txt: Added.
* accessibility/mac/figure-element.html: Added.

Modified Paths

Added Paths

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"));
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to