AX: Title attribute should not be used in AXTitle
authorcfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 Dec 2011 17:24:04 +0000 (17:24 +0000)
committercfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 Dec 2011 17:24:04 +0000 (17:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=75027

Reviewed by Darin Adler.

Source/WebCore:

Accessibility has been incorrectly exposing the title attribute through AXTitle. The title
attribute better corresponds with a help tag for accessibility clients.

Test: platform/mac/accessibility/title-attribute-not-used-as-axtitle.html

* accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::title):
    Don't use the title attribute.
(WebCore::AccessibilityRenderObject::exposesTitleUIElement):
    Change the semantics around when a checkbox or radio button combines it's title ui element. The change
    makes it so that we will expose the title ui element when the control already has a label. Otherwise
    the title ui element is hidden, and it's text is used as the AXTitle for the control.
(WebCore::AccessibilityRenderObject::titleUIElement):
    Change this method so it always returns the title ui element, and then leave it up to exposesTitleUIElement
    to determine whether it should be shown.
* accessibility/AccessibilityTableCell.h:
(WebCore::AccessibilityTableCell::exposesTitleUIElement):
    There's no special logic for table cells that have title ui elements, and we don't want to use
    the logic in AccessibilityRenderObject, hence the override here.
* accessibility/mac/WebAccessibilityObjectWrapper.mm:
(-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):

LayoutTests:

* accessibility/aria-option-role.html:
     Test was using the title attribute as a means of conveying AXTitle, which is wrong.
* accessibility/radio-button-title-label-expected.txt:
* accessibility/radio-button-title-label.html:
     Updated to refine the logic surrounding when radio buttons expose a title ui element and when they do not.
* platform/mac/accessibility/aria-option-role-expected.txt:
* platform/mac/accessibility/title-attribute-not-used-as-axtitle-expected.txt: Added.
* platform/mac/accessibility/title-attribute-not-used-as-axtitle.html: Added.
     New test to verify that the title attribute is not exposed through AXTitle.

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

LayoutTests/ChangeLog
LayoutTests/accessibility/aria-option-role.html
LayoutTests/accessibility/radio-button-title-label-expected.txt
LayoutTests/accessibility/radio-button-title-label.html
LayoutTests/platform/mac/accessibility/aria-option-role-expected.txt
LayoutTests/platform/mac/accessibility/title-attribute-not-used-as-axtitle-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/accessibility/title-attribute-not-used-as-axtitle.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/accessibility/AccessibilityRenderObject.cpp
Source/WebCore/accessibility/AccessibilityTableCell.h
Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm

index c7a9fcf..7637546 100644 (file)
@@ -1,5 +1,22 @@
 2011-12-22  Chris Fleizach  <cfleizach@apple.com>
 
+        AX: Title attribute should not be used in AXTitle
+        https://bugs.webkit.org/show_bug.cgi?id=75027
+
+        Reviewed by Darin Adler.
+
+        * accessibility/aria-option-role.html:
+             Test was using the title attribute as a means of conveying AXTitle, which is wrong.
+        * accessibility/radio-button-title-label-expected.txt:
+        * accessibility/radio-button-title-label.html:
+             Updated to refine the logic surrounding when radio buttons expose a title ui element and when they do not.
+        * platform/mac/accessibility/aria-option-role-expected.txt:
+        * platform/mac/accessibility/title-attribute-not-used-as-axtitle-expected.txt: Added.
+        * platform/mac/accessibility/title-attribute-not-used-as-axtitle.html: Added.
+             New test to verify that the title attribute is not exposed through AXTitle.
+
+2011-12-22  Chris Fleizach  <cfleizach@apple.com>
+
         AX: aria-describedby should not be part of AXDescription (should be a part of AXHelp)
         https://bugs.webkit.org/show_bug.cgi?id=75052
 
index 937e51c..d77dd24 100644 (file)
@@ -7,7 +7,7 @@
 
 <div role="listbox">
 <div role="option">option 1</div>
