Index: Source/core/layout/LayoutView.cpp |
diff --git a/Source/core/layout/LayoutView.cpp b/Source/core/layout/LayoutView.cpp |
index 45582708eaa583505b9eebc297d7b62d6199eda4..1ae144522dfab71b790af0525bc380d3f5dfd367 100644 |
--- a/Source/core/layout/LayoutView.cpp |
+++ b/Source/core/layout/LayoutView.cpp |
@@ -773,61 +773,9 @@ void LayoutView::setSelection(const FrameSelection& selection) |
m_pendingSelection->setSelection(selection); |
} |
-template <typename Strategy> |
-void LayoutView::commitPendingSelectionAlgorithm() |
-{ |
- using PositionType = typename Strategy::PositionType; |
- |
- if (!hasPendingSelection()) |
- return; |
- ASSERT(!needsLayout()); |
- |
- // Skip if pending VisibilePositions became invalid before we reach here. |
- if (!m_pendingSelection->isInDocument(document())) { |
- m_pendingSelection->clear(); |
- return; |
- } |
- |
- // Construct a new VisibleSolution, since m_selection is not necessarily valid, and the following steps |
- // assume a valid selection. See <https://bugs.webkit.org/show_bug.cgi?id=69563> and <rdar://problem/10232866>. |
- VisibleSelection selection = m_pendingSelection->calcVisibleSelection(); |
- m_pendingSelection->clear(); |
- |
- if (!selection.isRange()) { |
- clearSelection(); |
- return; |
- } |
- |
- // Use the rightmost candidate for the start of the selection, and the leftmost candidate for the end of the selection. |
- // Example: foo <a>bar</a>. Imagine that a line wrap occurs after 'foo', and that 'bar' is selected. If we pass [foo, 3] |
- // as the start of the selection, the selection painting code will think that content on the line containing 'foo' is selected |
- // and will fill the gap before 'bar'. |
- PositionType startPos = Strategy::selectionStart(selection); |
- PositionType candidate = mostForwardCaretPosition(startPos); |
- if (isVisuallyEquivalentCandidate(candidate)) |
- startPos = candidate; |
- PositionType endPos = Strategy::selectionEnd(selection); |
- candidate = mostBackwardCaretPosition(endPos); |
- if (isVisuallyEquivalentCandidate(candidate)) |
- endPos = candidate; |
- |
- // We can get into a state where the selection endpoints map to the same VisiblePosition when a selection is deleted |
- // because we don't yet notify the FrameSelection of text removal. |
- if (startPos.isNull() || endPos.isNull() || Strategy::selectionVisibleStart(selection).deepEquivalent() == Strategy::selectionVisibleEnd(selection).deepEquivalent()) |
- return; |
- LayoutObject* startLayoutObject = startPos.anchorNode()->layoutObject(); |
- LayoutObject* endLayoutObject = endPos.anchorNode()->layoutObject(); |
- if (!startLayoutObject || !endLayoutObject) |
- return; |
- ASSERT(startLayoutObject->view() == this && endLayoutObject->view() == this); |
- setSelection(startLayoutObject, startPos.computeEditingOffset(), endLayoutObject, endPos.computeEditingOffset()); |
-} |
- |
void LayoutView::commitPendingSelection() |
{ |
- if (RuntimeEnabledFeatures::selectionForComposedTreeEnabled()) |
- return commitPendingSelectionAlgorithm<VisibleSelection::InComposedTree>(); |
- commitPendingSelectionAlgorithm<VisibleSelection::InDOMTree>(); |
+ m_pendingSelection->commit(*this); |
} |
LayoutObject* LayoutView::selectionStart() |