AX: Incorrect range from index and length in contenteditable with <p> tags
authorn_wang@apple.com <n_wang@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 26 Jul 2017 16:53:09 +0000 (16:53 +0000)
committern_wang@apple.com <n_wang@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 26 Jul 2017 16:53:09 +0000 (16:53 +0000)
https://bugs.webkit.org/show_bug.cgi?id=174856

Reviewed by Chris Fleizach.

Source/WebCore:

When asking for the string inside a text control with a given range, we sometimes get
a wrong string at the line boundary due to a bad plain range to text marker conversion.
To fix this, we should use the exsisting method on text controls to avoid this issue.

Updated the test to test the problematic case.

* accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(-[WebAccessibilityObjectWrapper accessibilityAttributeValue:forParameter:]):

LayoutTests:

* accessibility/mac/range-for-contenteditable-newline-expected.txt:
* accessibility/mac/range-for-contenteditable-newline.html:

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

LayoutTests/ChangeLog
LayoutTests/accessibility/mac/range-for-contenteditable-newline-expected.txt
LayoutTests/accessibility/mac/range-for-contenteditable-newline.html
Source/WebCore/ChangeLog
Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm

index c566414..1daf364 100644 (file)
@@ -1,3 +1,13 @@
+2017-07-26  Nan Wang  <n_wang@apple.com>
+
+        AX: Incorrect range from index and length in contenteditable with <p> tags
+        https://bugs.webkit.org/show_bug.cgi?id=174856
+
+        Reviewed by Chris Fleizach.
+
+        * accessibility/mac/range-for-contenteditable-newline-expected.txt:
+        * accessibility/mac/range-for-contenteditable-newline.html:
+
 2017-07-26  Ms2ger  <Ms2ger@igalia.com>
 
         Remove obsolete failure annotation for bad-charset-alias.html.
index d7a6564..c87b008 100644 (file)
@@ -7,9 +7,9 @@ abc
 
 
 def
-The quick brown fox
+ab
 
-jumped over the lazy dog
+cd ef
 
 Text in a pre element
 is displayed in a fixed-width
@@ -26,14 +26,11 @@ PASS textTest is 'test'
 PASS textareaTextHello is 'hello'
 PASS textareaTextWorld is 'world'
 PASS textDEF is 'def'
-PASS rangeForLine is '{21, 25}'
-PASS textLine is 'jumped over the lazy dog'
-PASS firstLine is 0
-PASS secondLine is 1
+PASS rangeValue is '[newline][newline]cd'
 PASS rangeForLine is '{22, 30}'
 PASS textLine is 'is displayed in a fixed-width\n'
 PASS firstLine is 0
-FAIL secondLine should be 1. Was 2.
+PASS secondLine is 1
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 9e28901..29007d8 100644 (file)
@@ -13,8 +13,8 @@ world</textarea>
 <div id="textcontrol2" contenteditable="true">abc<div><br></div<div><br></div><div><br></div><div>def</div></div>
 
 <div id="textcontrol3" contenteditable="true">
-<p>The quick brown fox</p>
-<p>jumped over the lazy dog</p>
+<p>ab</p>
+<p>cd ef</p>
 </div>
 
 <div id="textcontrol4" contenteditable="true">
@@ -59,14 +59,10 @@ font
     
     // Test line ranges in contenteditable
     var textControl3 = accessibilityController.accessibleElementById("textcontrol3");
-    var rangeForLine = textControl3.rangeForLine(1);
-    shouldBe("rangeForLine", "'{21, 25}'");
-    var textLine = textControl3.stringForRange(21, 25);
-    shouldBe("textLine", "'jumped over the lazy dog'");
-    var firstLine = textControl3.lineForIndex(20);
-    var secondLine = textControl3.lineForIndex(46);
-    shouldBe("firstLine", "0");
-    shouldBe("secondLine", "1");
+    var rangeValue = textControl3.stringForRange(2, 4);
+    // Replace the newline characters, and make sure it has two of them
+    rangeValue = rangeValue.replace(/(?:\r\n|\r|\n)/g, '[newline]'); 
+    shouldBe("rangeValue", "'[newline][newline]cd'");
     
     // pre tag in contenteditable
     var textControl4 = accessibilityController.accessibleElementById("textcontrol4");
@@ -75,7 +71,7 @@ font
     textLine = textControl4.stringForRange(22, 30);
     shouldBe("textLine", "'is displayed in a fixed-width\\n'");
     firstLine = textControl4.lineForIndex(21);
-    secondLine = textControl4.lineForIndex(52);
+    secondLine = textControl4.lineForIndex(51);
     shouldBe("firstLine", "0");
     shouldBe("secondLine", "1");
 
index 8b2f948..e8873e3 100644 (file)
@@ -1,3 +1,19 @@
+2017-07-26  Nan Wang  <n_wang@apple.com>
+
+        AX: Incorrect range from index and length in contenteditable with <p> tags
+        https://bugs.webkit.org/show_bug.cgi?id=174856
+
+        Reviewed by Chris Fleizach.
+
+        When asking for the string inside a text control with a given range, we sometimes get
+        a wrong string at the line boundary due to a bad plain range to text marker conversion.
+        To fix this, we should use the exsisting method on text controls to avoid this issue. 
+
+        Updated the test to test the problematic case.
+
+        * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
+        (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:forParameter:]):
+
 2017-07-26  Daewoong Jang  <daewoong.jang@navercorp.com>
 
         [Curl] Bug fix after r219606
index b1edf27..eec17d8 100644 (file)
@@ -3960,6 +3960,11 @@ static void formatForDebugger(const VisiblePositionRange& range, char* buffer, u
     }
     
     if ([attribute isEqualToString:NSAccessibilityStringForRangeParameterizedAttribute]) {
+        if (m_object->isTextControl()) {
+            PlainTextRange plainTextRange = PlainTextRange(range.location, range.length);
+            return m_object->doAXStringForRange(plainTextRange);
+        }
+        
         CharacterOffset start = cache->characterOffsetForIndex(range.location, m_object);
         CharacterOffset end = cache->characterOffsetForIndex(range.location + range.length, m_object);
         if (start.isNull() || end.isNull())