-<div role="option" title="label 2">option 2</div>
+<div role="option" aria-label="label 2">option 2</div>
 </div>
 
 <p id="description"></p>
@@ -29,7 +29,7 @@
           shouldBe("firstChild.title", "'AXTitle: option 1'");
 
           shouldBe("secondChild.role", "'AXRole: AXStaticText'");
-          shouldBe("secondChild.title", "'AXTitle: label 2'");
+          shouldBe("secondChild.description", "'AXDescription: label 2'");
 
           shouldBe("firstChild.childrenCount", "0");
           shouldBe("secondChild.childrenCount", "0");
index a9c219e..6103c28 100644 (file)
@@ -1,3 +1,22 @@
-Test passed
+This test checks that radio buttons expose title ui elements correctly under a variety of cirmcumstances. In general, the should disappear and act as the title for the radio button.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS focusedElement.title is 'AXTitle: LABEL'
+PASS !titleUIElement || titleUIElement.title == 'AXTitle: ' is true
+PASS focusedElement.description is 'AXDescription: LABEL2a'
+PASS focusedElement.title is 'AXTitle: '
+PASS !titleUIElement || titleUIElement.title == 'AXTitle: ' is true
+PASS focusedElement.description is 'AXDescription: radio3'
+PASS focusedElement.title is 'AXTitle: '
+PASS titleUIElement.title is 'AXTitle: '
+PASS successfullyParsed is true
+
+TEST COMPLETE
 Test
-LABEL
+LABEL  Test
+LABEL2
+LABEL2a
+Test
+LABEL3
index 6e104f2..019a738 100644 (file)
@@ -1,34 +1,61 @@
 <html>
+<head>
+<script src="../fast/js/resources/js-test-pre.js"></script>
+</head>
 <script>
     if (window.layoutTestController)
         layoutTestController.dumpAsText();
 </script>
 <body>
+
+<p id="description"></p>
+<div id="console"></div>
     
-    <div id="result"></div>
-    
-    <!-- This test checks that if a radio button has a title and a title ui element label, both are exposed -->
     <input type="radio" name="r1" id="r1" title="TITLE">Test<br>
     <label for="r1">LABEL</label>
 
+    <input type="radio" id="r2" aria-labeledby="label3">Test<br>
+    <label for="r2">LABEL2</label>
+    <div id="label3">LABEL2a</div>
+
+    <input type="radio" name="r3" id="r3" aria-label="radio3">Test<br>
+    <label for="r3">LABEL3</label>
+
     <script>
+
+        description("This test checks that radio buttons expose title ui elements correctly under a variety of cirmcumstances. In general, the <label> should disappear and act as the title for the radio button.");
+
         if (window.accessibilityController) {
-            var result = document.getElementById("result");
 
             // radio button 1
-            var r1 = document.getElementById("r1");
-            r1.focus();
+            document.getElementById("r1").focus();
+
+            // 1) Even though a checkbox has a title attribute, the title ui element should still be exposed.
             var focusedElement = accessibilityController.focusedElement;
             var titleUIElement = focusedElement.titleUIElement();
+            shouldBe("focusedElement.title", "'AXTitle: LABEL'");
+            shouldBeTrue("!titleUIElement || titleUIElement.title == 'AXTitle: '");
+
+            // 2) aria-labeledby should override the native label semantics and return a title for the radio button, instead of a title ui element.
+            document.getElementById("r2").focus();
+            focusedElement = accessibilityController.focusedElement;
+            titleUIElement = focusedElement.titleUIElement();
+            shouldBe("focusedElement.description", "'AXDescription: LABEL2a'");
+            shouldBe("focusedElement.title", "'AXTitle: '");
+            shouldBeTrue("!titleUIElement || titleUIElement.title == 'AXTitle: '");
+
+            // 3) If a radio button has an aria-label and a <label>, the aria-label should be the title.
+            document.getElementById("r3").focus();
+            focusedElement = accessibilityController.focusedElement;
+            titleUIElement = focusedElement.titleUIElement();
+            shouldBe("focusedElement.description", "'AXDescription: radio3'");
+            shouldBe("focusedElement.title", "'AXTitle: '");
+            shouldBe("titleUIElement.title", "'AXTitle: '");
 
-            var pattern = "AXTitle: TITLE";
-            if (focusedElement.allAttributes().indexOf(pattern) != -1 && titleUIElement.allAttributes().length > 0) {
-                result.innerText += "Test passed\n";
-            }
-            else {
-                 result.innerText += "Test failed\n";
-            }
         }
     </script>
