| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/editing/Position.h" | 5 #include "core/editing/Position.h" |
| 6 | 6 |
| 7 #include "core/editing/EditingTestBase.h" | 7 #include "core/editing/EditingTestBase.h" |
| 8 | 8 |
| 9 namespace blink { | 9 namespace blink { |
| 10 | 10 |
| 11 class PositionTest : public EditingTestBase {}; | 11 class PositionTest : public EditingTestBase {}; |
| 12 | 12 |
| 13 TEST_F(PositionTest, IsEquivalent) { | 13 TEST_F(PositionTest, IsEquivalent) { |
| 14 SetBodyContent("<a id=sample>0<b>1</b>2</a>"); | 14 SetBodyContent("<a id=sample>0<b>1</b>2</a>"); |
| 15 | 15 |
| 16 Element* sample = GetDocument().getElementById("sample"); | 16 Element* sample = GetDocument().getElementById("sample"); |
| 17 | 17 |
| 18 EXPECT_TRUE(Position(sample, 0).IsEquivalent(Position(sample, 0))); | 18 EXPECT_TRUE(Position(sample, 0).IsEquivalent(Position(sample, 0))); |
| 19 | 19 |
| 20 EXPECT_TRUE( | 20 EXPECT_TRUE( |
| 21 Position(sample, 0).IsEquivalent(Position::FirstPositionInNode(sample))); | 21 Position(sample, 0).IsEquivalent(Position::FirstPositionInNode(sample))); |
| 22 EXPECT_TRUE(Position(sample, 0).IsEquivalent( | 22 EXPECT_TRUE(Position(sample, 0).IsEquivalent( |
| 23 Position::BeforeNode(*sample->firstChild()))); | 23 Position::BeforeNode(*sample->firstChild()))); |
| 24 EXPECT_TRUE(Position(sample, 1).IsEquivalent( | 24 EXPECT_TRUE(Position(sample, 1).IsEquivalent( |
| 25 Position::AfterNode(sample->firstChild()))); | 25 Position::AfterNode(*sample->firstChild()))); |
| 26 EXPECT_TRUE(Position(sample, 1).IsEquivalent( | 26 EXPECT_TRUE(Position(sample, 1).IsEquivalent( |
| 27 Position::BeforeNode(*sample->firstChild()->nextSibling()))); | 27 Position::BeforeNode(*sample->firstChild()->nextSibling()))); |
| 28 EXPECT_TRUE(Position(sample, 2).IsEquivalent( | 28 EXPECT_TRUE(Position(sample, 2).IsEquivalent( |
| 29 Position::BeforeNode(*sample->lastChild()))); | 29 Position::BeforeNode(*sample->lastChild()))); |
| 30 EXPECT_TRUE(Position(sample, 3).IsEquivalent( | 30 EXPECT_TRUE(Position(sample, 3).IsEquivalent( |
| 31 Position::AfterNode(sample->lastChild()))); | 31 Position::AfterNode(*sample->lastChild()))); |
| 32 EXPECT_TRUE( | 32 EXPECT_TRUE( |
| 33 Position(sample, 3).IsEquivalent(Position::LastPositionInNode(sample))); | 33 Position(sample, 3).IsEquivalent(Position::LastPositionInNode(sample))); |
| 34 | 34 |
| 35 EXPECT_FALSE(Position(sample, 0).IsEquivalent(Position(sample, 1))); | 35 EXPECT_FALSE(Position(sample, 0).IsEquivalent(Position(sample, 1))); |
| 36 EXPECT_FALSE( | 36 EXPECT_FALSE( |
| 37 Position(sample, 0).IsEquivalent(Position::LastPositionInNode(sample))); | 37 Position(sample, 0).IsEquivalent(Position::LastPositionInNode(sample))); |
| 38 } | 38 } |
| 39 | 39 |
| 40 TEST_F(PositionTest, NodeAsRangeLastNodeNull) { | 40 TEST_F(PositionTest, NodeAsRangeLastNodeNull) { |
| 41 EXPECT_EQ(nullptr, Position().NodeAsRangeLastNode()); | 41 EXPECT_EQ(nullptr, Position().NodeAsRangeLastNode()); |
| 42 EXPECT_EQ(nullptr, PositionInFlatTree().NodeAsRangeLastNode()); | 42 EXPECT_EQ(nullptr, PositionInFlatTree().NodeAsRangeLastNode()); |
| 43 } | 43 } |
| 44 | 44 |
| 45 TEST_F(PositionTest, editingPositionOfWithEditingIgnoresContent) { | 45 TEST_F(PositionTest, editingPositionOfWithEditingIgnoresContent) { |
| 46 const char* body_content = | 46 const char* body_content = |
| 47 "<textarea id=textarea></textarea><a id=child1>1</a><b id=child2>2</b>"; | 47 "<textarea id=textarea></textarea><a id=child1>1</a><b id=child2>2</b>"; |
| 48 SetBodyContent(body_content); | 48 SetBodyContent(body_content); |
| 49 Node* textarea = GetDocument().getElementById("textarea"); | 49 Node* textarea = GetDocument().getElementById("textarea"); |
| 50 | 50 |
| 51 EXPECT_EQ(Position::BeforeNode(*textarea), | 51 EXPECT_EQ(Position::BeforeNode(*textarea), |
| 52 Position::EditingPositionOf(textarea, 0)); | 52 Position::EditingPositionOf(textarea, 0)); |
| 53 EXPECT_EQ(Position::AfterNode(textarea), | 53 EXPECT_EQ(Position::AfterNode(*textarea), |
| 54 Position::EditingPositionOf(textarea, 1)); | 54 Position::EditingPositionOf(textarea, 1)); |
| 55 EXPECT_EQ(Position::AfterNode(textarea), | 55 EXPECT_EQ(Position::AfterNode(*textarea), |
| 56 Position::EditingPositionOf(textarea, 2)); | 56 Position::EditingPositionOf(textarea, 2)); |
| 57 | 57 |
| 58 // Change DOM tree to | 58 // Change DOM tree to |
| 59 // <textarea id=textarea><a id=child1>1</a><b id=child2>2</b></textarea> | 59 // <textarea id=textarea><a id=child1>1</a><b id=child2>2</b></textarea> |
| 60 Node* child1 = GetDocument().getElementById("child1"); | 60 Node* child1 = GetDocument().getElementById("child1"); |
| 61 Node* child2 = GetDocument().getElementById("child2"); | 61 Node* child2 = GetDocument().getElementById("child2"); |
| 62 textarea->appendChild(child1); | 62 textarea->appendChild(child1); |
| 63 textarea->appendChild(child2); | 63 textarea->appendChild(child2); |
| 64 | 64 |
| 65 EXPECT_EQ(Position::BeforeNode(*textarea), | 65 EXPECT_EQ(Position::BeforeNode(*textarea), |
| 66 Position::EditingPositionOf(textarea, 0)); | 66 Position::EditingPositionOf(textarea, 0)); |
| 67 EXPECT_EQ(Position::AfterNode(textarea), | 67 EXPECT_EQ(Position::AfterNode(*textarea), |
| 68 Position::EditingPositionOf(textarea, 1)); | 68 Position::EditingPositionOf(textarea, 1)); |
| 69 EXPECT_EQ(Position::AfterNode(textarea), | 69 EXPECT_EQ(Position::AfterNode(*textarea), |
| 70 Position::EditingPositionOf(textarea, 2)); | 70 Position::EditingPositionOf(textarea, 2)); |
| 71 EXPECT_EQ(Position::AfterNode(textarea), | 71 EXPECT_EQ(Position::AfterNode(*textarea), |
| 72 Position::EditingPositionOf(textarea, 3)); | 72 Position::EditingPositionOf(textarea, 3)); |
| 73 } | 73 } |
| 74 | 74 |
| 75 TEST_F(PositionTest, NodeAsRangeLastNode) { | 75 TEST_F(PositionTest, NodeAsRangeLastNode) { |
| 76 const char* body_content = | 76 const char* body_content = |
| 77 "<p id='p1'>11</p><p id='p2'></p><p id='p3'>33</p>"; | 77 "<p id='p1'>11</p><p id='p2'></p><p id='p3'>33</p>"; |
| 78 SetBodyContent(body_content); | 78 SetBodyContent(body_content); |
| 79 Node* p1 = GetDocument().getElementById("p1"); | 79 Node* p1 = GetDocument().getElementById("p1"); |
| 80 Node* p2 = GetDocument().getElementById("p2"); | 80 Node* p2 = GetDocument().getElementById("p2"); |
| 81 Node* p3 = GetDocument().getElementById("p3"); | 81 Node* p3 = GetDocument().getElementById("p3"); |
| 82 Node* body = EditingStrategy::Parent(*p1); | 82 Node* body = EditingStrategy::Parent(*p1); |
| 83 Node* t1 = EditingStrategy::FirstChild(*p1); | 83 Node* t1 = EditingStrategy::FirstChild(*p1); |
| 84 Node* t3 = EditingStrategy::FirstChild(*p3); | 84 Node* t3 = EditingStrategy::FirstChild(*p3); |
| 85 | 85 |
| 86 EXPECT_EQ(body, Position::InParentBeforeNode(*p1).NodeAsRangeLastNode()); | 86 EXPECT_EQ(body, Position::InParentBeforeNode(*p1).NodeAsRangeLastNode()); |
| 87 EXPECT_EQ(t1, Position::InParentBeforeNode(*p2).NodeAsRangeLastNode()); | 87 EXPECT_EQ(t1, Position::InParentBeforeNode(*p2).NodeAsRangeLastNode()); |
| 88 EXPECT_EQ(p2, Position::InParentBeforeNode(*p3).NodeAsRangeLastNode()); | 88 EXPECT_EQ(p2, Position::InParentBeforeNode(*p3).NodeAsRangeLastNode()); |
| 89 EXPECT_EQ(t1, Position::InParentAfterNode(*p1).NodeAsRangeLastNode()); | 89 EXPECT_EQ(t1, Position::InParentAfterNode(*p1).NodeAsRangeLastNode()); |
| 90 EXPECT_EQ(p2, Position::InParentAfterNode(*p2).NodeAsRangeLastNode()); | 90 EXPECT_EQ(p2, Position::InParentAfterNode(*p2).NodeAsRangeLastNode()); |
| 91 EXPECT_EQ(t3, Position::InParentAfterNode(*p3).NodeAsRangeLastNode()); | 91 EXPECT_EQ(t3, Position::InParentAfterNode(*p3).NodeAsRangeLastNode()); |
| 92 EXPECT_EQ(t3, Position::AfterNode(p3).NodeAsRangeLastNode()); | 92 EXPECT_EQ(t3, Position::AfterNode(*p3).NodeAsRangeLastNode()); |
| 93 | 93 |
| 94 EXPECT_EQ(body, | 94 EXPECT_EQ(body, |
| 95 PositionInFlatTree::InParentBeforeNode(*p1).NodeAsRangeLastNode()); | 95 PositionInFlatTree::InParentBeforeNode(*p1).NodeAsRangeLastNode()); |
| 96 EXPECT_EQ(t1, | 96 EXPECT_EQ(t1, |
| 97 PositionInFlatTree::InParentBeforeNode(*p2).NodeAsRangeLastNode()); | 97 PositionInFlatTree::InParentBeforeNode(*p2).NodeAsRangeLastNode()); |
| 98 EXPECT_EQ(p2, | 98 EXPECT_EQ(p2, |
| 99 PositionInFlatTree::InParentBeforeNode(*p3).NodeAsRangeLastNode()); | 99 PositionInFlatTree::InParentBeforeNode(*p3).NodeAsRangeLastNode()); |
| 100 EXPECT_EQ(t1, | 100 EXPECT_EQ(t1, |
| 101 PositionInFlatTree::InParentAfterNode(*p1).NodeAsRangeLastNode()); | 101 PositionInFlatTree::InParentAfterNode(*p1).NodeAsRangeLastNode()); |
| 102 EXPECT_EQ(p2, | 102 EXPECT_EQ(p2, |
| 103 PositionInFlatTree::InParentAfterNode(*p2).NodeAsRangeLastNode()); | 103 PositionInFlatTree::InParentAfterNode(*p2).NodeAsRangeLastNode()); |
| 104 EXPECT_EQ(t3, | 104 EXPECT_EQ(t3, |
| 105 PositionInFlatTree::InParentAfterNode(*p3).NodeAsRangeLastNode()); | 105 PositionInFlatTree::InParentAfterNode(*p3).NodeAsRangeLastNode()); |
| 106 EXPECT_EQ(t3, PositionInFlatTree::AfterNode(p3).NodeAsRangeLastNode()); | 106 EXPECT_EQ(t3, PositionInFlatTree::AfterNode(*p3).NodeAsRangeLastNode()); |
| 107 } | 107 } |
| 108 | 108 |
| 109 TEST_F(PositionTest, NodeAsRangeLastNodeShadow) { | 109 TEST_F(PositionTest, NodeAsRangeLastNodeShadow) { |
| 110 const char* body_content = | 110 const char* body_content = |
| 111 "<p id='host'>00<b id='one'>11</b><b id='two'>22</b>33</p>"; | 111 "<p id='host'>00<b id='one'>11</b><b id='two'>22</b>33</p>"; |
| 112 const char* shadow_content = | 112 const char* shadow_content = |
| 113 "<a id='a'><content select=#two></content><content " | 113 "<a id='a'><content select=#two></content><content " |
| 114 "select=#one></content></a>"; | 114 "select=#one></content></a>"; |
| 115 SetBodyContent(body_content); | 115 SetBodyContent(body_content); |
| 116 ShadowRoot* shadow_root = SetShadowContent(shadow_content, "host"); | 116 ShadowRoot* shadow_root = SetShadowContent(shadow_content, "host"); |
| 117 | 117 |
| 118 Node* host = GetDocument().getElementById("host"); | 118 Node* host = GetDocument().getElementById("host"); |
| 119 Node* n1 = GetDocument().getElementById("one"); | 119 Node* n1 = GetDocument().getElementById("one"); |
| 120 Node* n2 = GetDocument().getElementById("two"); | 120 Node* n2 = GetDocument().getElementById("two"); |
| 121 Node* t0 = EditingStrategy::FirstChild(*host); | 121 Node* t0 = EditingStrategy::FirstChild(*host); |
| 122 Node* t1 = EditingStrategy::FirstChild(*n1); | 122 Node* t1 = EditingStrategy::FirstChild(*n1); |
| 123 Node* t2 = EditingStrategy::FirstChild(*n2); | 123 Node* t2 = EditingStrategy::FirstChild(*n2); |
| 124 Node* t3 = EditingStrategy::LastChild(*host); | 124 Node* t3 = EditingStrategy::LastChild(*host); |
| 125 Node* a = shadow_root->getElementById("a"); | 125 Node* a = shadow_root->getElementById("a"); |
| 126 | 126 |
| 127 EXPECT_EQ(t0, Position::InParentBeforeNode(*n1).NodeAsRangeLastNode()); | 127 EXPECT_EQ(t0, Position::InParentBeforeNode(*n1).NodeAsRangeLastNode()); |
| 128 EXPECT_EQ(t1, Position::InParentBeforeNode(*n2).NodeAsRangeLastNode()); | 128 EXPECT_EQ(t1, Position::InParentBeforeNode(*n2).NodeAsRangeLastNode()); |
| 129 EXPECT_EQ(t1, Position::InParentAfterNode(*n1).NodeAsRangeLastNode()); | 129 EXPECT_EQ(t1, Position::InParentAfterNode(*n1).NodeAsRangeLastNode()); |
| 130 EXPECT_EQ(t2, Position::InParentAfterNode(*n2).NodeAsRangeLastNode()); | 130 EXPECT_EQ(t2, Position::InParentAfterNode(*n2).NodeAsRangeLastNode()); |
| 131 EXPECT_EQ(t3, Position::AfterNode(host).NodeAsRangeLastNode()); | 131 EXPECT_EQ(t3, Position::AfterNode(*host).NodeAsRangeLastNode()); |
| 132 | 132 |
| 133 EXPECT_EQ(t2, | 133 EXPECT_EQ(t2, |
| 134 PositionInFlatTree::InParentBeforeNode(*n1).NodeAsRangeLastNode()); | 134 PositionInFlatTree::InParentBeforeNode(*n1).NodeAsRangeLastNode()); |
| 135 EXPECT_EQ(a, | 135 EXPECT_EQ(a, |
| 136 PositionInFlatTree::InParentBeforeNode(*n2).NodeAsRangeLastNode()); | 136 PositionInFlatTree::InParentBeforeNode(*n2).NodeAsRangeLastNode()); |
| 137 EXPECT_EQ(t1, | 137 EXPECT_EQ(t1, |
| 138 PositionInFlatTree::InParentAfterNode(*n1).NodeAsRangeLastNode()); | 138 PositionInFlatTree::InParentAfterNode(*n1).NodeAsRangeLastNode()); |
| 139 EXPECT_EQ(t2, | 139 EXPECT_EQ(t2, |
| 140 PositionInFlatTree::InParentAfterNode(*n2).NodeAsRangeLastNode()); | 140 PositionInFlatTree::InParentAfterNode(*n2).NodeAsRangeLastNode()); |
| 141 EXPECT_EQ(t1, PositionInFlatTree::AfterNode(host).NodeAsRangeLastNode()); | 141 EXPECT_EQ(t1, PositionInFlatTree::AfterNode(*host).NodeAsRangeLastNode()); |
| 142 } | 142 } |
| 143 | 143 |
| 144 TEST_F(PositionTest, ToPositionInFlatTreeWithActiveInsertionPoint) { | 144 TEST_F(PositionTest, ToPositionInFlatTreeWithActiveInsertionPoint) { |
| 145 const char* body_content = "<p id='host'>00<b id='one'>11</b>22</p>"; | 145 const char* body_content = "<p id='host'>00<b id='one'>11</b>22</p>"; |
| 146 const char* shadow_content = | 146 const char* shadow_content = |
| 147 "<a id='a'><content select=#one " | 147 "<a id='a'><content select=#one " |
| 148 "id='content'></content><content></content></a>"; | 148 "id='content'></content><content></content></a>"; |
| 149 SetBodyContent(body_content); | 149 SetBodyContent(body_content); |
| 150 ShadowRoot* shadow_root = SetShadowContent(shadow_content, "host"); | 150 ShadowRoot* shadow_root = SetShadowContent(shadow_content, "host"); |
| 151 Element* anchor = shadow_root->getElementById("a"); | 151 Element* anchor = shadow_root->getElementById("a"); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 const char* shadow_content = ""; | 222 const char* shadow_content = ""; |
| 223 SetBodyContent(body_content); | 223 SetBodyContent(body_content); |
| 224 ShadowRoot* shadow_root = SetShadowContent(shadow_content, "host"); | 224 ShadowRoot* shadow_root = SetShadowContent(shadow_content, "host"); |
| 225 Element* host = GetDocument().getElementById("host"); | 225 Element* host = GetDocument().getElementById("host"); |
| 226 | 226 |
| 227 EXPECT_EQ(PositionInFlatTree(host, PositionAnchorType::kAfterChildren), | 227 EXPECT_EQ(PositionInFlatTree(host, PositionAnchorType::kAfterChildren), |
| 228 ToPositionInFlatTree(Position(shadow_root, 0))); | 228 ToPositionInFlatTree(Position(shadow_root, 0))); |
| 229 } | 229 } |
| 230 | 230 |
| 231 } // namespace blink | 231 } // namespace blink |
| OLD | NEW |