Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Unified Diff: third_party/WebKit/Source/core/editing/suggestion/TextSuggestionControllerTest.cpp

Issue 2931443003: Add support for Android spellcheck menu in Chrome/WebViews (Closed)
Patch Set: Remove leftover traces Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/editing/suggestion/TextSuggestionControllerTest.cpp
diff --git a/third_party/WebKit/Source/core/editing/suggestion/TextSuggestionControllerTest.cpp b/third_party/WebKit/Source/core/editing/suggestion/TextSuggestionControllerTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..727912ccd6d4d0e6127efa82bcc7e61ec6c5ca3f
--- /dev/null
+++ b/third_party/WebKit/Source/core/editing/suggestion/TextSuggestionControllerTest.cpp
@@ -0,0 +1,260 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/editing/suggestion/TextSuggestionController.h"
+
+#include "core/editing/EditingTestBase.h"
+#include "core/editing/FrameSelection.h"
+#include "core/editing/markers/DocumentMarkerController.h"
+#include "core/editing/spellcheck/SpellChecker.h"
+
+namespace blink {
+
+class TextSuggestionControllerTest : public EditingTestBase {};
+
+TEST_F(TextSuggestionControllerTest, ApplySpellCheckSuggestion) {
+ SetBodyContent(
+ "<div contenteditable>"
+ "spllchck"
+ "</div>");
+ Element* div = GetDocument().QuerySelector("div");
+ Node* text = div->firstChild();
+
+ GetDocument().Markers().AddSpellingMarker(
+ EphemeralRange(Position(text, 0), Position(text, 8)));
+ // Select immediately before misspelling
+ GetDocument().GetFrame()->Selection().SetSelection(
+ SelectionInDOMTree::Builder()
+ .SetBaseAndExtent(Position(text, 0), Position(text, 0))
+ .Build());
+ GetDocument()
+ .GetFrame()
+ ->GetTextSuggestionController()
+ .ApplySpellCheckSuggestion("spellcheck");
+
+ EXPECT_EQ("spellcheck", text->textContent());
+}
+
+TEST_F(TextSuggestionControllerTest, DeleteActiveSuggestionRange_DeleteAtEnd) {
+ SetBodyContent(
+ "<div contenteditable>"
+ "word1 word2"
+ "</div>");
+ Element* div = GetDocument().QuerySelector("div");
+ Node* text = div->firstChild();
+
+ // Mark "word2" as misspelled
+ GetDocument().Markers().AddSpellingMarker(
+ EphemeralRange(Position(text, 6), Position(text, 11)));
+ // Select immediately before word2
+ GetDocument().GetFrame()->Selection().SetSelection(
+ SelectionInDOMTree::Builder()
+ .SetBaseAndExtent(Position(text, 6), Position(text, 6))
+ .Build());
+ GetDocument()
+ .GetFrame()
+ ->GetTextSuggestionController()
+ .DeleteActiveSuggestionRange();
+
+ EXPECT_EQ("word1\xA0", text->textContent());
+}
+
+TEST_F(TextSuggestionControllerTest,
+ DeleteActiveSuggestionRange_DeleteInMiddle) {
+ SetBodyContent(
+ "<div contenteditable>"
+ "word1 word2 word3"
+ "</div>");
+ Element* div = GetDocument().QuerySelector("div");
+ Node* text = div->firstChild();
+
+ // Mark "word2" as misspelled
+ GetDocument().Markers().AddSpellingMarker(
+ EphemeralRange(Position(text, 6), Position(text, 11)));
+ // Select immediately before word2
+ GetDocument().GetFrame()->Selection().SetSelection(
+ SelectionInDOMTree::Builder()
+ .SetBaseAndExtent(Position(text, 6), Position(text, 6))
+ .Build());
+ GetDocument()
+ .GetFrame()
+ ->GetTextSuggestionController()
+ .DeleteActiveSuggestionRange();
+
+ // One of the extra spaces around "word2" should have been removed
+ EXPECT_EQ("word1\xA0word3", text->textContent());
+}
+
+TEST_F(TextSuggestionControllerTest,
+ DeleteActiveSuggestionRange_DeleteAtBeginningWithSpaceAfter) {
+ SetBodyContent(
+ "<div contenteditable>"
+ "word1 word2"
+ "</div>");
+ Element* div = GetDocument().QuerySelector("div");
+ Node* text = div->firstChild();
+
+ // Mark "word1" as misspelled
+ GetDocument().Markers().AddSpellingMarker(
+ EphemeralRange(Position(text, 0), Position(text, 5)));
+ // Select immediately before word1
+ GetDocument().GetFrame()->Selection().SetSelection(
+ SelectionInDOMTree::Builder()
+ .SetBaseAndExtent(Position(text, 0), Position(text, 0))
+ .Build());
+ GetDocument()
+ .GetFrame()
+ ->GetTextSuggestionController()
+ .DeleteActiveSuggestionRange();
+
+ // The space after "word1" should have been removed (to avoid leaving an
+ // empty space at the beginning of the composition)
+ EXPECT_EQ("word2", text->textContent());
+}
+
+TEST_F(TextSuggestionControllerTest,
+ DeleteActiveSuggestionRange_DeleteEntireRange) {
+ SetBodyContent(
+ "<div contenteditable>"
+ "word1"
+ "</div>");
+ Element* div = GetDocument().QuerySelector("div");
+ Node* text = div->firstChild();
+
+ // Mark "word1" as misspelled
+ GetDocument().Markers().AddSpellingMarker(
+ EphemeralRange(Position(text, 0), Position(text, 5)));
+ // Select immediately before word1
+ GetDocument().GetFrame()->Selection().SetSelection(
+ SelectionInDOMTree::Builder()
+ .SetBaseAndExtent(Position(text, 0), Position(text, 0))
+ .Build());
+ GetDocument()
+ .GetFrame()
+ ->GetTextSuggestionController()
+ .DeleteActiveSuggestionRange();
+
+ EXPECT_EQ("", text->textContent());
+}
+
+// The following two cases test situations that shouldn't occur in normal use
+// (spellcheck markers not spanning a whole word), but are included anyway to
+// verify that DeleteActiveSuggestionRange() is well-behaved in these cases
+
+TEST_F(TextSuggestionControllerTest,
+ DeleteActiveSuggestionRange_DeleteRangeWithTextBeforeAndSpaceAfter) {
+ SetBodyContent(
+ "<div contenteditable>"
+ "word1word2 word3"
+ "</div>");
+ Element* div = GetDocument().QuerySelector("div");
+ Node* text = div->firstChild();
+
+ // Mark "word2" as misspelled
+ GetDocument().Markers().AddSpellingMarker(
+ EphemeralRange(Position(text, 5), Position(text, 10)));
+ // Select immediately before word2
+ GetDocument().GetFrame()->Selection().SetSelection(
+ SelectionInDOMTree::Builder()
+ .SetBaseAndExtent(Position(text, 5), Position(text, 5))
+ .Build());
+ GetDocument()
+ .GetFrame()
+ ->GetTextSuggestionController()
+ .DeleteActiveSuggestionRange();
+
+ EXPECT_EQ("word1\xA0word3", text->textContent());
+}
+
+TEST_F(TextSuggestionControllerTest,
+ DeleteActiveSuggestionRange_DeleteRangeWithSpaceBeforeAndTextAfter) {
+ SetBodyContent(
+ "<div contenteditable>"
+ "word1 word2word3"
+ "</div>");
+ Element* div = GetDocument().QuerySelector("div");
+ Node* text = div->firstChild();
+
+ // Mark "word2" as misspelled
+ GetDocument().Markers().AddSpellingMarker(
+ EphemeralRange(Position(text, 6), Position(text, 11)));
+ // Select immediately before word2
+ GetDocument().GetFrame()->Selection().SetSelection(
+ SelectionInDOMTree::Builder()
+ .SetBaseAndExtent(Position(text, 6), Position(text, 6))
+ .Build());
+ GetDocument()
+ .GetFrame()
+ ->GetTextSuggestionController()
+ .DeleteActiveSuggestionRange();
+
+ EXPECT_EQ("word1\xA0word3", text->textContent());
+}
+
+TEST_F(TextSuggestionControllerTest,
+ DeleteActiveSuggestionRange_DeleteAtBeginningWithTextAfter) {
+ SetBodyContent(
+ "<div contenteditable>"
+ "word1word2"
+ "</div>");
+ Element* div = GetDocument().QuerySelector("div");
+ Node* text = div->firstChild();
+
+ // Mark "word1" as misspelled
+ GetDocument().Markers().AddSpellingMarker(
+ EphemeralRange(Position(text, 0), Position(text, 5)));
+ // Select immediately before word1
+ GetDocument().GetFrame()->Selection().SetSelection(
+ SelectionInDOMTree::Builder()
+ .SetBaseAndExtent(Position(text, 0), Position(text, 0))
+ .Build());
+ GetDocument()
+ .GetFrame()
+ ->GetTextSuggestionController()
+ .DeleteActiveSuggestionRange();
+
+ EXPECT_EQ("word2", text->textContent());
+}
+
+TEST_F(TextSuggestionControllerTest,
+ DeleteActiveSuggestionRange_NewWordAddedToDictionary) {
+ SetBodyContent(
+ "<div contenteditable>"
+ "embiggen"
+ "</div>");
+ Element* div = GetDocument().QuerySelector("div");
+ Node* text = div->firstChild();
+
+ // Mark "embiggen" as misspelled
+ GetDocument().Markers().AddSpellingMarker(
+ EphemeralRange(Position(text, 0), Position(text, 8)));
+ // Select immediately before embiggen
+ GetDocument().GetFrame()->Selection().SetSelection(
+ SelectionInDOMTree::Builder()
+ .SetBaseAndExtent(Position(text, 0), Position(text, 0))
+ .Build());
+ // Add some other word to the dictionary
+ GetDocument()
+ .GetFrame()
+ ->GetTextSuggestionController()
+ .NewWordAddedToDictionary("cromulent");
+ // Verify the spelling marker is still present
+ EXPECT_TRUE(GetDocument()
+ .GetFrame()
+ ->GetSpellChecker()
+ .GetSpellCheckMarkerTouchingSelection());
+
+ // Add "embiggen" to the dictionary
+ GetDocument()
+ .GetFrame()
+ ->GetTextSuggestionController()
+ .NewWordAddedToDictionary("embiggen");
+ // Verify the spelling marker is gone
+ EXPECT_FALSE(GetDocument()
+ .GetFrame()
+ ->GetSpellChecker()
+ .GetSpellCheckMarkerTouchingSelection());
+}
+
+} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698