15d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// found in the LICENSE file. 45d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 55d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "config.h" 65d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/editing/SurroundingText.h" 75d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 87242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/dom/Document.h" 95d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/dom/Position.h" 105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/dom/Range.h" 115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/dom/Text.h" 125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/editing/VisibleSelection.h" 135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/html/HTMLElement.h" 145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/testing/DummyPageHolder.h" 155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include <gtest/gtest.h> 165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 17c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using namespace blink; 185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)namespace { 205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)class SurroundingTextTest : public ::testing::Test { 225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)protected: 235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Document& document() const { return m_dummyPageHolder->document(); } 245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) void setHTML(const String&); 255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection select(int offset) { return select(offset, offset); } 265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection select(int start, int end); 275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)private: 295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) virtual void SetUp() OVERRIDE; 305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) OwnPtr<DummyPageHolder> m_dummyPageHolder; 325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}; 335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void SurroundingTextTest::SetUp() 355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){ 365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_dummyPageHolder = DummyPageHolder::create(IntSize(800, 600)); 375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void SurroundingTextTest::setHTML(const String& content) 405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){ 415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) document().body()->setInnerHTML(content, ASSERT_NO_EXCEPTION); 425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)VisibleSelection SurroundingTextTest::select(int start, int end) 455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){ 465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Element* element = document().getElementById("selection"); 475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection; 485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) selection.setBase(Position(toText(element->firstChild()), start)); 495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) selection.setExtent(Position(toText(element->firstChild()), end)); 505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return selection; 515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)TEST_F(SurroundingTextTest, BasicCaretSelection) 545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){ 555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) setHTML(String("<p id='selection'>foo bar</p>")); 565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(0); 595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(selection.start(), 1); 605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("f", surroundingText.content()); 625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(0u, surroundingText.startOffsetInContent()); 635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(0u, surroundingText.endOffsetInContent()); 645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(0); 685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(selection.start(), 5); 695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // maxlength/2 is used on the left and right. 715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("foo", surroundingText.content().simplifyWhiteSpace()); 725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(1u, surroundingText.startOffsetInContent()); 735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(1u, surroundingText.endOffsetInContent()); 745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(0); 785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(selection.start(), 42); 795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("foo bar", surroundingText.content().simplifyWhiteSpace()); 815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(1u, surroundingText.startOffsetInContent()); 825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(1u, surroundingText.endOffsetInContent()); 835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // FIXME: if the selection is at the end of the text, SurroundingText 875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // will return nothing. 885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(7); 895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(selection.start(), 42); 905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(0u, surroundingText.content().length()); 925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(0u, surroundingText.startOffsetInContent()); 935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(0u, surroundingText.endOffsetInContent()); 945d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(6); 985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(selection.start(), 2); 995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("ar", surroundingText.content()); 1015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(1u, surroundingText.startOffsetInContent()); 1025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(1u, surroundingText.endOffsetInContent()); 1035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 1045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 1065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(6); 1075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(selection.start(), 42); 1085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("foo bar", surroundingText.content().simplifyWhiteSpace()); 1105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(7u, surroundingText.startOffsetInContent()); 1115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(7u, surroundingText.endOffsetInContent()); 1125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 1135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 1145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)TEST_F(SurroundingTextTest, BasicRangeSelection) 1165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){ 1175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) setHTML(String("<p id='selection'>Lorem ipsum dolor sit amet</p>")); 1185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 1205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(0, 5); 1215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(*selection.firstRange(), 1); 1225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("Lorem ", surroundingText.content()); 1245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(0u, surroundingText.startOffsetInContent()); 1255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(5u, surroundingText.endOffsetInContent()); 1265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 1275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 1295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(0, 5); 1305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(*selection.firstRange(), 5); 1315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("Lorem ip", surroundingText.content().simplifyWhiteSpace()); 1335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(1u, surroundingText.startOffsetInContent()); 1345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(6u, surroundingText.endOffsetInContent()); 1355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 1365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 1385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(0, 5); 1395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(*selection.firstRange(), 42); 1405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("Lorem ipsum dolor sit amet", surroundingText.content().simplifyWhiteSpace()); 1425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(1u, surroundingText.startOffsetInContent()); 1435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(6u, surroundingText.endOffsetInContent()); 1445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 1455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 1475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(6, 11); 1485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(*selection.firstRange(), 2); 1495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(" ipsum ", surroundingText.content()); 1515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(1u, surroundingText.startOffsetInContent()); 1525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(6u, surroundingText.endOffsetInContent()); 1535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 1545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 1565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(6, 11); 1575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(*selection.firstRange(), 42); 1585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("Lorem ipsum dolor sit amet", surroundingText.content().simplifyWhiteSpace()); 1605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(7u, surroundingText.startOffsetInContent()); 1615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(12u, surroundingText.endOffsetInContent()); 1625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 1635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 1645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)TEST_F(SurroundingTextTest, TreeCaretSelection) 1665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){ 1675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) setHTML(String("<div>This is outside of <p id='selection'>foo bar</p> the selected node</div>")); 1685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 1705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(0); 1715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(selection.start(), 1); 1725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("f", surroundingText.content()); 1745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(0u, surroundingText.startOffsetInContent()); 1755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(0u, surroundingText.endOffsetInContent()); 1765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 1775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 1795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(0); 1805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(selection.start(), 5); 1815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("foo", surroundingText.content().simplifyWhiteSpace()); 1835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(1u, surroundingText.startOffsetInContent()); 1845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(1u, surroundingText.endOffsetInContent()); 1855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 1865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 1885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(0); 1895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(selection.start(), 1337); 1905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace()); 1925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(20u, surroundingText.startOffsetInContent()); 1935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(20u, surroundingText.endOffsetInContent()); 1945d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 1955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 1975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(6); 1985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(selection.start(), 2); 1995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("ar", surroundingText.content()); 2015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(1u, surroundingText.startOffsetInContent()); 2025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(1u, surroundingText.endOffsetInContent()); 2035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 2045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 2065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(6); 2075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(selection.start(), 1337); 2085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace()); 2105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(26u, surroundingText.startOffsetInContent()); 2115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(26u, surroundingText.endOffsetInContent()); 2125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 2135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 2145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)TEST_F(SurroundingTextTest, TreeRangeSelection) 2165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){ 2175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) setHTML(String("<div>This is outside of <p id='selection'>foo bar</p> the selected node</div>")); 2185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 2205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(0, 1); 2215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(*selection.firstRange(), 1); 2225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("fo", surroundingText.content().simplifyWhiteSpace()); 2245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(0u, surroundingText.startOffsetInContent()); 2255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(1u, surroundingText.endOffsetInContent()); 2265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 2275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 2295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(0, 3); 2305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(*selection.firstRange(), 12); 2315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("e of foo bar", surroundingText.content().simplifyWhiteSpace()); 2335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(5u, surroundingText.startOffsetInContent()); 2345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(8u, surroundingText.endOffsetInContent()); 2355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 2365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 2385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(0, 3); 2395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(*selection.firstRange(), 1337); 2405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace()); 2425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(20u, surroundingText.startOffsetInContent()); 2435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(23u, surroundingText.endOffsetInContent()); 2445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 2455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 2475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(4, 7); 2485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(*selection.firstRange(), 12); 2495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("foo bar the se", surroundingText.content().simplifyWhiteSpace()); 2515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(5u, surroundingText.startOffsetInContent()); 2525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(8u, surroundingText.endOffsetInContent()); 2535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 2545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) { 2565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) VisibleSelection selection = select(0, 7); 2575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) SurroundingText surroundingText(*selection.firstRange(), 1337); 2585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace()); 2605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(20u, surroundingText.startOffsetInContent()); 2615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) EXPECT_EQ(27u, surroundingText.endOffsetInContent()); 2625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 2635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 2645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} // anonymous namespace 266