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

Unified Diff: third_party/WebKit/Source/core/editing/PositionIteratorTest.cpp

Issue 2725803002: Introduce PositionIteratorTest in webkit_unit_tests (Closed)
Patch Set: 2017-03-01T15:38:19 Add EXPECT_EQ() just after ctor by yoichio@'s comment Created 3 years, 10 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
« no previous file with comments | « third_party/WebKit/Source/core/editing/PositionIterator.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/editing/PositionIteratorTest.cpp
diff --git a/third_party/WebKit/Source/core/editing/PositionIteratorTest.cpp b/third_party/WebKit/Source/core/editing/PositionIteratorTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5f22d8c32940cad160ab9e218f8245eaaf2ce8d9
--- /dev/null
+++ b/third_party/WebKit/Source/core/editing/PositionIteratorTest.cpp
@@ -0,0 +1,391 @@
+// 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/PositionIterator.h"
+
+#include "core/dom/shadow/FlatTreeTraversal.h"
+#include "core/editing/EditingTestBase.h"
+
+namespace blink {
+
+class PositionIteratorTest : public EditingTestBase {};
+
+// For http://crbug.com/695317
+TEST_F(PositionIteratorTest, decrementWithInputElement) {
+ setBodyContent("123<input value='abc'>");
+ Element* const input = document().querySelector("input");
+ Node* const innerEditor = FlatTreeTraversal::firstChild(*input);
+ Node* const text = input->previousSibling();
+
+ // Decrement until start of "123" from INPUT on DOM tree
+ PositionIterator domIterator(Position::lastPositionInNode(document().body()));
+ EXPECT_EQ(Position::lastPositionInNode(document().body()),
+ domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position::afterNode(input), domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position::beforeNode(input), domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position(text, 3), domIterator.computePosition());
+
+ // Decrement until start of "123" from INPUT on flat tree
+ PositionIteratorInFlatTree flatIterator(
+ PositionInFlatTree::lastPositionInNode(document().body()));
+ EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree::afterNode(input),
+ flatIterator.computePosition());
+ // TODO(yosin): We should not traverse inside INPUT
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree::lastPositionInNode(innerEditor),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 3),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 2),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 1),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 0),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(innerEditor, 0), flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(input, 0), flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(document().body(), 1),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition());
+}
+
+TEST_F(PositionIteratorTest, decrementWithSelectElement) {
+ setBodyContent("123<select><option>1</option><option>2</option></select>");
+ Element* const select = document().querySelector("select");
+ Node* const option1 = select->firstChild();
+ Node* const option2 = select->lastChild();
+ Node* text = select->previousSibling();
+
+ // Decrement until start of "123" from SELECT on DOM tree
+ PositionIterator domIterator(Position::lastPositionInNode(document().body()));
+ EXPECT_EQ(Position::lastPositionInNode(document().body()),
+ domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position::afterNode(select), domIterator.computePosition());
+ // TODO(yosin): We should not traverse inside SELECT and OPTION
+ domIterator.decrement();
+ EXPECT_EQ(Position::lastPositionInNode(option2),
+ domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position(option2->firstChild(), 1), domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position(option2, 0), domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position(select, 1), domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position::lastPositionInNode(option1),
+ domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position(option1->firstChild(), 1), domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position(option1, 0), domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position(select, 0), domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position(text, 3), domIterator.computePosition());
+
+ // Decrement until start of "123" from SELECT on flat tree
+ PositionIteratorInFlatTree flatIterator(
+ PositionInFlatTree::lastPositionInNode(document().body()));
+ EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree::afterNode(select),
+ flatIterator.computePosition());
+ // TODO(yosin): We should not traverse inside SELECT and OPTION
+ // Traverse |option2|
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree::lastPositionInNode(option2),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(FlatTreeTraversal::firstChild(*option2), 1),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(option2, 0), flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(select, 1), flatIterator.computePosition());
+ // Traverse |option1|
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree::lastPositionInNode(option1),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(FlatTreeTraversal::firstChild(*option1), 1),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(option1, 0), flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(select, 0), flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(document().body(), 1),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition());
+}
+
+// For http://crbug.com/695317
+TEST_F(PositionIteratorTest, decrementWithTextAreaElement) {
+ setBodyContent("123<textarea>456</textarea>");
+ Element* const textarea = document().querySelector("textarea");
+ Node* const innerEditor = FlatTreeTraversal::firstChild(*textarea);
+ Node* const text = textarea->previousSibling();
+
+ // Decrement until end of "123" from after TEXTAREA on DOM tree
+ PositionIterator domIterator(Position::lastPositionInNode(document().body()));
+ EXPECT_EQ(Position::lastPositionInNode(document().body()),
+ domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position::afterNode(textarea), domIterator.computePosition());
+ // TODO(yosin): We should not traverse inside TEXTAREA
+ domIterator.decrement();
+ EXPECT_EQ(Position(textarea->firstChild(), 3), domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position(textarea, 0), domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition());
+ domIterator.decrement();
+ EXPECT_EQ(Position(text, 3), domIterator.computePosition());
+
+ // Decrement until end of "123" from after TEXTAREA on flat tree
+ PositionIteratorInFlatTree flatIterator(
+ PositionInFlatTree::lastPositionInNode(document().body()));
+ EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree::afterNode(textarea),
+ flatIterator.computePosition());
+ // TODO(yosin): We should not traverse inside TEXTAREA
+ // Traverse |innerEditor|
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree::lastPositionInNode(innerEditor),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 3),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 2),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 1),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 0),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(innerEditor, 0), flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(textarea, 0), flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(document().body(), 1),
+ flatIterator.computePosition());
+ flatIterator.decrement();
+ EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition());
+}
+
+// For http://crbug.com/695317
+TEST_F(PositionIteratorTest, incrementWithInputElement) {
+ setBodyContent("<input value='abc'>123");
+ Element* const input = document().querySelector("input");
+ Node* const innerEditor = FlatTreeTraversal::firstChild(*input);
+ Node* const text = input->nextSibling();
+
+ // Increment until start of "123" from INPUT on DOM tree
+ PositionIterator domIterator(
+ Position::firstPositionInNode(document().body()));
+ EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position::beforeNode(input), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position::afterNode(input), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position(text, 0), domIterator.computePosition());
+
+ // Increment until start of "123" from INPUT on flat tree
+ PositionIteratorInFlatTree flatIterator(
+ PositionInFlatTree::firstPositionInNode(document().body()));
+ EXPECT_EQ(PositionInFlatTree(document().body(), 0),
+ flatIterator.computePosition());
+ // TODO(yosin): We should not traverse inside INPUT
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(input, 0), flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(innerEditor, 0), flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 0),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 1),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 2),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 3),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree::lastPositionInNode(innerEditor),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree::afterNode(input),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(document().body(), 1),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition());
+}
+
+TEST_F(PositionIteratorTest, incrementWithSelectElement) {
+ setBodyContent("<select><option>1</option><option>2</option></select>123");
+ Element* const select = document().querySelector("select");
+ Node* const option1 = select->firstChild();
+ Node* const option2 = select->lastChild();
+ Node* const text = select->nextSibling();
+
+ // Increment until start of "123" from SELECT on DOM tree
+ PositionIterator domIterator(
+ Position::firstPositionInNode(document().body()));
+ EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition());
+ // TODO(yosin): We should not traverse inside SELECT
+ domIterator.increment();
+ EXPECT_EQ(Position(select, 0), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position(option1, 0), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position(option1->firstChild(), 0), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position::lastPositionInNode(option1),
+ domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position(select, 1), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position(option2, 0), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position(option2->firstChild(), 0), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position::lastPositionInNode(option2),
+ domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position::afterNode(select), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position(text, 0), domIterator.computePosition());
+
+ // Increment until start of "123" from SELECT on flat tree
+ PositionIteratorInFlatTree flatIterator(
+ PositionInFlatTree::firstPositionInNode(document().body()));
+ EXPECT_EQ(PositionInFlatTree(document().body(), 0),
+ flatIterator.computePosition());
+ // TODO(yosin): We should not traverse inside SELECT
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(select, 0), flatIterator.computePosition());
+ flatIterator.increment();
+ // Traverse |option2|
+ EXPECT_EQ(PositionInFlatTree(option1, 0), flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(FlatTreeTraversal::firstChild(*option1), 0),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree::lastPositionInNode(option1),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(select, 1), flatIterator.computePosition());
+ // Traverse |option2|
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(option2, 0), flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(FlatTreeTraversal::firstChild(*option2), 0),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree::lastPositionInNode(option2),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree::afterNode(select),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(document().body(), 1),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition());
+}
+
+// For http://crbug.com/695317
+TEST_F(PositionIteratorTest, incrementWithTextAreaElement) {
+ setBodyContent("<textarea>123</textarea>456");
+ Element* const textarea = document().querySelector("textarea");
+ Node* const text = textarea->nextSibling();
+ Node* const innerEditor = FlatTreeTraversal::firstChild(*textarea);
+
+ // Increment until start of "123" from TEXTAREA on DOM tree
+ PositionIterator domIterator(
+ Position::firstPositionInNode(document().body()));
+ EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position(textarea, 0), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position(textarea->firstChild(), 0), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position::afterNode(textarea), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition());
+ domIterator.increment();
+ EXPECT_EQ(Position(text, 0), domIterator.computePosition());
+
+ // Increment until start of "123" from TEXTAREA on flat tree
+ PositionIteratorInFlatTree flatIterator(
+ PositionInFlatTree::firstPositionInNode(document().body()));
+ EXPECT_EQ(PositionInFlatTree(document().body(), 0),
+ flatIterator.computePosition());
+ // TODO(yosin): We should not traverse inside TEXTAREA
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(textarea, 0), flatIterator.computePosition());
+ // Traverse |innerEditor|
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(innerEditor, 0), flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 0),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 1),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 2),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 3),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree::lastPositionInNode(innerEditor),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree::afterNode(textarea),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(document().body(), 1),
+ flatIterator.computePosition());
+ flatIterator.increment();
+ EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition());
+}
+
+} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/core/editing/PositionIterator.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698