Support accessibility for <figure> element on iOS.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 27 Sep 2019 22:15:21 +0000 (22:15 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 27 Sep 2019 22:15:21 +0000 (22:15 +0000)
https://bugs.webkit.org/show_bug.cgi?id=202272
<rdar://problem/54789907>

Patch by Andres Gonzalez <andresg_22@apple.com> on 2019-09-27
Reviewed by Chris Fleizach.

Source/WebCore:

Test: accessibility/ios-simulator/figure-element.html

Added a role description for the <figure> element.
* accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::roleDescription const):

Tools:

Implemented titleUIElement and roleDescription properties for <figure> elements on iOS.
* WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm:
(WTR::AccessibilityUIElement::titleUIElement):
(WTR::AccessibilityUIElement::roleDescription):

LayoutTests:

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

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250462 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/accessibility/ios-simulator/figure-element-expected.txt [new file with mode: 0644]
LayoutTests/accessibility/ios-simulator/figure-element.html [new file with mode: 0644]
LayoutTests/accessibility/roles-exposed.html
LayoutTests/platform/mac-wk2/accessibility/roles-exposed-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/accessibility/AccessibilityObject.cpp
Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm
Tools/ChangeLog
Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm

index 7436ae1..cc3506f 100644 (file)
@@ -1,3 +1,14 @@
+2019-09-27  Andres Gonzalez  <andresg_22@apple.com>
+
+        Support accessibility for <figure> element on iOS.
+        https://bugs.webkit.org/show_bug.cgi?id=202272
+        <rdar://problem/54789907>
+
+        Reviewed by Chris Fleizach.
+
+        * accessibility/ios-simulator/figure-element-expected.txt: Added.
+        * accessibility/ios-simulator/figure-element.html: Added.
+
 2019-09-27  Truitt Savell  <tsavell@apple.com>
 
         fast/images/async-image-multiple-clients-repaint.html
