Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(130)

Unified Diff: third_party/WebKit/Source/core/editing/PendingSelection.cpp

Issue 2803583002: Rename PendingSelection to LayoutSelection (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/editing/PendingSelection.cpp
diff --git a/third_party/WebKit/Source/core/editing/PendingSelection.cpp b/third_party/WebKit/Source/core/editing/PendingSelection.cpp
deleted file mode 100644
index 8ffc8e7fe380de3dcdca49a8453493e0a42ab10c..0000000000000000000000000000000000000000
--- a/third_party/WebKit/Source/core/editing/PendingSelection.cpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights
- * reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "core/editing/PendingSelection.h"
-
-#include "core/dom/Document.h"
-#include "core/editing/EditingUtilities.h"
-#include "core/editing/FrameSelection.h"
-#include "core/editing/VisiblePosition.h"
-#include "core/editing/VisibleUnits.h"
-#include "core/html/TextControlElement.h"
-#include "core/layout/LayoutView.h"
-
-namespace blink {
-
-PendingSelection::PendingSelection(FrameSelection& frameSelection)
- : m_frameSelection(&frameSelection), m_hasPendingSelection(false) {}
-
-const VisibleSelection& PendingSelection::visibleSelection() const {
- return m_frameSelection->computeVisibleSelectionInDOMTree();
-}
-
-static bool isSelectionInDocument(
- const VisibleSelectionInFlatTree& visibleSelection,
- const Document& document) {
- const PositionInFlatTree& start = visibleSelection.start();
- if (start.isNotNull() &&
- (!start.isConnected() || start.document() != document))
- return false;
- const PositionInFlatTree& end = visibleSelection.end();
- if (end.isNotNull() && (!end.isConnected() || end.document() != document))
- return false;
- const PositionInFlatTree extent = visibleSelection.extent();
- if (extent.isNotNull() &&
- (!extent.isConnected() || extent.document() != document))
- return false;
- return true;
-}
-
-SelectionInFlatTree PendingSelection::calcVisibleSelection(
- const VisibleSelectionInFlatTree& originalSelection) const {
- const PositionInFlatTree& start = originalSelection.start();
- const PositionInFlatTree& end = originalSelection.end();
- SelectionType selectionType = originalSelection.getSelectionType();
- const TextAffinity affinity = originalSelection.affinity();
-
- bool paintBlockCursor =
- m_frameSelection->shouldShowBlockCursor() &&
- selectionType == SelectionType::CaretSelection &&
- !isLogicalEndOfLine(createVisiblePosition(end, affinity));
- if (enclosingTextControl(start.computeContainerNode())) {
- // TODO(yosin) We should use |PositionMoveType::CodePoint| to avoid
- // ending paint at middle of character.
- PositionInFlatTree endPosition =
- paintBlockCursor ? nextPositionOf(originalSelection.extent(),
- PositionMoveType::CodeUnit)
- : end;
- return SelectionInFlatTree::Builder()
- .setBaseAndExtent(start, endPosition)
- .build();
- }
-
- const VisiblePositionInFlatTree& visibleStart = createVisiblePosition(
- start, selectionType == SelectionType::RangeSelection
- ? TextAffinity::Downstream
- : affinity);
- if (visibleStart.isNull())
- return SelectionInFlatTree();
- if (paintBlockCursor) {
- const VisiblePositionInFlatTree visibleExtent = nextPositionOf(
- createVisiblePosition(end, affinity), CanSkipOverEditingBoundary);
- if (visibleExtent.isNull())
- return SelectionInFlatTree();
- SelectionInFlatTree::Builder builder;
- builder.collapse(visibleStart.toPositionWithAffinity());
- builder.extend(visibleExtent.deepEquivalent());
- return builder.build();
- }
- const VisiblePositionInFlatTree visibleEnd =
- createVisiblePosition(end, selectionType == SelectionType::RangeSelection
- ? TextAffinity::Upstream
- : affinity);
- if (visibleEnd.isNull())
- return SelectionInFlatTree();
- SelectionInFlatTree::Builder builder;
- builder.collapse(visibleStart.toPositionWithAffinity());
- builder.extend(visibleEnd.deepEquivalent());
- return builder.build();
-}
-
-void PendingSelection::commit(LayoutView& layoutView) {
- if (!hasPendingSelection())
- return;
- DCHECK(!layoutView.needsLayout());
- m_hasPendingSelection = false;
-
- const VisibleSelectionInFlatTree& originalSelection =
- m_frameSelection->computeVisibleSelectionInFlatTree();
-
- // Skip if pending VisibilePositions became invalid before we reach here.
- if (!isSelectionInDocument(originalSelection, layoutView.document()))
- return;
-
- // Construct a new VisibleSolution, since visibleSelection() 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>.
- const SelectionInFlatTree selection = calcVisibleSelection(originalSelection);
- const VisibleSelectionInFlatTree& visibleSelection =
- createVisibleSelection(selection);
-
- if (!visibleSelection.isRange() || !selectionHasFocus(selection)) {
- layoutView.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'.
- PositionInFlatTree startPos = visibleSelection.start();
- PositionInFlatTree candidate = mostForwardCaretPosition(startPos);
- if (isVisuallyEquivalentCandidate(candidate))
- startPos = candidate;
- PositionInFlatTree endPos = visibleSelection.end();
- 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() ||
- visibleSelection.visibleStart().deepEquivalent() ==
- visibleSelection.visibleEnd().deepEquivalent())
- return;
- LayoutObject* startLayoutObject = startPos.anchorNode()->layoutObject();
- LayoutObject* endLayoutObject = endPos.anchorNode()->layoutObject();
- if (!startLayoutObject || !endLayoutObject)
- return;
- DCHECK(layoutView == startLayoutObject->view());
- DCHECK(layoutView == endLayoutObject->view());
- layoutView.setSelection(startLayoutObject, startPos.computeEditingOffset(),
- endLayoutObject, endPos.computeEditingOffset());
-}
-
-DEFINE_TRACE(PendingSelection) {
- visitor->trace(m_frameSelection);
-}
-
-} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698