AX: Cannot call setValue() on contenteditable or ARIA text controls
authorcfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 30 Jun 2017 03:43:25 +0000 (03:43 +0000)
committercfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 30 Jun 2017 03:43:25 +0000 (03:43 +0000)
https://bugs.webkit.org/show_bug.cgi?id=173520

Reviewed by Ryosuke Niwa.

Source/WebCore:

Add support for changing the value of a contenteditable and any other aria text control in setValue().

Test: accessibility/mac/set-value-editable-types.html

* accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::setValue):

Tools:

Add setValue() method to WKTR (already existed in DRT).

* WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp:
(WTR::AccessibilityUIElement::setValue):
* WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h:
* WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl:
* WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:
(WTR::AccessibilityUIElement::setValue):

LayoutTests:

* accessibility/mac/set-value-editable-types-expected.txt: Added.
* accessibility/mac/set-value-editable-types.html: Added.

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

LayoutTests/ChangeLog
LayoutTests/accessibility/mac/set-value-editable-types-expected.txt [new file with mode: 0644]
LayoutTests/accessibility/mac/set-value-editable-types.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/accessibility/AccessibilityRenderObject.cpp
Tools/ChangeLog
Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp
Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h
Tools/WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl
Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm

index c64bdc2..93f9527 100644 (file)
@@ -1,3 +1,13 @@
+2017-06-29  Chris Fleizach  <cfleizach@apple.com>
+
+        AX: Cannot call setValue() on contenteditable or ARIA text controls
+        https://bugs.webkit.org/show_bug.cgi?id=173520
+
+        Reviewed by Ryosuke Niwa.
+
+        * accessibility/mac/set-value-editable-types-expected.txt: Added.
+        * accessibility/mac/set-value-editable-types.html: Added.
+
 2017-06-28  Simon Fraser  <simon.fraser@apple.com>
 
         getBoundingClientRect returns wrong value for combination of page zoom and scroll
diff --git a/LayoutTests/accessibility/mac/set-value-editable-types-expected.txt b/LayoutTests/accessibility/mac/set-value-editable-types-expected.txt
new file mode 100644 (file)
index 0000000..54712e6
--- /dev/null
@@ -0,0 +1,16 @@
+This tests that you can set the value of a contenteditable element.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Contenteditable
+Role: AXRole: AXTextArea
+Value: AXValue: current1
+Writable: true
+Value change notification received
+Updated Value: AXValue: new value
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/accessibility/mac/set-value-editable-types.html b/LayoutTests/accessibility/mac/set-value-editable-types.html
new file mode 100644 (file)
index 0000000..ee7ec2b
--- /dev/null
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+<body id="body">
+<script src="../../resources/js-test-pre.js"></script>
+<div id="content">
+
+<div contenteditable="true" id="contenteditable">current1</div>
+
+</div>
+
+<p id="description"></p>
+<div id="console"></div>
+
+<script>
+
+    description("This tests that you can set the value of a contenteditable element.");
+
+    if (window.accessibilityController) {
+        jsTestIsAsync = true;
+
+       accessibilityController.addNotificationListener(function(element, notification) {
+          if (notification == "AXValueChanged") {
+               debug("Value change notification received"); 
+               var axElement = accessibilityController.accessibleElementById("contenteditable");
+               debug("Updated Value: " + axElement.stringValue);
+               document.getElementById("content").style.visibility = "hidden";
+               accessibilityController.removeNotificationListener();
+               finishJSTest();
+          }
+       });
+
+        function testElement(idValue) {
+            var axElement = accessibilityController.accessibleElementById(idValue);
+            debug("Role: " + axElement.role);
+            debug("Value: " + axElement.stringValue);
+        
+            var writable = axElement.isAttributeSettable("AXValue");
+            debug("Writable: " + writable);
+
+            axElement.setValue("new value");
+        }
+
+        debug("\nContenteditable");
+        testElement("contenteditable");
+
+    } else {
+        testFailed("Could not load accessibility controller");
+    }
+
+</script>
+
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
index fdf05c7..159b8b8 100644 (file)
@@ -1,3 +1,17 @@
+2017-06-29  Chris Fleizach  <cfleizach@apple.com>
+
+        AX: Cannot call setValue() on contenteditable or ARIA text controls
+        https://bugs.webkit.org/show_bug.cgi?id=173520
+
+        Reviewed by Ryosuke Niwa.
+
+        Add support for changing the value of a contenteditable and any other aria text control in setValue().
+        Test: accessibility/mac/set-value-editable-types.html
+
+        * accessibility/AccessibilityRenderObject.cpp:
+        (WebCore::AccessibilityRenderObject::setValue):
+
 2017-06-28  Simon Fraser  <simon.fraser@apple.com>
 
         getBoundingClientRect returns wrong value for combination of page zoom and scroll
