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/Document.h"
9 #include "core/dom/Position.h"
10 #include "core/dom/Range.h"
11 #include "core/dom/Text.h"
12 #include "core/editing/VisibleSelection.h"
13 #include "core/html/HTMLElement.h"
14 #include "core/testing/DummyPageHolder.h"
15 #include <gtest/gtest.h>
17 using namespace blink;
21 class SurroundingTextTest : public ::testing::Test {
23 Document& document() const { return m_dummyPageHolder->document(); }
24 void setHTML(const String&);
25 VisibleSelection select(int offset) { return select(offset, offset); }
26 VisibleSelection select(int start, int end);
29 virtual void SetUp() OVERRIDE;
31 OwnPtr<DummyPageHolder> m_dummyPageHolder;
34 void SurroundingTextTest::SetUp()
36 m_dummyPageHolder = DummyPageHolder::create(IntSize(800, 600));
39 void SurroundingTextTest::setHTML(const String& content)
41 document().body()->setInnerHTML(content, ASSERT_NO_EXCEPTION);
44 VisibleSelection SurroundingTextTest::select(int start, int end)
46 Element* element = document().getElementById("selection");
47 VisibleSelection selection;
48 selection.setBase(Position(toText(element->firstChild()), start));
49 selection.setExtent(Position(toText(element->firstChild()), end));
53 TEST_F(SurroundingTextTest, BasicCaretSelection)
55 setHTML(String("<p id='selection'>foo bar</p>"));
58 VisibleSelection selection = select(0);
59 SurroundingText surroundingText(selection.start(), 1);
61 EXPECT_EQ("f", surroundingText.content());
62 EXPECT_EQ(0u, surroundingText.startOffsetInContent());
63 EXPECT_EQ(0u, surroundingText.endOffsetInContent());
67 VisibleSelection selection = select(0);
68 SurroundingText surroundingText(selection.start(), 5);
70 // maxlength/2 is used on the left and right.
71 EXPECT_EQ("foo", surroundingText.content().simplifyWhiteSpace());
72 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
73 EXPECT_EQ(1u, surroundingText.endOffsetInContent());
77 VisibleSelection selection = select(0);
78 SurroundingText surroundingText(selection.start(), 42);
80 EXPECT_EQ("foo bar", surroundingText.content().simplifyWhiteSpace());
81 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
82 EXPECT_EQ(1u, surroundingText.endOffsetInContent());
86 // FIXME: if the selection is at the end of the text, SurroundingText
87 // will return nothing.
88 VisibleSelection selection = select(7);
89 SurroundingText surroundingText(selection.start(), 42);
91 EXPECT_EQ(0u, surroundingText.content().length());
92 EXPECT_EQ(0u, surroundingText.startOffsetInContent());
93 EXPECT_EQ(0u, surroundingText.endOffsetInContent());
97 VisibleSelection selection = select(6);
98 SurroundingText surroundingText(selection.start(), 2);
100 EXPECT_EQ("ar", surroundingText.content());
101 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
102 EXPECT_EQ(1u, surroundingText.endOffsetInContent());
106 VisibleSelection selection = select(6);
107 SurroundingText surroundingText(selection.start(), 42);
109 EXPECT_EQ("foo bar", surroundingText.content().simplifyWhiteSpace());
110 EXPECT_EQ(7u, surroundingText.startOffsetInContent());
111 EXPECT_EQ(7u, surroundingText.endOffsetInContent());
115 TEST_F(SurroundingTextTest, BasicRangeSelection)
117 setHTML(String("<p id='selection'>Lorem ipsum dolor sit amet</p>"));
120 VisibleSelection selection = select(0, 5);
121 SurroundingText surroundingText(*selection.firstRange(), 1);
123 EXPECT_EQ("Lorem ", surroundingText.content());
124 EXPECT_EQ(0u, surroundingText.startOffsetInContent());
125 EXPECT_EQ(5u, surroundingText.endOffsetInContent());
129 VisibleSelection selection = select(0, 5);
130 SurroundingText surroundingText(*selection.firstRange(), 5);
132 EXPECT_EQ("Lorem ip", surroundingText.content().simplifyWhiteSpace());
133 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
134 EXPECT_EQ(6u, surroundingText.endOffsetInContent());
138 VisibleSelection selection = select(0, 5);
139 SurroundingText surroundingText(*selection.firstRange(), 42);
141 EXPECT_EQ("Lorem ipsum dolor sit amet", surroundingText.content().simplifyWhiteSpace());
142 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
143 EXPECT_EQ(6u, surroundingText.endOffsetInContent());
147 VisibleSelection selection = select(6, 11);
148 SurroundingText surroundingText(*selection.firstRange(), 2);
150 EXPECT_EQ(" ipsum ", surroundingText.content());
151 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
152 EXPECT_EQ(6u, surroundingText.endOffsetInContent());
156 VisibleSelection selection = select(6, 11);
157 SurroundingText surroundingText(*selection.firstRange(), 42);
159 EXPECT_EQ("Lorem ipsum dolor sit amet", surroundingText.content().simplifyWhiteSpace());
160 EXPECT_EQ(7u, surroundingText.startOffsetInContent());
161 EXPECT_EQ(12u, surroundingText.endOffsetInContent());
165 TEST_F(SurroundingTextTest, TreeCaretSelection)
167 setHTML(String("<div>This is outside of <p id='selection'>foo bar</p> the selected node</div>"));
170 VisibleSelection selection = select(0);
171 SurroundingText surroundingText(selection.start(), 1);
173 EXPECT_EQ("f", surroundingText.content());
174 EXPECT_EQ(0u, surroundingText.startOffsetInContent());
175 EXPECT_EQ(0u, surroundingText.endOffsetInContent());
179 VisibleSelection selection = select(0);
180 SurroundingText surroundingText(selection.start(), 5);
182 EXPECT_EQ("foo", surroundingText.content().simplifyWhiteSpace());
183 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
184 EXPECT_EQ(1u, surroundingText.endOffsetInContent());
188 VisibleSelection selection = select(0);
189 SurroundingText surroundingText(selection.start(), 1337);
191 EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace());
192 EXPECT_EQ(20u, surroundingText.startOffsetInContent());
193 EXPECT_EQ(20u, surroundingText.endOffsetInContent());
197 VisibleSelection selection = select(6);
198 SurroundingText surroundingText(selection.start(), 2);
200 EXPECT_EQ("ar", surroundingText.content());
201 EXPECT_EQ(1u, surroundingText.startOffsetInContent());
202 EXPECT_EQ(1u, surroundingText.endOffsetInContent());
206 VisibleSelection selection = select(6);
207 SurroundingText surroundingText(selection.start(), 1337);
209 EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace());
210 EXPECT_EQ(26u, surroundingText.startOffsetInContent());
211 EXPECT_EQ(26u, surroundingText.endOffsetInContent());
215 TEST_F(SurroundingTextTest, TreeRangeSelection)
217 setHTML(String("<div>This is outside of <p id='selection'>foo bar</p> the selected node</div>"));
220 VisibleSelection selection = select(0, 1);
221 SurroundingText surroundingText(*selection.firstRange(), 1);
223 EXPECT_EQ("fo", surroundingText.content().simplifyWhiteSpace());
224 EXPECT_EQ(0u, surroundingText.startOffsetInContent());
225 EXPECT_EQ(1u, surroundingText.endOffsetInContent());
229 VisibleSelection selection = select(0, 3);
230 SurroundingText surroundingText(*selection.firstRange(), 12);
232 EXPECT_EQ("e of foo bar", surroundingText.content().simplifyWhiteSpace());
233 EXPECT_EQ(5u, surroundingText.startOffsetInContent());
234 EXPECT_EQ(8u, surroundingText.endOffsetInContent());
238 VisibleSelection selection = select(0, 3);
239 SurroundingText surroundingText(*selection.firstRange(), 1337);
241 EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace());
242 EXPECT_EQ(20u, surroundingText.startOffsetInContent());
243 EXPECT_EQ(23u, surroundingText.endOffsetInContent());
247 VisibleSelection selection = select(4, 7);
248 SurroundingText surroundingText(*selection.firstRange(), 12);
250 EXPECT_EQ("foo bar the se", surroundingText.content().simplifyWhiteSpace());
251 EXPECT_EQ(5u, surroundingText.startOffsetInContent());
252 EXPECT_EQ(8u, surroundingText.endOffsetInContent());
256 VisibleSelection selection = select(0, 7);
257 SurroundingText surroundingText(*selection.firstRange(), 1337);
259 EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace());
260 EXPECT_EQ(20u, surroundingText.startOffsetInContent());
261 EXPECT_EQ(27u, surroundingText.endOffsetInContent());
265 } // anonymous namespace