OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/editing/InputMethodController.h" | 5 #include "core/editing/InputMethodController.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include "core/dom/Document.h" | 8 #include "core/dom/Document.h" |
9 #include "core/dom/Element.h" | 9 #include "core/dom/Element.h" |
10 #include "core/dom/Range.h" | 10 #include "core/dom/Range.h" |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 Vector<CompositionUnderline> underlines; | 174 Vector<CompositionUnderline> underlines; |
175 underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); | 175 underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); |
176 Controller().SetCompositionFromExistingText(underlines, 0, 5); | 176 Controller().SetCompositionFromExistingText(underlines, 0, 5); |
177 | 177 |
178 Range* range = Controller().CompositionRange(); | 178 Range* range = Controller().CompositionRange(); |
179 EXPECT_EQ(0u, range->startOffset()); | 179 EXPECT_EQ(0u, range->startOffset()); |
180 EXPECT_EQ(5u, range->endOffset()); | 180 EXPECT_EQ(5u, range->endOffset()); |
181 | 181 |
182 PlainTextRange plain_text_range(PlainTextRange::Create(*div, *range)); | 182 PlainTextRange plain_text_range(PlainTextRange::Create(*div, *range)); |
183 EXPECT_EQ(0u, plain_text_range.Start()); | 183 EXPECT_EQ(0u, plain_text_range.Start()); |
184 EXPECT_EQ(5u, plain_text_range.end()); | 184 EXPECT_EQ(5u, plain_text_range.End()); |
185 } | 185 } |
186 | 186 |
187 TEST_F(InputMethodControllerTest, SetCompositionAfterEmoji) { | 187 TEST_F(InputMethodControllerTest, SetCompositionAfterEmoji) { |
188 // "trophy" = U+1F3C6 = 0xF0 0x9F 0x8F 0x86 (UTF8). | 188 // "trophy" = U+1F3C6 = 0xF0 0x9F 0x8F 0x86 (UTF8). |
189 Element* div = InsertHTMLElement( | 189 Element* div = InsertHTMLElement( |
190 "<div id='sample' contenteditable>🏆</div>", "sample"); | 190 "<div id='sample' contenteditable>🏆</div>", "sample"); |
191 | 191 |
192 Vector<CompositionUnderline> underlines; | 192 Vector<CompositionUnderline> underlines; |
193 underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); | 193 underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); |
194 | 194 |
(...skipping 23 matching lines...) Expand all Loading... |
218 Vector<CompositionUnderline> underlines; | 218 Vector<CompositionUnderline> underlines; |
219 underlines.push_back(CompositionUnderline(6, 6, Color(255, 0, 0), false, 0)); | 219 underlines.push_back(CompositionUnderline(6, 6, Color(255, 0, 0), false, 0)); |
220 GetDocument().UpdateStyleAndLayout(); | 220 GetDocument().UpdateStyleAndLayout(); |
221 | 221 |
222 // UTF16 = 0x0939 0x0947 0x0932 0x0932. Note that 0x0932 0x0932 is a grapheme | 222 // UTF16 = 0x0939 0x0947 0x0932 0x0932. Note that 0x0932 0x0932 is a grapheme |
223 // cluster. | 223 // cluster. |
224 Controller().SetComposition( | 224 Controller().SetComposition( |
225 String::FromUTF8("\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA4\xB2"), | 225 String::FromUTF8("\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA4\xB2"), |
226 underlines, 4, 4); | 226 underlines, 4, 4); |
227 EXPECT_EQ(4u, Controller().GetSelectionOffsets().Start()); | 227 EXPECT_EQ(4u, Controller().GetSelectionOffsets().Start()); |
228 EXPECT_EQ(4u, Controller().GetSelectionOffsets().end()); | 228 EXPECT_EQ(4u, Controller().GetSelectionOffsets().End()); |
229 | 229 |
230 // UTF16 = 0x0939 0x0947 0x0932 0x094D 0x0932 0x094B. | 230 // UTF16 = 0x0939 0x0947 0x0932 0x094D 0x0932 0x094B. |
231 Controller().SetComposition( | 231 Controller().SetComposition( |
232 String::FromUTF8("\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0" | 232 String::FromUTF8("\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0" |
233 "\xA4\xB2\xE0\xA5\x8B"), | 233 "\xA4\xB2\xE0\xA5\x8B"), |
234 underlines, 6, 6); | 234 underlines, 6, 6); |
235 EXPECT_EQ(6u, Controller().GetSelectionOffsets().Start()); | 235 EXPECT_EQ(6u, Controller().GetSelectionOffsets().Start()); |
236 EXPECT_EQ(6u, Controller().GetSelectionOffsets().end()); | 236 EXPECT_EQ(6u, Controller().GetSelectionOffsets().End()); |
237 } | 237 } |
238 | 238 |
239 TEST_F(InputMethodControllerTest, | 239 TEST_F(InputMethodControllerTest, |
240 SetCompositionWithGraphemeClusterAndMultipleNodes) { | 240 SetCompositionWithGraphemeClusterAndMultipleNodes) { |
241 Element* div = | 241 Element* div = |
242 InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); | 242 InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); |
243 | 243 |
244 Vector<CompositionUnderline> underlines; | 244 Vector<CompositionUnderline> underlines; |
245 underlines.push_back( | 245 underlines.push_back( |
246 CompositionUnderline(12, 12, Color(255, 0, 0), false, 0)); | 246 CompositionUnderline(12, 12, Color(255, 0, 0), false, 0)); |
247 GetDocument().UpdateStyleAndLayout(); | 247 GetDocument().UpdateStyleAndLayout(); |
248 | 248 |
249 // UTF16 = 0x0939 0x0947 0x0932 0x094D 0x0932 0x094B. 0x0939 0x0947 0x0932 is | 249 // UTF16 = 0x0939 0x0947 0x0932 0x094D 0x0932 0x094B. 0x0939 0x0947 0x0932 is |
250 // a grapheme cluster, so is the remainding 0x0932 0x094B. | 250 // a grapheme cluster, so is the remainding 0x0932 0x094B. |
251 Controller().CommitText( | 251 Controller().CommitText( |
252 String::FromUTF8("\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0" | 252 String::FromUTF8("\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0" |
253 "\xA4\xB2\xE0\xA5\x8B"), | 253 "\xA4\xB2\xE0\xA5\x8B"), |
254 underlines, 1); | 254 underlines, 1); |
255 Controller().CommitText("\nab ", underlines, 1); | 255 Controller().CommitText("\nab ", underlines, 1); |
256 Controller().SetComposition(String("c"), underlines, 1, 1); | 256 Controller().SetComposition(String("c"), underlines, 1, 1); |
257 EXPECT_STREQ( | 257 EXPECT_STREQ( |
258 "\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0\xA4\xB2\xE0\xA5" | 258 "\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0\xA4\xB2\xE0\xA5" |
259 "\x8B\nab c", | 259 "\x8B\nab c", |
260 div->innerText().Utf8().data()); | 260 div->innerText().Utf8().data()); |
261 EXPECT_EQ(11u, Controller().GetSelectionOffsets().Start()); | 261 EXPECT_EQ(11u, Controller().GetSelectionOffsets().Start()); |
262 EXPECT_EQ(11u, Controller().GetSelectionOffsets().end()); | 262 EXPECT_EQ(11u, Controller().GetSelectionOffsets().End()); |
263 | 263 |
264 Controller().SetComposition(String("cd"), underlines, 2, 2); | 264 Controller().SetComposition(String("cd"), underlines, 2, 2); |
265 EXPECT_STREQ( | 265 EXPECT_STREQ( |
266 "\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0\xA4\xB2\xE0\xA5" | 266 "\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0\xA4\xB2\xE0\xA5" |
267 "\x8B\nab cd", | 267 "\x8B\nab cd", |
268 div->innerText().Utf8().data()); | 268 div->innerText().Utf8().data()); |
269 EXPECT_EQ(12u, Controller().GetSelectionOffsets().Start()); | 269 EXPECT_EQ(12u, Controller().GetSelectionOffsets().Start()); |
270 EXPECT_EQ(12u, Controller().GetSelectionOffsets().end()); | 270 EXPECT_EQ(12u, Controller().GetSelectionOffsets().End()); |
271 } | 271 } |
272 | 272 |
273 TEST_F(InputMethodControllerTest, SetCompositionKeepingStyle) { | 273 TEST_F(InputMethodControllerTest, SetCompositionKeepingStyle) { |
274 Element* div = InsertHTMLElement( | 274 Element* div = InsertHTMLElement( |
275 "<div id='sample' " | 275 "<div id='sample' " |
276 "contenteditable>abc1<b>2</b>34567<b>8</b>9d<b>e</b>f</div>", | 276 "contenteditable>abc1<b>2</b>34567<b>8</b>9d<b>e</b>f</div>", |
277 "sample"); | 277 "sample"); |
278 | 278 |
279 Vector<CompositionUnderline> underlines; | 279 Vector<CompositionUnderline> underlines; |
280 underlines.push_back(CompositionUnderline(3, 12, Color(255, 0, 0), false, 0)); | 280 underlines.push_back(CompositionUnderline(3, 12, Color(255, 0, 0), false, 0)); |
281 Controller().SetCompositionFromExistingText(underlines, 3, 12); | 281 Controller().SetCompositionFromExistingText(underlines, 3, 12); |
282 | 282 |
283 // Subtract a character. | 283 // Subtract a character. |
284 Controller().SetComposition(String("12345789"), underlines, 8, 8); | 284 Controller().SetComposition(String("12345789"), underlines, 8, 8); |
285 EXPECT_STREQ("abc1<b>2</b>3457<b>8</b>9d<b>e</b>f", | 285 EXPECT_STREQ("abc1<b>2</b>3457<b>8</b>9d<b>e</b>f", |
286 div->innerHTML().Utf8().data()); | 286 div->innerHTML().Utf8().data()); |
287 EXPECT_EQ(11u, Controller().GetSelectionOffsets().Start()); | 287 EXPECT_EQ(11u, Controller().GetSelectionOffsets().Start()); |
288 EXPECT_EQ(11u, Controller().GetSelectionOffsets().end()); | 288 EXPECT_EQ(11u, Controller().GetSelectionOffsets().End()); |
289 | 289 |
290 // Append a character. | 290 // Append a character. |
291 Controller().SetComposition(String("123456789"), underlines, 9, 9); | 291 Controller().SetComposition(String("123456789"), underlines, 9, 9); |
292 EXPECT_STREQ("abc1<b>2</b>34567<b>8</b>9d<b>e</b>f", | 292 EXPECT_STREQ("abc1<b>2</b>34567<b>8</b>9d<b>e</b>f", |
293 div->innerHTML().Utf8().data()); | 293 div->innerHTML().Utf8().data()); |
294 EXPECT_EQ(12u, Controller().GetSelectionOffsets().Start()); | 294 EXPECT_EQ(12u, Controller().GetSelectionOffsets().Start()); |
295 EXPECT_EQ(12u, Controller().GetSelectionOffsets().end()); | 295 EXPECT_EQ(12u, Controller().GetSelectionOffsets().End()); |
296 | 296 |
297 // Subtract and append characters. | 297 // Subtract and append characters. |
298 Controller().SetComposition(String("123hello789"), underlines, 11, 11); | 298 Controller().SetComposition(String("123hello789"), underlines, 11, 11); |
299 EXPECT_STREQ("abc1<b>2</b>3hello7<b>8</b>9d<b>e</b>f", | 299 EXPECT_STREQ("abc1<b>2</b>3hello7<b>8</b>9d<b>e</b>f", |
300 div->innerHTML().Utf8().data()); | 300 div->innerHTML().Utf8().data()); |
301 } | 301 } |
302 | 302 |
303 TEST_F(InputMethodControllerTest, SetCompositionWithEmojiKeepingStyle) { | 303 TEST_F(InputMethodControllerTest, SetCompositionWithEmojiKeepingStyle) { |
304 // U+1F3E0 = 0xF0 0x9F 0x8F 0xA0 (UTF8). It's an emoji character. | 304 // U+1F3E0 = 0xF0 0x9F 0x8F 0xA0 (UTF8). It's an emoji character. |
305 Element* div = InsertHTMLElement( | 305 Element* div = InsertHTMLElement( |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 Vector<CompositionUnderline> underlines; | 457 Vector<CompositionUnderline> underlines; |
458 underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); | 458 underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); |
459 Controller().SetCompositionFromExistingText(underlines, 0, 5); | 459 Controller().SetCompositionFromExistingText(underlines, 0, 5); |
460 | 460 |
461 Range* range = Controller().CompositionRange(); | 461 Range* range = Controller().CompositionRange(); |
462 EXPECT_EQ(1u, range->startOffset()); | 462 EXPECT_EQ(1u, range->startOffset()); |
463 EXPECT_EQ(6u, range->endOffset()); | 463 EXPECT_EQ(6u, range->endOffset()); |
464 | 464 |
465 PlainTextRange plain_text_range(PlainTextRange::Create(*div, *range)); | 465 PlainTextRange plain_text_range(PlainTextRange::Create(*div, *range)); |
466 EXPECT_EQ(0u, plain_text_range.Start()); | 466 EXPECT_EQ(0u, plain_text_range.Start()); |
467 EXPECT_EQ(5u, plain_text_range.end()); | 467 EXPECT_EQ(5u, plain_text_range.End()); |
468 } | 468 } |
469 | 469 |
470 TEST_F(InputMethodControllerTest, | 470 TEST_F(InputMethodControllerTest, |
471 SetCompositionFromExistingTextWithInvalidOffsets) { | 471 SetCompositionFromExistingTextWithInvalidOffsets) { |
472 InsertHTMLElement("<div id='sample' contenteditable>test</div>", "sample"); | 472 InsertHTMLElement("<div id='sample' contenteditable>test</div>", "sample"); |
473 | 473 |
474 Vector<CompositionUnderline> underlines; | 474 Vector<CompositionUnderline> underlines; |
475 underlines.push_back(CompositionUnderline(7, 8, Color(255, 0, 0), false, 0)); | 475 underlines.push_back(CompositionUnderline(7, 8, Color(255, 0, 0), false, 0)); |
476 Controller().SetCompositionFromExistingText(underlines, 7, 8); | 476 Controller().SetCompositionFromExistingText(underlines, 7, 8); |
477 | 477 |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
780 "<div id='sample2' contenteditable>bbb" | 780 "<div id='sample2' contenteditable>bbb" |
781 "<div id='sample3' contenteditable>ccc" | 781 "<div id='sample3' contenteditable>ccc" |
782 "<div id='sample4' contenteditable>ddd" | 782 "<div id='sample4' contenteditable>ddd" |
783 "<div id='sample5' contenteditable>eee" | 783 "<div id='sample5' contenteditable>eee" |
784 "</div></div></div></div></div>", | 784 "</div></div></div></div></div>", |
785 "sample"); | 785 "sample"); |
786 | 786 |
787 Controller().SetEditableSelectionOffsets(PlainTextRange(8, 8)); | 787 Controller().SetEditableSelectionOffsets(PlainTextRange(8, 8)); |
788 EXPECT_STREQ("aaa\nbbb\nccc\nddd\neee", div->innerText().Utf8().data()); | 788 EXPECT_STREQ("aaa\nbbb\nccc\nddd\neee", div->innerText().Utf8().data()); |
789 EXPECT_EQ(8u, Controller().GetSelectionOffsets().Start()); | 789 EXPECT_EQ(8u, Controller().GetSelectionOffsets().Start()); |
790 EXPECT_EQ(8u, Controller().GetSelectionOffsets().end()); | 790 EXPECT_EQ(8u, Controller().GetSelectionOffsets().End()); |
791 | 791 |
792 Controller().DeleteSurroundingText(1, 0); | 792 Controller().DeleteSurroundingText(1, 0); |
793 EXPECT_STREQ("aaa\nbbbccc\nddd\neee", div->innerText().Utf8().data()); | 793 EXPECT_STREQ("aaa\nbbbccc\nddd\neee", div->innerText().Utf8().data()); |
794 EXPECT_EQ(7u, Controller().GetSelectionOffsets().Start()); | 794 EXPECT_EQ(7u, Controller().GetSelectionOffsets().Start()); |
795 EXPECT_EQ(7u, Controller().GetSelectionOffsets().end()); | 795 EXPECT_EQ(7u, Controller().GetSelectionOffsets().End()); |
796 | 796 |
797 Controller().DeleteSurroundingText(0, 4); | 797 Controller().DeleteSurroundingText(0, 4); |
798 EXPECT_STREQ("aaa\nbbbddd\neee", div->innerText().Utf8().data()); | 798 EXPECT_STREQ("aaa\nbbbddd\neee", div->innerText().Utf8().data()); |
799 EXPECT_EQ(7u, Controller().GetSelectionOffsets().Start()); | 799 EXPECT_EQ(7u, Controller().GetSelectionOffsets().Start()); |
800 EXPECT_EQ(7u, Controller().GetSelectionOffsets().end()); | 800 EXPECT_EQ(7u, Controller().GetSelectionOffsets().End()); |
801 | 801 |
802 Controller().DeleteSurroundingText(5, 5); | 802 Controller().DeleteSurroundingText(5, 5); |
803 EXPECT_STREQ("aaee", div->innerText().Utf8().data()); | 803 EXPECT_STREQ("aaee", div->innerText().Utf8().data()); |
804 EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); | 804 EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); |
805 EXPECT_EQ(2u, Controller().GetSelectionOffsets().end()); | 805 EXPECT_EQ(2u, Controller().GetSelectionOffsets().End()); |
806 } | 806 } |
807 | 807 |
808 TEST_F(InputMethodControllerTest, | 808 TEST_F(InputMethodControllerTest, |
809 DeleteSurroundingTextInCodePointsWithMultiCodeTextOnTheLeft) { | 809 DeleteSurroundingTextInCodePointsWithMultiCodeTextOnTheLeft) { |
810 HTMLInputElement* input = | 810 HTMLInputElement* input = |
811 toHTMLInputElement(InsertHTMLElement("<input id='sample'>", "sample")); | 811 toHTMLInputElement(InsertHTMLElement("<input id='sample'>", "sample")); |
812 | 812 |
813 // 'a' + "black star" + SPACE + "trophy" + SPACE + composed text (U+0E01 | 813 // 'a' + "black star" + SPACE + "trophy" + SPACE + composed text (U+0E01 |
814 // "ka kai" + U+0E49 "mai tho"). | 814 // "ka kai" + U+0E49 "mai tho"). |
815 // A "black star" is 1 grapheme cluster. It has 1 code point, and its length | 815 // A "black star" is 1 grapheme cluster. It has 1 code point, and its length |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
876 TEST_F(InputMethodControllerTest, DeleteSurroundingTextInCodePointsWithImage) { | 876 TEST_F(InputMethodControllerTest, DeleteSurroundingTextInCodePointsWithImage) { |
877 Element* div = InsertHTMLElement( | 877 Element* div = InsertHTMLElement( |
878 "<div id='sample' contenteditable>aaa" | 878 "<div id='sample' contenteditable>aaa" |
879 "<img src='empty.png'>bbb</div>", | 879 "<img src='empty.png'>bbb</div>", |
880 "sample"); | 880 "sample"); |
881 | 881 |
882 Controller().SetEditableSelectionOffsets(PlainTextRange(4, 4)); | 882 Controller().SetEditableSelectionOffsets(PlainTextRange(4, 4)); |
883 Controller().DeleteSurroundingTextInCodePoints(1, 1); | 883 Controller().DeleteSurroundingTextInCodePoints(1, 1); |
884 EXPECT_STREQ("aaabb", div->innerText().Utf8().data()); | 884 EXPECT_STREQ("aaabb", div->innerText().Utf8().data()); |
885 EXPECT_EQ(3u, Controller().GetSelectionOffsets().Start()); | 885 EXPECT_EQ(3u, Controller().GetSelectionOffsets().Start()); |
886 EXPECT_EQ(3u, Controller().GetSelectionOffsets().end()); | 886 EXPECT_EQ(3u, Controller().GetSelectionOffsets().End()); |
887 } | 887 } |
888 | 888 |
889 TEST_F(InputMethodControllerTest, | 889 TEST_F(InputMethodControllerTest, |
890 DeleteSurroundingTextInCodePointsWithInvalidSurrogatePair) { | 890 DeleteSurroundingTextInCodePointsWithInvalidSurrogatePair) { |
891 HTMLInputElement* input = | 891 HTMLInputElement* input = |
892 toHTMLInputElement(InsertHTMLElement("<input id='sample'>", "sample")); | 892 toHTMLInputElement(InsertHTMLElement("<input id='sample'>", "sample")); |
893 | 893 |
894 // 'a' + high surrogate of "trophy" + "black star" + low surrogate of "trophy" | 894 // 'a' + high surrogate of "trophy" + "black star" + low surrogate of "trophy" |
895 // + SPACE | 895 // + SPACE |
896 const UChar kUText[] = {'a', 0xD83C, 0x2605, 0xDFC6, ' ', '\0'}; | 896 const UChar kUText[] = {'a', 0xD83C, 0x2605, 0xDFC6, ' ', '\0'}; |
(...skipping 29 matching lines...) Expand all Loading... |
926 | 926 |
927 TEST_F(InputMethodControllerTest, SetCompositionForInputWithNewCaretPositions) { | 927 TEST_F(InputMethodControllerTest, SetCompositionForInputWithNewCaretPositions) { |
928 HTMLInputElement* input = | 928 HTMLInputElement* input = |
929 toHTMLInputElement(InsertHTMLElement("<input id='sample'>", "sample")); | 929 toHTMLInputElement(InsertHTMLElement("<input id='sample'>", "sample")); |
930 | 930 |
931 input->setValue("hello"); | 931 input->setValue("hello"); |
932 GetDocument().UpdateStyleAndLayout(); | 932 GetDocument().UpdateStyleAndLayout(); |
933 Controller().SetEditableSelectionOffsets(PlainTextRange(2, 2)); | 933 Controller().SetEditableSelectionOffsets(PlainTextRange(2, 2)); |
934 EXPECT_STREQ("hello", input->value().Utf8().data()); | 934 EXPECT_STREQ("hello", input->value().Utf8().data()); |
935 EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); | 935 EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); |
936 EXPECT_EQ(2u, Controller().GetSelectionOffsets().end()); | 936 EXPECT_EQ(2u, Controller().GetSelectionOffsets().End()); |
937 | 937 |
938 Vector<CompositionUnderline> underlines; | 938 Vector<CompositionUnderline> underlines; |
939 underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); | 939 underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); |
940 | 940 |
941 // The caret exceeds left boundary. | 941 // The caret exceeds left boundary. |
942 // "*heABllo", where * stands for caret. | 942 // "*heABllo", where * stands for caret. |
943 Controller().SetComposition("AB", underlines, -100, -100); | 943 Controller().SetComposition("AB", underlines, -100, -100); |
944 EXPECT_STREQ("heABllo", input->value().Utf8().data()); | 944 EXPECT_STREQ("heABllo", input->value().Utf8().data()); |
945 EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start()); | 945 EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start()); |
946 EXPECT_EQ(0u, Controller().GetSelectionOffsets().end()); | 946 EXPECT_EQ(0u, Controller().GetSelectionOffsets().End()); |
947 | 947 |
948 // The caret is on left boundary. | 948 // The caret is on left boundary. |
949 // "*heABllo". | 949 // "*heABllo". |
950 Controller().SetComposition("AB", underlines, -2, -2); | 950 Controller().SetComposition("AB", underlines, -2, -2); |
951 EXPECT_STREQ("heABllo", input->value().Utf8().data()); | 951 EXPECT_STREQ("heABllo", input->value().Utf8().data()); |
952 EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start()); | 952 EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start()); |
953 EXPECT_EQ(0u, Controller().GetSelectionOffsets().end()); | 953 EXPECT_EQ(0u, Controller().GetSelectionOffsets().End()); |
954 | 954 |
955 // The caret is before the composing text. | 955 // The caret is before the composing text. |
956 // "he*ABllo". | 956 // "he*ABllo". |
957 Controller().SetComposition("AB", underlines, 0, 0); | 957 Controller().SetComposition("AB", underlines, 0, 0); |
958 EXPECT_STREQ("heABllo", input->value().Utf8().data()); | 958 EXPECT_STREQ("heABllo", input->value().Utf8().data()); |
959 EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); | 959 EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); |
960 EXPECT_EQ(2u, Controller().GetSelectionOffsets().end()); | 960 EXPECT_EQ(2u, Controller().GetSelectionOffsets().End()); |
961 | 961 |
962 // The caret is after the composing text. | 962 // The caret is after the composing text. |
963 // "heAB*llo". | 963 // "heAB*llo". |
964 Controller().SetComposition("AB", underlines, 2, 2); | 964 Controller().SetComposition("AB", underlines, 2, 2); |
965 EXPECT_STREQ("heABllo", input->value().Utf8().data()); | 965 EXPECT_STREQ("heABllo", input->value().Utf8().data()); |
966 EXPECT_EQ(4u, Controller().GetSelectionOffsets().Start()); | 966 EXPECT_EQ(4u, Controller().GetSelectionOffsets().Start()); |
967 EXPECT_EQ(4u, Controller().GetSelectionOffsets().end()); | 967 EXPECT_EQ(4u, Controller().GetSelectionOffsets().End()); |
968 | 968 |
969 // The caret is on right boundary. | 969 // The caret is on right boundary. |
970 // "heABllo*". | 970 // "heABllo*". |
971 Controller().SetComposition("AB", underlines, 5, 5); | 971 Controller().SetComposition("AB", underlines, 5, 5); |
972 EXPECT_STREQ("heABllo", input->value().Utf8().data()); | 972 EXPECT_STREQ("heABllo", input->value().Utf8().data()); |
973 EXPECT_EQ(7u, Controller().GetSelectionOffsets().Start()); | 973 EXPECT_EQ(7u, Controller().GetSelectionOffsets().Start()); |
974 EXPECT_EQ(7u, Controller().GetSelectionOffsets().end()); | 974 EXPECT_EQ(7u, Controller().GetSelectionOffsets().End()); |
975 | 975 |
976 // The caret exceeds right boundary. | 976 // The caret exceeds right boundary. |
977 // "heABllo*". | 977 // "heABllo*". |
978 Controller().SetComposition("AB", underlines, 100, 100); | 978 Controller().SetComposition("AB", underlines, 100, 100); |
979 EXPECT_STREQ("heABllo", input->value().Utf8().data()); | 979 EXPECT_STREQ("heABllo", input->value().Utf8().data()); |
980 EXPECT_EQ(7u, Controller().GetSelectionOffsets().Start()); | 980 EXPECT_EQ(7u, Controller().GetSelectionOffsets().Start()); |
981 EXPECT_EQ(7u, Controller().GetSelectionOffsets().end()); | 981 EXPECT_EQ(7u, Controller().GetSelectionOffsets().End()); |
982 } | 982 } |
983 | 983 |
984 TEST_F(InputMethodControllerTest, | 984 TEST_F(InputMethodControllerTest, |
985 SetCompositionForContentEditableWithNewCaretPositions) { | 985 SetCompositionForContentEditableWithNewCaretPositions) { |
986 // There are 7 nodes and 5+1+5+1+3+4+3 characters: "hello", '\n', "world", | 986 // There are 7 nodes and 5+1+5+1+3+4+3 characters: "hello", '\n', "world", |
987 // "\n", "012", "3456", "789". | 987 // "\n", "012", "3456", "789". |
988 Element* div = InsertHTMLElement( | 988 Element* div = InsertHTMLElement( |
989 "<div id='sample' contenteditable>" | 989 "<div id='sample' contenteditable>" |
990 "hello" | 990 "hello" |
991 "<div id='sample2' contenteditable>world" | 991 "<div id='sample2' contenteditable>world" |
992 "<p>012<b>3456</b><i>789</i></p>" | 992 "<p>012<b>3456</b><i>789</i></p>" |
993 "</div>" | 993 "</div>" |
994 "</div>", | 994 "</div>", |
995 "sample"); | 995 "sample"); |
996 | 996 |
997 Controller().SetEditableSelectionOffsets(PlainTextRange(17, 17)); | 997 Controller().SetEditableSelectionOffsets(PlainTextRange(17, 17)); |
998 EXPECT_STREQ("hello\nworld\n0123456789", div->innerText().Utf8().data()); | 998 EXPECT_STREQ("hello\nworld\n0123456789", div->innerText().Utf8().data()); |
999 EXPECT_EQ(17u, Controller().GetSelectionOffsets().Start()); | 999 EXPECT_EQ(17u, Controller().GetSelectionOffsets().Start()); |
1000 EXPECT_EQ(17u, Controller().GetSelectionOffsets().end()); | 1000 EXPECT_EQ(17u, Controller().GetSelectionOffsets().End()); |
1001 | 1001 |
1002 Vector<CompositionUnderline> underlines; | 1002 Vector<CompositionUnderline> underlines; |
1003 underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); | 1003 underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); |
1004 | 1004 |
1005 // The caret exceeds left boundary. | 1005 // The caret exceeds left boundary. |
1006 // "*hello\nworld\n01234AB56789", where * stands for caret. | 1006 // "*hello\nworld\n01234AB56789", where * stands for caret. |
1007 Controller().SetComposition("AB", underlines, -100, -100); | 1007 Controller().SetComposition("AB", underlines, -100, -100); |
1008 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); | 1008 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); |
1009 EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start()); | 1009 EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start()); |
1010 EXPECT_EQ(0u, Controller().GetSelectionOffsets().end()); | 1010 EXPECT_EQ(0u, Controller().GetSelectionOffsets().End()); |
1011 | 1011 |
1012 // The caret is on left boundary. | 1012 // The caret is on left boundary. |
1013 // "*hello\nworld\n01234AB56789". | 1013 // "*hello\nworld\n01234AB56789". |
1014 Controller().SetComposition("AB", underlines, -17, -17); | 1014 Controller().SetComposition("AB", underlines, -17, -17); |
1015 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); | 1015 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); |
1016 EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start()); | 1016 EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start()); |
1017 EXPECT_EQ(0u, Controller().GetSelectionOffsets().end()); | 1017 EXPECT_EQ(0u, Controller().GetSelectionOffsets().End()); |
1018 | 1018 |
1019 // The caret is in the 1st node. | 1019 // The caret is in the 1st node. |
1020 // "he*llo\nworld\n01234AB56789". | 1020 // "he*llo\nworld\n01234AB56789". |
1021 Controller().SetComposition("AB", underlines, -15, -15); | 1021 Controller().SetComposition("AB", underlines, -15, -15); |
1022 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); | 1022 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); |
1023 EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); | 1023 EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); |
1024 EXPECT_EQ(2u, Controller().GetSelectionOffsets().end()); | 1024 EXPECT_EQ(2u, Controller().GetSelectionOffsets().End()); |
1025 | 1025 |
1026 // The caret is on right boundary of the 1st node. | 1026 // The caret is on right boundary of the 1st node. |
1027 // "hello*\nworld\n01234AB56789". | 1027 // "hello*\nworld\n01234AB56789". |
1028 Controller().SetComposition("AB", underlines, -12, -12); | 1028 Controller().SetComposition("AB", underlines, -12, -12); |
1029 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); | 1029 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); |
1030 EXPECT_EQ(5u, Controller().GetSelectionOffsets().Start()); | 1030 EXPECT_EQ(5u, Controller().GetSelectionOffsets().Start()); |
1031 EXPECT_EQ(5u, Controller().GetSelectionOffsets().end()); | 1031 EXPECT_EQ(5u, Controller().GetSelectionOffsets().End()); |
1032 | 1032 |
1033 // The caret is on right boundary of the 2nd node. | 1033 // The caret is on right boundary of the 2nd node. |
1034 // "hello\n*world\n01234AB56789". | 1034 // "hello\n*world\n01234AB56789". |
1035 Controller().SetComposition("AB", underlines, -11, -11); | 1035 Controller().SetComposition("AB", underlines, -11, -11); |
1036 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); | 1036 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); |
1037 EXPECT_EQ(6u, Controller().GetSelectionOffsets().Start()); | 1037 EXPECT_EQ(6u, Controller().GetSelectionOffsets().Start()); |
1038 EXPECT_EQ(6u, Controller().GetSelectionOffsets().end()); | 1038 EXPECT_EQ(6u, Controller().GetSelectionOffsets().End()); |
1039 | 1039 |
1040 // The caret is on right boundary of the 3rd node. | 1040 // The caret is on right boundary of the 3rd node. |
1041 // "hello\nworld*\n01234AB56789". | 1041 // "hello\nworld*\n01234AB56789". |
1042 Controller().SetComposition("AB", underlines, -6, -6); | 1042 Controller().SetComposition("AB", underlines, -6, -6); |
1043 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); | 1043 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); |
1044 EXPECT_EQ(11u, Controller().GetSelectionOffsets().Start()); | 1044 EXPECT_EQ(11u, Controller().GetSelectionOffsets().Start()); |
1045 EXPECT_EQ(11u, Controller().GetSelectionOffsets().end()); | 1045 EXPECT_EQ(11u, Controller().GetSelectionOffsets().End()); |
1046 | 1046 |
1047 // The caret is on right boundary of the 4th node. | 1047 // The caret is on right boundary of the 4th node. |
1048 // "hello\nworld\n*01234AB56789". | 1048 // "hello\nworld\n*01234AB56789". |
1049 Controller().SetComposition("AB", underlines, -5, -5); | 1049 Controller().SetComposition("AB", underlines, -5, -5); |
1050 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); | 1050 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); |
1051 EXPECT_EQ(12u, Controller().GetSelectionOffsets().Start()); | 1051 EXPECT_EQ(12u, Controller().GetSelectionOffsets().Start()); |
1052 EXPECT_EQ(12u, Controller().GetSelectionOffsets().end()); | 1052 EXPECT_EQ(12u, Controller().GetSelectionOffsets().End()); |
1053 | 1053 |
1054 // The caret is before the composing text. | 1054 // The caret is before the composing text. |
1055 // "hello\nworld\n01234*AB56789". | 1055 // "hello\nworld\n01234*AB56789". |
1056 Controller().SetComposition("AB", underlines, 0, 0); | 1056 Controller().SetComposition("AB", underlines, 0, 0); |
1057 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); | 1057 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); |
1058 EXPECT_EQ(17u, Controller().GetSelectionOffsets().Start()); | 1058 EXPECT_EQ(17u, Controller().GetSelectionOffsets().Start()); |
1059 EXPECT_EQ(17u, Controller().GetSelectionOffsets().end()); | 1059 EXPECT_EQ(17u, Controller().GetSelectionOffsets().End()); |
1060 | 1060 |
1061 // The caret is after the composing text. | 1061 // The caret is after the composing text. |
1062 // "hello\nworld\n01234AB*56789". | 1062 // "hello\nworld\n01234AB*56789". |
1063 Controller().SetComposition("AB", underlines, 2, 2); | 1063 Controller().SetComposition("AB", underlines, 2, 2); |
1064 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); | 1064 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); |
1065 EXPECT_EQ(19u, Controller().GetSelectionOffsets().Start()); | 1065 EXPECT_EQ(19u, Controller().GetSelectionOffsets().Start()); |
1066 EXPECT_EQ(19u, Controller().GetSelectionOffsets().end()); | 1066 EXPECT_EQ(19u, Controller().GetSelectionOffsets().End()); |
1067 | 1067 |
1068 // The caret is on right boundary. | 1068 // The caret is on right boundary. |
1069 // "hello\nworld\n01234AB56789*". | 1069 // "hello\nworld\n01234AB56789*". |
1070 Controller().SetComposition("AB", underlines, 7, 7); | 1070 Controller().SetComposition("AB", underlines, 7, 7); |
1071 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); | 1071 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); |
1072 EXPECT_EQ(24u, Controller().GetSelectionOffsets().Start()); | 1072 EXPECT_EQ(24u, Controller().GetSelectionOffsets().Start()); |
1073 EXPECT_EQ(24u, Controller().GetSelectionOffsets().end()); | 1073 EXPECT_EQ(24u, Controller().GetSelectionOffsets().End()); |
1074 | 1074 |
1075 // The caret exceeds right boundary. | 1075 // The caret exceeds right boundary. |
1076 // "hello\nworld\n01234AB56789*". | 1076 // "hello\nworld\n01234AB56789*". |
1077 Controller().SetComposition("AB", underlines, 100, 100); | 1077 Controller().SetComposition("AB", underlines, 100, 100); |
1078 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); | 1078 EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); |
1079 EXPECT_EQ(24u, Controller().GetSelectionOffsets().Start()); | 1079 EXPECT_EQ(24u, Controller().GetSelectionOffsets().Start()); |
1080 EXPECT_EQ(24u, Controller().GetSelectionOffsets().end()); | 1080 EXPECT_EQ(24u, Controller().GetSelectionOffsets().End()); |
1081 } | 1081 } |
1082 | 1082 |
1083 TEST_F(InputMethodControllerTest, SetCompositionWithEmptyText) { | 1083 TEST_F(InputMethodControllerTest, SetCompositionWithEmptyText) { |
1084 Element* div = InsertHTMLElement( | 1084 Element* div = InsertHTMLElement( |
1085 "<div id='sample' contenteditable>hello</div>", "sample"); | 1085 "<div id='sample' contenteditable>hello</div>", "sample"); |
1086 | 1086 |
1087 Controller().SetEditableSelectionOffsets(PlainTextRange(2, 2)); | 1087 Controller().SetEditableSelectionOffsets(PlainTextRange(2, 2)); |
1088 EXPECT_STREQ("hello", div->innerText().Utf8().data()); | 1088 EXPECT_STREQ("hello", div->innerText().Utf8().data()); |
1089 EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); | 1089 EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); |
1090 EXPECT_EQ(2u, Controller().GetSelectionOffsets().end()); | 1090 EXPECT_EQ(2u, Controller().GetSelectionOffsets().End()); |
1091 | 1091 |
1092 Vector<CompositionUnderline> underlines0; | 1092 Vector<CompositionUnderline> underlines0; |
1093 underlines0.push_back(CompositionUnderline(0, 0, Color(255, 0, 0), false, 0)); | 1093 underlines0.push_back(CompositionUnderline(0, 0, Color(255, 0, 0), false, 0)); |
1094 Vector<CompositionUnderline> underlines2; | 1094 Vector<CompositionUnderline> underlines2; |
1095 underlines2.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); | 1095 underlines2.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); |
1096 | 1096 |
1097 Controller().SetComposition("AB", underlines2, 2, 2); | 1097 Controller().SetComposition("AB", underlines2, 2, 2); |
1098 // With previous composition. | 1098 // With previous composition. |
1099 Controller().SetComposition("", underlines0, 2, 2); | 1099 Controller().SetComposition("", underlines0, 2, 2); |
1100 EXPECT_STREQ("hello", div->innerText().Utf8().data()); | 1100 EXPECT_STREQ("hello", div->innerText().Utf8().data()); |
1101 EXPECT_EQ(4u, Controller().GetSelectionOffsets().Start()); | 1101 EXPECT_EQ(4u, Controller().GetSelectionOffsets().Start()); |
1102 EXPECT_EQ(4u, Controller().GetSelectionOffsets().end()); | 1102 EXPECT_EQ(4u, Controller().GetSelectionOffsets().End()); |
1103 | 1103 |
1104 // Without previous composition. | 1104 // Without previous composition. |
1105 Controller().SetComposition("", underlines0, -1, -1); | 1105 Controller().SetComposition("", underlines0, -1, -1); |
1106 EXPECT_STREQ("hello", div->innerText().Utf8().data()); | 1106 EXPECT_STREQ("hello", div->innerText().Utf8().data()); |
1107 EXPECT_EQ(3u, Controller().GetSelectionOffsets().Start()); | 1107 EXPECT_EQ(3u, Controller().GetSelectionOffsets().Start()); |
1108 EXPECT_EQ(3u, Controller().GetSelectionOffsets().end()); | 1108 EXPECT_EQ(3u, Controller().GetSelectionOffsets().End()); |
1109 } | 1109 } |
1110 | 1110 |
1111 TEST_F(InputMethodControllerTest, InsertLineBreakWhileComposingText) { | 1111 TEST_F(InputMethodControllerTest, InsertLineBreakWhileComposingText) { |
1112 Element* div = | 1112 Element* div = |
1113 InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); | 1113 InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); |
1114 | 1114 |
1115 Vector<CompositionUnderline> underlines; | 1115 Vector<CompositionUnderline> underlines; |
1116 underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); | 1116 underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); |
1117 Controller().SetComposition("hello", underlines, 5, 5); | 1117 Controller().SetComposition("hello", underlines, 5, 5); |
1118 EXPECT_STREQ("hello", div->innerText().Utf8().data()); | 1118 EXPECT_STREQ("hello", div->innerText().Utf8().data()); |
1119 EXPECT_EQ(5u, Controller().GetSelectionOffsets().Start()); | 1119 EXPECT_EQ(5u, Controller().GetSelectionOffsets().Start()); |
1120 EXPECT_EQ(5u, Controller().GetSelectionOffsets().end()); | 1120 EXPECT_EQ(5u, Controller().GetSelectionOffsets().End()); |
1121 | 1121 |
1122 GetFrame().GetEditor().InsertLineBreak(); | 1122 GetFrame().GetEditor().InsertLineBreak(); |
1123 EXPECT_STREQ("\n\n", div->innerText().Utf8().data()); | 1123 EXPECT_STREQ("\n\n", div->innerText().Utf8().data()); |
1124 EXPECT_EQ(1u, Controller().GetSelectionOffsets().Start()); | 1124 EXPECT_EQ(1u, Controller().GetSelectionOffsets().Start()); |
1125 EXPECT_EQ(1u, Controller().GetSelectionOffsets().end()); | 1125 EXPECT_EQ(1u, Controller().GetSelectionOffsets().End()); |
1126 } | 1126 } |
1127 | 1127 |
1128 TEST_F(InputMethodControllerTest, InsertLineBreakAfterConfirmingText) { | 1128 TEST_F(InputMethodControllerTest, InsertLineBreakAfterConfirmingText) { |
1129 Element* div = | 1129 Element* div = |
1130 InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); | 1130 InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); |
1131 | 1131 |
1132 Vector<CompositionUnderline> underlines; | 1132 Vector<CompositionUnderline> underlines; |
1133 underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); | 1133 underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); |
1134 Controller().CommitText("hello", underlines, 0); | 1134 Controller().CommitText("hello", underlines, 0); |
1135 EXPECT_STREQ("hello", div->innerText().Utf8().data()); | 1135 EXPECT_STREQ("hello", div->innerText().Utf8().data()); |
1136 | 1136 |
1137 Controller().SetEditableSelectionOffsets(PlainTextRange(2, 2)); | 1137 Controller().SetEditableSelectionOffsets(PlainTextRange(2, 2)); |
1138 EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); | 1138 EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); |
1139 EXPECT_EQ(2u, Controller().GetSelectionOffsets().end()); | 1139 EXPECT_EQ(2u, Controller().GetSelectionOffsets().End()); |
1140 | 1140 |
1141 GetFrame().GetEditor().InsertLineBreak(); | 1141 GetFrame().GetEditor().InsertLineBreak(); |
1142 EXPECT_STREQ("he\nllo", div->innerText().Utf8().data()); | 1142 EXPECT_STREQ("he\nllo", div->innerText().Utf8().data()); |
1143 EXPECT_EQ(3u, Controller().GetSelectionOffsets().Start()); | 1143 EXPECT_EQ(3u, Controller().GetSelectionOffsets().Start()); |
1144 EXPECT_EQ(3u, Controller().GetSelectionOffsets().end()); | 1144 EXPECT_EQ(3u, Controller().GetSelectionOffsets().End()); |
1145 } | 1145 } |
1146 | 1146 |
1147 TEST_F(InputMethodControllerTest, CompositionInputEventIsComposing) { | 1147 TEST_F(InputMethodControllerTest, CompositionInputEventIsComposing) { |
1148 GetDocument().GetSettings()->SetScriptEnabled(true); | 1148 GetDocument().GetSettings()->SetScriptEnabled(true); |
1149 Element* editable = | 1149 Element* editable = |
1150 InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); | 1150 InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); |
1151 Element* script = GetDocument().createElement("script"); | 1151 Element* script = GetDocument().createElement("script"); |
1152 script->setInnerHTML( | 1152 script->setInnerHTML( |
1153 "document.getElementById('sample').addEventListener('beforeinput', " | 1153 "document.getElementById('sample').addEventListener('beforeinput', " |
1154 " event => document.title = " | 1154 " event => document.title = " |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1290 TEST_F(InputMethodControllerTest, CompositionEndEventWithNoSelection) { | 1290 TEST_F(InputMethodControllerTest, CompositionEndEventWithNoSelection) { |
1291 CreateHTMLWithCompositionEndEventListener(kNoSelection); | 1291 CreateHTMLWithCompositionEndEventListener(kNoSelection); |
1292 | 1292 |
1293 // Simulate composition in the |contentEditable|. | 1293 // Simulate composition in the |contentEditable|. |
1294 Vector<CompositionUnderline> underlines; | 1294 Vector<CompositionUnderline> underlines; |
1295 underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); | 1295 underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); |
1296 | 1296 |
1297 Controller().SetComposition("hello", underlines, 1, 1); | 1297 Controller().SetComposition("hello", underlines, 1, 1); |
1298 GetDocument().UpdateStyleAndLayout(); | 1298 GetDocument().UpdateStyleAndLayout(); |
1299 EXPECT_EQ(1u, Controller().GetSelectionOffsets().Start()); | 1299 EXPECT_EQ(1u, Controller().GetSelectionOffsets().Start()); |
1300 EXPECT_EQ(1u, Controller().GetSelectionOffsets().end()); | 1300 EXPECT_EQ(1u, Controller().GetSelectionOffsets().End()); |
1301 | 1301 |
1302 // Confirm the ongoing composition. Note that it moves the caret to the end of | 1302 // Confirm the ongoing composition. Note that it moves the caret to the end of |
1303 // text [5,5] before firing 'compositonend' event. | 1303 // text [5,5] before firing 'compositonend' event. |
1304 Controller().FinishComposingText(InputMethodController::kDoNotKeepSelection); | 1304 Controller().FinishComposingText(InputMethodController::kDoNotKeepSelection); |
1305 GetDocument().UpdateStyleAndLayout(); | 1305 GetDocument().UpdateStyleAndLayout(); |
1306 EXPECT_TRUE(Controller().GetSelectionOffsets().IsNull()); | 1306 EXPECT_TRUE(Controller().GetSelectionOffsets().IsNull()); |
1307 } | 1307 } |
1308 | 1308 |
1309 TEST_F(InputMethodControllerTest, FinishCompositionRemovedRange) { | 1309 TEST_F(InputMethodControllerTest, FinishCompositionRemovedRange) { |
1310 Element* input_a = | 1310 Element* input_a = |
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1813 // Set selection before BODY(editable). | 1813 // Set selection before BODY(editable). |
1814 GetFrame().Selection().SetSelection( | 1814 GetFrame().Selection().SetSelection( |
1815 SelectionInDOMTree::Builder() | 1815 SelectionInDOMTree::Builder() |
1816 .Collapse(Position(GetDocument().documentElement(), 0)) | 1816 .Collapse(Position(GetDocument().documentElement(), 0)) |
1817 .Build()); | 1817 .Build()); |
1818 | 1818 |
1819 EXPECT_EQ(kWebTextInputTypeContentEditable, Controller().TextInputType()); | 1819 EXPECT_EQ(kWebTextInputTypeContentEditable, Controller().TextInputType()); |
1820 } | 1820 } |
1821 | 1821 |
1822 } // namespace blink | 1822 } // namespace blink |
OLD | NEW |