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

Side by Side Diff: third_party/WebKit/Source/core/editing/Editor.cpp

Issue 2258663003: [InputEvent] Support |deleteByCut|&|insertFromPaste| with |dataTransfer| field (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: yosin's review - Add tests for 'beforeinput' in destroyed iframe Created 4 years, 3 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 return; 535 return;
536 536
537 ReplaceSelectionCommand::CommandOptions options = ReplaceSelectionCommand::P reventNesting | ReplaceSelectionCommand::SanitizeFragment; 537 ReplaceSelectionCommand::CommandOptions options = ReplaceSelectionCommand::P reventNesting | ReplaceSelectionCommand::SanitizeFragment;
538 if (selectReplacement) 538 if (selectReplacement)
539 options |= ReplaceSelectionCommand::SelectReplacement; 539 options |= ReplaceSelectionCommand::SelectReplacement;
540 if (smartReplace) 540 if (smartReplace)
541 options |= ReplaceSelectionCommand::SmartReplace; 541 options |= ReplaceSelectionCommand::SmartReplace;
542 if (matchStyle) 542 if (matchStyle)
543 options |= ReplaceSelectionCommand::MatchStyle; 543 options |= ReplaceSelectionCommand::MatchStyle;
544 DCHECK(frame().document()); 544 DCHECK(frame().document());
545 ReplaceSelectionCommand::create(*frame().document(), fragment, options, Inpu tEvent::InputType::Paste)->apply(); 545 ReplaceSelectionCommand::create(*frame().document(), fragment, options, Inpu tEvent::InputType::InsertFromPaste)->apply();
546 revealSelectionAfterEditingOperation(); 546 revealSelectionAfterEditingOperation();
547 } 547 }
548 548
549 void Editor::replaceSelectionWithText(const String& text, bool selectReplacement , bool smartReplace) 549 void Editor::replaceSelectionWithText(const String& text, bool selectReplacement , bool smartReplace)
550 { 550 {
551 replaceSelectionWithFragment(createFragmentFromText(selectedRange(), text), selectReplacement, smartReplace, true); 551 replaceSelectionWithFragment(createFragmentFromText(selectedRange(), text), selectReplacement, smartReplace, true);
552 } 552 }
553 553
554 // TODO(xiaochengh): Merge it with |replaceSelectionWithFragment()|. 554 // TODO(xiaochengh): Merge it with |replaceSelectionWithFragment()|.
555 void Editor::replaceSelectionAfterDragging(DocumentFragment* fragment, bool smar tReplace, bool plainText) 555 void Editor::replaceSelectionAfterDragging(DocumentFragment* fragment, bool smar tReplace, bool plainText)
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 bool alignToEdge = isEndOfEditableOrNonEditableContent(caret); 861 bool alignToEdge = isEndOfEditableOrNonEditableContent(caret);
862 DCHECK(frame().document()); 862 DCHECK(frame().document());
863 EditingState editingState; 863 EditingState editingState;
864 if (!TypingCommand::insertParagraphSeparator(*frame().document())) 864 if (!TypingCommand::insertParagraphSeparator(*frame().document()))
865 return false; 865 return false;
866 revealSelectionAfterEditingOperation(alignToEdge ? ScrollAlignment::alignToE dgeIfNeeded : ScrollAlignment::alignCenterIfNeeded); 866 revealSelectionAfterEditingOperation(alignToEdge ? ScrollAlignment::alignToE dgeIfNeeded : ScrollAlignment::alignCenterIfNeeded);
867 867
868 return true; 868 return true;
869 } 869 }
870 870
871 void Editor::cut() 871 void Editor::cut(EditorCommandSource source)
872 { 872 {
873 if (tryDHTMLCut()) 873 if (tryDHTMLCut())
874 return; // DHTML did the whole operation 874 return; // DHTML did the whole operation
875 if (!canCut()) 875 if (!canCut())
876 return; 876 return;
877 // TODO(yosin) We should use early return style here. 877 // TODO(yosin) We should use early return style here.
878 if (shouldDeleteRange(selectedRange())) { 878 if (shouldDeleteRange(selectedRange())) {
879 spellChecker().updateMarkersForWordsAffectedByEditing(true); 879 spellChecker().updateMarkersForWordsAffectedByEditing(true);
880 if (enclosingTextFormControl(frame().selection().start())) { 880 if (enclosingTextFormControl(frame().selection().start())) {
881 String plainText = frame().selectedTextForClipboard(); 881 String plainText = frame().selectedTextForClipboard();
882 Pasteboard::generalPasteboard()->writePlainText(plainText, 882 Pasteboard::generalPasteboard()->writePlainText(plainText,
883 canSmartCopyOrDelete() ? Pasteboard::CanSmartReplace : Pasteboar d::CannotSmartReplace); 883 canSmartCopyOrDelete() ? Pasteboard::CanSmartReplace : Pasteboar d::CannotSmartReplace);
884 } else { 884 } else {
885 writeSelectionToPasteboard(); 885 writeSelectionToPasteboard();
886 } 886 }
887 deleteSelectionWithSmartDelete(canSmartCopyOrDelete(), InputEvent::Input Type::Cut); 887
888 if (source == CommandFromMenuOrKeyBinding) {
889 if (dispatchBeforeInputDataTransfer(findEventTargetFromSelection(), InputEvent::InputType::DeleteByCut, nullptr, nullptr) != DispatchEventResult::No tCanceled)
890 return;
891 // 'beforeinput' event handler may destroy target frame.
892 if (!m_frame->document()->frame())
893 return;
chongz 2016/08/24 01:43:27 Compare document won't work, have to do this...
yosin_UTC9 2016/08/24 02:11:44 How about |m_frame->document()->frame() != m_fram
chongz 2016/08/24 02:42:01 Done.
894 }
895 deleteSelectionWithSmartDelete(canSmartCopyOrDelete(), InputEvent::Input Type::DeleteByCut);
888 } 896 }
889 } 897 }
890 898
891 void Editor::copy() 899 void Editor::copy()
892 { 900 {
893 if (tryDHTMLCopy()) 901 if (tryDHTMLCopy())
894 return; // DHTML did the whole operation 902 return; // DHTML did the whole operation
895 if (!canCopy()) 903 if (!canCopy())
896 return; 904 return;
897 if (enclosingTextFormControl(frame().selection().start())) { 905 if (enclosingTextFormControl(frame().selection().start())) {
898 Pasteboard::generalPasteboard()->writePlainText(frame().selectedTextForC lipboard(), 906 Pasteboard::generalPasteboard()->writePlainText(frame().selectedTextForC lipboard(),
899 canSmartCopyOrDelete() ? Pasteboard::CanSmartReplace : Pasteboard::C annotSmartReplace); 907 canSmartCopyOrDelete() ? Pasteboard::CanSmartReplace : Pasteboard::C annotSmartReplace);
900 } else { 908 } else {
901 Document* document = frame().document(); 909 Document* document = frame().document();
902 if (HTMLImageElement* imageElement = imageElementFromImageDocument(docum ent)) 910 if (HTMLImageElement* imageElement = imageElementFromImageDocument(docum ent))
903 writeImageNodeToPasteboard(Pasteboard::generalPasteboard(), imageEle ment, document->title()); 911 writeImageNodeToPasteboard(Pasteboard::generalPasteboard(), imageEle ment, document->title());
904 else 912 else
905 writeSelectionToPasteboard(); 913 writeSelectionToPasteboard();
906 } 914 }
907 } 915 }
908 916
909 void Editor::paste() 917 void Editor::paste(EditorCommandSource source)
910 { 918 {
911 DCHECK(frame().document()); 919 DCHECK(frame().document());
912 if (tryDHTMLPaste(AllMimeTypes)) 920 if (tryDHTMLPaste(AllMimeTypes))
913 return; // DHTML did the whole operation 921 return; // DHTML did the whole operation
914 if (!canPaste()) 922 if (!canPaste())
915 return; 923 return;
916 spellChecker().updateMarkersForWordsAffectedByEditing(false); 924 spellChecker().updateMarkersForWordsAffectedByEditing(false);
917 ResourceFetcher* loader = frame().document()->fetcher(); 925 ResourceFetcher* loader = frame().document()->fetcher();
918 ResourceCacheValidationSuppressor validationSuppressor(loader); 926 ResourceCacheValidationSuppressor validationSuppressor(loader);
919 if (frame().selection().isContentRichlyEditable()) 927
928 PasteMode pasteMode = frame().selection().isContentRichlyEditable() ? AllMim eTypes : PlainTextOnly;
929
930 if (source == CommandFromMenuOrKeyBinding) {
931 DataTransfer* dataTransfer = DataTransfer::create(
932 DataTransfer::CopyAndPaste,
933 DataTransferReadable,
934 DataObject::createFromPasteboard(pasteMode));
935
936 if (dispatchBeforeInputDataTransfer(findEventTargetFromSelection(), Inpu tEvent::InputType::InsertFromPaste, dataTransfer, nullptr) != DispatchEventResul t::NotCanceled)
937 return;
938 // 'beforeinput' event handler may destroy target frame.
939 if (!m_frame->document()->frame())
940 return;
941 }
942
943 if (pasteMode == AllMimeTypes)
920 pasteWithPasteboard(Pasteboard::generalPasteboard()); 944 pasteWithPasteboard(Pasteboard::generalPasteboard());
921 else 945 else
922 pasteAsPlainTextWithPasteboard(Pasteboard::generalPasteboard()); 946 pasteAsPlainTextWithPasteboard(Pasteboard::generalPasteboard());
923 } 947 }
924 948
925 void Editor::pasteAsPlainText() 949 void Editor::pasteAsPlainText(EditorCommandSource source)
926 { 950 {
927 if (tryDHTMLPaste(PlainTextOnly)) 951 if (tryDHTMLPaste(PlainTextOnly))
928 return; 952 return;
929 if (!canPaste()) 953 if (!canPaste())
930 return; 954 return;
931 spellChecker().updateMarkersForWordsAffectedByEditing(false); 955 spellChecker().updateMarkersForWordsAffectedByEditing(false);
932 pasteAsPlainTextWithPasteboard(Pasteboard::generalPasteboard()); 956 pasteAsPlainTextWithPasteboard(Pasteboard::generalPasteboard());
933 } 957 }
934 958
935 void Editor::performDelete() 959 void Editor::performDelete()
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
1388 1412
1389 DEFINE_TRACE(Editor) 1413 DEFINE_TRACE(Editor)
1390 { 1414 {
1391 visitor->trace(m_frame); 1415 visitor->trace(m_frame);
1392 visitor->trace(m_lastEditCommand); 1416 visitor->trace(m_lastEditCommand);
1393 visitor->trace(m_undoStack); 1417 visitor->trace(m_undoStack);
1394 visitor->trace(m_mark); 1418 visitor->trace(m_mark);
1395 } 1419 }
1396 1420
1397 } // namespace blink 1421 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698