| // 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 "third_party/blink/renderer/core/editing/commands/set_character_data_command.h" |
| |
| #include "third_party/blink/renderer/core/editing/commands/editing_state.h" |
| #include "third_party/blink/renderer/core/editing/testing/editing_test_base.h" |
| #include "third_party/blink/renderer/core/layout/layout_text_combine.h" |
| |
| namespace blink { |
| |
| class SetCharacterDataCommandTest : public EditingTestBase {}; |
| |
| TEST_F(SetCharacterDataCommandTest, replaceTextWithSameLength) { |
| SetBodyContent("<div contenteditable>This is a good test case</div>"); |
| |
| SimpleEditCommand* command = MakeGarbageCollected<SetCharacterDataCommand>( |
| To<Text>(GetDocument().body()->firstChild()->firstChild()), 10, 4, |
| "lame"); |
| |
| command->DoReapply(); |
| EXPECT_EQ( |
| "This is a lame test case", |
| To<Text>(GetDocument().body()->firstChild()->firstChild())->wholeText()); |
| |
| command->DoUnapply(); |
| EXPECT_EQ( |
| "This is a good test case", |
| To<Text>(GetDocument().body()->firstChild()->firstChild())->wholeText()); |
| } |
| |
| TEST_F(SetCharacterDataCommandTest, replaceTextWithLongerText) { |
| SetBodyContent("<div contenteditable>This is a good test case</div>"); |
| |
| SimpleEditCommand* command = MakeGarbageCollected<SetCharacterDataCommand>( |
| To<Text>(GetDocument().body()->firstChild()->firstChild()), 10, 4, |
| "lousy"); |
| |
| command->DoReapply(); |
| EXPECT_EQ( |
| "This is a lousy test case", |
| To<Text>(GetDocument().body()->firstChild()->firstChild())->wholeText()); |
| |
| command->DoUnapply(); |
| EXPECT_EQ( |
| "This is a good test case", |
| To<Text>(GetDocument().body()->firstChild()->firstChild())->wholeText()); |
| } |
| |
| TEST_F(SetCharacterDataCommandTest, replaceTextWithShorterText) { |
| SetBodyContent("<div contenteditable>This is a good test case</div>"); |
| |
| SimpleEditCommand* command = MakeGarbageCollected<SetCharacterDataCommand>( |
| To<Text>(GetDocument().body()->firstChild()->firstChild()), 10, 4, "meh"); |
| |
| command->DoReapply(); |
| EXPECT_EQ( |
| "This is a meh test case", |
| To<Text>(GetDocument().body()->firstChild()->firstChild())->wholeText()); |
| |
| command->DoUnapply(); |
| EXPECT_EQ( |
| "This is a good test case", |
| To<Text>(GetDocument().body()->firstChild()->firstChild())->wholeText()); |
| } |
| |
| TEST_F(SetCharacterDataCommandTest, insertTextIntoEmptyNode) { |
| SetBodyContent("<div contenteditable />"); |
| |
| GetDocument().body()->firstChild()->appendChild( |
| GetDocument().CreateEditingTextNode("")); |
| |
| SimpleEditCommand* command = MakeGarbageCollected<SetCharacterDataCommand>( |
| To<Text>(GetDocument().body()->firstChild()->firstChild()), 0, 0, |
| "hello"); |
| |
| command->DoReapply(); |
| EXPECT_EQ( |
| "hello", |
| To<Text>(GetDocument().body()->firstChild()->firstChild())->wholeText()); |
| |
| command->DoUnapply(); |
| EXPECT_EQ( |
| "", |
| To<Text>(GetDocument().body()->firstChild()->firstChild())->wholeText()); |
| } |
| |
| TEST_F(SetCharacterDataCommandTest, insertTextAtEndOfNonEmptyNode) { |
| SetBodyContent("<div contenteditable>Hello</div>"); |
| |
| SimpleEditCommand* command = MakeGarbageCollected<SetCharacterDataCommand>( |
| To<Text>(GetDocument().body()->firstChild()->firstChild()), 5, 0, |
| ", world!"); |
| |
| command->DoReapply(); |
| EXPECT_EQ( |
| "Hello, world!", |
| To<Text>(GetDocument().body()->firstChild()->firstChild())->wholeText()); |
| |
| command->DoUnapply(); |
| EXPECT_EQ( |
| "Hello", |
| To<Text>(GetDocument().body()->firstChild()->firstChild())->wholeText()); |
| } |
| |
| TEST_F(SetCharacterDataCommandTest, replaceEntireNode) { |
| SetBodyContent("<div contenteditable>Hello</div>"); |
| |
| SimpleEditCommand* command = MakeGarbageCollected<SetCharacterDataCommand>( |
| To<Text>(GetDocument().body()->firstChild()->firstChild()), 0, 5, "Bye"); |
| |
| command->DoReapply(); |
| EXPECT_EQ( |
| "Bye", |
| To<Text>(GetDocument().body()->firstChild()->firstChild())->wholeText()); |
| |
| command->DoUnapply(); |
| EXPECT_EQ( |
| "Hello", |
| To<Text>(GetDocument().body()->firstChild()->firstChild())->wholeText()); |
| } |
| |
| TEST_F(SetCharacterDataCommandTest, CombinedText) { |
| SetBodyContent( |
| "<div contenteditable style='writing-mode:vertical-lr; " |
| "-webkit-text-combine:horizontal' />"); |
| |
| auto* text_node = To<Text>(GetDocument().body()->firstChild()->appendChild( |
| GetDocument().CreateEditingTextNode(""))); |
| UpdateAllLifecyclePhasesForTest(); |
| |
| ASSERT_TRUE(text_node->GetLayoutObject()); |
| ASSERT_TRUE(text_node->GetLayoutObject()->IsCombineText()); |
| EXPECT_FALSE( |
| To<LayoutTextCombine>(text_node->GetLayoutObject())->IsCombined()); |
| |
| SimpleEditCommand* command = |
| MakeGarbageCollected<SetCharacterDataCommand>(text_node, 0, 0, "text"); |
| command->DoReapply(); |
| UpdateAllLifecyclePhasesForTest(); |
| |
| ASSERT_TRUE(text_node->GetLayoutObject()); |
| ASSERT_TRUE(text_node->GetLayoutObject()->IsCombineText()); |
| EXPECT_TRUE( |
| To<LayoutTextCombine>(text_node->GetLayoutObject())->IsCombined()); |
| |
| command->DoUnapply(); |
| UpdateAllLifecyclePhasesForTest(); |
| |
| ASSERT_TRUE(text_node->GetLayoutObject()); |
| ASSERT_TRUE(text_node->GetLayoutObject()->IsCombineText()); |
| EXPECT_FALSE( |
| To<LayoutTextCombine>(text_node->GetLayoutObject())->IsCombined()); |
| } |
| |
| } // namespace blink |