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
3 // found in the LICENSE file.
6 #include "core/editing/SurroundingText.h"
8 #include "core/dom/Position.h"
9 #include "core/dom/Range.h"
10 #include "core/dom/Text.h"
11 #include "core/editing/VisibleSelection.h"
12 #include "core/html/HTMLElement.h"
13 #include "core/testing/DummyPageHolder.h"
14 #include <gtest/gtest.h>
16 using namespace blink;
20 class SurroundingTextTest : public ::testing::Test {
22 Document& document() const { return m_dummyPageHolder->document(); }
23 void setHTML(const String&);
24 VisibleSelection select(int offset) { return select(offset, offset); }
25 VisibleSelection select(int start, int end);
28 virtual void SetUp() OVERRIDE;
30 OwnPtr<DummyPageHolder> m_dummyPageHolder;
33 void SurroundingTextTest::SetUp()
35 m_dummyPageHolder = DummyPageHolder::create(IntSize(800, 600));
38 void SurroundingTextTest::setHTML(const String& content)
40 document().body()->setInnerHTML(content, ASSERT_NO_EXCEPTION);
43 VisibleSelection SurroundingTextTest::select(int start, int end)
45 Element* element = document().getElementById("selection");
46 VisibleSelection selection;
47 selection.setBase(Position(toText(element->firstChild()), start));
48 selection.setExtent(Position(toText(element->firstChild()), end));
52 TEST_F(SurroundingTextTest, BasicCaretSelection)
54 setHTML(String("<p id='selection'>foo bar</p>"));
57 VisibleSelection selection = select(0);
58 SurroundingText surroundingText(selection.start(), 1);
60 EXPECT_EQ("f", surroundingText.content());
61 EXPECT_EQ(0u, surroundingText.startOffsetInContent());
62 EXPECT_EQ(0u, surroundingText.endOffsetInContent());
66 VisibleSelection selection = select(0);
67 SurroundingText surroundingText(selection.start(), 5);
69 // maxlength/2 is used on the left and right.
70 EXPECT_EQ("foo", surroundingText.content().simplifyWhiteSpace());
71 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
72 EXPECT_EQ(1u, surroundingText.endOffsetInContent());
76 VisibleSelection selection = select(0);
77 SurroundingText surroundingText(selection.start(), 42);
79 EXPECT_EQ("foo bar", surroundingText.content().simplifyWhiteSpace());
80 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
81 EXPECT_EQ(1u, surroundingText.endOffsetInContent());
85 // FIXME: if the selection is at the end of the text, SurroundingText
86 // will return nothing.
87 VisibleSelection selection = select(7);
88 SurroundingText surroundingText(selection.start(), 42);
90 EXPECT_EQ(0u, surroundingText.content().length());
91 EXPECT_EQ(0u, surroundingText.startOffsetInContent());
92 EXPECT_EQ(0u, surroundingText.endOffsetInContent());
96 VisibleSelection selection = select(6);
97 SurroundingText surroundingText(selection.start(), 2);
99 EXPECT_EQ("ar", surroundingText.content());
100 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
101 EXPECT_EQ(1u, surroundingText.endOffsetInContent());
105 VisibleSelection selection = select(6);
106 SurroundingText surroundingText(selection.start(), 42);
108 EXPECT_EQ("foo bar", surroundingText.content().simplifyWhiteSpace());
109 EXPECT_EQ(7u, surroundingText.startOffsetInContent());
110 EXPECT_EQ(7u, surroundingText.endOffsetInContent());
114 TEST_F(SurroundingTextTest, BasicRangeSelection)
116 setHTML(String("<p id='selection'>Lorem ipsum dolor sit amet</p>"));
119 VisibleSelection selection = select(0, 5);
120 SurroundingText surroundingText(*selection.firstRange(), 1);
122 EXPECT_EQ("Lorem ", surroundingText.content());
123 EXPECT_EQ(0u, surroundingText.startOffsetInContent());
124 EXPECT_EQ(5u, surroundingText.endOffsetInContent());
128 VisibleSelection selection = select(0, 5);
129 SurroundingText surroundingText(*selection.firstRange(), 5);
131 EXPECT_EQ("Lorem ip", surroundingText.content().simplifyWhiteSpace());
132 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
133 EXPECT_EQ(6u, surroundingText.endOffsetInContent());
137 VisibleSelection selection = select(0, 5);
138 SurroundingText surroundingText(*selection.firstRange(), 42);
140 EXPECT_EQ("Lorem ipsum dolor sit amet", surroundingText.content().simplifyWhiteSpace());
141 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
142 EXPECT_EQ(6u, surroundingText.endOffsetInContent());
146 VisibleSelection selection = select(6, 11);
147 SurroundingText surroundingText(*selection.firstRange(), 2);
149 EXPECT_EQ(" ipsum ", surroundingText.content());
150 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
151 EXPECT_EQ(6u, surroundingText.endOffsetInContent());
155 VisibleSelection selection = select(6, 11);
156 SurroundingText surroundingText(*selection.firstRange(), 42);
158 EXPECT_EQ("Lorem ipsum dolor sit amet", surroundingText.content().simplifyWhiteSpace());
159 EXPECT_EQ(7u, surroundingText.startOffsetInContent());
160 EXPECT_EQ(12u, surroundingText.endOffsetInContent());
164 TEST_F(SurroundingTextTest, TreeCaretSelection)
166 setHTML(String("<div>This is outside of <p id='selection'>foo bar</p> the selected node</div>"));
169 VisibleSelection selection = select(0);
170 SurroundingText surroundingText(selection.start(), 1);
172 EXPECT_EQ("f", surroundingText.content());
173 EXPECT_EQ(0u, surroundingText.startOffsetInContent());
174 EXPECT_EQ(0u, surroundingText.endOffsetInContent());
178 VisibleSelection selection = select(0);
179 SurroundingText surroundingText(selection.start(), 5);
181 EXPECT_EQ("foo", surroundingText.content().simplifyWhiteSpace());
182 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
183 EXPECT_EQ(1u, surroundingText.endOffsetInContent());
187 VisibleSelection selection = select(0);
188 SurroundingText surroundingText(selection.start(), 1337);
190 EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace());
191 EXPECT_EQ(20u, surroundingText.startOffsetInContent());
192 EXPECT_EQ(20u, surroundingText.endOffsetInContent());
196 VisibleSelection selection = select(6);
197 SurroundingText surroundingText(selection.start(), 2);
199 EXPECT_EQ("ar", surroundingText.content());
200 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
201 EXPECT_EQ(1u, surroundingText.endOffsetInContent());
205 VisibleSelection selection = select(6);
206 SurroundingText surroundingText(selection.start(), 1337);
208 EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace());
209 EXPECT_EQ(26u, surroundingText.startOffsetInContent());
210 EXPECT_EQ(26u, surroundingText.endOffsetInContent());
214 TEST_F(SurroundingTextTest, TreeRangeSelection)
216 setHTML(String("<div>This is outside of <p id='selection'>foo bar</p> the selected node</div>"));
219 VisibleSelection selection = select(0, 1);
220 SurroundingText surroundingText(*selection.firstRange(), 1);
222 EXPECT_EQ("fo", surroundingText.content().simplifyWhiteSpace());
223 EXPECT_EQ(0u, surroundingText.startOffsetInContent());
224 EXPECT_EQ(1u, surroundingText.endOffsetInContent());
228 VisibleSelection selection = select(0, 3);
229 SurroundingText surroundingText(*selection.firstRange(), 12);
231 EXPECT_EQ("e of foo bar", surroundingText.content().simplifyWhiteSpace());
232 EXPECT_EQ(5u, surroundingText.startOffsetInContent());
233 EXPECT_EQ(8u, surroundingText.endOffsetInContent());
237 VisibleSelection selection = select(0, 3);
238 SurroundingText surroundingText(*selection.firstRange(), 1337);
240 EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace());
241 EXPECT_EQ(20u, surroundingText.startOffsetInContent());
242 EXPECT_EQ(23u, surroundingText.endOffsetInContent());
246 VisibleSelection selection = select(4, 7);
247 SurroundingText surroundingText(*selection.firstRange(), 12);
249 EXPECT_EQ("foo bar the se", surroundingText.content().simplifyWhiteSpace());
250 EXPECT_EQ(5u, surroundingText.startOffsetInContent());
251 EXPECT_EQ(8u, surroundingText.endOffsetInContent());
255 VisibleSelection selection = select(0, 7);
256 SurroundingText surroundingText(*selection.firstRange(), 1337);
258 EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace());
259 EXPECT_EQ(20u, surroundingText.startOffsetInContent());
260 EXPECT_EQ(27u, surroundingText.endOffsetInContent());
264 } // anonymous namespace