OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008 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 * Copyright (C) 2009 Igalia S.L. | 4 * Copyright (C) 2009 Igalia S.L. |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 std::begin(kCommandNameEntries), std::end(kCommandNameEntries), commandN
ame, | 97 std::begin(kCommandNameEntries), std::end(kCommandNameEntries), commandN
ame, |
98 [](const CommandNameEntry& entry, const String& needle) | 98 [](const CommandNameEntry& entry, const String& needle) |
99 { | 99 { |
100 return codePointCompareIgnoringASCIICase(needle, entry.name) > 0; | 100 return codePointCompareIgnoringASCIICase(needle, entry.name) > 0; |
101 }); | 101 }); |
102 if (result != std::end(kCommandNameEntries) && codePointCompareIgnoringASCII
Case(commandName, result->name) == 0) | 102 if (result != std::end(kCommandNameEntries) && codePointCompareIgnoringASCII
Case(commandName, result->name) == 0) |
103 return result->type; | 103 return result->type; |
104 return WebEditingCommandType::Invalid; | 104 return WebEditingCommandType::Invalid; |
105 } | 105 } |
106 | 106 |
| 107 InputEvent::InputType InputTypeFromCommandType(WebEditingCommandType commandType
) |
| 108 { |
| 109 switch (commandType) { |
| 110 case WebEditingCommandType::Delete: |
| 111 case WebEditingCommandType::DeleteBackward: |
| 112 case WebEditingCommandType::DeleteBackwardByDecomposingPreviousCharacter: |
| 113 case WebEditingCommandType::DeleteForward: |
| 114 case WebEditingCommandType::DeleteToBeginningOfLine: |
| 115 case WebEditingCommandType::DeleteToBeginningOfParagraph: |
| 116 case WebEditingCommandType::DeleteToEndOfLine: |
| 117 case WebEditingCommandType::DeleteToEndOfParagraph: |
| 118 case WebEditingCommandType::DeleteToMark: |
| 119 case WebEditingCommandType::DeleteWordBackward: |
| 120 case WebEditingCommandType::DeleteWordForward: |
| 121 return InputEvent::InputType::DeleteContent; |
| 122 case WebEditingCommandType::Redo: |
| 123 return InputEvent::InputType::Redo; |
| 124 case WebEditingCommandType::Undo: |
| 125 return InputEvent::InputType::Undo; |
| 126 case WebEditingCommandType::InsertBacktab: |
| 127 case WebEditingCommandType::InsertText: |
| 128 return InputEvent::InputType::InsertText; |
| 129 default: |
| 130 return InputEvent::InputType::None; |
| 131 } |
| 132 } |
| 133 |
107 } // anonymous namespace | 134 } // anonymous namespace |
108 | 135 |
109 class EditorInternalCommand { | 136 class EditorInternalCommand { |
110 public: | 137 public: |
111 WebEditingCommandType commandType; | 138 WebEditingCommandType commandType; |
112 bool (*execute)(LocalFrame&, Event*, EditorCommandSource, const String&); | 139 bool (*execute)(LocalFrame&, Event*, EditorCommandSource, const String&); |
113 bool (*isSupportedFromDOM)(LocalFrame*); | 140 bool (*isSupportedFromDOM)(LocalFrame*); |
114 bool (*isEnabled)(LocalFrame&, Event*, EditorCommandSource); | 141 bool (*isEnabled)(LocalFrame&, Event*, EditorCommandSource); |
115 TriState (*state)(LocalFrame&, Event*); | 142 TriState (*state)(LocalFrame&, Event*); |
116 String (*value)(LocalFrame&, Event*); | 143 String (*value)(LocalFrame&, Event*); |
(...skipping 1627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1744 { | 1771 { |
1745 // TODO(yosin) We should move this logic into |canExecute()| member function | 1772 // TODO(yosin) We should move this logic into |canExecute()| member function |
1746 // in |EditorInternalCommand| to replace |allowExecutionWhenDisabled|. | 1773 // in |EditorInternalCommand| to replace |allowExecutionWhenDisabled|. |
1747 // |allowExecutionWhenDisabled| is for "Copy", "Cut" and "Paste" commands | 1774 // |allowExecutionWhenDisabled| is for "Copy", "Cut" and "Paste" commands |
1748 // only. | 1775 // only. |
1749 if (!isEnabled(triggeringEvent)) { | 1776 if (!isEnabled(triggeringEvent)) { |
1750 // Let certain commands be executed when performed explicitly even if th
ey are disabled. | 1777 // Let certain commands be executed when performed explicitly even if th
ey are disabled. |
1751 if (!isSupported() || !m_frame || !m_command->allowExecutionWhenDisabled
) | 1778 if (!isSupported() || !m_frame || !m_command->allowExecutionWhenDisabled
) |
1752 return false; | 1779 return false; |
1753 } | 1780 } |
| 1781 |
| 1782 if (m_source == CommandFromMenuOrKeyBinding) { |
| 1783 InputEvent::InputType inputType = InputTypeFromCommandType(m_command->co
mmandType); |
| 1784 if (inputType != InputEvent::InputType::None) { |
| 1785 if (dispatchBeforeInputEditorCommand(eventTargetNodeForDocument(m_fr
ame->document()), inputType) != DispatchEventResult::NotCanceled) |
| 1786 return true; |
| 1787 } |
| 1788 } |
| 1789 |
| 1790 // 'beforeinput' event handler may destroy |frame()|. |
| 1791 if (!m_frame || !frame().document()) |
| 1792 return false; |
| 1793 |
1754 frame().document()->updateLayoutIgnorePendingStylesheets(); | 1794 frame().document()->updateLayoutIgnorePendingStylesheets(); |
1755 DEFINE_STATIC_LOCAL(SparseHistogram, commandHistogram, ("WebCore.Editing.Com
mands")); | 1795 DEFINE_STATIC_LOCAL(SparseHistogram, commandHistogram, ("WebCore.Editing.Com
mands")); |
1756 commandHistogram.sample(static_cast<int>(m_command->commandType)); | 1796 commandHistogram.sample(static_cast<int>(m_command->commandType)); |
1757 return m_command->execute(*m_frame, triggeringEvent, m_source, parameter); | 1797 return m_command->execute(*m_frame, triggeringEvent, m_source, parameter); |
1758 } | 1798 } |
1759 | 1799 |
1760 bool Editor::Command::execute(Event* triggeringEvent) const | 1800 bool Editor::Command::execute(Event* triggeringEvent) const |
1761 { | 1801 { |
1762 return execute(String(), triggeringEvent); | 1802 return execute(String(), triggeringEvent); |
1763 } | 1803 } |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1803 { | 1843 { |
1804 return m_command && m_command->isTextInsertion; | 1844 return m_command && m_command->isTextInsertion; |
1805 } | 1845 } |
1806 | 1846 |
1807 int Editor::Command::idForHistogram() const | 1847 int Editor::Command::idForHistogram() const |
1808 { | 1848 { |
1809 return isSupported() ? static_cast<int>(m_command->commandType) : 0; | 1849 return isSupported() ? static_cast<int>(m_command->commandType) : 0; |
1810 } | 1850 } |
1811 | 1851 |
1812 } // namespace blink | 1852 } // namespace blink |
OLD | NEW |