Autocorrection makes it hard to type "doesn't" and to type @ in email addresses
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 28 May 2016 19:18:48 +0000 (19:18 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 28 May 2016 19:18:48 +0000 (19:18 +0000)
commite346d3057f7f7b937e6ab1d6ec6502bee38f6fe4
tree0c3bd8ccbb2a29e30211308ada1da1af688b57ee
parent081c7702796e949fa073a04f024292d9931dc848
Autocorrection makes it hard to type "doesn't" and to type @ in email addresses
https://bugs.webkit.org/show_bug.cgi?id=158177
.:

Reviewed by Darin Adler.

Fixed manual tests for autocorrection panels and added a manual test for . Most of changes are fixing up the path to LayoutTests/editing/editing.js.

Also wrap many steps to type in a space or delete a character inside setTimeout since autocorrection happens on a timer
and the fact WebKit2 communicates with NSSpellChecker via IPC makes the behavior even more indeterministic.

* ManualTests/autocorrection/autocorrection-at-mark.html: Added.
* ManualTests/autocorrection/autocorrection-cancelled-by-ESC.html:
* ManualTests/autocorrection/autocorrection-cancelled-by-typing-1.html:
* ManualTests/autocorrection/autocorrection-contraction-2.html: Added.
* ManualTests/autocorrection/autocorrection-contraction.html:
* ManualTests/autocorrection/autocorrection-in-iframe.html:
* ManualTests/autocorrection/close-window-when-correction-is-shown.html:
* ManualTests/autocorrection/continue-typing-to-dismiss-reversion.html:
* ManualTests/autocorrection/delete-to-dismiss-reversion.html:
* ManualTests/autocorrection/delete-to-end-of-word-to-show-reversion.html:
* ManualTests/autocorrection/dismiss-multiple-guesses.html:
* ManualTests/autocorrection/document-for-iframe-test.html: Removed.
* ManualTests/autocorrection/move-to-end-of-word-to-show-reversion.html: Type a space and move care in setTimeout as
the reversion panel wouldn't show up otherwise.
* ManualTests/autocorrection/remove-misspelling-marker-after-appending-letter.html: Delay the typing of a space as well as
deleting letters since autocorrection panel wouldn't show up in time otherwise, and deleting character immediately would
reject the autocorrection instead of accepting it. Also removed the steps to add back the spellchecking marker and extracted
it as a separate test.
* ManualTests/autocorrection/removing-misspelling-marker-after-appending-letter-2.html: Copied. This test continues the full
scenario in the previous test by typing a space and deleting the character, thereby bringing up spellchecking marker.
* ManualTests/autocorrection/resources: Added.
* ManualTests/autocorrection/resources/document-for-iframe-test.html: Moved from ManualTests/autocorrection/.
* ManualTests/autocorrection/select-from-multiple-guesses.html: Added a missing instruction.
* ManualTests/autocorrection/spell-checking-after-reversion.html:
* ManualTests/autocorrection/type-whitespace-to-dismiss-reversion.html: Delay the typing of a space and moving the selection
since the reversion panel wouldn't show up otherwise.
* ManualTests/autocorrection/undo-autocorrection-2.html: Copied. Automated most of steps in the second test case.
* ManualTests/autocorrection/undo-autocorrection.html:

Source/WebCore:

<rdar://problem/20490862>
<rdar://problem/24707954>

Reviewed by Darin Adler.

When the user had typed "doesn'", some unified spellchecker may try to autocorrect it to "doesn't" or "does"
but we should ignore this for a moment until the next character is typed by the user. The code to deal with
this situation which checks the existence of an "ambiguous boundary character" was not robust when the
replacement text was longer than the corrected text.

Fixed this bug by fixing the logic to detect this case. Also added '@' as an ambiguous boundary character
since autocorrecting letters that appear right before '@' would not be useful in many cases.

Tests: ManualTests/autocorrection/autocorrection-at-mark.html
       ManualTests/autocorrection/autocorrection-contraction-2.html

* editing/AlternativeTextController.cpp:
(WebCore::AlternativeTextController::timerFired): Fixed a bug that we can show an empty reversion panel.
* editing/Editor.cpp:
(WebCore::Editor::markAndReplaceFor): When the user had typed "doesn'" and our autocorrection result is
"doesn't", resultEndLocation (the end of "doesn't") is larger than selectionOffset (the end of "doesn'").
When the correction is "does", resultEndLocation (the end of "does") is one less than selectionOffset.
Updated the condition to deal with both of these conditions as well as cases where the correction result
contains more than one letter after '.
* editing/htmlediting.cpp:
(WebCore::isAmbiguousBoundaryCharacter): Moved from the header file since this is not a hot function and
doesn't need to be inlined everywhere. Added '@' as an ambiguous boundary character.
* editing/htmlediting.h:
(WebCore::isAmbiguousBoundaryCharacter): Moved to the cpp file.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@201490 268f45cc-cd09-0410-ab3c-d52691b4dbfc
25 files changed:
ChangeLog
ManualTests/autocorrection/autocorrection-at-mark.html [new file with mode: 0644]
ManualTests/autocorrection/autocorrection-cancelled-by-ESC.html
ManualTests/autocorrection/autocorrection-cancelled-by-typing-1.html
ManualTests/autocorrection/autocorrection-contraction.html
ManualTests/autocorrection/autocorrection-in-iframe.html
ManualTests/autocorrection/close-window-when-correction-is-shown.html
ManualTests/autocorrection/continue-typing-to-dismiss-reversion.html
ManualTests/autocorrection/delete-to-dismiss-reversion.html
ManualTests/autocorrection/delete-to-end-of-word-to-show-reversion.html
ManualTests/autocorrection/dismiss-multiple-guesses.html
ManualTests/autocorrection/move-to-end-of-word-to-show-reversion.html
ManualTests/autocorrection/remove-misspelling-marker-after-appending-letter.html
ManualTests/autocorrection/removing-misspelling-marker-after-appending-letter-2.html [new file with mode: 0644]
ManualTests/autocorrection/resources/document-for-iframe-test.html [moved from ManualTests/autocorrection/document-for-iframe-test.html with 83% similarity]
ManualTests/autocorrection/select-from-multiple-guesses.html
ManualTests/autocorrection/spell-checking-after-reversion.html
ManualTests/autocorrection/type-whitespace-to-dismiss-reversion.html
ManualTests/autocorrection/undo-autocorrection-2.html [new file with mode: 0644]
ManualTests/autocorrection/undo-autocorrection.html
Source/WebCore/ChangeLog
Source/WebCore/editing/AlternativeTextController.cpp
Source/WebCore/editing/Editor.cpp
Source/WebCore/editing/htmlediting.cpp
Source/WebCore/editing/htmlediting.h