index 0a8bfe2..4f0dd0e 100644 (file)
@@ -1743,16 +1743,15 @@ void AccessibilityRenderObject::setValue(const String& string)
     if (!m_renderer || !is<Element>(m_renderer->node()))
         return;
     Element& element = downcast<Element>(*m_renderer->node());
-
-    if (!is<RenderBoxModelObject>(*m_renderer))
-        return;
-    RenderBoxModelObject& renderer = downcast<RenderBoxModelObject>(*m_renderer);
-
+    RenderObject& renderer = *m_renderer;
+    
     // FIXME: Do we want to do anything here for ARIA textboxes?
     if (renderer.isTextField() && is<HTMLInputElement>(element))
         downcast<HTMLInputElement>(element).setValue(string);
     else if (renderer.isTextArea() && is<HTMLTextAreaElement>(element))
         downcast<HTMLTextAreaElement>(element).setValue(string);
+    else if (is<HTMLElement>(element) && contentEditableAttributeIsEnabled(&element))
+        downcast<HTMLElement>(element).setInnerText(string);
 }
 
 bool AccessibilityRenderObject::supportsARIAOwns() const
index fee85a6..d0bda50 100644 (file)
@@ -1,3 +1,19 @@
+2017-06-29  Chris Fleizach  <cfleizach@apple.com>
+
+        AX: Cannot call setValue() on contenteditable or ARIA text controls
+        https://bugs.webkit.org/show_bug.cgi?id=173520
+
+        Reviewed by Ryosuke Niwa.
+
+        Add setValue() method to WKTR (already existed in DRT).
+
+        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp:
+        (WTR::AccessibilityUIElement::setValue):
+        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h:
+        * WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl:
+        * WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:
+        (WTR::AccessibilityUIElement::setValue):
+
 2017-06-28  Simon Fraser  <simon.fraser@apple.com>
 
         getBoundingClientRect returns wrong value for combination of page zoom and scroll
index 25814e4..95cd26a 100644 (file)
@@ -89,6 +89,7 @@ JSRetainPtr<JSStringRef> AccessibilityUIElement::sentenceAtOffset(int) { return
 RefPtr<AccessibilityTextMarkerRange> AccessibilityUIElement::selectedTextMarkerRange() { return nullptr; }
 void AccessibilityUIElement::resetSelectedTextMarkerRange() { }
 void AccessibilityUIElement::setBoolAttributeValue(JSStringRef, bool) { }
+void AccessibilityUIElement::setValue(JSStringRef) { }
 #endif
 
 #if !PLATFORM(COCOA) || !HAVE(ACCESSIBILITY)
index 571dea3..4a27253 100644 (file)
@@ -110,6 +110,7 @@ public:
     bool isPressActionSupported();
     bool isIncrementActionSupported();
     bool isDecrementActionSupported();
+    void setValue(JSStringRef);
     JSRetainPtr<JSStringRef> role();
     JSRetainPtr<JSStringRef> subrole();
     JSRetainPtr<JSStringRef> roleDescription();
index c1778f7..be0d646 100644 (file)
@@ -69,6 +69,7 @@ interface AccessibilityUIElement {
     boolean isPressActionSupported();
     boolean isIncrementActionSupported();
     boolean isDecrementActionSupported();
+    void setValue(DOMString value);
 
     readonly attribute DOMString stringValue;
     readonly attribute long intValue;
index a4966af..4a97a81 100644 (file)
@@ -589,7 +589,14 @@ void AccessibilityUIElement::setBoolAttributeValue(JSStringRef attribute, bool v
     [m_element _accessibilitySetTestValue:@(value) forAttribute:[NSString stringWithJSStringRef:attribute]];
     END_AX_OBJC_EXCEPTIONS
 }
-
+    
+void AccessibilityUIElement::setValue(JSStringRef value)
+{
+    BEGIN_AX_OBJC_EXCEPTIONS
+    [m_element accessibilitySetValue:[NSString stringWithJSStringRef:value] forAttribute:NSAccessibilityValueAttribute];
+    END_AX_OBJC_EXCEPTIONS
+}
+    
 bool AccessibilityUIElement::isAttributeSettable(JSStringRef attribute)
 {
     BEGIN_AX_OBJC_EXCEPTIONS