Chromium Code Reviews| Index: third_party/WebKit/Source/core/page/DragController.cpp |
| diff --git a/third_party/WebKit/Source/core/page/DragController.cpp b/third_party/WebKit/Source/core/page/DragController.cpp |
| index 70e4290a77a1b481e6320b4fce4f54f1837486a4..eb031fb0b45edb0c66664b679842536119e134b2 100644 |
| --- a/third_party/WebKit/Source/core/page/DragController.cpp |
| +++ b/third_party/WebKit/Source/core/page/DragController.cpp |
| @@ -42,6 +42,7 @@ |
| #include "core/editing/EditingUtilities.h" |
| #include "core/editing/Editor.h" |
| #include "core/editing/FrameSelection.h" |
| +#include "core/editing/commands/DragAndDropCommand.h" |
| #include "core/editing/serializers/Serialization.h" |
| #include "core/events/TextEvent.h" |
| #include "core/fetch/ImageResource.h" |
| @@ -147,7 +148,7 @@ DragController* DragController::create(Page* page) |
| static DocumentFragment* documentFragmentFromDragData(DragData* dragData, LocalFrame* frame, Range* context, bool allowPlainText, bool& chosePlainText) |
| { |
| - ASSERT(dragData); |
| + DCHECK(dragData); |
| chosePlainText = false; |
| Document& document = context->ownerDocument(); |
| @@ -504,6 +505,11 @@ bool DragController::concludeEditDrag(DragData* dragData) |
| return false; |
| ResourceFetcher* fetcher = range->ownerDocument().fetcher(); |
| ResourceCacheValidationSuppressor validationSuppressor(fetcher); |
| + |
| + // Start new Drag&Drop command group, invalidate previous command group. |
| + // Assume no other places is firing |DeleteByDrag| and |InsertFromDrop|. |
| + innerFrame->editor().registerCommandGroup(DragAndDropCommand::create(*innerFrame->document())); |
| + |
| if (dragIsMove(innerFrame->selection(), dragData) || dragCaret.isContentRichlyEditable()) { |
| bool chosePlainText = false; |
| DocumentFragment* fragment = documentFragmentFromDragData(dragData, innerFrame, range, true, chosePlainText); |
| @@ -513,13 +519,23 @@ bool DragController::concludeEditDrag(DragData* dragData) |
| if (dragIsMove(innerFrame->selection(), dragData)) { |
| // NSTextView behavior is to always smart delete on moving a selection, |
| // but only to smart insert if the selection granularity is word granularity. |
| - bool smartDelete = innerFrame->editor().smartInsertDeleteEnabled(); |
| - bool smartInsert = smartDelete && innerFrame->selection().granularity() == WordGranularity && dragData->canSmartReplace(); |
| - innerFrame->editor().moveSelectionAfterDragging(fragment, dragCaret.base(), smartInsert, smartDelete); |
| + const bool smartDelete = innerFrame->editor().smartInsertDeleteEnabled(); |
| + const bool smartInsert = smartDelete && innerFrame->selection().granularity() == WordGranularity && dragData->canSmartReplace(); |
| + |
| + if (!innerFrame->editor().deleteSelectionAfterDraggingWithEvents(innerFrame->editor().findEventTargetFromSelection(), smartDelete ? SmartDelete::Yes : SmartDelete::No, dragCaret.base())) |
| + return false; |
| + |
| + innerFrame->selection().setSelection(VisibleSelection(range->startPosition(), range->endPosition())); |
| + if (innerFrame->selection().isAvailable()) { |
| + DCHECK(m_documentUnderMouse); |
| + if (!innerFrame->editor().replaceSelectionAfterDraggingWithEvents(element, dragData, fragment, range, smartInsert ? SmartInsert::Yes : SmartInsert::No, chosePlainText ? ChosePlainText::Yes : ChosePlainText::No)) |
| + return false; |
| + } |
| } else { |
| if (setSelectionToDragCaret(innerFrame, dragCaret, range, point)) { |
| - ASSERT(m_documentUnderMouse); |
| - m_documentUnderMouse->frame()->editor().replaceSelectionAfterDragging(fragment, dragData->canSmartReplace(), chosePlainText); |
| + DCHECK(m_documentUnderMouse); |
| + if (!innerFrame->editor().replaceSelectionAfterDraggingWithEvents(element, dragData, fragment, range, dragData->canSmartReplace() ? SmartInsert::Yes : SmartInsert::No, chosePlainText ? ChosePlainText::Yes : ChosePlainText::No)) |
| + return false; |
| } |
| } |
| } else { |
| @@ -528,10 +544,11 @@ bool DragController::concludeEditDrag(DragData* dragData) |
| return false; |
| if (setSelectionToDragCaret(innerFrame, dragCaret, range, point)) { |
| - const bool canSmartReplace = false; |
| - const bool chosePlainText = true; |
| - ASSERT(m_documentUnderMouse); |
| - m_documentUnderMouse->frame()->editor().replaceSelectionAfterDragging(createFragmentFromText(EphemeralRange(range), text), canSmartReplace, chosePlainText); |
| + const SmartInsert canSmartReplace = SmartInsert::No; |
|
yosin_UTC9
2016/10/03 09:19:03
nit: Since we have enum class for smart insert and
chongz
2016/10/04 02:18:39
Done.
|
| + const ChosePlainText chosePlainText = ChosePlainText::Yes; |
| + DCHECK(m_documentUnderMouse); |
| + if (!innerFrame->editor().replaceSelectionAfterDraggingWithEvents(element, dragData, createFragmentFromText(EphemeralRange(range), text), range, canSmartReplace, chosePlainText)) |
| + return false; |
| } |
| } |