diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/core/editing/position_iterator_test.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/core/editing/position_iterator_test.cc | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/core/editing/position_iterator_test.cc b/chromium/third_party/blink/renderer/core/editing/position_iterator_test.cc new file mode 100644 index 00000000000..5fa5a32f9a0 --- /dev/null +++ b/chromium/third_party/blink/renderer/core/editing/position_iterator_test.cc @@ -0,0 +1,247 @@ +// 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 {}; + +// For http://crbug.com/695317 +TEST_F(PositionIteratorTest, decrementWithInputElement) { + SetBodyContent("123<input value='abc'>"); + Element* const input = GetDocument().QuerySelector("input"); + Node* const text = input->previousSibling(); + + // Decrement until start of "123" from INPUT on DOM tree + PositionIterator dom_iterator( + Position::LastPositionInNode(*GetDocument().body())); + EXPECT_EQ(Position::LastPositionInNode(*GetDocument().body()), + dom_iterator.ComputePosition()); + dom_iterator.Decrement(); + EXPECT_EQ(Position::AfterNode(*input), dom_iterator.ComputePosition()); + dom_iterator.Decrement(); + EXPECT_EQ(Position::BeforeNode(*input), dom_iterator.ComputePosition()); + dom_iterator.Decrement(); + EXPECT_EQ(Position(GetDocument().body(), 1), dom_iterator.ComputePosition()); + dom_iterator.Decrement(); + EXPECT_EQ(Position(text, 3), dom_iterator.ComputePosition()); + + // Decrement until start of "123" from INPUT on flat tree + PositionIteratorInFlatTree flat_iterator( + PositionInFlatTree::LastPositionInNode(*GetDocument().body())); + EXPECT_EQ(PositionInFlatTree::LastPositionInNode(*GetDocument().body()), + flat_iterator.ComputePosition()); + flat_iterator.Decrement(); + EXPECT_EQ(PositionInFlatTree::AfterNode(*input), + flat_iterator.ComputePosition()); + flat_iterator.Decrement(); + EXPECT_EQ(PositionInFlatTree::BeforeNode(*input), + flat_iterator.ComputePosition()); + flat_iterator.Decrement(); + EXPECT_EQ(PositionInFlatTree(GetDocument().body(), 1), + flat_iterator.ComputePosition()); + flat_iterator.Decrement(); + EXPECT_EQ(PositionInFlatTree(text, 3), flat_iterator.ComputePosition()); +} + +TEST_F(PositionIteratorTest, decrementWithSelectElement) { + SetBodyContent("123<select><option>1</option><option>2</option></select>"); + Element* const select = GetDocument().QuerySelector("select"); + Node* text = select->previousSibling(); + + // Decrement until start of "123" from SELECT on DOM tree + PositionIterator dom_iterator( + Position::LastPositionInNode(*GetDocument().body())); + EXPECT_EQ(Position::LastPositionInNode(*GetDocument().body()), + dom_iterator.ComputePosition()); + dom_iterator.Decrement(); + EXPECT_EQ(Position::AfterNode(*select), dom_iterator.ComputePosition()); + dom_iterator.Decrement(); + EXPECT_EQ(Position::AfterNode(*select), dom_iterator.ComputePosition()) + << "This is redundant result, we should not have. see " + "http://crbug.com/697283"; + dom_iterator.Decrement(); + EXPECT_EQ(Position::BeforeNode(*select), dom_iterator.ComputePosition()); + dom_iterator.Decrement(); + EXPECT_EQ(Position(GetDocument().body(), 1), dom_iterator.ComputePosition()); + dom_iterator.Decrement(); + EXPECT_EQ(Position(text, 3), dom_iterator.ComputePosition()); + + // Decrement until start of "123" from SELECT on flat tree + PositionIteratorInFlatTree flat_iterator( + PositionInFlatTree::LastPositionInNode(*GetDocument().body())); + EXPECT_EQ(PositionInFlatTree::LastPositionInNode(*GetDocument().body()), + flat_iterator.ComputePosition()); + flat_iterator.Decrement(); + EXPECT_EQ(PositionInFlatTree::AfterNode(*select), + flat_iterator.ComputePosition()); + flat_iterator.Decrement(); + EXPECT_EQ(PositionInFlatTree::BeforeNode(*select), + flat_iterator.ComputePosition()); + flat_iterator.Decrement(); + EXPECT_EQ(PositionInFlatTree(GetDocument().body(), 1), + flat_iterator.ComputePosition()); + flat_iterator.Decrement(); + EXPECT_EQ(PositionInFlatTree(text, 3), flat_iterator.ComputePosition()); +} + +// For http://crbug.com/695317 +TEST_F(PositionIteratorTest, decrementWithTextAreaElement) { + SetBodyContent("123<textarea>456</textarea>"); + Element* const textarea = GetDocument().QuerySelector("textarea"); + Node* const text = textarea->previousSibling(); + + // Decrement until end of "123" from after TEXTAREA on DOM tree + PositionIterator dom_iterator( + Position::LastPositionInNode(*GetDocument().body())); + EXPECT_EQ(Position::LastPositionInNode(*GetDocument().body()), + dom_iterator.ComputePosition()); + dom_iterator.Decrement(); + EXPECT_EQ(Position::AfterNode(*textarea), dom_iterator.ComputePosition()); + dom_iterator.Decrement(); + EXPECT_EQ(Position::BeforeNode(*textarea), dom_iterator.ComputePosition()); + dom_iterator.Decrement(); + EXPECT_EQ(Position(GetDocument().body(), 1), dom_iterator.ComputePosition()); + dom_iterator.Decrement(); + EXPECT_EQ(Position(text, 3), dom_iterator.ComputePosition()); + + // Decrement until end of "123" from after TEXTAREA on flat tree + PositionIteratorInFlatTree flat_iterator( + PositionInFlatTree::LastPositionInNode(*GetDocument().body())); + EXPECT_EQ(PositionInFlatTree::LastPositionInNode(*GetDocument().body()), + flat_iterator.ComputePosition()); + flat_iterator.Decrement(); + EXPECT_EQ(PositionInFlatTree::AfterNode(*textarea), + flat_iterator.ComputePosition()); + flat_iterator.Decrement(); + EXPECT_EQ(PositionInFlatTree::BeforeNode(*textarea), + flat_iterator.ComputePosition()); + flat_iterator.Decrement(); + EXPECT_EQ(PositionInFlatTree(GetDocument().body(), 1), + flat_iterator.ComputePosition()); + flat_iterator.Decrement(); + EXPECT_EQ(PositionInFlatTree(text, 3), flat_iterator.ComputePosition()); +} + +// For http://crbug.com/695317 +TEST_F(PositionIteratorTest, incrementWithInputElement) { + SetBodyContent("<input value='abc'>123"); + Element* const input = GetDocument().QuerySelector("input"); + Node* const text = input->nextSibling(); + + // Increment until start of "123" from INPUT on DOM tree + PositionIterator dom_iterator( + Position::FirstPositionInNode(*GetDocument().body())); + EXPECT_EQ(Position(GetDocument().body(), 0), dom_iterator.ComputePosition()); + dom_iterator.Increment(); + EXPECT_EQ(Position::BeforeNode(*input), dom_iterator.ComputePosition()); + dom_iterator.Increment(); + EXPECT_EQ(Position::AfterNode(*input), dom_iterator.ComputePosition()); + dom_iterator.Increment(); + EXPECT_EQ(Position(GetDocument().body(), 1), dom_iterator.ComputePosition()); + dom_iterator.Increment(); + EXPECT_EQ(Position(text, 0), dom_iterator.ComputePosition()); + + // Increment until start of "123" from INPUT on flat tree + PositionIteratorInFlatTree flat_iterator( + PositionInFlatTree::FirstPositionInNode(*GetDocument().body())); + EXPECT_EQ(PositionInFlatTree(GetDocument().body(), 0), + flat_iterator.ComputePosition()); + flat_iterator.Increment(); + EXPECT_EQ(PositionInFlatTree::BeforeNode(*input), + flat_iterator.ComputePosition()); + flat_iterator.Increment(); + EXPECT_EQ(PositionInFlatTree::AfterNode(*input), + flat_iterator.ComputePosition()); + flat_iterator.Increment(); + EXPECT_EQ(PositionInFlatTree(GetDocument().body(), 1), + flat_iterator.ComputePosition()); + flat_iterator.Increment(); + EXPECT_EQ(PositionInFlatTree(text, 0), flat_iterator.ComputePosition()); +} + +TEST_F(PositionIteratorTest, incrementWithSelectElement) { + SetBodyContent("<select><option>1</option><option>2</option></select>123"); + Element* const select = GetDocument().QuerySelector("select"); + Node* const text = select->nextSibling(); + + // Increment until start of "123" from SELECT on DOM tree + PositionIterator dom_iterator( + Position::FirstPositionInNode(*GetDocument().body())); + EXPECT_EQ(Position(GetDocument().body(), 0), dom_iterator.ComputePosition()); + dom_iterator.Increment(); + EXPECT_EQ(Position::BeforeNode(*select), dom_iterator.ComputePosition()); + dom_iterator.Increment(); + EXPECT_EQ(Position::AfterNode(*select), dom_iterator.ComputePosition()); + dom_iterator.Increment(); + EXPECT_EQ(Position::AfterNode(*select), dom_iterator.ComputePosition()) + << "This is redundant result, we should not have. see " + "http://crbug.com/697283"; + dom_iterator.Increment(); + EXPECT_EQ(Position(GetDocument().body(), 1), dom_iterator.ComputePosition()); + dom_iterator.Increment(); + EXPECT_EQ(Position(text, 0), dom_iterator.ComputePosition()); + + // Increment until start of "123" from SELECT on flat tree + PositionIteratorInFlatTree flat_iterator( + PositionInFlatTree::FirstPositionInNode(*GetDocument().body())); + EXPECT_EQ(PositionInFlatTree(GetDocument().body(), 0), + flat_iterator.ComputePosition()); + flat_iterator.Increment(); + EXPECT_EQ(PositionInFlatTree::BeforeNode(*select), + flat_iterator.ComputePosition()); + flat_iterator.Increment(); + EXPECT_EQ(PositionInFlatTree::AfterNode(*select), + flat_iterator.ComputePosition()); + flat_iterator.Increment(); + EXPECT_EQ(PositionInFlatTree(GetDocument().body(), 1), + flat_iterator.ComputePosition()); + flat_iterator.Increment(); + EXPECT_EQ(PositionInFlatTree(text, 0), flat_iterator.ComputePosition()); +} + +// For http://crbug.com/695317 +TEST_F(PositionIteratorTest, incrementWithTextAreaElement) { + SetBodyContent("<textarea>123</textarea>456"); + Element* const textarea = GetDocument().QuerySelector("textarea"); + Node* const text = textarea->nextSibling(); + + // Increment until start of "123" from TEXTAREA on DOM tree + PositionIterator dom_iterator( + Position::FirstPositionInNode(*GetDocument().body())); + EXPECT_EQ(Position(GetDocument().body(), 0), dom_iterator.ComputePosition()); + dom_iterator.Increment(); + EXPECT_EQ(Position::BeforeNode(*textarea), dom_iterator.ComputePosition()); + dom_iterator.Increment(); + EXPECT_EQ(Position::AfterNode(*textarea), dom_iterator.ComputePosition()); + dom_iterator.Increment(); + EXPECT_EQ(Position(GetDocument().body(), 1), dom_iterator.ComputePosition()); + dom_iterator.Increment(); + EXPECT_EQ(Position(text, 0), dom_iterator.ComputePosition()); + + // Increment until start of "123" from TEXTAREA on flat tree + PositionIteratorInFlatTree flat_iterator( + PositionInFlatTree::FirstPositionInNode(*GetDocument().body())); + EXPECT_EQ(PositionInFlatTree(GetDocument().body(), 0), + flat_iterator.ComputePosition()); + // TODO(yosin): We should not traverse inside TEXTAREA + flat_iterator.Increment(); + EXPECT_EQ(PositionInFlatTree::BeforeNode(*textarea), + flat_iterator.ComputePosition()); + flat_iterator.Increment(); + EXPECT_EQ(PositionInFlatTree::AfterNode(*textarea), + flat_iterator.ComputePosition()); + flat_iterator.Increment(); + EXPECT_EQ(PositionInFlatTree(GetDocument().body(), 1), + flat_iterator.ComputePosition()); + flat_iterator.Increment(); + EXPECT_EQ(PositionInFlatTree(text, 0), flat_iterator.ComputePosition()); +} + +} // namespace blink |