Title: [198768] trunk
Revision
198768
Author
cfleiz...@apple.com
Date
2016-03-28 17:42:32 -0700 (Mon, 28 Mar 2016)

Log Message

AX: iOS: Can't navigate inside ContentEditable fields with voiceover enabled
https://bugs.webkit.org/show_bug.cgi?id=155942

Reviewed by Joanmarie Diggs.

Source/WebCore:

The code to set the selected text range on a non-native text control (like a contenteditable) was either
wrong or broke at some point. It assumed that creating a Position with the contenteditable node with the right
offset would make a valid Position, but it almost never did.

Instead we can use this helper method to create a valid Position.

Test: accessibility/set-selected-text-range-contenteditable.html

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

LayoutTests:

* accessibility/set-selected-text-range-contenteditable-expected.txt: Added.
* accessibility/set-selected-text-range-contenteditable.html: Added.
* platform/efl/TestExpectations:
* platform/gtk/TestExpectations:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (198767 => 198768)


--- trunk/LayoutTests/ChangeLog	2016-03-29 00:36:59 UTC (rev 198767)
+++ trunk/LayoutTests/ChangeLog	2016-03-29 00:42:32 UTC (rev 198768)
@@ -1,3 +1,15 @@
+2016-03-28  Chris Fleizach  <cfleiz...@apple.com>
+
+        AX: iOS: Can't navigate inside ContentEditable fields with voiceover enabled
+        https://bugs.webkit.org/show_bug.cgi?id=155942
+
+        Reviewed by Joanmarie Diggs.
+
+        * accessibility/set-selected-text-range-contenteditable-expected.txt: Added.
+        * accessibility/set-selected-text-range-contenteditable.html: Added.
+        * platform/efl/TestExpectations:
+        * platform/gtk/TestExpectations:
+
 2016-03-28  Gyuyoung Kim  <gyuyoung....@webkit.org>
 
         Unreviewed EFL gardening on 29th Mar.

Added: trunk/LayoutTests/accessibility/set-selected-text-range-contenteditable-expected.txt (0 => 198768)


--- trunk/LayoutTests/accessibility/set-selected-text-range-contenteditable-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/accessibility/set-selected-text-range-contenteditable-expected.txt	2016-03-29 00:42:32 UTC (rev 198768)
@@ -0,0 +1,29 @@
+hello world test
+This tests that selected text ranges can be set on a contenteditable element.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Initial selected range: {1, 0}
+
+Set range: {3, 0}
+PASS content.selectedTextRange became '{3, 0}'
+
+Set range: {100, 0}
+PASS content.selectedTextRange became '{16, 0}'
+
+Set range: {0, 0}
+PASS content.selectedTextRange became '{0, 0}'
+
+Set range: {1, 12}
+PASS content.selectedTextRange became '{1, 12}'
+
+Set range: {-1, 0}
+PASS content.selectedTextRange became '{0, 0}'
+
+Set range: {7, 3}
+PASS content.selectedTextRange became '{7, 3}'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/accessibility/set-selected-text-range-contenteditable.html (0 => 198768)


--- trunk/LayoutTests/accessibility/set-selected-text-range-contenteditable.html	                        (rev 0)
+++ trunk/LayoutTests/accessibility/set-selected-text-range-contenteditable.html	2016-03-29 00:42:32 UTC (rev 198768)
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<meta charset="utf-8">
+<script src=""
+</head>
+<body id="body">
+
+<div contenteditable id="content" tabindex="0">hello <b>world</b> test</div>
+
+<p id="description"></p>
+<div id="console"></div>
+
+<script>
+
+    description("This tests that selected text ranges can be set on a contenteditable element.");
+
+
+    if (window.accessibilityController) {
+        window.jsTestIsAsync = true;
+
+        document.getElementById("content").focus();
+        var sel = window.getSelection();
+        var range = document.createRange();
+        range.setStart(sel.anchorNode, 1);
+        range.setEnd(sel.anchorNode, 1);
+        sel.removeAllRanges();
+        sel.addRange(range);
+
+        var content = accessibilityController.accessibleElementById("content");
+        debug("Initial selected range: " + content.selectedTextRange);
+
+        debug("\nSet range: {3, 0}");
+        content.setSelectedTextRange(3, 0);
+        shouldBecomeEqual("content.selectedTextRange", "'{3, 0}'", function() {
+            debug("\nSet range: {100, 0}");
+            content.setSelectedTextRange(100, 0);
+            shouldBecomeEqual("content.selectedTextRange", "'{16, 0}'", function() {
+                debug("\nSet range: {0, 0}");
+                content.setSelectedTextRange(0, 0);
+                shouldBecomeEqual("content.selectedTextRange", "'{0, 0}'", function() {
+                    debug("\nSet range: {1, 12}");
+                    content.setSelectedTextRange(1, 12);
+                    shouldBecomeEqual("content.selectedTextRange", "'{1, 12}'", function() {
+                        debug("\nSet range: {-1, 0}");
+                        content.setSelectedTextRange(-1, 0);
+                        shouldBecomeEqual("content.selectedTextRange", "'{0, 0}'", function() {
+                            debug("\nSet range: {7, 3}");
+                            content.setSelectedTextRange(7, 3);
+                            shouldBecomeEqual("content.selectedTextRange", "'{7, 3}'", finishJSTest);
+                        });
+                    });
+                });
+            });
+        }); 
+    }
+
+</script>
+
+<script src=""
+</body>
+</html>

