Changeset 243296 in webkit
- Timestamp:
- Mar 21, 2019, 10:03:17 AM (7 years ago)
- Location:
- trunk
- Files:
-
- 13 added
- 6 edited
-
LayoutTests/editing/deleting/smart-delete-paragraph-001-expected.txt (added)
-
LayoutTests/editing/deleting/smart-delete-paragraph-001.html (added)
-
LayoutTests/editing/deleting/smart-delete-paragraph-002-expected.txt (added)
-
LayoutTests/editing/deleting/smart-delete-paragraph-002.html (added)
-
LayoutTests/editing/deleting/smart-delete-paragraph-003-expected.txt (added)
-
LayoutTests/editing/deleting/smart-delete-paragraph-003.html (added)
-
LayoutTests/editing/deleting/smart-delete-paragraph-004-expected.txt (added)
-
LayoutTests/editing/deleting/smart-delete-paragraph-004.html (added)
-
LayoutTests/platform/ios/editing/deleting/delete-3959464-fix-expected.txt (added)
-
LayoutTests/platform/ios/editing/deleting/smart-delete-paragraph-001-expected.txt (added)
-
LayoutTests/platform/ios/editing/deleting/smart-delete-paragraph-002-expected.txt (added)
-
LayoutTests/platform/ios/editing/deleting/smart-delete-paragraph-003-expected.txt (added)
-
LayoutTests/platform/ios/editing/deleting/smart-delete-paragraph-004-expected.txt (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/editing/DeleteSelectionCommand.cpp (modified) (2 diffs)
-
Source/WebCore/editing/DeleteSelectionCommand.h (modified) (1 diff)
-
Source/WebCore/editing/ReplaceSelectionCommand.cpp (modified) (4 diffs)
-
Source/WebCore/editing/VisibleUnits.cpp (modified) (1 diff)
-
Source/WebCore/editing/VisibleUnits.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r243290 r243296 1 2019-03-21 Megan Gardner <megan_gardner@apple.com> 2 3 Smart delete for paragraphs. 4 https://bugs.webkit.org/show_bug.cgi?id=195837 5 6 Reviewed by Ryosuke Niwa. 7 8 Remove additional newlines to maintain spacing around paragraphs. 9 10 Tests: editing/pasteboard/smart-delete-paragraph-001.html 11 editing/pasteboard/smart-delete-paragraph-002.html 12 editing/pasteboard/smart-delete-paragraph-003.html 13 editing/pasteboard/smart-delete-paragraph-004.html 14 15 * editing/DeleteSelectionCommand.cpp: 16 (WebCore::isBlankLine): 17 (WebCore::DeleteSelectionCommand::initializePositionData): 18 1 19 2019-03-21 Cathie Chen <cathiechen@igalia.com> 2 20 -
trunk/Source/WebCore/editing/DeleteSelectionCommand.cpp
r239535 r243296 173 173 } 174 174 175 bool DeleteSelectionCommand::shouldSmartDeleteParagraphSpacers() 176 { 177 return document().editingBehavior().shouldSmartInsertDeleteParagraphs(); 178 } 179 180 void DeleteSelectionCommand::smartDeleteParagraphSpacers() 181 { 182 VisiblePosition visibleStart { m_upstreamStart }; 183 VisiblePosition visibleEnd { m_downstreamEnd }; 184 bool selectionEndsInParagraphSeperator = isEndOfParagraph(visibleEnd); 185 bool selectionEndIsEndOfContent = endOfEditableContent(visibleEnd) == visibleEnd; 186 bool startAndEndInSameUnsplittableElement = unsplittableElementForPosition(visibleStart.deepEquivalent()) == unsplittableElementForPosition(visibleEnd.deepEquivalent()); 187 visibleStart = visibleStart.previous(CannotCrossEditingBoundary); 188 visibleEnd = visibleEnd.next(CannotCrossEditingBoundary); 189 bool previousPositionIsBlankParagraph = isBlankParagraph(visibleStart); 190 bool endPositonIsBlankParagraph = isBlankParagraph(visibleEnd); 191 bool hasBlankParagraphAfterEndOrIsEndOfContent = !selectionEndIsEndOfContent && (endPositonIsBlankParagraph || selectionEndsInParagraphSeperator); 192 if (startAndEndInSameUnsplittableElement && previousPositionIsBlankParagraph && hasBlankParagraphAfterEndOrIsEndOfContent) { 193 m_needPlaceholder = false; 194 Position position; 195 if (endPositonIsBlankParagraph) 196 position = startOfNextParagraph(startOfNextParagraph(m_downstreamEnd)).deepEquivalent(); 197 else 198 position = VisiblePosition(m_downstreamEnd).next().deepEquivalent(); 199 m_upstreamEnd = position.upstream(); 200 m_downstreamEnd = position.downstream(); 201 m_trailingWhitespace = m_downstreamEnd.trailingWhitespacePosition(VP_DEFAULT_AFFINITY); 202 setStartingSelectionOnSmartDelete(m_upstreamStart, m_downstreamEnd); 203 } 204 if (startAndEndInSameUnsplittableElement && selectionEndIsEndOfContent && previousPositionIsBlankParagraph && selectionEndsInParagraphSeperator) { 205 m_needPlaceholder = false; 206 VisiblePosition endOfParagraphBeforeStart = endOfParagraph(VisiblePosition { m_upstreamStart }.previous().previous()); 207 Position position = endOfParagraphBeforeStart.deepEquivalent(); 208 m_upstreamStart = position.upstream(); 209 m_downstreamStart = position.downstream(); 210 m_leadingWhitespace = m_upstreamStart.leadingWhitespacePosition(DOWNSTREAM); 211 setStartingSelectionOnSmartDelete(m_upstreamStart, m_upstreamEnd); 212 } 213 } 214 175 215 bool DeleteSelectionCommand::initializePositionData() 176 216 { … … 266 306 setStartingSelectionOnSmartDelete(m_downstreamStart, m_downstreamEnd); 267 307 } 308 309 if (shouldSmartDeleteParagraphSpacers()) 310 smartDeleteParagraphSpacers(); 268 311 } 269 312 -
trunk/Source/WebCore/editing/DeleteSelectionCommand.h
r235775 r243296 70 70 void deleteTextFromNode(Text&, unsigned, unsigned) override; 71 71 void removeRedundantBlocks(); 72 bool shouldSmartDeleteParagraphSpacers(); 73 void smartDeleteParagraphSpacers(); 72 74 73 75 // This function provides access to original string after the correction has been deleted. -
trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp
r243124 r243296 778 778 return true; 779 779 } 780 781 static bool isBlankLine(VisiblePosition& position)782 {783 return isStartOfLine(position) && startOfLine(position.next()) != startOfLine(position);784 }785 780 786 781 // At copy time, WebKit wraps copied content in a span that contains the source document's … … 940 935 bool hasLineBeforePosition = isEndOfLine(previousPosition); 941 936 942 return !reachedBoundaryStart && !reachedBoundaryEnd && isBlank Line(visiblePosition) && hasLineBeforePosition && isStartOfLine(nextPosition);937 return !reachedBoundaryStart && !reachedBoundaryEnd && isBlankParagraph(visiblePosition) && hasLineBeforePosition && isStartOfLine(nextPosition); 943 938 } 944 939 … … 1383 1378 1384 1379 if (!reachedBoundaryStart && !reachedBoundaryEnd) { 1385 if (!isBlank Line(positionBeforeStart) && !isBlankLine(startOfInsertedContent) && isEndOfLine(positionBeforeStart) && !isEndOfEditableOrNonEditableContent(positionAfterEnd) && !isEndOfEditableOrNonEditableContent(endOfInsertedContent)) {1380 if (!isBlankParagraph(positionBeforeStart) && !isBlankParagraph(startOfInsertedContent) && isEndOfLine(positionBeforeStart) && !isEndOfEditableOrNonEditableContent(positionAfterEnd) && !isEndOfEditableOrNonEditableContent(endOfInsertedContent)) { 1386 1381 setEndingSelection(startOfInsertedContent); 1387 1382 insertParagraphSeparator(); … … 1398 1393 1399 1394 if (!reachedBoundaryEnd && !reachedBoundaryStart) { 1400 if (!isBlank Line(positionAfterEnd) && !isBlankLine(endOfInsertedContent) && isStartOfLine(positionAfterEnd) && !isEndOfLine(positionAfterEnd) && !isEndOfEditableOrNonEditableContent(positionAfterEnd)) {1395 if (!isBlankParagraph(positionAfterEnd) && !isBlankParagraph(endOfInsertedContent) && isStartOfLine(positionAfterEnd) && !isEndOfLine(positionAfterEnd) && !isEndOfEditableOrNonEditableContent(positionAfterEnd)) { 1401 1396 setEndingSelection(endOfInsertedContent); 1402 1397 insertParagraphSeparator(); -
trunk/Source/WebCore/editing/VisibleUnits.cpp
r239535 r243296 1378 1378 return pos.isNotNull() && pos == endOfParagraph(pos, boundaryCrossingRule); 1379 1379 } 1380 1381 bool isBlankParagraph(const VisiblePosition& position) 1382 { 1383 return isStartOfParagraph(position) && startOfParagraph(position.next()) != startOfParagraph(position); 1384 } 1380 1385 1381 1386 VisiblePosition previousParagraphPosition(const VisiblePosition& p, int x) -
trunk/Source/WebCore/editing/VisibleUnits.h
r218748 r243296 76 76 WEBCORE_EXPORT bool isEndOfParagraph(const VisiblePosition &, EditingBoundaryCrossingRule = CannotCrossEditingBoundary); 77 77 bool inSameParagraph(const VisiblePosition &, const VisiblePosition &, EditingBoundaryCrossingRule = CannotCrossEditingBoundary); 78 bool isBlankParagraph(const VisiblePosition &); 78 79 79 80 // blocks (true paragraphs; line break elements don't break blocks)
Note:
See TracChangeset
for help on using the changeset viewer.