| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "config.h" | 5 #include "config.h" |
| 6 #include "core/editing/VisibleSelection.h" | 6 #include "core/editing/VisibleSelection.h" |
| 7 | 7 |
| 8 #include "core/dom/Range.h" | 8 #include "core/dom/Range.h" |
| 9 #include "core/editing/EditingTestBase.h" | 9 #include "core/editing/EditingTestBase.h" |
| 10 | 10 |
| 11 #define LOREM_IPSUM \ | 11 #define LOREM_IPSUM \ |
| 12 "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod te
mpor " \ | 12 "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod te
mpor " \ |
| 13 "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud " \ | 13 "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud " \ |
| 14 "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
aute irure " \ | 14 "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
aute irure " \ |
| 15 "dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat null
a pariatur." \ | 15 "dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat null
a pariatur." \ |
| 16 "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia d
eserunt " \ | 16 "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia d
eserunt " \ |
| 17 "mollit anim id est laborum." | 17 "mollit anim id est laborum." |
| 18 | 18 |
| 19 namespace blink { | 19 namespace blink { |
| 20 | 20 |
| 21 class VisibleSelectionTest : public EditingTestBase { | 21 class VisibleSelectionTest : public EditingTestBase { |
| 22 protected: | 22 protected: |
| 23 // Helper function to set the VisibleSelection base/extent. | 23 // Helper function to set the VisibleSelection base/extent. |
| 24 void setSelection(VisibleSelection& selection, int base) { setSelection(sele
ction, base, base); } | 24 void setSelection(VisibleSelection& selection, int base) { setSelection(sele
ction, base, base); } |
| 25 | 25 |
| 26 // Helper function to set the VisibleSelection base/extent. | 26 // Helper function to set the VisibleSelection base/extent. |
| 27 void setSelection(VisibleSelection& selection, int base, int extend) | 27 void setSelection(VisibleSelection& selection, int base, int extend) |
| 28 { | 28 { |
| 29 Node* node = document().body()->firstChild(); | 29 Node* node = document().body()->firstChild(); |
| 30 selection.setBase(Position(node, base, Position::PositionIsOffsetInAncho
r)); | 30 selection.setBase(Position(node, base)); |
| 31 selection.setExtent(Position(node, extend, Position::PositionIsOffsetInA
nchor)); | 31 selection.setExtent(Position(node, extend)); |
| 32 } | 32 } |
| 33 | 33 |
| 34 static bool equalPositions(const Position&, const PositionInComposedTree&); | 34 static bool equalPositions(const Position&, const PositionInComposedTree&); |
| 35 static void testComposedTreePositionsToEqualToDOMTreePositions(const Visible
Selection&); | 35 static void testComposedTreePositionsToEqualToDOMTreePositions(const Visible
Selection&); |
| 36 }; | 36 }; |
| 37 | 37 |
| 38 bool VisibleSelectionTest::equalPositions(const Position& positionInDOMTree, con
st PositionInComposedTree& positionInComposedTree) | 38 bool VisibleSelectionTest::equalPositions(const Position& positionInDOMTree, con
st PositionInComposedTree& positionInComposedTree) |
| 39 { | 39 { |
| 40 // Since DOM tree positions can't be map to composed tree version, e.g. | 40 // Since DOM tree positions can't be map to composed tree version, e.g. |
| 41 // shadow root, not distributed node, we map a position in composed tree | 41 // shadow root, not distributed node, we map a position in composed tree |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 RefPtrWillBeRawPtr<ShadowRoot> shadowRoot = setShadowContent(shadowContent); | 76 RefPtrWillBeRawPtr<ShadowRoot> shadowRoot = setShadowContent(shadowContent); |
| 77 | 77 |
| 78 RefPtrWillBeRawPtr<Element> body = document().body(); | 78 RefPtrWillBeRawPtr<Element> body = document().body(); |
| 79 RefPtrWillBeRawPtr<Element> host = body->querySelector("#host", ASSERT_NO_EX
CEPTION); | 79 RefPtrWillBeRawPtr<Element> host = body->querySelector("#host", ASSERT_NO_EX
CEPTION); |
| 80 RefPtrWillBeRawPtr<Element> one = body->querySelector("#one", ASSERT_NO_EXCE
PTION); | 80 RefPtrWillBeRawPtr<Element> one = body->querySelector("#one", ASSERT_NO_EXCE
PTION); |
| 81 RefPtrWillBeRawPtr<Element> six = shadowRoot->querySelector("#s6", ASSERT_NO
_EXCEPTION); | 81 RefPtrWillBeRawPtr<Element> six = shadowRoot->querySelector("#s6", ASSERT_NO
_EXCEPTION); |
| 82 | 82 |
| 83 VisibleSelection selection(Position::firstPositionInNode(one.get()), Positio
n::lastPositionInNode(shadowRoot.get())); | 83 VisibleSelection selection(Position::firstPositionInNode(one.get()), Positio
n::lastPositionInNode(shadowRoot.get())); |
| 84 | 84 |
| 85 EXPECT_EQ(Position(host.get(), Position::PositionIsBeforeAnchor), selection.
start()); | 85 EXPECT_EQ(Position(host.get(), Position::PositionIsBeforeAnchor), selection.
start()); |
| 86 EXPECT_EQ(Position(one->firstChild(), 0, Position::PositionIsOffsetInAnchor)
, selection.end()); | 86 EXPECT_EQ(Position(one->firstChild(), 0), selection.end()); |
| 87 EXPECT_EQ(PositionInComposedTree(one->firstChild(), 0, PositionInComposedTre
e::PositionIsOffsetInAnchor), selection.startInComposedTree()); | 87 EXPECT_EQ(PositionInComposedTree(one->firstChild(), 0), selection.startInCom
posedTree()); |
| 88 EXPECT_EQ(PositionInComposedTree(six->firstChild(), 2, PositionInComposedTre
e::PositionIsOffsetInAnchor), selection.endInComposedTree()); | 88 EXPECT_EQ(PositionInComposedTree(six->firstChild(), 2), selection.endInCompo
sedTree()); |
| 89 } | 89 } |
| 90 | 90 |
| 91 TEST_F(VisibleSelectionTest, ShadowDistributedNodes) | 91 TEST_F(VisibleSelectionTest, ShadowDistributedNodes) |
| 92 { | 92 { |
| 93 const char* bodyContent = "<p id='host'>00<b id='one'>11</b><b id='two'>22</
b>33</p>"; | 93 const char* bodyContent = "<p id='host'>00<b id='one'>11</b><b id='two'>22</
b>33</p>"; |
| 94 const char* shadowContent = "<a><span id='s4'>44</span><content select=#two>
</content><span id='s5'>55</span><content select=#one></content><span id='s6'>66
</span></a>"; | 94 const char* shadowContent = "<a><span id='s4'>44</span><content select=#two>
</content><span id='s5'>55</span><content select=#one></content><span id='s6'>66
</span></a>"; |
| 95 setBodyContent(bodyContent); | 95 setBodyContent(bodyContent); |
| 96 RefPtrWillBeRawPtr<ShadowRoot> shadowRoot = setShadowContent(shadowContent); | 96 RefPtrWillBeRawPtr<ShadowRoot> shadowRoot = setShadowContent(shadowContent); |
| 97 | 97 |
| 98 RefPtrWillBeRawPtr<Element> body = document().body(); | 98 RefPtrWillBeRawPtr<Element> body = document().body(); |
| 99 RefPtrWillBeRawPtr<Element> one = body->querySelector("#one", ASSERT_NO_EXCE
PTION); | 99 RefPtrWillBeRawPtr<Element> one = body->querySelector("#one", ASSERT_NO_EXCE
PTION); |
| 100 RefPtrWillBeRawPtr<Element> two = body->querySelector("#two", ASSERT_NO_EXCE
PTION); | 100 RefPtrWillBeRawPtr<Element> two = body->querySelector("#two", ASSERT_NO_EXCE
PTION); |
| 101 RefPtrWillBeRawPtr<Element> five = shadowRoot->querySelector("#s5", ASSERT_N
O_EXCEPTION); | 101 RefPtrWillBeRawPtr<Element> five = shadowRoot->querySelector("#s5", ASSERT_N
O_EXCEPTION); |
| 102 | 102 |
| 103 VisibleSelection selection(Position::firstPositionInNode(one.get()), Positio
n::lastPositionInNode(two.get())); | 103 VisibleSelection selection(Position::firstPositionInNode(one.get()), Positio
n::lastPositionInNode(two.get())); |
| 104 | 104 |
| 105 EXPECT_EQ(Position(one->firstChild(), 0, Position::PositionIsOffsetInAnchor)
, selection.start()); | 105 EXPECT_EQ(Position(one->firstChild(), 0), selection.start()); |
| 106 EXPECT_EQ(Position(two->firstChild(), 2, Position::PositionIsOffsetInAnchor)
, selection.end()); | 106 EXPECT_EQ(Position(two->firstChild(), 2), selection.end()); |
| 107 EXPECT_EQ(PositionInComposedTree(five->firstChild(), 0, PositionInComposedTr
ee::PositionIsOffsetInAnchor), selection.startInComposedTree()); | 107 EXPECT_EQ(PositionInComposedTree(five->firstChild(), 0), selection.startInCo
mposedTree()); |
| 108 EXPECT_EQ(PositionInComposedTree(five->firstChild(), 2, PositionInComposedTr
ee::PositionIsOffsetInAnchor), selection.endInComposedTree()); | 108 EXPECT_EQ(PositionInComposedTree(five->firstChild(), 2), selection.endInComp
osedTree()); |
| 109 } | 109 } |
| 110 | 110 |
| 111 TEST_F(VisibleSelectionTest, ShadowNested) | 111 TEST_F(VisibleSelectionTest, ShadowNested) |
| 112 { | 112 { |
| 113 const char* bodyContent = "<p id='host'>00<b id='one'>11</b><b id='two'>22</
b>33</p>"; | 113 const char* bodyContent = "<p id='host'>00<b id='one'>11</b><b id='two'>22</
b>33</p>"; |
| 114 const char* shadowContent = "<a><span id='s4'>44</span><content select=#two>
</content><span id='s5'>55</span><content select=#one></content><span id='s6'>66
</span></a>"; | 114 const char* shadowContent = "<a><span id='s4'>44</span><content select=#two>
</content><span id='s5'>55</span><content select=#one></content><span id='s6'>66
</span></a>"; |
| 115 const char* shadowContent2 = "<span id='s7'>77</span><content></content><spa
n id='s8'>88</span>"; | 115 const char* shadowContent2 = "<span id='s7'>77</span><content></content><spa
n id='s8'>88</span>"; |
| 116 setBodyContent(bodyContent); | 116 setBodyContent(bodyContent); |
| 117 RefPtrWillBeRawPtr<ShadowRoot> shadowRoot = setShadowContent(shadowContent); | 117 RefPtrWillBeRawPtr<ShadowRoot> shadowRoot = setShadowContent(shadowContent); |
| 118 RefPtrWillBeRawPtr<ShadowRoot> shadowRoot2 = createShadowRootForElementWithI
DAndSetInnerHTML(*shadowRoot, "s5", shadowContent2); | 118 RefPtrWillBeRawPtr<ShadowRoot> shadowRoot2 = createShadowRootForElementWithI
DAndSetInnerHTML(*shadowRoot, "s5", shadowContent2); |
| 119 | 119 |
| 120 RefPtrWillBeRawPtr<Element> body = document().body(); | 120 RefPtrWillBeRawPtr<Element> body = document().body(); |
| 121 RefPtrWillBeRawPtr<Element> host = body->querySelector("#host", ASSERT_NO_EX
CEPTION); | 121 RefPtrWillBeRawPtr<Element> host = body->querySelector("#host", ASSERT_NO_EX
CEPTION); |
| 122 RefPtrWillBeRawPtr<Element> one = body->querySelector("#one", ASSERT_NO_EXCE
PTION); | 122 RefPtrWillBeRawPtr<Element> one = body->querySelector("#one", ASSERT_NO_EXCE
PTION); |
| 123 RefPtrWillBeRawPtr<Element> eight = shadowRoot2->querySelector("#s8", ASSERT
_NO_EXCEPTION); | 123 RefPtrWillBeRawPtr<Element> eight = shadowRoot2->querySelector("#s8", ASSERT
_NO_EXCEPTION); |
| 124 | 124 |
| 125 VisibleSelection selection(Position::firstPositionInNode(one.get()), Positio
n::lastPositionInNode(shadowRoot2.get())); | 125 VisibleSelection selection(Position::firstPositionInNode(one.get()), Positio
n::lastPositionInNode(shadowRoot2.get())); |
| 126 | 126 |
| 127 EXPECT_EQ(Position(host.get(), Position::PositionIsBeforeAnchor), selection.
start()); | 127 EXPECT_EQ(Position(host.get(), Position::PositionIsBeforeAnchor), selection.
start()); |
| 128 EXPECT_EQ(Position(one->firstChild(), 0, Position::PositionIsOffsetInAnchor)
, selection.end()); | 128 EXPECT_EQ(Position(one->firstChild(), 0), selection.end()); |
| 129 EXPECT_EQ(PositionInComposedTree(eight->firstChild(), 2, PositionInComposedT
ree::PositionIsOffsetInAnchor), selection.startInComposedTree()); | 129 EXPECT_EQ(PositionInComposedTree(eight->firstChild(), 2), selection.startInC
omposedTree()); |
| 130 EXPECT_EQ(PositionInComposedTree(one->firstChild(), 0, PositionInComposedTre
e::PositionIsOffsetInAnchor), selection.endInComposedTree()); | 130 EXPECT_EQ(PositionInComposedTree(one->firstChild(), 0), selection.endInCompo
sedTree()); |
| 131 } | 131 } |
| 132 | 132 |
| 133 TEST_F(VisibleSelectionTest, WordGranularity) | 133 TEST_F(VisibleSelectionTest, WordGranularity) |
| 134 { | 134 { |
| 135 setBodyContent(LOREM_IPSUM); | 135 setBodyContent(LOREM_IPSUM); |
| 136 | 136 |
| 137 VisibleSelection selection; | 137 VisibleSelection selection; |
| 138 | 138 |
| 139 // Beginning of a word. | 139 // Beginning of a word. |
| 140 { | 140 { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 | 221 |
| 222 RefPtrWillBeRawPtr<Range> range = selection.firstRange(); | 222 RefPtrWillBeRawPtr<Range> range = selection.firstRange(); |
| 223 EXPECT_EQ(0, range->startOffset()); | 223 EXPECT_EQ(0, range->startOffset()); |
| 224 EXPECT_EQ(11, range->endOffset()); | 224 EXPECT_EQ(11, range->endOffset()); |
| 225 EXPECT_EQ("Lorem ipsum", range->text()); | 225 EXPECT_EQ("Lorem ipsum", range->text()); |
| 226 testComposedTreePositionsToEqualToDOMTreePositions(selection); | 226 testComposedTreePositionsToEqualToDOMTreePositions(selection); |
| 227 } | 227 } |
| 228 } | 228 } |
| 229 | 229 |
| 230 } // namespace blink | 230 } // namespace blink |
| OLD | NEW |