| 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 "core/editing/FrameSelection.h" | 5 #include "core/editing/FrameSelection.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/ExceptionStatePlaceholder.h" | 7 #include "bindings/core/v8/ExceptionStatePlaceholder.h" |
| 8 #include "core/dom/Document.h" | 8 #include "core/dom/Document.h" |
| 9 #include "core/dom/Element.h" | 9 #include "core/dom/Element.h" |
| 10 #include "core/dom/Text.h" | 10 #include "core/dom/Text.h" |
| 11 #include "core/editing/EditingTestBase.h" | 11 #include "core/editing/EditingTestBase.h" |
| 12 #include "core/editing/FrameCaret.h" | 12 #include "core/editing/FrameCaret.h" |
| 13 #include "core/editing/SelectionController.h" |
| 13 #include "core/frame/FrameView.h" | 14 #include "core/frame/FrameView.h" |
| 14 #include "core/html/HTMLBodyElement.h" | 15 #include "core/html/HTMLBodyElement.h" |
| 16 #include "core/input/EventHandler.h" |
| 15 #include "core/layout/LayoutView.h" | 17 #include "core/layout/LayoutView.h" |
| 16 #include "core/paint/PaintInfo.h" | 18 #include "core/paint/PaintInfo.h" |
| 17 #include "core/paint/PaintLayer.h" | 19 #include "core/paint/PaintLayer.h" |
| 18 #include "core/testing/DummyPageHolder.h" | 20 #include "core/testing/DummyPageHolder.h" |
| 19 #include "platform/graphics/paint/DrawingRecorder.h" | 21 #include "platform/graphics/paint/DrawingRecorder.h" |
| 20 #include "platform/graphics/paint/PaintController.h" | 22 #include "platform/graphics/paint/PaintController.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
| 22 #include "wtf/PassRefPtr.h" | 24 #include "wtf/PassRefPtr.h" |
| 23 #include "wtf/RefPtr.h" | 25 #include "wtf/RefPtr.h" |
| 24 #include "wtf/StdLibExtras.h" | 26 #include "wtf/StdLibExtras.h" |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 createVisiblePosition(Position(text, 2)), | 268 createVisiblePosition(Position(text, 2)), |
| 267 CharacterGranularity); | 269 CharacterGranularity); |
| 268 EXPECT_EQ_SELECTED_TEXT("o B"); | 270 EXPECT_EQ_SELECTED_TEXT("o B"); |
| 269 // "Fo<o B|ar Baz," with the Word granularity. | 271 // "Fo<o B|ar Baz," with the Word granularity. |
| 270 selection().moveRangeSelection(createVisiblePosition(Position(text, 5)), | 272 selection().moveRangeSelection(createVisiblePosition(Position(text, 5)), |
| 271 createVisiblePosition(Position(text, 2)), | 273 createVisiblePosition(Position(text, 2)), |
| 272 WordGranularity); | 274 WordGranularity); |
| 273 EXPECT_EQ_SELECTED_TEXT("Foo Bar"); | 275 EXPECT_EQ_SELECTED_TEXT("Foo Bar"); |
| 274 } | 276 } |
| 275 | 277 |
| 276 TEST_F(FrameSelectionTest, setNonDirectionalSelectionIfNeeded) { | 278 // TODO(yosin): We should move |SelectionControllerTest" to |
| 279 // "SelectionControllerTest.cpp" |
| 280 class SelectionControllerTest : public EditingTestBase { |
| 281 protected: |
| 282 SelectionControllerTest() = default; |
| 283 |
| 284 const VisibleSelection& visibleSelectionInDOMTree() const { |
| 285 return selection().selection(); |
| 286 } |
| 287 |
| 288 const VisibleSelectionInFlatTree& visibleSelectionInFlatTree() const { |
| 289 return selection().selectionInFlatTree(); |
| 290 } |
| 291 |
| 292 void setNonDirectionalSelectionIfNeeded(const VisibleSelectionInFlatTree&, |
| 293 TextGranularity); |
| 294 |
| 295 private: |
| 296 DISALLOW_COPY_AND_ASSIGN(SelectionControllerTest); |
| 297 }; |
| 298 |
| 299 // TODO(yosin): We should move this function to "SelectionControllerTest.cpp" |
| 300 void SelectionControllerTest::setNonDirectionalSelectionIfNeeded( |
| 301 const VisibleSelectionInFlatTree& newSelection, |
| 302 TextGranularity granularity) { |
| 303 frame() |
| 304 .eventHandler() |
| 305 .selectionController() |
| 306 .setNonDirectionalSelectionIfNeeded( |
| 307 newSelection, granularity, SelectionController::DoNotAdjustEndpoints); |
| 308 } |
| 309 |
| 310 // TODO(yosin): We should move this test to "SelectionControllerTest.cpp" |
| 311 TEST_F(SelectionControllerTest, setNonDirectionalSelectionIfNeeded) { |
| 277 const char* bodyContent = "<span id=top>top</span><span id=host></span>"; | 312 const char* bodyContent = "<span id=top>top</span><span id=host></span>"; |
| 278 const char* shadowContent = "<span id=bottom>bottom</span>"; | 313 const char* shadowContent = "<span id=bottom>bottom</span>"; |
| 279 setBodyContent(bodyContent); | 314 setBodyContent(bodyContent); |
| 280 ShadowRoot* shadowRoot = setShadowContent(shadowContent, "host"); | 315 ShadowRoot* shadowRoot = setShadowContent(shadowContent, "host"); |
| 281 | 316 |
| 282 Node* top = document().getElementById("top")->firstChild(); | 317 Node* top = document().getElementById("top")->firstChild(); |
| 283 Node* bottom = shadowRoot->getElementById("bottom")->firstChild(); | 318 Node* bottom = shadowRoot->getElementById("bottom")->firstChild(); |
| 284 Node* host = document().getElementById("host"); | 319 Node* host = document().getElementById("host"); |
| 285 | 320 |
| 286 // top to bottom | 321 // top to bottom |
| 287 selection().setNonDirectionalSelectionIfNeeded( | 322 setNonDirectionalSelectionIfNeeded( |
| 288 createVisibleSelection(SelectionInFlatTree::Builder() | 323 createVisibleSelection(SelectionInFlatTree::Builder() |
| 289 .collapse(PositionInFlatTree(top, 1)) | 324 .collapse(PositionInFlatTree(top, 1)) |
| 290 .extend(PositionInFlatTree(bottom, 3)) | 325 .extend(PositionInFlatTree(bottom, 3)) |
| 291 .build()), | 326 .build()), |
| 292 CharacterGranularity); | 327 CharacterGranularity); |
| 293 EXPECT_EQ(Position(top, 1), visibleSelectionInDOMTree().base()); | 328 EXPECT_EQ(Position(top, 1), visibleSelectionInDOMTree().base()); |
| 294 EXPECT_EQ(Position::beforeNode(host), visibleSelectionInDOMTree().extent()); | 329 EXPECT_EQ(Position::beforeNode(host), visibleSelectionInDOMTree().extent()); |
| 295 EXPECT_EQ(Position(top, 1), visibleSelectionInDOMTree().start()); | 330 EXPECT_EQ(Position(top, 1), visibleSelectionInDOMTree().start()); |
| 296 EXPECT_EQ(Position(top, 3), visibleSelectionInDOMTree().end()); | 331 EXPECT_EQ(Position(top, 3), visibleSelectionInDOMTree().end()); |
| 297 | 332 |
| 298 EXPECT_EQ(PositionInFlatTree(top, 1), visibleSelectionInFlatTree().base()); | 333 EXPECT_EQ(PositionInFlatTree(top, 1), visibleSelectionInFlatTree().base()); |
| 299 EXPECT_EQ(PositionInFlatTree(bottom, 3), | 334 EXPECT_EQ(PositionInFlatTree(bottom, 3), |
| 300 visibleSelectionInFlatTree().extent()); | 335 visibleSelectionInFlatTree().extent()); |
| 301 EXPECT_EQ(PositionInFlatTree(top, 1), visibleSelectionInFlatTree().start()); | 336 EXPECT_EQ(PositionInFlatTree(top, 1), visibleSelectionInFlatTree().start()); |
| 302 EXPECT_EQ(PositionInFlatTree(bottom, 3), visibleSelectionInFlatTree().end()); | 337 EXPECT_EQ(PositionInFlatTree(bottom, 3), visibleSelectionInFlatTree().end()); |
| 303 | 338 |
| 304 // bottom to top | 339 // bottom to top |
| 305 selection().setNonDirectionalSelectionIfNeeded( | 340 setNonDirectionalSelectionIfNeeded( |
| 306 createVisibleSelection(SelectionInFlatTree::Builder() | 341 createVisibleSelection(SelectionInFlatTree::Builder() |
| 307 .collapse(PositionInFlatTree(bottom, 3)) | 342 .collapse(PositionInFlatTree(bottom, 3)) |
| 308 .extend(PositionInFlatTree(top, 1)) | 343 .extend(PositionInFlatTree(top, 1)) |
| 309 .build()), | 344 .build()), |
| 310 CharacterGranularity); | 345 CharacterGranularity); |
| 311 EXPECT_EQ(Position(bottom, 3), visibleSelectionInDOMTree().base()); | 346 EXPECT_EQ(Position(bottom, 3), visibleSelectionInDOMTree().base()); |
| 312 EXPECT_EQ(Position::beforeNode(bottom->parentNode()), | 347 EXPECT_EQ(Position::beforeNode(bottom->parentNode()), |
| 313 visibleSelectionInDOMTree().extent()); | 348 visibleSelectionInDOMTree().extent()); |
| 314 EXPECT_EQ(Position(bottom, 0), visibleSelectionInDOMTree().start()); | 349 EXPECT_EQ(Position(bottom, 0), visibleSelectionInDOMTree().start()); |
| 315 EXPECT_EQ(Position(bottom, 3), visibleSelectionInDOMTree().end()); | 350 EXPECT_EQ(Position(bottom, 3), visibleSelectionInDOMTree().end()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 selection().updateIfNeeded(); | 382 selection().updateIfNeeded(); |
| 348 | 383 |
| 349 // TODO(yosin): Once lazy canonicalization implemented, selection.start | 384 // TODO(yosin): Once lazy canonicalization implemented, selection.start |
| 350 // should be Position(HTML, 0). | 385 // should be Position(HTML, 0). |
| 351 EXPECT_EQ(Position(), selection().start()) | 386 EXPECT_EQ(Position(), selection().start()) |
| 352 << "updateIfNeeded() makes selection to null."; | 387 << "updateIfNeeded() makes selection to null."; |
| 353 EXPECT_EQ(selection().start(), caretPosition().position()); | 388 EXPECT_EQ(selection().start(), caretPosition().position()); |
| 354 } | 389 } |
| 355 | 390 |
| 356 } // namespace blink | 391 } // namespace blink |
| OLD | NEW |