| Index: Source/core/html/HTMLTextFormControlElementTest.cpp
|
| diff --git a/Source/core/html/HTMLTextFormControlElementTest.cpp b/Source/core/html/HTMLTextFormControlElementTest.cpp
|
| index 1134854814f50e622791d248eed837aa2d9c7b0b..af7a69a11c7ef90940d0669c9df192f029d0798c 100644
|
| --- a/Source/core/html/HTMLTextFormControlElementTest.cpp
|
| +++ b/Source/core/html/HTMLTextFormControlElementTest.cpp
|
| @@ -5,8 +5,15 @@
|
| #include "config.h"
|
| #include "core/html/HTMLTextFormControlElement.h"
|
|
|
| +#include "core/dom/Position.h"
|
| +#include "core/dom/Text.h"
|
| +#include "core/editing/FrameSelection.h"
|
| +#include "core/editing/VisibleSelection.h"
|
| +#include "core/editing/VisibleUnits.h"
|
| #include "core/frame/FrameView.h"
|
| +#include "core/html/HTMLBRElement.h"
|
| #include "core/html/HTMLDocument.h"
|
| +#include "core/rendering/RenderTreeAsText.h"
|
| #include "core/testing/DummyPageHolder.h"
|
| #include "wtf/OwnPtr.h"
|
| #include <gtest/gtest.h>
|
| @@ -19,21 +26,23 @@ class HTMLTextFormControlElementTest : public ::testing::Test {
|
| protected:
|
| virtual void SetUp() OVERRIDE;
|
|
|
| + HTMLDocument& document() const { return *m_document; }
|
| HTMLTextFormControlElement& textControl() const { return *m_textControl; }
|
|
|
| private:
|
| OwnPtr<DummyPageHolder> m_dummyPageHolder;
|
|
|
| + RefPtrWillBePersistent<HTMLDocument> m_document;
|
| RefPtrWillBePersistent<HTMLTextFormControlElement> m_textControl;
|
| };
|
|
|
| void HTMLTextFormControlElementTest::SetUp()
|
| {
|
| m_dummyPageHolder = DummyPageHolder::create(IntSize(800, 600));
|
| - HTMLDocument& document = toHTMLDocument(m_dummyPageHolder->document());
|
| - document.documentElement()->setInnerHTML("<body><textarea id=textarea></textarea></body>", ASSERT_NO_EXCEPTION);
|
| - document.view()->updateLayoutAndStyleIfNeededRecursive();
|
| - m_textControl = toHTMLTextFormControlElement(document.getElementById("textarea"));
|
| + m_document = toHTMLDocument(&m_dummyPageHolder->document());
|
| + m_document->documentElement()->setInnerHTML("<body><textarea id=textarea></textarea></body>", ASSERT_NO_EXCEPTION);
|
| + m_document->view()->updateLayoutAndStyleIfNeededRecursive();
|
| + m_textControl = toHTMLTextFormControlElement(m_document->getElementById("textarea"));
|
| m_textControl->focus();
|
| }
|
|
|
| @@ -51,4 +60,77 @@ TEST_F(HTMLTextFormControlElementTest, SetSelectionRange)
|
| EXPECT_EQ(3, textControl().selectionEnd());
|
| }
|
|
|
| +typedef Position (*PositionFunction)(const Position&);
|
| +typedef VisiblePosition(*VisblePositionFunction)(const VisiblePosition&);
|
| +
|
| +void testFunctionEquivalence(const Position& position, PositionFunction positionFunction, VisblePositionFunction visibleFunction)
|
| +{
|
| + VisiblePosition visiblePosition(position);
|
| + VisiblePosition expected = visibleFunction(visiblePosition);
|
| + VisiblePosition actual = VisiblePosition(positionFunction(position));
|
| + EXPECT_EQ(expected, actual);
|
| +}
|
| +
|
| +static VisiblePosition startOfWord(const VisiblePosition& position)
|
| +{
|
| + return startOfWord(position, LeftWordIfOnBoundary);
|
| +}
|
| +
|
| +static VisiblePosition endOfWord(const VisiblePosition& position)
|
| +{
|
| + return endOfWord(position, RightWordIfOnBoundary);
|
| +}
|
| +
|
| +void testBoundary(HTMLDocument& document, HTMLTextFormControlElement& textControl)
|
| +{
|
| + for (unsigned i = 0; i < textControl.innerEditorValue().length(); i++) {
|
| + textControl.setSelectionRange(i, i);
|
| + Position position = document.frame()->selection().start();
|
| + SCOPED_TRACE(testing::Message() << "offset " << position.deprecatedEditingOffset() << " of " << nodePositionAsStringForTesting(position.deprecatedNode()).ascii().data());
|
| + {
|
| + SCOPED_TRACE("HTMLTextFormControlElement::startOfWord");
|
| + testFunctionEquivalence(position, HTMLTextFormControlElement::startOfWord, startOfWord);
|
| + }
|
| + {
|
| + SCOPED_TRACE("HTMLTextFormControlElement::endOfWord");
|
| + testFunctionEquivalence(position, HTMLTextFormControlElement::endOfWord, endOfWord);
|
| + }
|
| + {
|
| + SCOPED_TRACE("HTMLTextFormControlElement::startOfSentence");
|
| + testFunctionEquivalence(position, HTMLTextFormControlElement::startOfSentence, startOfSentence);
|
| + }
|
| + {
|
| + SCOPED_TRACE("HTMLTextFormControlElement::endOfSentence");
|
| + testFunctionEquivalence(position, HTMLTextFormControlElement::endOfSentence, endOfSentence);
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST_F(HTMLTextFormControlElementTest, WordAndSentenceBoundary)
|
| +{
|
| + HTMLElement* innerText = textControl().innerEditorElement();
|
| + {
|
| + SCOPED_TRACE("String is value.");
|
| + innerText->removeChildren();
|
| + innerText->setNodeValue("Hel\nlo, text form.\n");
|
| + testBoundary(document(), textControl());
|
| + }
|
| + {
|
| + SCOPED_TRACE("A Text node and a BR element");
|
| + innerText->removeChildren();
|
| + innerText->setNodeValue("");
|
| + innerText->appendChild(Text::create(document(), "Hello, text form."));
|
| + innerText->appendChild(HTMLBRElement::create(document()));
|
| + testBoundary(document(), textControl());
|
| + }
|
| + {
|
| + SCOPED_TRACE("Text nodes.");
|
| + innerText->removeChildren();
|
| + innerText->setNodeValue("");
|
| + innerText->appendChild(Text::create(document(), "Hel\nlo, te"));
|
| + innerText->appendChild(Text::create(document(), "xt form."));
|
| + testBoundary(document(), textControl());
|
| + }
|
| +}
|
| +
|
| }
|
|
|