[iOS 14] A couple of tests in editing/selection/ios fail after <rdar://problem/60978283>
authorwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 29 Jun 2020 23:58:59 +0000 (23:58 +0000)
committerwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 29 Jun 2020 23:58:59 +0000 (23:58 +0000)
https://bugs.webkit.org/show_bug.cgi?id=213746
More work towards <rdar://problem/64808138>

Reviewed by Devin Rousso.

The UIKit change in <rdar://problem/60978283> adjusts text interaction behaviors such that a long press gesture
while editing makes a new caret selection, rather than a new word-granularity selection. Tweak a couple of
layout tests in editing/selection/ios that currently assume that long presses while editing will select a word.

* editing/selection/ios/select-text-in-existing-selection-expected.txt:
* editing/selection/ios/select-text-in-existing-selection.html:

This test verifies that the selection can be changed by making a long press inside an existing selection.
However, it now fails after the changes in <rdar://problem/60978283> because it expects the selected text to be
"jumped", but instead, the selection ends up being a caret inside the word "jumped". Tweak this test to verify
that the selection anchors' common ancestor node is the text node with the text "jumped" instead, to handle both
possibilities (where a long press selects a word vs. sets a caret selection).

* editing/selection/ios/selection-extends-into-overflow-area.html:

This test verifies the position and size of a ranged selection made inside content that visibly overflows its
parent container. It now fails because it tries to long press the word to make a selection; instead, use a
double tap gesture to make the word selection.

* resources/ui-helper.js:
(window.UIHelper.doubleTapElement):

Add a new helper method that double taps in the middle of the given element.

(window.UIHelper.callFunctionAndWaitForEvent):

Adjust this helper method to wait for the given function to resolve, if the given function returns a Promise.

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

LayoutTests/ChangeLog
LayoutTests/editing/selection/ios/select-text-in-existing-selection-expected.txt
LayoutTests/editing/selection/ios/select-text-in-existing-selection.html
LayoutTests/editing/selection/ios/selection-extends-into-overflow-area.html
LayoutTests/resources/ui-helper.js

index 767deea..51a3fa1 100644 (file)
@@ -1,3 +1,39 @@
+2020-06-29  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+        [iOS 14] A couple of tests in editing/selection/ios fail after <rdar://problem/60978283>
+        https://bugs.webkit.org/show_bug.cgi?id=213746
+        More work towards <rdar://problem/64808138>
+
+        Reviewed by Devin Rousso.
+
+        The UIKit change in <rdar://problem/60978283> adjusts text interaction behaviors such that a long press gesture
+        while editing makes a new caret selection, rather than a new word-granularity selection. Tweak a couple of
+        layout tests in editing/selection/ios that currently assume that long presses while editing will select a word.
+
+        * editing/selection/ios/select-text-in-existing-selection-expected.txt:
+        * editing/selection/ios/select-text-in-existing-selection.html:
+
+        This test verifies that the selection can be changed by making a long press inside an existing selection.
+        However, it now fails after the changes in <rdar://problem/60978283> because it expects the selected text to be
+        "jumped", but instead, the selection ends up being a caret inside the word "jumped". Tweak this test to verify
+        that the selection anchors' common ancestor node is the text node with the text "jumped" instead, to handle both
+        possibilities (where a long press selects a word vs. sets a caret selection).
+
+        * editing/selection/ios/selection-extends-into-overflow-area.html:
+
+        This test verifies the position and size of a ranged selection made inside content that visibly overflows its
+        parent container. It now fails because it tries to long press the word to make a selection; instead, use a
+        double tap gesture to make the word selection.
+
+        * resources/ui-helper.js:
+        (window.UIHelper.doubleTapElement):
+
+        Add a new helper method that double taps in the middle of the given element.
+
+        (window.UIHelper.callFunctionAndWaitForEvent):
+
+        Adjust this helper method to wait for the given function to resolve, if the given function returns a Promise.
+
 2020-06-29  Peng Liu  <peng.liu6@apple.com>
 
         Video spills over PiP screen a little when using Picture in Picture
index 5eebb83..0be68ba 100644 (file)
@@ -1,10 +1,10 @@
 The quick brown fox jumped over the lazy dog.
