WebKit Bugzilla
Attachment 362561 Details for
Bug 194880
: Smart Insert for paragraphs.
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-194880-20190220161050.patch (text/plain), 12.58 KB, created by
Megan Gardner
on 2019-02-20 16:10:50 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Megan Gardner
Created:
2019-02-20 16:10:50 PST
Size:
12.58 KB
patch
obsolete
>Subversion Revision: 241749 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 5b161f97e19c2093627d6ad6c776ec15fd931408..150f5a93863d4b102d5594346ce8e401b7f2f58d 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,33 @@ >+2019-02-20 Megan Gardner <megan_gardner@apple.com> >+ >+ Smart Insert for paragraphs. >+ https://bugs.webkit.org/show_bug.cgi?id=194880 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ No new tests (OOPS!). >+ >+ * editing/CompositeEditCommand.cpp: >+ (WebCore::CompositeEditCommand::insertParagraphSeparatorAtPosition): >+ (WebCore::CompositeEditCommand::insertParagraphSeparator): >+ * editing/CompositeEditCommand.h: >+ * editing/DictationCommand.cpp: >+ (WebCore::DictationCommand::insertParagraphSeparator): >+ * editing/Editing.cpp: >+ (WebCore::newlineString): >+ * editing/Editing.h: >+ * editing/InsertParagraphSeparatorCommand.cpp: >+ (WebCore::InsertParagraphSeparatorCommand::InsertParagraphSeparatorCommand): >+ (WebCore::InsertParagraphSeparatorCommand::doApply): >+ * editing/InsertParagraphSeparatorCommand.h: >+ (WebCore::InsertParagraphSeparatorCommand::create): >+ * editing/ReplaceSelectionCommand.cpp: >+ (WebCore::ReplaceSelectionCommand::doApply): >+ (WebCore::ReplaceSelectionCommand::addNewLinesForSmartReplace): >+ * editing/ReplaceSelectionCommand.h: >+ * editing/TypingCommand.cpp: >+ (WebCore::TypingCommand::insertParagraphSeparator): >+ > 2019-02-18 Wenson Hsieh <wenson_hsieh@apple.com> > > [iOS] Support pasting item-provider-backed data on the pasteboard as attachment elements >diff --git a/Source/WebCore/editing/CompositeEditCommand.cpp b/Source/WebCore/editing/CompositeEditCommand.cpp >index 91d8af180a4e311ac361b33baeb91c2400b11413..6bb1cb7de9d223fd0635bea5c79b565e37da49e9 100644 >--- a/Source/WebCore/editing/CompositeEditCommand.cpp >+++ b/Source/WebCore/editing/CompositeEditCommand.cpp >@@ -498,9 +498,14 @@ void CompositeEditCommand::removeStyledElement(Ref<Element>&& element) > applyCommandToComposite(ApplyStyleCommand::create(WTFMove(element), true)); > } > >+void CompositeEditCommand::insertParagraphSeparatorAtPosition(const Position& position, bool useDefaultParagraphElement, bool pasteBlockqutoeIntoUnquotedArea) >+{ >+ applyCommandToComposite(InsertParagraphSeparatorCommand::create(document(), &position, useDefaultParagraphElement, pasteBlockqutoeIntoUnquotedArea, editingAction())); >+} >+ > void CompositeEditCommand::insertParagraphSeparator(bool useDefaultParagraphElement, bool pasteBlockqutoeIntoUnquotedArea) > { >- applyCommandToComposite(InsertParagraphSeparatorCommand::create(document(), useDefaultParagraphElement, pasteBlockqutoeIntoUnquotedArea, editingAction())); >+ applyCommandToComposite(InsertParagraphSeparatorCommand::create(document(), nullptr, useDefaultParagraphElement, pasteBlockqutoeIntoUnquotedArea, editingAction())); > } > > void CompositeEditCommand::insertLineBreak() >diff --git a/Source/WebCore/editing/CompositeEditCommand.h b/Source/WebCore/editing/CompositeEditCommand.h >index 04c21ff341c48963934c5de2d0e71c3cc9f38715..12819f20f9028a6d6fb0098aab877e073f5da029 100644 >--- a/Source/WebCore/editing/CompositeEditCommand.h >+++ b/Source/WebCore/editing/CompositeEditCommand.h >@@ -152,6 +152,7 @@ protected: > void insertNodeAt(Ref<Node>&&, const Position&); > void insertNodeAtTabSpanPosition(Ref<Node>&&, const Position&); > void insertNodeBefore(Ref<Node>&&, Node& refChild, ShouldAssumeContentIsAlwaysEditable = DoNotAssumeContentIsAlwaysEditable); >+ void insertParagraphSeparatorAtPosition(const Position&, bool useDefaultParagraphElement = false, bool pasteBlockqutoeIntoUnquotedArea = false); > void insertParagraphSeparator(bool useDefaultParagraphElement = false, bool pasteBlockqutoeIntoUnquotedArea = false); > void insertLineBreak(); > void insertTextIntoNode(Text&, unsigned offset, const String& text); >diff --git a/Source/WebCore/editing/DictationCommand.cpp b/Source/WebCore/editing/DictationCommand.cpp >index adf744fc5c311fcf65c6fd7a351ef6300081b971..902eebf93868c9c2ea077f39c5a8c0dc4798a606 100644 >--- a/Source/WebCore/editing/DictationCommand.cpp >+++ b/Source/WebCore/editing/DictationCommand.cpp >@@ -126,7 +126,7 @@ void DictationCommand::insertParagraphSeparator() > if (!canAppendNewLineFeedToSelection(endingSelection())) > return; > >- applyCommandToComposite(InsertParagraphSeparatorCommand::create(document(), false, false, EditAction::Dictation)); >+ applyCommandToComposite(InsertParagraphSeparatorCommand::create(document(), nullptr, false, false, EditAction::Dictation)); > } > > void DictationCommand::collectDictationAlternativesInRange(size_t rangeStart, size_t rangeLength, Vector<DictationAlternative>& alternatives) >diff --git a/Source/WebCore/editing/InsertParagraphSeparatorCommand.cpp b/Source/WebCore/editing/InsertParagraphSeparatorCommand.cpp >index faf819ceeca9d30d21dbb5c613481d8ff7eca464..2d6e4687ca5e5e770ec9d022c9cbb07f73dcb8b6 100644 >--- a/Source/WebCore/editing/InsertParagraphSeparatorCommand.cpp >+++ b/Source/WebCore/editing/InsertParagraphSeparatorCommand.cpp >@@ -59,8 +59,9 @@ static Element* highestVisuallyEquivalentDivBelowRoot(Element* startBlock) > return curBlock; > } > >-InsertParagraphSeparatorCommand::InsertParagraphSeparatorCommand(Document& document, bool mustUseDefaultParagraphElement, bool pasteBlockqutoeIntoUnquotedArea, EditAction editingAction) >+InsertParagraphSeparatorCommand::InsertParagraphSeparatorCommand(Document& document, const Position* position, bool mustUseDefaultParagraphElement, bool pasteBlockqutoeIntoUnquotedArea, EditAction editingAction) > : CompositeEditCommand(document, editingAction) >+ , m_insertPosition(position) > , m_mustUseDefaultParagraphElement(mustUseDefaultParagraphElement) > , m_pasteBlockqutoeIntoUnquotedArea(pasteBlockqutoeIntoUnquotedArea) > { >@@ -148,10 +149,17 @@ Ref<Element> InsertParagraphSeparatorCommand::cloneHierarchyUnderNewBlock(const > > void InsertParagraphSeparatorCommand::doApply() > { >- if (endingSelection().isNoneOrOrphaned()) >- return; >+ Position insertionPosition; >+ >+ if (m_insertPosition) >+ insertionPosition = *m_insertPosition; > >- Position insertionPosition = endingSelection().start(); >+ else { >+ if (endingSelection().isNoneOrOrphaned()) >+ return; >+ >+ Position insertionPosition = endingSelection().start(); >+ } > > EAffinity affinity = endingSelection().affinity(); > >diff --git a/Source/WebCore/editing/InsertParagraphSeparatorCommand.h b/Source/WebCore/editing/InsertParagraphSeparatorCommand.h >index 689b2836dc3d089bb4e59c0f0929fbe5b41b165b..31b465dc2e14c331c5ca94c69d20f5e68b16e326 100644 >--- a/Source/WebCore/editing/InsertParagraphSeparatorCommand.h >+++ b/Source/WebCore/editing/InsertParagraphSeparatorCommand.h >@@ -33,13 +33,13 @@ class EditingStyle; > > class InsertParagraphSeparatorCommand : public CompositeEditCommand { > public: >- static Ref<InsertParagraphSeparatorCommand> create(Document& document, bool useDefaultParagraphElement = false, bool pasteBlockqutoeIntoUnquotedArea = false, EditAction editingAction = EditAction::Insert) >+ static Ref<InsertParagraphSeparatorCommand> create(Document& document, const Position * position, bool useDefaultParagraphElement = false, bool pasteBlockqutoeIntoUnquotedArea = false, EditAction editingAction = EditAction::Insert) > { >- return adoptRef(*new InsertParagraphSeparatorCommand(document, useDefaultParagraphElement, pasteBlockqutoeIntoUnquotedArea, editingAction)); >+ return adoptRef(*new InsertParagraphSeparatorCommand(document, position, useDefaultParagraphElement, pasteBlockqutoeIntoUnquotedArea, editingAction)); > } > > private: >- InsertParagraphSeparatorCommand(Document&, bool useDefaultParagraphElement, bool pasteBlockqutoeIntoUnquotedArea, EditAction); >+ InsertParagraphSeparatorCommand(Document&, const Position *, bool useDefaultParagraphElement, bool pasteBlockqutoeIntoUnquotedArea, EditAction); > > void doApply() override; > >@@ -54,6 +54,7 @@ private: > > RefPtr<EditingStyle> m_style; > >+ const Position* m_insertPosition; > bool m_mustUseDefaultParagraphElement; > bool m_pasteBlockqutoeIntoUnquotedArea; > }; >diff --git a/Source/WebCore/editing/ReplaceSelectionCommand.cpp b/Source/WebCore/editing/ReplaceSelectionCommand.cpp >index 7311b2a2a5de24008e22783095613d6fe6cf0630..291ec45513ba95895c2bdac657f227a168903018 100644 >--- a/Source/WebCore/editing/ReplaceSelectionCommand.cpp >+++ b/Source/WebCore/editing/ReplaceSelectionCommand.cpp >@@ -1268,8 +1268,10 @@ void ReplaceSelectionCommand::doApply() > if (Node* mailBlockquote = enclosingNodeOfType(positionAtStartOfInsertedContent().deepEquivalent(), isMailPasteAsQuotationNode)) > removeNodeAttribute(downcast<Element>(*mailBlockquote), classAttr); > >- if (shouldPerformSmartReplace()) >+ if (shouldPerformSmartReplace()) { > addSpacesForSmartReplace(); >+ addNewLinesForSmartReplace(); >+ } > > // If we are dealing with a fragment created from plain text > // no style matching is necessary. >@@ -1332,6 +1334,47 @@ static bool isCharacterSmartReplaceExemptConsideringNonBreakingSpace(UChar32 cha > return isCharacterSmartReplaceExempt(character == noBreakSpace ? ' ' : character, previousCharacter); > } > >+void ReplaceSelectionCommand::addNewLinesForSmartReplace() >+{ >+ VisiblePosition startOfInsertedContent = positionAtStartOfInsertedContent(); >+ VisiblePosition endOfInsertedContent = positionAtEndOfInsertedContent(); >+ >+ Position endUpstream = endOfInsertedContent.deepEquivalent().upstream(); >+ Node* endNode = endUpstream.computeNodeBeforePosition(); >+ int endOffset = is<Text>(endNode) ? downcast<Text>(*endNode).length() : 0; >+ if (endUpstream.anchorType() == Position::PositionIsOffsetInAnchor) { >+ endNode = endUpstream.containerNode(); >+ endOffset = endUpstream.offsetInContainerNode(); >+ } >+ >+ Position startDownstream = startOfInsertedContent.deepEquivalent().downstream(); >+ Node* startNode = startDownstream.computeNodeAfterPosition(); >+ unsigned startOffset = 0; >+ if (startDownstream.anchorType() == Position::PositionIsOffsetInAnchor) { >+ startNode = startDownstream.containerNode(); >+ startOffset = startDownstream.offsetInContainerNode(); >+ } >+ >+ bool isFullParagraph = isStartOfParagraph(startOfInsertedContent) && isEndOfParagraph(endOfInsertedContent); >+ >+ if (!isFullParagraph) >+ return; >+ >+ bool reachedBoundary = false; >+ VisiblePosition positionBeforeStart = startOfInsertedContent.previous(CannotCrossEditingBoundary, &reachedBoundary); >+ if (!reachedBoundary) { >+ if (isEndOfLine(positionBeforeStart)) >+ insertParagraphSeparatorAtPosition(startDownstream); >+ } >+ >+ reachedBoundary = false; >+ VisiblePosition positionAfterEnd = endOfInsertedContent.next(CannotCrossEditingBoundary, &reachedBoundary); >+ if (!reachedBoundary) { >+ if (isStartOfLine(positionAfterEnd)) >+ insertParagraphSeparatorAtPosition(endUpstream); >+ } >+} >+ > void ReplaceSelectionCommand::addSpacesForSmartReplace() > { > VisiblePosition startOfInsertedContent = positionAtStartOfInsertedContent(); >diff --git a/Source/WebCore/editing/ReplaceSelectionCommand.h b/Source/WebCore/editing/ReplaceSelectionCommand.h >index a2581cba06b7f40a69449cbfb75fcd8a8530ca26..1d2c48f2ed5f3872f1e9068b364e8fe57912e603 100644 >--- a/Source/WebCore/editing/ReplaceSelectionCommand.h >+++ b/Source/WebCore/editing/ReplaceSelectionCommand.h >@@ -109,6 +109,7 @@ private: > > bool shouldPerformSmartReplace() const; > void addSpacesForSmartReplace(); >+ void addNewLinesForSmartReplace(); > void completeHTMLReplacement(const Position& lastPositionToSelect); > void mergeTextNodesAroundPosition(Position&, Position& positionOnlyToBeUpdated); > >diff --git a/Source/WebCore/editing/TypingCommand.cpp b/Source/WebCore/editing/TypingCommand.cpp >index 67063ee1562ae31f22025b358511fdf4d998a571..1b84e0e4b58f01381e7618721b41d5b0297666f8 100644 >--- a/Source/WebCore/editing/TypingCommand.cpp >+++ b/Source/WebCore/editing/TypingCommand.cpp >@@ -582,7 +582,7 @@ void TypingCommand::insertParagraphSeparator() > if (!willAddTypingToOpenCommand(InsertParagraphSeparator, ParagraphGranularity)) > return; > >- applyCommandToComposite(InsertParagraphSeparatorCommand::create(document(), false, false, EditAction::TypingInsertParagraph)); >+ applyCommandToComposite(InsertParagraphSeparatorCommand::create(document(), nullptr, false, false, EditAction::TypingInsertParagraph)); > typingAddedToOpenCommand(InsertParagraphSeparator); > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 194880
:
362561
|
362570
|
362571
|
362575
|
362581
|
362752
|
362948
|
363023
|
363050
|
363070
|
363148
|
363170
|
364468
|
364495
|
364496
|
364509
|
364539
|
364542
|
364547
|
364548
|
364699
|
364876
|
365049
|
365076
|
365097