+
+<script src="../fast/js/resources/js-test-post.js"></script>
+
 </body>
 </html>
index d75949a..e037837 100644 (file)
@@ -8,7 +8,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 PASS firstChild.role is 'AXRole: AXStaticText'
 PASS firstChild.title is 'AXTitle: option 1'
 PASS secondChild.role is 'AXRole: AXStaticText'
-PASS secondChild.title is 'AXTitle: label 2'
+PASS secondChild.description is 'AXDescription: label 2'
 PASS firstChild.childrenCount is 0
 PASS secondChild.childrenCount is 0
 PASS successfullyParsed is true
diff --git a/LayoutTests/platform/mac/accessibility/title-attribute-not-used-as-axtitle-expected.txt b/LayoutTests/platform/mac/accessibility/title-attribute-not-used-as-axtitle-expected.txt
new file mode 100644 (file)
index 0000000..6866b5c
--- /dev/null
@@ -0,0 +1,12 @@
+text
+This tests that the title attribute is not used as the AXTitle (only as the AXHelp)
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS accessibilityController.focusedElement.title is 'AXTitle: text'
+PASS accessibilityController.focusedElement.helpText is 'AXHelp: TITLE'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/mac/accessibility/title-attribute-not-used-as-axtitle.html b/LayoutTests/platform/mac/accessibility/title-attribute-not-used-as-axtitle.html
new file mode 100644 (file)
index 0000000..287b444
--- /dev/null
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="../../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body id="body">
+
+<a id="link" tabindex="0" href="#" title="TITLE">text</a>
+
+<p id="description"></p>
+<div id="console"></div>
+<div id="notifications"></div>
+
+<script>
+
+    description("This tests that the title attribute is not used as the AXTitle (only as the AXHelp)");
+
+    if (window.accessibilityController) {
+
+        document.getElementById("link").focus();
+        shouldBe("accessibilityController.focusedElement.title", "'AXTitle: text'");
+        shouldBe("accessibilityController.focusedElement.helpText", "'AXHelp: TITLE'");
+    }
+
+</script>
+
+<script src="../../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
index 5c1ab44..33b1493 100644 (file)
@@ -1,5 +1,34 @@
 2011-12-22  Chris Fleizach  <cfleizach@apple.com>
 
