Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 #include "core/html/HTMLTextFormControlElement.h" | 6 #include "core/html/HTMLTextFormControlElement.h" |
| 7 | 7 |
| 8 #include "core/dom/Position.h" | |
| 9 #include "core/dom/Text.h" | |
| 10 #include "core/editing/FrameSelection.h" | |
| 11 #include "core/editing/VisibleSelection.h" | |
| 12 #include "core/editing/VisibleUnits.h" | |
| 8 #include "core/frame/FrameView.h" | 13 #include "core/frame/FrameView.h" |
| 14 #include "core/html/HTMLBRElement.h" | |
| 9 #include "core/html/HTMLDocument.h" | 15 #include "core/html/HTMLDocument.h" |
| 16 #include "core/rendering/RenderTreeAsText.h" | |
| 10 #include "core/testing/DummyPageHolder.h" | 17 #include "core/testing/DummyPageHolder.h" |
| 11 #include "wtf/OwnPtr.h" | 18 #include "wtf/OwnPtr.h" |
| 12 #include <gtest/gtest.h> | 19 #include <gtest/gtest.h> |
| 13 | 20 |
| 21 using namespace blink; | |
|
Yuta Kitamura
2014/07/03 08:39:27
Is there anything under blink namespace in this fi
yoichio
2014/07/04 01:29:44
Nothing. Thanks.
| |
| 14 using namespace WebCore; | 22 using namespace WebCore; |
| 15 | 23 |
| 16 namespace { | 24 namespace { |
| 17 | 25 |
| 18 class HTMLTextFormControlElementTest : public ::testing::Test { | 26 class HTMLTextFormControlElementTest : public ::testing::Test { |
| 19 protected: | 27 protected: |
| 20 virtual void SetUp() OVERRIDE; | 28 virtual void SetUp() OVERRIDE; |
| 21 | 29 |
| 30 HTMLDocument& document() const { return *m_document; } | |
| 22 HTMLTextFormControlElement& textControl() const { return *m_textControl; } | 31 HTMLTextFormControlElement& textControl() const { return *m_textControl; } |
| 23 | 32 |
| 24 private: | 33 private: |
| 25 OwnPtr<DummyPageHolder> m_dummyPageHolder; | 34 OwnPtr<DummyPageHolder> m_dummyPageHolder; |
| 26 | 35 |
| 36 RefPtrWillBePersistent<HTMLDocument> m_document; | |
| 27 RefPtrWillBePersistent<HTMLTextFormControlElement> m_textControl; | 37 RefPtrWillBePersistent<HTMLTextFormControlElement> m_textControl; |
| 28 }; | 38 }; |
| 29 | 39 |
| 30 void HTMLTextFormControlElementTest::SetUp() | 40 void HTMLTextFormControlElementTest::SetUp() |
| 31 { | 41 { |
| 32 m_dummyPageHolder = DummyPageHolder::create(IntSize(800, 600)); | 42 m_dummyPageHolder = DummyPageHolder::create(IntSize(800, 600)); |
| 33 HTMLDocument& document = toHTMLDocument(m_dummyPageHolder->document()); | 43 m_document = toHTMLDocument(&m_dummyPageHolder->document()); |
| 34 document.documentElement()->setInnerHTML("<body><textarea id=textarea></text area></body>", ASSERT_NO_EXCEPTION); | 44 m_document->documentElement()->setInnerHTML("<body><textarea id=textarea></t extarea></body>", ASSERT_NO_EXCEPTION); |
| 35 document.view()->updateLayoutAndStyleIfNeededRecursive(); | 45 m_document->view()->updateLayoutAndStyleIfNeededRecursive(); |
| 36 m_textControl = toHTMLTextFormControlElement(document.getElementById("textar ea")); | 46 m_textControl = toHTMLTextFormControlElement(m_document->getElementById("tex tarea")); |
| 37 m_textControl->focus(); | 47 m_textControl->focus(); |
| 38 } | 48 } |
| 39 | 49 |
| 40 TEST_F(HTMLTextFormControlElementTest, SetSelectionRange) | 50 TEST_F(HTMLTextFormControlElementTest, SetSelectionRange) |
| 41 { | 51 { |
| 42 EXPECT_EQ(0, textControl().selectionStart()); | 52 EXPECT_EQ(0, textControl().selectionStart()); |
| 43 EXPECT_EQ(0, textControl().selectionEnd()); | 53 EXPECT_EQ(0, textControl().selectionEnd()); |
| 44 | 54 |
| 45 textControl().setInnerEditorValue("Hello, text form."); | 55 textControl().setInnerEditorValue("Hello, text form."); |
| 46 EXPECT_EQ(0, textControl().selectionStart()); | 56 EXPECT_EQ(0, textControl().selectionStart()); |
| 47 EXPECT_EQ(0, textControl().selectionEnd()); | 57 EXPECT_EQ(0, textControl().selectionEnd()); |
| 48 | 58 |
| 49 textControl().setSelectionRange(1, 3); | 59 textControl().setSelectionRange(1, 3); |
| 50 EXPECT_EQ(1, textControl().selectionStart()); | 60 EXPECT_EQ(1, textControl().selectionStart()); |
| 51 EXPECT_EQ(3, textControl().selectionEnd()); | 61 EXPECT_EQ(3, textControl().selectionEnd()); |
| 52 } | 62 } |
| 53 | 63 |
| 64 typedef Position (*PositionFunction)(const Position&); | |
| 65 typedef VisiblePosition(*VisblePositionFunction)(const VisiblePosition&); | |
| 66 | |
| 67 void testFunctionEquality(const Position& position, PositionFunction positionFun ction, VisblePositionFunction visibleFunction) | |
|
Yuta Kitamura
2014/07/03 08:39:27
nit: "Equality" is not a right word to compare the
yoichio
2014/07/04 01:29:44
Done.
| |
| 68 { | |
| 69 VisiblePosition visiblePosition(position); | |
| 70 VisiblePosition expected = visibleFunction(visiblePosition); | |
| 71 VisiblePosition actual = VisiblePosition(positionFunction(position)); | |
| 72 EXPECT_EQ(expected, actual); | |
| 54 } | 73 } |
| 74 | |
| 75 static VisiblePosition startOfWord(const VisiblePosition& position) | |
| 76 { | |
| 77 return startOfWord(position, LeftWordIfOnBoundary); | |
| 78 } | |
| 79 | |
| 80 static VisiblePosition endOfWord(const VisiblePosition& position) | |
| 81 { | |
| 82 return endOfWord(position, RightWordIfOnBoundary); | |
| 83 } | |
| 84 | |
| 85 TEST_F(HTMLTextFormControlElementTest, WordAndSentenceBoundary) | |
| 86 { | |
| 87 HTMLElement* innerText = textControl().innerEditorElement(); | |
| 88 // We have: | |
| 89 // innerText(shadow root) | |
| 90 // --#Text "Hello, text form." | |
| 91 // --BR | |
| 92 // --BR | |
| 93 // --#TEXT "" | |
| 94 // --#TEXT "\n\n" | |
| 95 // --#TEXT "\n" | |
| 96 // --#Text "Hel\nlo, te" | |
| 97 // --#TEXT "xt form." | |
| 98 innerText->appendChild(Text::create(document(), "Hello, text form.")); | |
| 99 innerText->appendChild(HTMLBRElement::create(document())); | |
| 100 innerText->appendChild(HTMLBRElement::create(document())); | |
| 101 innerText->appendChild(Text::create(document(), "")); | |
| 102 innerText->appendChild(Text::create(document(), "\n\n")); | |
| 103 innerText->appendChild(Text::create(document(), "\n")); | |
| 104 innerText->appendChild(Text::create(document(), "Hel\nlo, te")); | |
| 105 innerText->appendChild(Text::create(document(), "xt form.")); | |
|
Yuta Kitamura
2014/07/03 08:39:27
Is it possible for a user to create this weird DOM
yoichio
2014/07/04 01:29:44
I can't create this by only HTML functions, but
at
Yuta Kitamura
2014/07/04 06:12:35
I don't see a point in testing impossible situatio
| |
| 106 | |
| 107 for (unsigned i = 0; i < textControl().innerEditorValue().length(); i++) { | |
| 108 textControl().setSelectionRange(i, i); | |
| 109 Position pos = document().frame()->selection().start(); | |
|
Yuta Kitamura
2014/07/03 08:39:27
Please avoid using a abbreviated word for variable
yoichio
2014/07/04 01:29:44
Done.
| |
| 110 SCOPED_TRACE(testing::Message() << "offset " << pos.deprecatedEditingOff set() << " of " << nodePosition(pos.deprecatedNode()).ascii().data()); | |
| 111 { | |
| 112 SCOPED_TRACE("HTMLTextFormControlElement::startOfWord"); | |
| 113 testFunctionEquality(pos, HTMLTextFormControlElement::startOfWord, s tartOfWord); | |
| 114 } | |
| 115 { | |
| 116 SCOPED_TRACE("HTMLTextFormControlElement::endOfWord"); | |
| 117 testFunctionEquality(pos, HTMLTextFormControlElement::endOfWord, end OfWord); | |
| 118 } | |
| 119 { | |
| 120 SCOPED_TRACE("HTMLTextFormControlElement::startOfSentence"); | |
| 121 testFunctionEquality(pos, HTMLTextFormControlElement::startOfSentenc e, startOfSentence); | |
| 122 } | |
| 123 { | |
| 124 SCOPED_TRACE("HTMLTextFormControlElement::endOfSentence"); | |
| 125 testFunctionEquality(pos, HTMLTextFormControlElement::endOfSentence, endOfSentence); | |
| 126 } | |
| 127 } | |
| 128 } | |
| 129 | |
| 130 } | |
| OLD | NEW |