Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 697 startRoot->dispatchEvent(Event::create(EventTypeNames::webkitEditableCon tentChanged)); | 697 startRoot->dispatchEvent(Event::create(EventTypeNames::webkitEditableCon tentChanged)); |
| 698 if (endRoot && endRoot != startRoot) | 698 if (endRoot && endRoot != startRoot) |
| 699 endRoot->dispatchEvent(Event::create(EventTypeNames::webkitEditableConte ntChanged)); | 699 endRoot->dispatchEvent(Event::create(EventTypeNames::webkitEditableConte ntChanged)); |
| 700 } | 700 } |
| 701 | 701 |
| 702 void Editor::requestSpellcheckingAfterApplyingCommand(CompositeEditCommand* cmd) | 702 void Editor::requestSpellcheckingAfterApplyingCommand(CompositeEditCommand* cmd) |
| 703 { | 703 { |
| 704 // Note: Request spell checking for and only for |ReplaceSelectionCommand|s | 704 // Note: Request spell checking for and only for |ReplaceSelectionCommand|s |
| 705 // created in |Editor::replaceSelectionWithFragment()|. | 705 // created in |Editor::replaceSelectionWithFragment()|. |
| 706 // TODO(xiaochengh): May also need to do this after dragging crbug.com/29804 6. | 706 // TODO(xiaochengh): May also need to do this after dragging crbug.com/29804 6. |
| 707 if (cmd->inputType() != InputEvent::InputType::Paste) | 707 if (cmd->inputType() != InputEvent::InputType::InsertFromPaste) |
| 708 return; | 708 return; |
| 709 if (!spellChecker().isSpellCheckingEnabled()) | 709 if (!spellChecker().isSpellCheckingEnabled()) |
| 710 return; | 710 return; |
| 711 if (!SpellChecker::isSpellCheckingEnabledFor(cmd->endingSelection())) | 711 if (!SpellChecker::isSpellCheckingEnabledFor(cmd->endingSelection())) |
| 712 return; | 712 return; |
| 713 DCHECK(cmd->isReplaceSelectionCommand()); | 713 DCHECK(cmd->isReplaceSelectionCommand()); |
| 714 const EphemeralRange& insertedRange = toReplaceSelectionCommand(cmd)->insert edRange(); | 714 const EphemeralRange& insertedRange = toReplaceSelectionCommand(cmd)->insert edRange(); |
| 715 if (insertedRange.isNull()) | 715 if (insertedRange.isNull()) |
| 716 return; | 716 return; |
| 717 // Patch crrev.com/2241293006 assumes the following equality. Revert if it f ails. | 717 // Patch crrev.com/2241293006 assumes the following equality. Revert if it f ails. |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 881 bool alignToEdge = isEndOfEditableOrNonEditableContent(caret); | 881 bool alignToEdge = isEndOfEditableOrNonEditableContent(caret); |
| 882 DCHECK(frame().document()); | 882 DCHECK(frame().document()); |
| 883 EditingState editingState; | 883 EditingState editingState; |
| 884 if (!TypingCommand::insertParagraphSeparator(*frame().document())) | 884 if (!TypingCommand::insertParagraphSeparator(*frame().document())) |
| 885 return false; | 885 return false; |
| 886 revealSelectionAfterEditingOperation(alignToEdge ? ScrollAlignment::alignToE dgeIfNeeded : ScrollAlignment::alignCenterIfNeeded); | 886 revealSelectionAfterEditingOperation(alignToEdge ? ScrollAlignment::alignToE dgeIfNeeded : ScrollAlignment::alignCenterIfNeeded); |
| 887 | 887 |
| 888 return true; | 888 return true; |
| 889 } | 889 } |
| 890 | 890 |
| 891 void Editor::cut() | 891 void Editor::cut(EditorCommandSource source) |
| 892 { | 892 { |
| 893 if (tryDHTMLCut()) | 893 if (tryDHTMLCut()) |
| 894 return; // DHTML did the whole operation | 894 return; // DHTML did the whole operation |
| 895 if (!canCut()) | 895 if (!canCut()) |
| 896 return; | 896 return; |
| 897 // TODO(yosin) We should use early return style here. | 897 // TODO(yosin) We should use early return style here. |
| 898 if (shouldDeleteRange(selectedRange())) { | 898 if (shouldDeleteRange(selectedRange())) { |
| 899 spellChecker().updateMarkersForWordsAffectedByEditing(true); | 899 spellChecker().updateMarkersForWordsAffectedByEditing(true); |
| 900 if (enclosingTextFormControl(frame().selection().start())) { | 900 if (enclosingTextFormControl(frame().selection().start())) { |
| 901 String plainText = frame().selectedTextForClipboard(); | 901 String plainText = frame().selectedTextForClipboard(); |
| 902 Pasteboard::generalPasteboard()->writePlainText(plainText, | 902 Pasteboard::generalPasteboard()->writePlainText(plainText, |
| 903 canSmartCopyOrDelete() ? Pasteboard::CanSmartReplace : Pasteboar d::CannotSmartReplace); | 903 canSmartCopyOrDelete() ? Pasteboard::CanSmartReplace : Pasteboar d::CannotSmartReplace); |
| 904 } else { | 904 } else { |
| 905 writeSelectionToPasteboard(); | 905 writeSelectionToPasteboard(); |
| 906 } | 906 } |
| 907 deleteSelectionWithSmartDelete(canSmartCopyOrDelete(), InputEvent::Input Type::Cut); | 907 |
| 908 if (source == CommandFromMenuOrKeyBinding) { | |
| 909 if (dispatchBeforeInputDataTransfer(findEventTargetFromSelection(), InputEvent::InputType::DeleteByCut, nullptr, nullptr) != DispatchEventResult::No tCanceled) | |
| 910 return; | |
| 911 // 'beforeinput' event handler might destroy target. | |
| 912 if (!m_frame) | |
|
yosin_UTC9
2016/08/23 04:23:54
|Editor::m_frame| is never |nullptr|.
You can chec
| |
| 913 return; | |
| 914 } | |
| 915 deleteSelectionWithSmartDelete(canSmartCopyOrDelete(), InputEvent::Input Type::DeleteByCut); | |
| 908 } | 916 } |
| 909 } | 917 } |
| 910 | 918 |
| 911 void Editor::copy() | 919 void Editor::copy() |
| 912 { | 920 { |
| 913 if (tryDHTMLCopy()) | 921 if (tryDHTMLCopy()) |
| 914 return; // DHTML did the whole operation | 922 return; // DHTML did the whole operation |
| 915 if (!canCopy()) | 923 if (!canCopy()) |
| 916 return; | 924 return; |
| 917 if (enclosingTextFormControl(frame().selection().start())) { | 925 if (enclosingTextFormControl(frame().selection().start())) { |
| 918 Pasteboard::generalPasteboard()->writePlainText(frame().selectedTextForC lipboard(), | 926 Pasteboard::generalPasteboard()->writePlainText(frame().selectedTextForC lipboard(), |
| 919 canSmartCopyOrDelete() ? Pasteboard::CanSmartReplace : Pasteboard::C annotSmartReplace); | 927 canSmartCopyOrDelete() ? Pasteboard::CanSmartReplace : Pasteboard::C annotSmartReplace); |
| 920 } else { | 928 } else { |
| 921 Document* document = frame().document(); | 929 Document* document = frame().document(); |
| 922 if (HTMLImageElement* imageElement = imageElementFromImageDocument(docum ent)) | 930 if (HTMLImageElement* imageElement = imageElementFromImageDocument(docum ent)) |
| 923 writeImageNodeToPasteboard(Pasteboard::generalPasteboard(), imageEle ment, document->title()); | 931 writeImageNodeToPasteboard(Pasteboard::generalPasteboard(), imageEle ment, document->title()); |
| 924 else | 932 else |
| 925 writeSelectionToPasteboard(); | 933 writeSelectionToPasteboard(); |
| 926 } | 934 } |
| 927 } | 935 } |
| 928 | 936 |
| 929 void Editor::paste() | 937 void Editor::paste(EditorCommandSource source) |
| 930 { | 938 { |
| 931 DCHECK(frame().document()); | 939 DCHECK(frame().document()); |
| 932 if (tryDHTMLPaste(AllMimeTypes)) | 940 if (tryDHTMLPaste(AllMimeTypes)) |
| 933 return; // DHTML did the whole operation | 941 return; // DHTML did the whole operation |
| 934 if (!canPaste()) | 942 if (!canPaste()) |
| 935 return; | 943 return; |
| 936 spellChecker().updateMarkersForWordsAffectedByEditing(false); | 944 spellChecker().updateMarkersForWordsAffectedByEditing(false); |
| 937 ResourceFetcher* loader = frame().document()->fetcher(); | 945 ResourceFetcher* loader = frame().document()->fetcher(); |
| 938 ResourceCacheValidationSuppressor validationSuppressor(loader); | 946 ResourceCacheValidationSuppressor validationSuppressor(loader); |
| 939 if (frame().selection().isContentRichlyEditable()) | 947 |
| 948 PasteMode pasteMode = frame().selection().isContentRichlyEditable() ? AllMim eTypes : PlainTextOnly; | |
| 949 | |
| 950 if (source == CommandFromMenuOrKeyBinding) { | |
| 951 DataTransfer* dataTransfer = DataTransfer::create( | |
| 952 DataTransfer::CopyAndPaste, | |
| 953 DataTransferReadable, | |
| 954 DataObject::createFromPasteboard(pasteMode)); | |
| 955 | |
| 956 if (dispatchBeforeInputDataTransfer(findEventTargetFromSelection(), Inpu tEvent::InputType::InsertFromPaste, dataTransfer, nullptr) != DispatchEventResul t::NotCanceled) | |
| 957 return; | |
| 958 // 'beforeinput' event handler might destroy target. | |
| 959 if (!m_frame) | |
| 960 return; | |
| 961 } | |
| 962 | |
| 963 if (pasteMode == AllMimeTypes) | |
| 940 pasteWithPasteboard(Pasteboard::generalPasteboard()); | 964 pasteWithPasteboard(Pasteboard::generalPasteboard()); |
| 941 else | 965 else |
| 942 pasteAsPlainTextWithPasteboard(Pasteboard::generalPasteboard()); | 966 pasteAsPlainTextWithPasteboard(Pasteboard::generalPasteboard()); |
| 943 } | 967 } |
| 944 | 968 |
| 945 void Editor::pasteAsPlainText() | 969 void Editor::pasteAsPlainText(EditorCommandSource source) |
| 946 { | 970 { |
| 947 if (tryDHTMLPaste(PlainTextOnly)) | 971 if (tryDHTMLPaste(PlainTextOnly)) |
| 948 return; | 972 return; |
| 949 if (!canPaste()) | 973 if (!canPaste()) |
| 950 return; | 974 return; |
| 951 spellChecker().updateMarkersForWordsAffectedByEditing(false); | 975 spellChecker().updateMarkersForWordsAffectedByEditing(false); |
| 952 pasteAsPlainTextWithPasteboard(Pasteboard::generalPasteboard()); | 976 pasteAsPlainTextWithPasteboard(Pasteboard::generalPasteboard()); |
| 953 } | 977 } |
| 954 | 978 |
| 955 void Editor::performDelete() | 979 void Editor::performDelete() |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1408 | 1432 |
| 1409 DEFINE_TRACE(Editor) | 1433 DEFINE_TRACE(Editor) |
| 1410 { | 1434 { |
| 1411 visitor->trace(m_frame); | 1435 visitor->trace(m_frame); |
| 1412 visitor->trace(m_lastEditCommand); | 1436 visitor->trace(m_lastEditCommand); |
| 1413 visitor->trace(m_undoStack); | 1437 visitor->trace(m_undoStack); |
| 1414 visitor->trace(m_mark); | 1438 visitor->trace(m_mark); |
| 1415 } | 1439 } |
| 1416 | 1440 |
| 1417 } // namespace blink | 1441 } // namespace blink |
| OLD | NEW |