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

Unified Diff: Source/core/editing/InsertListCommand.cpp

Issue 114043002: Fix issue with selection being lost when InsertListCommand changes the list type. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fixing nit Created 6 years, 6 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
« no previous file with comments | « LayoutTests/editing/execCommand/selection-after-switch-type-of-listitem-expected.txt ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/editing/InsertListCommand.cpp
diff --git a/Source/core/editing/InsertListCommand.cpp b/Source/core/editing/InsertListCommand.cpp
index 0d07431ba83045d411b6c113631cd32c7576f5a7..391aad1359dc5dc2cb44207f54c4bced7f88068f 100644
--- a/Source/core/editing/InsertListCommand.cpp
+++ b/Source/core/editing/InsertListCommand.cpp
@@ -129,18 +129,26 @@ void InsertListCommand::doApply()
const QualifiedName& listTag = (m_type == OrderedList) ? olTag : ulTag;
if (endingSelection().isRange()) {
+ bool forceListCreation = false;
VisibleSelection selection = selectionForParagraphIteration(endingSelection());
ASSERT(selection.isRange());
VisiblePosition startOfSelection = selection.visibleStart();
VisiblePosition endOfSelection = selection.visibleEnd();
VisiblePosition startOfLastParagraph = startOfParagraph(endOfSelection, CanSkipOverEditingBoundary);
+ RefPtrWillBeRawPtr<Range> currentSelection = endingSelection().firstRange();
+ RefPtrWillBeRawPtr<ContainerNode> scopeForStartOfSelection = nullptr;
+ RefPtrWillBeRawPtr<ContainerNode> scopeForEndOfSelection = nullptr;
+ // FIXME: This is an inefficient way to keep selection alive because
+ // indexForVisiblePosition walks from the beginning of the document to the
+ // endOfSelection everytime this code is executed. But not using index is hard
+ // because there are so many ways we can los eselection inside doApplyForSingleParagraph.
+ int indexForStartOfSelection = indexForVisiblePosition(startOfSelection, scopeForStartOfSelection);
+ int indexForEndOfSelection = indexForVisiblePosition(endOfSelection, scopeForEndOfSelection);
+
if (startOfParagraph(startOfSelection, CanSkipOverEditingBoundary) != startOfLastParagraph) {
- RefPtrWillBeRawPtr<ContainerNode> scope = nullptr;
- int indexForEndOfSelection = indexForVisiblePosition(endOfSelection, scope);
- bool forceCreateList = !selectionHasListOfType(selection, listTag);
+ forceListCreation = !selectionHasListOfType(selection, listTag);
- RefPtrWillBeRawPtr<Range> currentSelection = endingSelection().firstRange();
VisiblePosition startOfCurrentParagraph = startOfSelection;
while (startOfCurrentParagraph.isNotNull() && !inSameParagraph(startOfCurrentParagraph, startOfLastParagraph, CanCrossEditingBoundary)) {
// doApply() may operate on and remove the last paragraph of the selection from the document
@@ -154,12 +162,9 @@ void InsertListCommand::doApply()
// Save and restore endOfSelection and startOfLastParagraph when necessary
// since moveParagraph and movePragraphWithClones can remove nodes.
- // FIXME: This is an inefficient way to keep selection alive because indexForVisiblePosition walks from
- // the beginning of the document to the endOfSelection everytime this code is executed.
- // But not using index is hard because there are so many ways we can lose selection inside doApplyForSingleParagraph.
- doApplyForSingleParagraph(forceCreateList, listTag, *currentSelection);
+ doApplyForSingleParagraph(forceListCreation, listTag, *currentSelection);
if (endOfSelection.isNull() || endOfSelection.isOrphan() || startOfLastParagraph.isNull() || startOfLastParagraph.isOrphan()) {
- endOfSelection = visiblePositionForIndex(indexForEndOfSelection, scope.get());
+ endOfSelection = visiblePositionForIndex(indexForEndOfSelection, scopeForEndOfSelection.get());
// If endOfSelection is null, then some contents have been deleted from the document.
// This should never happen and if it did, exit early immediately because we've lost the loop invariant.
ASSERT(endOfSelection.isNotNull());
@@ -168,26 +173,24 @@ void InsertListCommand::doApply()
startOfLastParagraph = startOfParagraph(endOfSelection, CanSkipOverEditingBoundary);
}
- // Fetch the start of the selection after moving the first paragraph,
- // because moving the paragraph will invalidate the original start.
- // We'll use the new start to restore the original selection after
- // we modified all selected paragraphs.
- if (startOfCurrentParagraph == startOfSelection)
- startOfSelection = endingSelection().visibleStart();
-
startOfCurrentParagraph = startOfNextParagraph(endingSelection().visibleStart());
}
setEndingSelection(endOfSelection);
- doApplyForSingleParagraph(forceCreateList, listTag, *currentSelection);
- // Fetch the end of the selection, for the reason mentioned above.
- if (endOfSelection.isNull() || endOfSelection.isOrphan()) {
- endOfSelection = visiblePositionForIndex(indexForEndOfSelection, scope.get());
- if (endOfSelection.isNull())
- return;
- }
- setEndingSelection(VisibleSelection(startOfSelection, endOfSelection, endingSelection().isDirectional()));
- return;
}
+ doApplyForSingleParagraph(forceListCreation, listTag, *currentSelection);
+ // Fetch the end of the selection, for the reason mentioned above.
+ if (endOfSelection.isNull() || endOfSelection.isOrphan()) {
+ endOfSelection = visiblePositionForIndex(indexForEndOfSelection, scopeForEndOfSelection.get());
+ if (endOfSelection.isNull())
+ return;
+ }
+ if (startOfSelection.isNull() || startOfSelection.isOrphan()) {
+ startOfSelection = visiblePositionForIndex(indexForStartOfSelection, scopeForStartOfSelection.get());
+ if (startOfSelection.isNull())
+ return;
+ }
+ setEndingSelection(VisibleSelection(startOfSelection, endOfSelection, endingSelection().isDirectional()));
+ return;
}
ASSERT(endingSelection().firstRange());
« no previous file with comments | « LayoutTests/editing/execCommand/selection-after-switch-type-of-listitem-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698