Modified: trunk/LayoutTests/platform/efl/TestExpectations (198767 => 198768)


--- trunk/LayoutTests/platform/efl/TestExpectations	2016-03-29 00:36:59 UTC (rev 198767)
+++ trunk/LayoutTests/platform/efl/TestExpectations	2016-03-29 00:42:32 UTC (rev 198768)
@@ -2103,6 +2103,7 @@
 webkit.org/b/112014 accessibility/textarea-insertion-point-line-number.html [ Failure ]
 webkit.org/b/112018 accessibility/th-as-title-ui.html [ Failure ]
 webkit.org/b/112021 accessibility/visible-elements.html [ Failure Crash ]
+webkit.org/b/133148 accessibility/set-selected-text-range-contenteditable.html [ Skip ]
 
 # New accessibility test added in r151079 that is failing for EFL.
 webkit.org/b/117182 accessibility/text-role-with-aria-hidden-inside.html [ Failure ]

Modified: trunk/LayoutTests/platform/gtk/TestExpectations (198767 => 198768)


--- trunk/LayoutTests/platform/gtk/TestExpectations	2016-03-29 00:36:59 UTC (rev 198767)
+++ trunk/LayoutTests/platform/gtk/TestExpectations	2016-03-29 00:42:32 UTC (rev 198768)
@@ -88,6 +88,7 @@
 webkit.org/b/98348 accessibility/radio-button-group-members.html [ Skip ]
 webkit.org/b/141074 accessibility/auto-filled-value.html [ Skip ]
 webkit.org/b/133148 accessibility/content-editable-as-textarea.html [ Skip ]
+webkit.org/b/133148 accessibility/set-selected-text-range-contenteditable.html [ Skip ]
 
 # Feature disabled, see: https://bugs.webkit.org/show_bug.cgi?id=85425
 webkit.org/b/98925 fast/viewport/viewport-legacy-handheldfriendly.html [ Skip ]

Modified: trunk/Source/WebCore/ChangeLog (198767 => 198768)


--- trunk/Source/WebCore/ChangeLog	2016-03-29 00:36:59 UTC (rev 198767)
+++ trunk/Source/WebCore/ChangeLog	2016-03-29 00:42:32 UTC (rev 198768)
@@ -1,3 +1,21 @@
+2016-03-28  Chris Fleizach  <cfleiz...@apple.com>
+
+        AX: iOS: Can't navigate inside ContentEditable fields with voiceover enabled
+        https://bugs.webkit.org/show_bug.cgi?id=155942
+
+        Reviewed by Joanmarie Diggs.
+
+        The code to set the selected text range on a non-native text control (like a contenteditable) was either
+        wrong or broke at some point. It assumed that creating a Position with the contenteditable node with the right
+        offset would make a valid Position, but it almost never did.
+
+        Instead we can use this helper method to create a valid Position.
+
+        Test: accessibility/set-selected-text-range-contenteditable.html
+
+        * accessibility/AccessibilityRenderObject.cpp:
+        (WebCore::AccessibilityRenderObject::setSelectedTextRange):
+
 2016-03-28  Alex Christensen  <achristen...@webkit.org>
 
         Fix Ninja build on Mac

Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp (198767 => 198768)


--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp	2016-03-29 00:36:59 UTC (rev 198767)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp	2016-03-29 00:42:32 UTC (rev 198768)
@@ -1499,18 +1499,17 @@
 
 void AccessibilityRenderObject::setSelectedTextRange(const PlainTextRange& range)
 {
+    setTextSelectionIntent(axObjectCache(), range.length ? AXTextStateChangeTypeSelectionExtend : AXTextStateChangeTypeSelectionMove);
+
     if (isNativeTextControl()) {
-        setTextSelectionIntent(axObjectCache(), range.length ? AXTextStateChangeTypeSelectionExtend : AXTextStateChangeTypeSelectionMove);
         HTMLTextFormControlElement& textControl = downcast<RenderTextControl>(*m_renderer).textFormControlElement();
         textControl.setSelectionRange(range.start, range.start + range.length);
-        clearTextSelectionIntent(axObjectCache());
-        return;
+    } else {
+        VisiblePosition start = visiblePositionForIndexUsingCharacterIterator(node(), range.start);
+        VisiblePosition end = visiblePositionForIndexUsingCharacterIterator(node(), range.start + range.length);
+        m_renderer->frame().selection().setSelection(VisibleSelection(start, end), FrameSelection::defaultSetSelectionOptions(UserTriggered));
     }
-
-    Node* node = m_renderer->node();
-    VisibleSelection newSelection(Position(node, range.start, Position::PositionIsOffsetInAnchor), Position(node, range.start + range.length, Position::PositionIsOffsetInAnchor), DOWNSTREAM);
-    setTextSelectionIntent(axObjectCache(), range.length ? AXTextStateChangeTypeSelectionExtend : AXTextStateChangeTypeSelectionMove);
-    m_renderer->frame().selection().setSelection(newSelection, FrameSelection::defaultSetSelectionOptions());
+    
     clearTextSelectionIntent(axObjectCache());
 }
 
@@ -2848,7 +2847,6 @@
 
 bool AccessibilityRenderObject::canSetValueAttribute() const
 {
-
     // In the event of a (Boolean)@readonly and (True/False/Undefined)@aria-readonly
     // value mismatch, the host language native attribute value wins.    
     if (isNativeTextControl())
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to