diff --git a/LayoutTests/accessibility/ios-simulator/figure-element-expected.txt b/LayoutTests/accessibility/ios-simulator/figure-element-expected.txt
new file mode 100644 (file)
index 0000000..59ad304
--- /dev/null
@@ -0,0 +1,51 @@
+This tests that the 'figure' element is accessible on iOS.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Test figure with aria-label.
+figure1: [object AccessibilityUIElement]
+figure1 AXRoleDescription: figure
+figure1 AXLabel: Figure 1.
+figure1 AXHint: 
+PASS !titleUIElement is true
+
+Test figure with title attribute.
+figure2: [object AccessibilityUIElement]
+figure2 AXRoleDescription: figure
+figure2 AXLabel: Figure 2.
+figure2 AXHint: 
+PASS !titleUIElement is true
+
+Test figure with aria-describedby.
+figure3: [object AccessibilityUIElement]
+figure3 AXRoleDescription: figure
+figure3 AXLabel: 
+figure3 AXHint: This is the description for Figure 3.
+PASS !titleUIElement is true
+
+Test figure with aria-roledescription attribute.
+figure4: [object AccessibilityUIElement]
+figure4 AXRoleDescription: ARIA role description for Figure 4.
+figure4 AXLabel: 
+figure4 AXHint: 
+PASS !titleUIElement is true
+
+Test figure with figcaption element.
+figure5: [object AccessibilityUIElement]
+figure5 AXRoleDescription: figure
+figure5 AXLabel: Caption for Figure 5.
+figure5 AXHint: 
+PASS titleUIElement.isEqual(figureCaption) is true
+
+Test figure with figcaption element and title attribute.
+figure6: [object AccessibilityUIElement]
+figure6 AXRoleDescription: figure
+figure6 AXLabel: Caption for Figure 6.
+figure6 AXHint: Figure 6.
+PASS titleUIElement.isEqual(figureCaption) is true
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/accessibility/ios-simulator/figure-element.html b/LayoutTests/accessibility/ios-simulator/figure-element.html
new file mode 100644 (file)
index 0000000..afc88bd
--- /dev/null
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="../../resources/js-test-pre.js"></script>
+</head>
+<body id="body">
+
+<div id="content">
+
+<p id="p1">Test figure with aria-label.</p>
+<figure id="figure1" aria-label="Figure 1.">
+    <img src="" alt="Alt text for Figure 1." width="20" height="20"/>
+</figure>
+
+<p id="p2">Test figure with title attribute.</p>
+<figure id="figure2" title="Figure 2.">
+    <img src="" alt="Alt text for Figure 2." width="20" height="20"/>
+</figure>
+
+<p id="p3">Test figure with aria-describedby.</p>
+<figure id="figure3" aria-describedby="fig-description">
+    <img src="" alt="Alt text for Figure 3." width="20" height="20"/>
+    <p id="fig-description">This is the description for Figure 3.</p>
+</figure>
+
+<p id="p4">Test figure with aria-roledescription attribute.</p>
+<figure id="figure4" aria-roledescription="ARIA role description for Figure 4.">
+    <img src="" alt="Alt text for Figure 4." width="20" height="20"/>
+</figure>
+
+<p id="p5">Test figure with figcaption element.</p>
+<figure id="figure5">
+    <img src="" alt="Alt text for Figure 5." width="20" height="20"/>
+    <figcaption id="figCaption5">Caption for Figure 5.</figcaption>
+</figure>
+
+<p id="p6">Test figure with figcaption element and title attribute.</p>
+<figure id="figure6" title="Figure 6.">
+    <img src="" alt="Alt text for Figure 6." width="20" height="20"/>
+    <figcaption id="figCaption6">Caption for Figure 6.</figcaption>
+</figure>
+
+</div>
+
+<p id="description"></p>
+<div id="console"></div>
+
+<script>
+    description("This tests that the 'figure' element is accessible on iOS.");
+
+    if (window.accessibilityController) {
+        for (var k = 1; k <= 6; k++) {
+            var p = document.getElementById("p" + k);
+            debug(p.innerText);
+            var figure = window.accessibilityController.accessibleElementById("figure" + k);
+            debug("figure" + k + ": " + figure);
+            debug("figure" + k + " " + figure.roleDescription);
+            debug("figure" + k + " " + figure.description);
+            debug("figure" + k + " " + figure.helpText);
+
+            var titleUIElement = figure.titleUIElement();
+            if (k >= 5) {
+                var figureCaption = accessibilityController.accessibleElementById("figCaption" + k);
+                shouldBeTrue("titleUIElement.isEqual(figureCaption)");
+            } else
+                shouldBeTrue("!titleUIElement");
+
+            debug("");
+        }
+
+        document.getElementById("content").innerText = "";
+    }
+</script>
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
index 9de2612..894e176 100644 (file)
@@ -38,7 +38,7 @@
 <fieldset data-platform="atk,mac" class="ex">
     <legend data-platform="atk,mac" class="ex">X</legend>
 </fieldset>
-<!-- skipped figure/figcaption http://webkit.org/b/108996 -->
+<figure data-platform="atk,mac" class="ex">X</figure>
 <footer data-platform="atk,mac" class="ex">X</footer>
 <form data-platform="atk,mac" class="ex">X</form>
 <!-- skipped <frame> -->
 </div>
 <!-- skipped <menu> -->
 <!-- skipped <meta> -->
-<!-- renable for atk after http://webkit.org/b/163383 fixed --><meter data-platform="mac" class="ex" value="0.75">X</meter>
+<!-- reenable for atk after http://webkit.org/b/163383 fixed --><meter data-platform="mac" class="ex" value="0.75">X</meter>
 <nav data-platform="atk,mac" class="ex">X</nav>
 <!-- skipped <noscript> -->
 <!-- skipped <object> -->
index ca41831..b9e326e 100644 (file)
@@ -129,6 +129,11 @@ legend
       AXSubrole: 
       AXRoleDescription: 
       
+figure
+      AXRole: AXGroup
+      AXSubrole: 
+      AXRoleDescription: figure
+      
 footer
       AXRole: AXGroup
       AXSubrole: AXLandmarkContentInfo
