| 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
|
|
|