summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/editing/selection_modifier_test.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2021-05-20 09:47:09 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2021-06-07 11:15:42 +0000
commit189d4fd8fad9e3c776873be51938cd31a42b6177 (patch)
tree6497caeff5e383937996768766ab3bb2081a40b2 /chromium/third_party/blink/renderer/core/editing/selection_modifier_test.cc
parent8bc75099d364490b22f43a7ce366b366c08f4164 (diff)
downloadqtwebengine-chromium-189d4fd8fad9e3c776873be51938cd31a42b6177.tar.gz
BASELINE: Update Chromium to 90.0.4430.221
Change-Id: Iff4d9d18d2fcf1a576f3b1f453010f744a232920 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/third_party/blink/renderer/core/editing/selection_modifier_test.cc')
-rw-r--r--chromium/third_party/blink/renderer/core/editing/selection_modifier_test.cc164
1 files changed, 164 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/core/editing/selection_modifier_test.cc b/chromium/third_party/blink/renderer/core/editing/selection_modifier_test.cc
index 166d1419fd0..0e304508d82 100644
--- a/chromium/third_party/blink/renderer/core/editing/selection_modifier_test.cc
+++ b/chromium/third_party/blink/renderer/core/editing/selection_modifier_test.cc
@@ -4,8 +4,11 @@
#include "third_party/blink/renderer/core/editing/selection_modifier.h"
+#include "third_party/blink/renderer/core/editing/editing_behavior.h"
+#include "third_party/blink/renderer/core/editing/editor.h"
#include "third_party/blink/renderer/core/editing/testing/editing_test_base.h"
#include "third_party/blink/renderer/core/editing/visible_position.h"
+#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
namespace blink {
@@ -128,4 +131,165 @@ TEST_F(SelectionModifierTest, StartOfSentenceWithNull) {
TextGranularity::kSentenceBoundary));
}
+TEST_F(SelectionModifierTest, MoveCaretWithShadow) {
+ const char* body_content =
+ "a a"
+ "<div id='host'>"
+ "<span slot='e'>e e</span>"
+ "<span slot='c'>c c</span>"
+ "</div>"
+ "f f";
+ const char* shadow_content =
+ "b b"
+ "<slot name='c'></slot>"
+ "d d"
+ "<slot name='e'></slot>";
+ LoadAhem();
+ InsertStyleElement("body {font-family: Ahem}");
+ SetBodyContent(body_content);
+ Element* host = GetDocument().getElementById("host");
+ ShadowRoot& shadow_root =
+ host->AttachShadowRootInternal(ShadowRootType::kOpen);
+ shadow_root.setInnerHTML(shadow_content);
+ UpdateAllLifecyclePhasesForTest();
+
+ Element* body = GetDocument().body();
+ Node* a = body->childNodes()->item(0);
+ Node* b = shadow_root.childNodes()->item(0);
+ Node* c = host->QuerySelector("[slot=c]")->firstChild();
+ Node* d = shadow_root.childNodes()->item(2);
+ Node* e = host->QuerySelector("[slot=e]")->firstChild();
+ Node* f = body->childNodes()->item(2);
+
+ auto makeSelection = [&](Position position) {
+ return SelectionInDOMTree::Builder().Collapse(position).Build();
+ };
+ SelectionModifyAlteration move = SelectionModifyAlteration::kMove;
+ SelectionModifyDirection direction;
+ TextGranularity granularity;
+
+ {
+ // Test moving forward, character by character.
+ direction = SelectionModifyDirection::kForward;
+ granularity = TextGranularity::kCharacter;
+ SelectionModifier modifier(GetFrame(), makeSelection(Position(body, 0)));
+ EXPECT_EQ(Position(a, 0), modifier.Selection().Base());
+ for (Node* node : {a, b, c, d, e, f}) {
+ if (node == b || node == f) {
+ modifier.Modify(move, direction, granularity);
+ EXPECT_EQ(Position(node, 0), modifier.Selection().Base());
+ }
+ modifier.Modify(move, direction, granularity);
+ EXPECT_EQ(Position(node, 1), modifier.Selection().Base());
+ modifier.Modify(move, direction, granularity);
+ EXPECT_EQ(Position(node, 2), modifier.Selection().Base());
+ modifier.Modify(move, direction, granularity);
+ EXPECT_EQ(Position(node, 3), modifier.Selection().Base());
+ }
+ }
+ {
+ // Test moving backward, character by character.
+ direction = SelectionModifyDirection::kBackward;
+ granularity = TextGranularity::kCharacter;
+ SelectionModifier modifier(GetFrame(), makeSelection(Position(body, 3)));
+ for (Node* node : {f, e, d, c, b, a}) {
+ EXPECT_EQ(Position(node, 3), modifier.Selection().Base());
+ modifier.Modify(move, direction, granularity);
+ EXPECT_EQ(Position(node, 2), modifier.Selection().Base());
+ modifier.Modify(move, direction, granularity);
+ EXPECT_EQ(Position(node, 1), modifier.Selection().Base());
+ modifier.Modify(move, direction, granularity);
+ if (node == f || node == b) {
+ EXPECT_EQ(Position(node, 0), modifier.Selection().Base());
+ modifier.Modify(move, direction, granularity);
+ }
+ }
+ EXPECT_EQ(Position(a, 0), modifier.Selection().Base());
+ }
+ {
+ // Test moving forward, word by word.
+ direction = SelectionModifyDirection::kForward;
+ granularity = TextGranularity::kWord;
+ bool skip_space =
+ GetFrame().GetEditor().Behavior().ShouldSkipSpaceWhenMovingRight();
+ SelectionModifier modifier(GetFrame(), makeSelection(Position(body, 0)));
+ EXPECT_EQ(Position(a, 0), modifier.Selection().Base());
+ for (Node* node : {a, b, c, d, e, f}) {
+ if (node == b || node == f) {
+ modifier.Modify(move, direction, granularity);
+ EXPECT_EQ(Position(node, 0), modifier.Selection().Base());
+ }
+ modifier.Modify(move, direction, granularity);
+ EXPECT_EQ(Position(node, skip_space ? 2 : 1),
+ modifier.Selection().Base());
+ if (node == a || node == e || node == f) {
+ modifier.Modify(move, direction, granularity);
+ EXPECT_EQ(Position(node, 3), modifier.Selection().Base());
+ }
+ }
+ }
+ {
+ // Test moving backward, word by word.
+ direction = SelectionModifyDirection::kBackward;
+ granularity = TextGranularity::kWord;
+ SelectionModifier modifier(GetFrame(), makeSelection(Position(body, 3)));
+ for (Node* node : {f, e, d, c, b, a}) {
+ if (node == f || node == e || node == a) {
+ EXPECT_EQ(Position(node, 3), modifier.Selection().Base());
+ modifier.Modify(move, direction, granularity);
+ }
+ EXPECT_EQ(Position(node, 2), modifier.Selection().Base());
+ modifier.Modify(move, direction, granularity);
+ if (node == f || node == b) {
+ EXPECT_EQ(Position(node, 0), modifier.Selection().Base());
+ modifier.Modify(move, direction, granularity);
+ }
+ }
+ EXPECT_EQ(Position(a, 0), modifier.Selection().Base());
+ }
+
+ // Place the contents into different lines
+ InsertStyleElement("span {display: block}");
+ UpdateAllLifecyclePhasesForTest();
+
+ {
+ // Test moving forward, line by line.
+ direction = SelectionModifyDirection::kForward;
+ granularity = TextGranularity::kLine;
+ for (int i = 0; i <= 3; ++i) {
+ SelectionModifier modifier(GetFrame(), makeSelection(Position(a, i)));
+ for (Node* node : {a, b, c, d, e, f}) {
+ EXPECT_EQ(Position(node, i), modifier.Selection().Base());
+ modifier.Modify(move, direction, granularity);
+ }
+ EXPECT_EQ(Position(f, 3), modifier.Selection().Base());
+ }
+ }
+ {
+ // Test moving backward, line by line.
+ direction = SelectionModifyDirection::kBackward;
+ granularity = TextGranularity::kLine;
+ for (int i = 0; i <= 3; ++i) {
+ SelectionModifier modifier(GetFrame(), makeSelection(Position(f, i)));
+ for (Node* node : {f, e, d, c, b, a}) {
+ EXPECT_EQ(Position(node, i), modifier.Selection().Base());
+ modifier.Modify(move, direction, granularity);
+ }
+ EXPECT_EQ(Position(a, 0), modifier.Selection().Base());
+ }
+ }
+}
+
+// For https://crbug.com/1155342 and https://crbug.com/1155309
+TEST_F(SelectionModifierTest, PreviousParagraphOfObject) {
+ const SelectionInDOMTree selection =
+ SetSelectionTextToBody("<object>|</object>");
+ SelectionModifier modifier(GetFrame(), selection);
+ modifier.Modify(SelectionModifyAlteration::kMove,
+ SelectionModifyDirection::kBackward,
+ TextGranularity::kParagraph);
+ EXPECT_EQ("|<object></object>",
+ GetSelectionTextFromBody(modifier.Selection().AsSelection()));
+}
+
} // namespace blink