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