-This test verifies that the selection can be modified via long press inside an existing selection. To manually test, select all the text in the editable area and long press on a word to select it.
+This test verifies that the selection can be modified via long press inside an existing selection. To manually test, select all the text in the editable area and long press on a word to change the selection.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS getSelection().toString() is "jumped"
+PASS getSelection().getRangeAt(0).commonAncestorContainer is target.childNodes[0]
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 6973795..5b1609f 100644 (file)
@@ -12,9 +12,9 @@ body, html {
 
 div[contenteditable] {
     width: 300px;
-    height: 300px;
+    height: 400px;
     border: 1px solid black;
-    font-size: 32px;
+    font-size: 64px;
 }
 </style>
 </head>
@@ -24,19 +24,18 @@ div[contenteditable] {
 <p id="console"></p>
 <script>
 jsTestIsAsync = true;
-description("This test verifies that the selection can be modified via long press inside an existing selection. To manually test, select all the text in the editable area and long press on a word to select it.");
+let editor = document.querySelector("div[contenteditable]");
+let target = document.getElementById("target");
+
+description("This test verifies that the selection can be modified via long press inside an existing selection. To manually test, select all the text in the editable area and long press on a word to change the selection.");
 document.addEventListener("dragstart", event => event.preventDefault());
 
 addEventListener("load", async () => {
-    const editor = document.querySelector("div[contenteditable]");
-    const longPressTarget = document.getElementById("target");
-
     await UIHelper.activateElementAndWaitForInputSession(editor);
     document.execCommand("SelectAll");
     await UIHelper.waitForSelectionToAppear();
-    await UIHelper.longPressElement(longPressTarget);
-
-    shouldBeEqualToString("getSelection().toString()", "jumped");
+    await UIHelper.longPressElement(target);
+    shouldBe("getSelection().getRangeAt(0).commonAncestorContainer", "target.childNodes[0]");
     finishJSTest();
 });
 </script>
index 73fcbeb..c1ae1cd 100644 (file)
             testRunner.waitUntilDone();
         }
 
-        function selectTextAt(tapX, tapY)
-        {
-            return new Promise(resolve => {
-                testRunner.runUIScript(`
-                    (function() {
-                        uiController.longPressAtPoint(${tapX}, ${tapY}, function() {
-                            uiController.uiScriptComplete("Done");
-                        });
-                    })();`, resolve);
-            });
-        }
-
         function rectToString(rect)
         {
             return `(left = ${Math.round(rect.left)}, top = ${Math.round(rect.top)}, width = ${Math.round(rect.width)}, height = ${Math.round(rect.height)})`;
         {
             let container = document.getElementById('editable');
             await UIHelper.activateAndWaitForInputSessionAt(25, 25);
-
-            await selectTextAt(25, 400)
-            const selectionRects = await UIHelper.getUISelectionRects();
+            await UIHelper.callFunctionAndWaitForEvent(() => UIHelper.doubleTapElement(target), document, "selectionchange");
+            await UIHelper.ensurePresentationUpdate();
             let rectsString = "";
-            for (let rect of selectionRects)
+            for (let rect of await UIHelper.getUISelectionRects())
                 rectsString += rectToString(rect) + ' ';
 
             document.querySelector("#selection-rects").textContent = rectsString;
@@ -81,7 +68,7 @@
         line<br>
         line<br>
         line<br>
-        line<br>
+        <span id="target">line</span><br>
         line<br>
         line<br>
         line<br>
index 79d0c76..be084a3 100644 (file)
@@ -129,6 +129,13 @@ window.UIHelper = class UIHelper {
         });
     }
 
+    static doubleTapElement(element, delay = 0)
+    {
+        const x = element.offsetLeft + (element.offsetWidth / 2);
+        const y = element.offsetTop + (element.offsetHeight / 2);
+        this.doubleTapAt(x, y, delay);
+    }
+
     static doubleTapAt(x, y, delay = 0)
     {
         console.assert(this.isIOSFamily());
@@ -1090,9 +1097,21 @@ window.UIHelper = class UIHelper {
 
     static callFunctionAndWaitForEvent(functionToCall, target, eventName)
     {
-        return new Promise((resolve) => {
-            target.addEventListener(eventName, resolve, { once: true });
-            functionToCall();
+        return new Promise(async resolve => {
+            let event;
+            await Promise.all([
+                new Promise((eventListenerResolve) => {
+                    target.addEventListener(eventName, (e) => {
+                        event = e;
+                        eventListenerResolve();
+                    }, {once: true});
+                }),
+                new Promise(async functionResolve => {
+                    await functionToCall();
+                    functionResolve();
+                })
+            ]);
+            resolve(event);
         });
     }