+        AX: Title attribute should not be used in AXTitle
+        https://bugs.webkit.org/show_bug.cgi?id=75027
+
+        Reviewed by Darin Adler.
+
+        Accessibility has been incorrectly exposing the title attribute through AXTitle. The title
+        attribute better corresponds with a help tag for accessibility clients.
+
+        Test: platform/mac/accessibility/title-attribute-not-used-as-axtitle.html
+
+        * accessibility/AccessibilityRenderObject.cpp:
+        (WebCore::AccessibilityRenderObject::title):
+            Don't use the title attribute.
+        (WebCore::AccessibilityRenderObject::exposesTitleUIElement):
+            Change the semantics around when a checkbox or radio button combines it's title ui element. The change
+            makes it so that we will expose the title ui element when the control already has a label. Otherwise
+            the title ui element is hidden, and it's text is used as the AXTitle for the control.
+        (WebCore::AccessibilityRenderObject::titleUIElement):
+            Change this method so it always returns the title ui element, and then leave it up to exposesTitleUIElement
+            to determine whether it should be shown.
+        * accessibility/AccessibilityTableCell.h:
+        (WebCore::AccessibilityTableCell::exposesTitleUIElement):
+            There's no special logic for table cells that have title ui elements, and we don't want to use
+            the logic in AccessibilityRenderObject, hence the override here.
+        * accessibility/mac/WebAccessibilityObjectWrapper.mm:
+        (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
+
+2011-12-22  Chris Fleizach  <cfleizach@apple.com>
+
         AX: aria-describedby should not be part of AXDescription (should be a part of AXHelp)
         https://bugs.webkit.org/show_bug.cgi?id=75052
 
index d97fc5f..9777a46 100644 (file)
@@ -1329,10 +1329,6 @@ String AccessibilityRenderObject::title() const
     if (!node)
         return String();
     
-    const AtomicString& title = getAttribute(titleAttr);
-    if (!title.isEmpty())
-        return title;
-    
     bool isInputTag = node->hasTagName(inputTag);
     if (isInputTag) {
         HTMLInputElement* input = static_cast<HTMLInputElement*>(node);
@@ -1342,7 +1338,7 @@ String AccessibilityRenderObject::title() const
     
     if (isInputTag || AccessibilityObject::isARIAInput(ariaRoleAttribute()) || isControl()) {
         HTMLLabelElement* label = labelForElement(static_cast<Element*>(node));
-        if (label && !titleUIElement())
+        if (label && !exposesTitleUIElement())
             return label->innerText();
     }
     
@@ -1687,10 +1683,13 @@ bool AccessibilityRenderObject::exposesTitleUIElement() const
     if (accessibilityIsIgnored())
         return true;
     
-    // checkbox or radio buttons don't expose the title ui element unless it has a title already
-    if (isCheckboxOrRadio() && getAttribute(titleAttr).isEmpty())
-        return false;
-    
+    // Checkboxes and radio buttons use the text of their title ui element as their own AXTitle.
+    // This code controls whether the title ui element should appear in the AX tree (usually, no).
+    // It should appear if the control already has a label (which will be used as the AXTitle instead).
+    if (isCheckboxOrRadio())
+        return hasTextAlternative();
+
+    // When controls have their own descriptions, the title element should be ignored.
     if (hasTextAlternative())
         return false;
     
@@ -1706,9 +1705,6 @@ AccessibilityObject* AccessibilityRenderObject::titleUIElement() const
     if (isFieldset())
         return axObjectCache()->getOrCreate(toRenderFieldset(m_renderer)->findLegend());
     
-    if (!exposesTitleUIElement())
-        return 0;
-    
     Node* element = m_renderer->node();
     HTMLLabelElement* label = labelForElement(static_cast<Element*>(element));
     if (label && label->renderer())
index dabbce2..e4a201f 100644 (file)
@@ -51,13 +51,14 @@ public:
     // fills in the start location and column span of cell
     virtual void columnIndexRange(pair<int, int>& columnRange);
     
-    // if a table cell is not exposed as a table cell, a TH element can
-    // serve as its title ui element
-    AccessibilityObject* titleUIElement() const;
-    
 protected:
     virtual AccessibilityObject* parentTable() const;
     int m_rowIndex;
+
+private:
+    // If a table cell is not exposed as a table cell, a TH element can serve as its title UI element.
+    virtual AccessibilityObject* titleUIElement() const;
+    virtual bool exposesTitleUIElement() const { return true; }
 }; 
     
 } // namespace WebCore 
index bfc4c6b..774af3f 100644 (file)
@@ -2255,6 +2255,9 @@ static NSString* roleValueToNSString(AccessibilityRole value)
     }
 
     if ([attributeName isEqualToString:NSAccessibilityTitleUIElementAttribute]) {
+        if (!m_object->exposesTitleUIElement())
+            return nil;
+        
         AccessibilityObject* obj = m_object->titleUIElement();
         if (obj)
             return obj->wrapper();