blob: 08525dd71363f2aa66d5b7ebc5d5f74f7bd8267d [file] [log] [blame]
// 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/position_iterator.h"
#include "third_party/blink/renderer/core/dom/flat_tree_traversal.h"
#include "third_party/blink/renderer/core/editing/position.h"
#include "third_party/blink/renderer/core/editing/testing/editing_test_base.h"
namespace blink {
class PositionIteratorTest : public EditingTestBase {
protected:
void TestDecrement(const char* markup);
void TestIncrement(const char* markup);
};
void PositionIteratorTest::TestDecrement(const char* markup) {
SetBodyContent(markup);
const Element& element = *GetDocument().QuerySelector("#target");
const Node* const text = element.previousSibling();
const Element* const body = element.GetDocument().body();
// Decrement until start of Text "123" from |element| on DOM tree.
PositionIterator dom_iterator(Position::LastPositionInNode(*body));
EXPECT_EQ(Position::LastPositionInNode(*body),
dom_iterator.ComputePosition());
dom_iterator.Decrement();
EXPECT_EQ(Position::AfterNode(element), dom_iterator.ComputePosition());
dom_iterator.Decrement();
EXPECT_EQ(Position::BeforeNode(element), dom_iterator.ComputePosition());
dom_iterator.Decrement();
EXPECT_EQ(Position(body, 1), dom_iterator.ComputePosition());
dom_iterator.Decrement();
EXPECT_EQ(Position(text, 3), dom_iterator.ComputePosition());
// Decrement until start of Text "123" from |element| on flat tree.
PositionIteratorInFlatTree flat_iterator(
PositionInFlatTree::LastPositionInNode(*body));
EXPECT_EQ(PositionInFlatTree::LastPositionInNode(*body),
flat_iterator.ComputePosition());
flat_iterator.Decrement();
EXPECT_EQ(PositionInFlatTree::AfterNode(element),
flat_iterator.ComputePosition());
flat_iterator.Decrement();
EXPECT_EQ(PositionInFlatTree::BeforeNode(element),
flat_iterator.ComputePosition());
flat_iterator.Decrement();
EXPECT_EQ(PositionInFlatTree(body, 1), flat_iterator.ComputePosition());
flat_iterator.Decrement();
EXPECT_EQ(PositionInFlatTree(text, 3), flat_iterator.ComputePosition());
}
void PositionIteratorTest::TestIncrement(const char* markup) {
SetBodyContent(markup);
const Element& element = *GetDocument().QuerySelector("#target");
Node* const text = element.nextSibling();
const Element* body = element.GetDocument().body();
// Increment until start of Text "123" from |element| on DOM tree.
PositionIterator dom_iterator(Position::FirstPositionInNode(*body));
EXPECT_EQ(Position(body, 0), dom_iterator.ComputePosition());
dom_iterator.Increment();
EXPECT_EQ(Position::BeforeNode(element), dom_iterator.ComputePosition());
dom_iterator.Increment();
EXPECT_EQ(Position::AfterNode(element), dom_iterator.ComputePosition());
dom_iterator.Increment();
EXPECT_EQ(Position(body, 1), dom_iterator.ComputePosition());
dom_iterator.Increment();
EXPECT_EQ(Position(text, 0), dom_iterator.ComputePosition());
// Increment until start of Text "123" from |element| on flat tree.
PositionIteratorInFlatTree flat_iterator(
PositionInFlatTree::FirstPositionInNode(*body));
EXPECT_EQ(PositionInFlatTree(body, 0), flat_iterator.ComputePosition());
flat_iterator.Increment();
EXPECT_EQ(PositionInFlatTree::BeforeNode(element),
flat_iterator.ComputePosition());
flat_iterator.Increment();
EXPECT_EQ(PositionInFlatTree::AfterNode(element),
flat_iterator.ComputePosition());
flat_iterator.Increment();
EXPECT_EQ(PositionInFlatTree(body, 1), flat_iterator.ComputePosition());
flat_iterator.Increment();
EXPECT_EQ(PositionInFlatTree(text, 0), flat_iterator.ComputePosition());
}
// For http://crbug.com/695317
TEST_F(PositionIteratorTest, decrementWithInputElement) {
TestDecrement("123<input id=target value='abc'>");
}
TEST_F(PositionIteratorTest, decrementWithSelectElement) {
TestDecrement(
"123<select id=target><option>1</option><option>2</option></select>");
}
// For http://crbug.com/695317
TEST_F(PositionIteratorTest, decrementWithTextAreaElement) {
TestDecrement("123<textarea id=target>456</textarea>");
}
// For http://crbug.com/695317
TEST_F(PositionIteratorTest, incrementWithInputElement) {
TestIncrement("<input id=target value='abc'>123");
}
TEST_F(PositionIteratorTest, incrementWithSelectElement) {
TestIncrement(
"<select id=target><option>1</option><option>2</option></select>123");
}
// For http://crbug.com/695317
TEST_F(PositionIteratorTest, incrementWithTextAreaElement) {
TestIncrement("<textarea id=target>123</textarea>456");
}
} // namespace blink