index bcca582..5d5d176 100644 (file)
@@ -1,3 +1,17 @@
+2019-09-27  Andres Gonzalez  <andresg_22@apple.com>
+
+        Support accessibility for <figure> element on iOS.
+        https://bugs.webkit.org/show_bug.cgi?id=202272
+        <rdar://problem/54789907>
+
+        Reviewed by Chris Fleizach.
+
+        Test: accessibility/ios-simulator/figure-element.html
+
+        Added a role description for the <figure> element.
+        * accessibility/AccessibilityObject.cpp:
+        (WebCore::AccessibilityObject::roleDescription const):
+
 2019-09-27  Zalan Bujtas  <zalan@apple.com>
 
         [iPadOS] Can’t use RalphLauren.com on iPad because hover menus don’t stay up
index 38d6f5c..d4a1148 100644 (file)
@@ -2614,9 +2614,17 @@ bool AccessibilityObject::hasHighlighting() const
 
 String AccessibilityObject::roleDescription() const
 {
-    return stripLeadingAndTrailingHTMLSpaces(getAttribute(aria_roledescriptionAttr));
+    // aria-roledescription takes precedence over any other rule.
+    String roleDescription = stripLeadingAndTrailingHTMLSpaces(getAttribute(aria_roledescriptionAttr));
+    if (!roleDescription.isEmpty())
+        return roleDescription;
+
+    if (roleValue() == AccessibilityRole::Figure)
+        return AXFigureText();
+
+    return roleDescription;
 }
-    
+
 bool nodeHasPresentationRole(Node* node)
 {
     return nodeHasRole(node, "presentation") || nodeHasRole(node, "none");
index 62247e7..cb222b4 100644 (file)
@@ -2490,8 +2490,6 @@ ALLOW_DEPRECATED_DECLARATIONS_END
             return AXDetailsText();
         case AccessibilityRole::Feed:
             return AXFeedText();
-        case AccessibilityRole::Figure:
-            return AXFigureText();
         case AccessibilityRole::Footer:
             return AXFooterRoleDescriptionText();
         case AccessibilityRole::Mark:
index 9cd0f28..2acecf1 100644 (file)
@@ -1,3 +1,16 @@
+2019-09-27  Andres Gonzalez  <andresg_22@apple.com>
+
+        Support accessibility for <figure> element on iOS.
+        https://bugs.webkit.org/show_bug.cgi?id=202272
+        <rdar://problem/54789907>
+
+        Reviewed by Chris Fleizach.
+
+        Implemented titleUIElement and roleDescription properties for <figure> elements on iOS.
+        * WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm:
+        (WTR::AccessibilityUIElement::titleUIElement):
+        (WTR::AccessibilityUIElement::roleDescription):
+
 2019-09-27  Alex Christensen  <achristensen@webkit.org>
 
         Move shouldUseTestingNetworkSession from NetworkProcessCreationParameters to NetworkSessionCreationParameters
index 1f36a32..3641755 100644 (file)
@@ -42,6 +42,7 @@ typedef void (*AXPostedNotificationCallback)(id element, NSString* notification,
 @interface NSObject (UIAccessibilityHidden)
 - (id)accessibilityHitTest:(CGPoint)point;
 - (id)accessibilityLinkedElement;
+- (id)accessibilityTitleElement;
 - (NSRange)accessibilityColumnRange;
 - (NSRange)accessibilityRowRange;
 - (id)accessibilityElementForRow:(NSInteger)row andColumn:(NSInteger)column;
@@ -326,6 +327,9 @@ RefPtr<AccessibilityUIElement> AccessibilityUIElement::selectedRowAtIndex(unsign
 
 RefPtr<AccessibilityUIElement> AccessibilityUIElement::titleUIElement()
 {
+    id titleElement = [m_element accessibilityTitleElement];
+    if (titleElement)
+        return AccessibilityUIElement::create(titleElement);
     return nullptr;
 }
 
@@ -469,7 +473,7 @@ JSRetainPtr<JSStringRef> AccessibilityUIElement::subrole()
 
 JSRetainPtr<JSStringRef> AccessibilityUIElement::roleDescription()
 {
-    return createEmptyJSString();
+    return concatenateAttributeAndValue(@"AXRoleDescription", [m_element accessibilityRoleDescription]);
 }
 
 JSRetainPtr<JSStringRef> AccessibilityUIElement::computedRoleString()