| Index: third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
|
| diff --git a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
|
| index 06751912f7b45f7712fb6027065d2bdc52f1f136..29125bddb0493eedf2210e5671ec6adcbb100f47 100644
|
| --- a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
|
| +++ b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
|
| @@ -79,6 +79,8 @@ public:
|
| TriState (*state)(LocalFrame&, Event*);
|
| String (*value)(LocalFrame&, Event*);
|
| bool isTextInsertion;
|
| + // TODO(yosin) We should have |canExecute()|, which checks clipboard
|
| + // accessibility to simplify |Editor::Command::execute()|.
|
| bool allowExecutionWhenDisabled;
|
| };
|
|
|
| @@ -295,8 +297,24 @@ static bool executeBackColor(LocalFrame& frame, Event*, EditorCommandSource sour
|
| return executeApplyStyle(frame, source, EditActionSetBackgroundColor, CSSPropertyBackgroundColor, value);
|
| }
|
|
|
| -static bool executeCopy(LocalFrame& frame, Event*, EditorCommandSource, const String&)
|
| +static bool canWriteClipboard(LocalFrame& frame, EditorCommandSource source)
|
| {
|
| + if (source == CommandFromMenuOrKeyBinding)
|
| + return true;
|
| + Settings* settings = frame.settings();
|
| + bool defaultValue = (settings && settings->javaScriptCanAccessClipboard()) || UserGestureIndicator::processingUserGesture();
|
| + return frame.editor().client().canCopyCut(&frame, defaultValue);
|
| +}
|
| +
|
| +static bool executeCopy(LocalFrame& frame, Event*, EditorCommandSource source, const String&)
|
| +{
|
| + // To support |allowExecutionWhenDisabled|, we need to check clipboard
|
| + // accessibility here rather than |Editor::Command::execute()|.
|
| + // TODO(yosin) We should move checking |canWriteClipboard()| to
|
| + // |Editor::Command::execute()| with introducing appropriate predicate, e.g.
|
| + // |canExecute()|. See also "Cut", and "Paste" command.
|
| + if (!canWriteClipboard(frame, source))
|
| + return false;
|
| frame.editor().copy();
|
| return true;
|
| }
|
| @@ -310,8 +328,15 @@ static bool executeCreateLink(LocalFrame& frame, Event*, EditorCommandSource, co
|
| return true;
|
| }
|
|
|
| -static bool executeCut(LocalFrame& frame, Event*, EditorCommandSource, const String&)
|
| +static bool executeCut(LocalFrame& frame, Event*, EditorCommandSource source, const String&)
|
| {
|
| + // To support |allowExecutionWhenDisabled|, we need to check clipboard
|
| + // accessibility here rather than |Editor::Command::execute()|.
|
| + // TODO(yosin) We should move checking |canWriteClipboard()| to
|
| + // |Editor::Command::execute()| with introducing appropriate predicate, e.g.
|
| + // |canExecute()|. See also "Copy", and "Paste" command.
|
| + if (!canWriteClipboard(frame, source))
|
| + return false;
|
| frame.editor().cut();
|
| return true;
|
| }
|
| @@ -941,14 +966,37 @@ static bool executeToggleOverwrite(LocalFrame& frame, Event*, EditorCommandSourc
|
| return true;
|
| }
|
|
|
| -static bool executePaste(LocalFrame& frame, Event*, EditorCommandSource, const String&)
|
| +static bool canReadClipboard(LocalFrame& frame, EditorCommandSource source)
|
| {
|
| + if (source == CommandFromMenuOrKeyBinding)
|
| + return true;
|
| + Settings* settings = frame.settings();
|
| + bool defaultValue = settings && settings->javaScriptCanAccessClipboard() && settings->DOMPasteAllowed();
|
| + return frame.editor().client().canPaste(&frame, defaultValue);
|
| +}
|
| +
|
| +static bool executePaste(LocalFrame& frame, Event*, EditorCommandSource source, const String&)
|
| +{
|
| + // To support |allowExecutionWhenDisabled|, we need to check clipboard
|
| + // accessibility here rather than |Editor::Command::execute()|.
|
| + // TODO(yosin) We should move checking |canReadClipboard()| to
|
| + // |Editor::Command::execute()| with introducing appropriate predicate, e.g.
|
| + // |canExecute()|. See also "Copy", and "Cut" command.
|
| + if (!canReadClipboard(frame, source))
|
| + return false;
|
| frame.editor().paste();
|
| return true;
|
| }
|
|
|
| static bool executePasteGlobalSelection(LocalFrame& frame, Event*, EditorCommandSource source, const String&)
|
| {
|
| + // To support |allowExecutionWhenDisabled|, we need to check clipboard
|
| + // accessibility here rather than |Editor::Command::execute()|.
|
| + // TODO(yosin) We should move checking |canReadClipboard()| to
|
| + // |Editor::Command::execute()| with introducing appropriate predicate, e.g.
|
| + // |canExecute()|. See also "Copy", and "Cut" command.
|
| + if (!canReadClipboard(frame, source))
|
| + return false;
|
| if (!frame.editor().behavior().supportsGlobalSelection())
|
| return false;
|
| ASSERT_UNUSED(source, source == CommandFromMenuOrKeyBinding);
|
| @@ -1170,26 +1218,6 @@ static bool supportedFromMenuOrKeyBinding(LocalFrame*)
|
| return false;
|
| }
|
|
|
| -static bool supportedCopyCut(LocalFrame* frame)
|
| -{
|
| - if (!frame)
|
| - return false;
|
| -
|
| - Settings* settings = frame->settings();
|
| - bool defaultValue = (settings && settings->javaScriptCanAccessClipboard()) || UserGestureIndicator::processingUserGesture();
|
| - return frame->editor().client().canCopyCut(frame, defaultValue);
|
| -}
|
| -
|
| -static bool supportedPaste(LocalFrame* frame)
|
| -{
|
| - if (!frame)
|
| - return false;
|
| -
|
| - Settings* settings = frame->settings();
|
| - bool defaultValue = settings && settings->javaScriptCanAccessClipboard() && settings->DOMPasteAllowed();
|
| - return frame->editor().client().canPaste(frame, defaultValue);
|
| -}
|
| -
|
| // Enabled functions
|
|
|
| static bool enabled(LocalFrame&, Event*, EditorCommandSource)
|
| @@ -1230,13 +1258,17 @@ static bool enableCaretInEditableText(LocalFrame& frame, Event* event, EditorCom
|
| return selection.isCaret() && selection.isContentEditable();
|
| }
|
|
|
| -static bool enabledCopy(LocalFrame& frame, Event*, EditorCommandSource)
|
| +static bool enabledCopy(LocalFrame& frame, Event*, EditorCommandSource source)
|
| {
|
| + if (!canWriteClipboard(frame, source))
|
| + return false;
|
| return frame.editor().canDHTMLCopy() || frame.editor().canCopy();
|
| }
|
|
|
| -static bool enabledCut(LocalFrame& frame, Event*, EditorCommandSource)
|
| +static bool enabledCut(LocalFrame& frame, Event*, EditorCommandSource source)
|
| {
|
| + if (!canWriteClipboard(frame, source))
|
| + return false;
|
| return frame.editor().canDHTMLCut() || frame.editor().canCut();
|
| }
|
|
|
| @@ -1270,8 +1302,10 @@ static bool enabledInRichlyEditableText(LocalFrame& frame, Event*, EditorCommand
|
| return frame.selection().isCaretOrRange() && frame.selection().isContentRichlyEditable() && frame.selection().rootEditableElement();
|
| }
|
|
|
| -static bool enabledPaste(LocalFrame& frame, Event*, EditorCommandSource)
|
| +static bool enabledPaste(LocalFrame& frame, Event*, EditorCommandSource source)
|
| {
|
| + if (!canReadClipboard(frame, source))
|
| + return false;
|
| return frame.editor().canPaste();
|
| }
|
|
|
| @@ -1457,9 +1491,9 @@ static const CommandMap& createCommandMap()
|
| { "BackColor", {4, executeBackColor, supported, enabledInRichlyEditableText, stateNone, valueBackColor, notTextInsertion, doNotAllowExecutionWhenDisabled } },
|
| { "BackwardDelete", {5, executeDeleteBackward, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } }, // FIXME: remove BackwardDelete when Safari for Windows stops using it.
|
| { "Bold", {6, executeToggleBold, supported, enabledInRichlyEditableText, stateBold, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
|
| - { "Copy", {7, executeCopy, supportedCopyCut, enabledCopy, stateNone, valueNull, notTextInsertion, allowExecutionWhenDisabled } },
|
| + { "Copy", {7, executeCopy, supported, enabledCopy, stateNone, valueNull, notTextInsertion, allowExecutionWhenDisabled } },
|
| { "CreateLink", {8, executeCreateLink, supported, enabledInRichlyEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
|
| - { "Cut", {9, executeCut, supportedCopyCut, enabledCut, stateNone, valueNull, notTextInsertion, allowExecutionWhenDisabled } },
|
| + { "Cut", {9, executeCut, supported, enabledCut, stateNone, valueNull, notTextInsertion, allowExecutionWhenDisabled } },
|
| { "DefaultParagraphSeparator", {10, executeDefaultParagraphSeparator, supported, enabled, stateNone, valueDefaultParagraphSeparator, notTextInsertion, doNotAllowExecutionWhenDisabled} },
|
| { "Delete", {11, executeDelete, supported, enabledDelete, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
|
| { "DeleteBackward", {12, executeDeleteBackward, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
|
| @@ -1553,8 +1587,8 @@ static const CommandMap& createCommandMap()
|
| { "MoveWordRightAndModifySelection", {100, executeMoveWordRightAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelectionOrCaretBrowsing, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
|
| { "Outdent", {101, executeOutdent, supported, enabledInRichlyEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
|
| { "OverWrite", {102, executeToggleOverwrite, supportedFromMenuOrKeyBinding, enabledInRichlyEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
|
| - { "Paste", {103, executePaste, supportedPaste, enabledPaste, stateNone, valueNull, notTextInsertion, allowExecutionWhenDisabled } },
|
| - { "PasteAndMatchStyle", {104, executePasteAndMatchStyle, supportedPaste, enabledPaste, stateNone, valueNull, notTextInsertion, allowExecutionWhenDisabled } },
|
| + { "Paste", {103, executePaste, supported, enabledPaste, stateNone, valueNull, notTextInsertion, allowExecutionWhenDisabled } },
|
| + { "PasteAndMatchStyle", {104, executePasteAndMatchStyle, supported, enabledPaste, stateNone, valueNull, notTextInsertion, allowExecutionWhenDisabled } },
|
| { "PasteGlobalSelection", {105, executePasteGlobalSelection, supportedFromMenuOrKeyBinding, enabledPaste, stateNone, valueNull, notTextInsertion, allowExecutionWhenDisabled } },
|
| { "Print", {106, executePrint, supported, enabled, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
|
| { "Redo", {107, executeRedo, supported, enabledRedo, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
|
| @@ -1731,6 +1765,10 @@ Editor::Command::Command(const EditorInternalCommand* command, EditorCommandSour
|
|
|
| bool Editor::Command::execute(const String& parameter, Event* triggeringEvent) const
|
| {
|
| + // TODO(yosin) We should move this logic into |canExecute()| member function
|
| + // in |EditorInternalCommand| to replace |allowExecutionWhenDisabled|.
|
| + // |allowExecutionWhenDisabled| is for "Copy", "Cut" and "Paste" commands
|
| + // only.
|
| if (!isEnabled(triggeringEvent)) {
|
| // Let certain commands be executed when performed explicitly even if they are disabled.
|
| if (!isSupported() || !m_frame || !m_command->allowExecutionWhenDisabled)
|
|
|