[iOS] Spelling suggestions cannot be selected in focused form controls when zoomed in
authorwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 31 Jul 2018 20:19:08 +0000 (20:19 +0000)
committerwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 31 Jul 2018 20:19:08 +0000 (20:19 +0000)
https://bugs.webkit.org/show_bug.cgi?id=188107
<rdar://problem/42354250>

Reviewed by Tim Horton.

Source/WebCore:

After r232040, the synthetic click gesture recognizer was enabled when tapping inside of the focused element,
which allows the page to handle click events inside editable content. However, this means that codepaths in
EventHandler that are responsible for changing selection due to default click event behaviors on macOS are now
active on iOS; this conflicts with selection changes due to text interaction gestures, which are the existing
mechanism for modifying the selection on iOS.

To address this, we defer selection changes when clicking to text interaction gestures on iOS by tweaking the
default behavior of a click on iOS to /not/ change selection when moving within the same editable root. This is
similar to r233311, but in a different codepath that specifically handles selection changes when clicking on
content that is already selected.

Test: fast/forms/ios/click-should-not-suppress-misspelling.html

* page/EventHandler.cpp:
(WebCore::EventHandler::handleMouseReleaseEvent):

LayoutTests:

Adds a new test to verify that tapping in a misspelled word to bring up the spelling correction callout and
selection view does not immediately cause the selection to dismiss.

* fast/forms/ios/click-should-not-suppress-misspelling-expected.txt: Added.
* fast/forms/ios/click-should-not-suppress-misspelling.html: Added.

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

LayoutTests/ChangeLog
LayoutTests/fast/forms/ios/click-should-not-suppress-misspelling-expected.txt [new file with mode: 0644]
LayoutTests/fast/forms/ios/click-should-not-suppress-misspelling.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/page/EventHandler.cpp

index d0d2217..ca20d15 100644 (file)
@@ -1,3 +1,17 @@
+2018-07-31  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+        [iOS] Spelling suggestions cannot be selected in focused form controls when zoomed in
+        https://bugs.webkit.org/show_bug.cgi?id=188107
+        <rdar://problem/42354250>
+
+        Reviewed by Tim Horton.
+
+        Adds a new test to verify that tapping in a misspelled word to bring up the spelling correction callout and
+        selection view does not immediately cause the selection to dismiss.
+
+        * fast/forms/ios/click-should-not-suppress-misspelling-expected.txt: Added.
+        * fast/forms/ios/click-should-not-suppress-misspelling.html: Added.
+
 2018-07-31  Alex Christensen  <achristensen@webkit.org>
 
         Remove Yosemite test results.
diff --git a/LayoutTests/fast/forms/ios/click-should-not-suppress-misspelling-expected.txt b/LayoutTests/fast/forms/ios/click-should-not-suppress-misspelling-expected.txt
new file mode 100644 (file)
index 0000000..691e2b4
--- /dev/null
@@ -0,0 +1,6 @@
+PASS successfullyParsed is true
+
+TEST COMPLETE
+PASS input.selectionStart is 0
+PASS input.selectionEnd is 7
+
diff --git a/LayoutTests/fast/forms/ios/click-should-not-suppress-misspelling.html b/LayoutTests/fast/forms/ios/click-should-not-suppress-misspelling.html
new file mode 100644 (file)
index 0000000..0702485
--- /dev/null
@@ -0,0 +1,49 @@
+<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
+<html>
+<head>
+<script src="../../../resources/ui-helper.js"></script>
+<script src="../../../resources/js-test.js"></script>
+<style>
+html, body {
+    margin: 0;
+    width: 100%;
+    height: 100%;
+}
+
+input {
+    font-size: 320px;
+    display: block;
+}
+</style>
+</head>
+<body>
+<input id="input" value="covfefe">
+</body>
+<script>
+const input = document.getElementById("input");
+
+addEventListener("load", async () => {
+    if (window.testRunner) {
+        testRunner.dumpAsText();
+        testRunner.waitUntilDone();
+    } else {
+        description(`To manually test, tap the input field to bring up the keyboard, and then tap on a part of the word in
+            the input field that is far away from the editing caret. As a result, the contents of the input should be
+            selected and marked as a misspelled word.`);
+        return;
+    }
+
+    await UIHelper.activateAndWaitForInputSessionAt(100, 150);
+
+    input.addEventListener("click", () => {
+        setTimeout(() => {
+            shouldBe("input.selectionStart", "0");
+            shouldBe("input.selectionEnd", "7");
+            testRunner.notifyDone();
+        });
+    });
+
+    await UIHelper.tapAt(800, 150);
+});
+</script>
+</html>
index a8fb191..9ad8a32 100644 (file)
@@ -1,3 +1,27 @@
+2018-07-31  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+        [iOS] Spelling suggestions cannot be selected in focused form controls when zoomed in
+        https://bugs.webkit.org/show_bug.cgi?id=188107
+        <rdar://problem/42354250>
+
+        Reviewed by Tim Horton.
+
+        After r232040, the synthetic click gesture recognizer was enabled when tapping inside of the focused element,
+        which allows the page to handle click events inside editable content. However, this means that codepaths in
+        EventHandler that are responsible for changing selection due to default click event behaviors on macOS are now
+        active on iOS; this conflicts with selection changes due to text interaction gestures, which are the existing
+        mechanism for modifying the selection on iOS.
+
+        To address this, we defer selection changes when clicking to text interaction gestures on iOS by tweaking the
+        default behavior of a click on iOS to /not/ change selection when moving within the same editable root. This is
+        similar to r233311, but in a different codepath that specifically handles selection changes when clicking on
+        content that is already selected.
+
+        Test: fast/forms/ios/click-should-not-suppress-misspelling.html
+
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::handleMouseReleaseEvent):
+
 2018-07-31  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         Clean up TransformationMatrix implementation
index 26c89b0..c8b1447 100644 (file)
@@ -1050,12 +1050,21 @@ bool EventHandler::handleMouseReleaseEvent(const MouseEventWithHitTestResults& e
         VisibleSelection newSelection;
         Node* node = event.targetNode();
         bool caretBrowsing = m_frame.settings().caretBrowsingEnabled();
+        bool allowSelectionChanges = true;
         if (node && node->renderer() && (caretBrowsing || node->hasEditableStyle())) {
             VisiblePosition pos = node->renderer()->positionForPoint(event.localPoint(), nullptr);
             newSelection = VisibleSelection(pos);
+#if PLATFORM(IOS)
+            // On iOS, selection changes are triggered using platform-specific text interaction gestures rather than
+            // default behavior on click or mouseup. As such, the only time we should allow click events to change the
+            // selection on iOS is when we focus a different editable element, in which case the text interaction
+            // gestures will fail.
+            allowSelectionChanges = m_frame.selection().selection().rootEditableElement() != newSelection.rootEditableElement();
+#endif
         }
 
-        setSelectionIfNeeded(m_frame.selection(), newSelection);
+        if (allowSelectionChanges)
+            setSelectionIfNeeded(m_frame.selection(), newSelection);
 
         handled = true;
     }