summaryrefslogtreecommitdiffstats
path: root/editor/libeditor/EditorCommands.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--editor/libeditor/EditorCommands.h920
1 files changed, 920 insertions, 0 deletions
diff --git a/editor/libeditor/EditorCommands.h b/editor/libeditor/EditorCommands.h
new file mode 100644
index 0000000000..1e63609f92
--- /dev/null
+++ b/editor/libeditor/EditorCommands.h
@@ -0,0 +1,920 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_EditorCommands_h
+#define mozilla_EditorCommands_h
+
+#include "mozilla/EventForwards.h"
+#include "mozilla/Maybe.h"
+#include "mozilla/StaticPtr.h"
+#include "mozilla/TypedEnumBits.h"
+#include "nsGkAtoms.h"
+#include "nsIControllerCommand.h"
+#include "nsIPrincipal.h"
+#include "nsISupportsImpl.h"
+#include "nsRefPtrHashtable.h"
+#include "nsStringFwd.h"
+
+class nsAtom;
+class nsCommandParams;
+class nsICommandParams;
+class nsIEditingSession;
+class nsITransferable;
+class nsStaticAtom;
+
+namespace mozilla {
+
+class HTMLEditor;
+class TextEditor;
+
+/**
+ * EditorCommandParamType tells you that EditorCommand subclasses refer
+ * which type in nsCommandParams (e.g., bool or nsString) or do not refer.
+ * If they refer some types, also set where is in nsCommandParams, e.g.,
+ * whether "state_attribute" or "state_data".
+ */
+enum class EditorCommandParamType : uint16_t {
+ // The command does not take params (even if specified, always ignored).
+ None = 0,
+ // The command refers nsCommandParams::GetBool() result.
+ Bool = 1 << 0,
+ // The command refers nsCommandParams::GetString() result.
+ // This may be specified with CString. In such case,
+ // nsCommandParams::GetCString() is preferred.
+ String = 1 << 1,
+ // The command refers nsCommandParams::GetCString() result.
+ CString = 1 << 2,
+ // The command refers nsCommandParams::GetISupports("transferable") result.
+ Transferable = 1 << 3,
+
+ // The command refres "state_attribute" of nsCommandParams when calling
+ // GetBool()/GetString()/GetCString(). This must not be set when the
+ // type is None or Transferable.
+ StateAttribute = 1 << 14,
+ // The command refers "state_data" of nsCommandParams when calling
+ // GetBool()/GetString()/GetCString(). This must not be set when the
+ // type is None or Transferable.
+ StateData = 1 << 15,
+};
+
+MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(EditorCommandParamType)
+
+/**
+ * This is a base class for commands registered with the editor controller.
+ * Note that such commands are designed as singleton classes. So, MUST be
+ * stateless. Any state must be stored via the refCon (an nsIEditor).
+ */
+
+class EditorCommand : public nsIControllerCommand {
+ public:
+ NS_DECL_ISUPPORTS
+
+ static EditorCommandParamType GetParamType(Command aCommand) {
+ // Keep same order of registration in EditorController.cpp and
+ // HTMLEditorController.cpp.
+ switch (aCommand) {
+ // UndoCommand
+ case Command::HistoryUndo:
+ return EditorCommandParamType::None;
+ // RedoCommand
+ case Command::HistoryRedo:
+ return EditorCommandParamType::None;
+ // CutCommand
+ case Command::Cut:
+ return EditorCommandParamType::None;
+ // CutOrDeleteCommand
+ case Command::CutOrDelete:
+ return EditorCommandParamType::None;
+ // CopyCommand
+ case Command::Copy:
+ return EditorCommandParamType::None;
+ // CopyOrDeleteCommand
+ case Command::CopyOrDelete:
+ return EditorCommandParamType::None;
+ // SelectAllCommand
+ case Command::SelectAll:
+ return EditorCommandParamType::None;
+ // PasteCommand
+ case Command::Paste:
+ return EditorCommandParamType::None;
+ case Command::PasteTransferable:
+ return EditorCommandParamType::Transferable;
+ // SwitchTextDirectionCommand
+ case Command::FormatSetBlockTextDirection:
+ return EditorCommandParamType::None;
+ // DeleteCommand
+ case Command::Delete:
+ case Command::DeleteCharBackward:
+ case Command::DeleteCharForward:
+ case Command::DeleteWordBackward:
+ case Command::DeleteWordForward:
+ case Command::DeleteToBeginningOfLine:
+ case Command::DeleteToEndOfLine:
+ return EditorCommandParamType::None;
+ // InsertPlaintextCommand
+ case Command::InsertText:
+ return EditorCommandParamType::String |
+ EditorCommandParamType::StateData;
+ // InsertParagraphCommand
+ case Command::InsertParagraph:
+ return EditorCommandParamType::None;
+ // InsertLineBreakCommand
+ case Command::InsertLineBreak:
+ return EditorCommandParamType::None;
+ // PasteQuotationCommand
+ case Command::PasteAsQuotation:
+ return EditorCommandParamType::None;
+
+ // SelectionMoveCommand
+ case Command::ScrollTop:
+ case Command::ScrollBottom:
+ case Command::MoveTop:
+ case Command::MoveBottom:
+ case Command::SelectTop:
+ case Command::SelectBottom:
+ case Command::LineNext:
+ case Command::LinePrevious:
+ case Command::SelectLineNext:
+ case Command::SelectLinePrevious:
+ case Command::CharPrevious:
+ case Command::CharNext:
+ case Command::SelectCharPrevious:
+ case Command::SelectCharNext:
+ case Command::BeginLine:
+ case Command::EndLine:
+ case Command::SelectBeginLine:
+ case Command::SelectEndLine:
+ case Command::WordPrevious:
+ case Command::WordNext:
+ case Command::SelectWordPrevious:
+ case Command::SelectWordNext:
+ case Command::ScrollPageUp:
+ case Command::ScrollPageDown:
+ case Command::ScrollLineUp:
+ case Command::ScrollLineDown:
+ case Command::MovePageUp:
+ case Command::MovePageDown:
+ case Command::SelectPageUp:
+ case Command::SelectPageDown:
+ case Command::MoveLeft:
+ case Command::MoveRight:
+ case Command::MoveUp:
+ case Command::MoveDown:
+ case Command::MoveLeft2:
+ case Command::MoveRight2:
+ case Command::MoveUp2:
+ case Command::MoveDown2:
+ case Command::SelectLeft:
+ case Command::SelectRight:
+ case Command::SelectUp:
+ case Command::SelectDown:
+ case Command::SelectLeft2:
+ case Command::SelectRight2:
+ case Command::SelectUp2:
+ case Command::SelectDown2:
+ return EditorCommandParamType::None;
+ // PasteNoFormattingCommand
+ case Command::PasteWithoutFormat:
+ return EditorCommandParamType::None;
+
+ // DocumentStateCommand
+ case Command::EditorObserverDocumentCreated:
+ case Command::EditorObserverDocumentLocationChanged:
+ case Command::EditorObserverDocumentWillBeDestroyed:
+ return EditorCommandParamType::None;
+ // SetDocumentStateCommand
+ case Command::SetDocumentModified:
+ case Command::SetDocumentUseCSS:
+ case Command::SetDocumentReadOnly:
+ case Command::SetDocumentInsertBROnEnterKeyPress:
+ return EditorCommandParamType::Bool |
+ EditorCommandParamType::StateAttribute;
+ case Command::SetDocumentDefaultParagraphSeparator:
+ return EditorCommandParamType::CString |
+ EditorCommandParamType::StateAttribute;
+ case Command::ToggleObjectResizers:
+ case Command::ToggleInlineTableEditor:
+ case Command::ToggleAbsolutePositionEditor:
+ return EditorCommandParamType::Bool |
+ EditorCommandParamType::StateAttribute;
+
+ // IndentCommand
+ case Command::FormatIndent:
+ return EditorCommandParamType::None;
+ // OutdentCommand
+ case Command::FormatOutdent:
+ return EditorCommandParamType::None;
+ // StyleUpdatingCommand
+ case Command::FormatBold:
+ case Command::FormatItalic:
+ case Command::FormatUnderline:
+ case Command::FormatTeletypeText:
+ case Command::FormatStrikeThrough:
+ case Command::FormatSuperscript:
+ case Command::FormatSubscript:
+ case Command::FormatNoBreak:
+ case Command::FormatEmphasis:
+ case Command::FormatStrong:
+ case Command::FormatCitation:
+ case Command::FormatAbbreviation:
+ case Command::FormatAcronym:
+ case Command::FormatCode:
+ case Command::FormatSample:
+ case Command::FormatVariable:
+ case Command::FormatRemoveLink:
+ return EditorCommandParamType::None;
+ // ListCommand
+ case Command::InsertOrderedList:
+ case Command::InsertUnorderedList:
+ return EditorCommandParamType::None;
+ // ListItemCommand
+ case Command::InsertDefinitionTerm:
+ case Command::InsertDefinitionDetails:
+ return EditorCommandParamType::None;
+ // RemoveListCommand
+ case Command::FormatRemoveList:
+ return EditorCommandParamType::None;
+ // ParagraphStateCommand
+ case Command::FormatBlock:
+ return EditorCommandParamType::CString |
+ EditorCommandParamType::String |
+ EditorCommandParamType::StateAttribute;
+ // FontFaceStateCommand
+ case Command::FormatFontName:
+ return EditorCommandParamType::CString |
+ EditorCommandParamType::String |
+ EditorCommandParamType::StateAttribute;
+ // FontSizeStateCommand
+ case Command::FormatFontSize:
+ return EditorCommandParamType::CString |
+ EditorCommandParamType::String |
+ EditorCommandParamType::StateAttribute;
+ // FontColorStateCommand
+ case Command::FormatFontColor:
+ return EditorCommandParamType::CString |
+ EditorCommandParamType::String |
+ EditorCommandParamType::StateAttribute;
+ // BackgroundColorStateCommand
+ case Command::FormatDocumentBackgroundColor:
+ return EditorCommandParamType::CString |
+ EditorCommandParamType::String |
+ EditorCommandParamType::StateAttribute;
+ // HighlightColorStateCommand
+ case Command::FormatBackColor:
+ return EditorCommandParamType::CString |
+ EditorCommandParamType::String |
+ EditorCommandParamType::StateAttribute;
+ // AlignCommand:
+ case Command::FormatJustifyLeft:
+ case Command::FormatJustifyRight:
+ case Command::FormatJustifyCenter:
+ case Command::FormatJustifyFull:
+ case Command::FormatJustifyNone:
+ return EditorCommandParamType::CString |
+ EditorCommandParamType::String |
+ EditorCommandParamType::StateAttribute;
+ // RemoveStylesCommand
+ case Command::FormatRemove:
+ return EditorCommandParamType::None;
+ // IncreaseFontSizeCommand
+ case Command::FormatIncreaseFontSize:
+ return EditorCommandParamType::None;
+ // DecreaseFontSizeCommand
+ case Command::FormatDecreaseFontSize:
+ return EditorCommandParamType::None;
+ // InsertHTMLCommand
+ case Command::InsertHTML:
+ return EditorCommandParamType::String |
+ EditorCommandParamType::StateData;
+ // InsertTagCommand
+ case Command::InsertLink:
+ case Command::InsertImage:
+ return EditorCommandParamType::String |
+ EditorCommandParamType::StateAttribute;
+ case Command::InsertHorizontalRule:
+ return EditorCommandParamType::None;
+ // AbsolutePositioningCommand
+ case Command::FormatAbsolutePosition:
+ return EditorCommandParamType::None;
+ // DecreaseZIndexCommand
+ case Command::FormatDecreaseZIndex:
+ return EditorCommandParamType::None;
+ // IncreaseZIndexCommand
+ case Command::FormatIncreaseZIndex:
+ return EditorCommandParamType::None;
+
+ // nsClipboardGetContentsCommand
+ // XXX nsClipboardGetContentsCommand is implemented by
+ // nsGlobalWindowCommands.cpp but cmd_getContents command is not
+ // used internally, but it's accessible from JS with
+ // queryCommandValue(), etc. So, this class is out of scope of
+ // editor module for now but we should return None for making
+ // Document code simpler. We should reimplement the command class
+ // in editor later for making Document's related methods possible
+ // to access directly. Anyway, it does not support `DoCommand()`
+ // nor `DoCommandParams()` so that let's return `None` here.
+ case Command::GetHTML:
+ return EditorCommandParamType::None;
+
+ default:
+ MOZ_ASSERT_UNREACHABLE("Unknown Command");
+ return EditorCommandParamType::None;
+ }
+ }
+
+ // nsIControllerCommand methods. Use EditorCommand specific methods instead
+ // for internal use.
+ MOZ_CAN_RUN_SCRIPT_BOUNDARY NS_IMETHOD
+ IsCommandEnabled(const char* aCommandName, nsISupports* aCommandRefCon,
+ bool* aIsEnabled) final;
+ MOZ_CAN_RUN_SCRIPT NS_IMETHOD DoCommand(const char* aCommandName,
+ nsISupports* aCommandRefCon) final;
+ MOZ_CAN_RUN_SCRIPT NS_IMETHOD
+ DoCommandParams(const char* aCommandName, nsICommandParams* aParams,
+ nsISupports* aCommandRefCon) final;
+ MOZ_CAN_RUN_SCRIPT_BOUNDARY NS_IMETHOD
+ GetCommandStateParams(const char* aCommandName, nsICommandParams* aParams,
+ nsISupports* aCommandRefCon) final;
+
+ MOZ_CAN_RUN_SCRIPT virtual bool IsCommandEnabled(
+ Command aCommand, TextEditor* aTextEditor) const = 0;
+ MOZ_CAN_RUN_SCRIPT virtual nsresult DoCommand(
+ Command aCommand, TextEditor& aTextEditor,
+ nsIPrincipal* aPrincipal) const = 0;
+
+ /**
+ * @param aTextEditor If the context is an editor, should be set to
+ * it. Otherwise, nullptr.
+ * @param aEditingSession If the context is an editing session, should be
+ * set to it. This usually occurs if editor has
+ * not been created yet during initialization.
+ * Otherwise, nullptr.
+ */
+ MOZ_CAN_RUN_SCRIPT virtual nsresult GetCommandStateParams(
+ Command aCommand, nsCommandParams& aParams, TextEditor* aTextEditor,
+ nsIEditingSession* aEditingSession) const = 0;
+
+ /**
+ * Called only when the result of EditorCommand::GetParamType(aCommand) is
+ * EditorCommandParamType::None.
+ */
+ MOZ_CAN_RUN_SCRIPT virtual nsresult DoCommandParam(
+ Command aCommand, TextEditor& aTextEditor,
+ nsIPrincipal* aPrincipal) const {
+ MOZ_ASSERT_UNREACHABLE("Wrong overload is called");
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ /**
+ * Called only when the result of EditorCommand::GetParamType(aCommand)
+ * includes EditorCommandParamType::Bool. If aBoolParam is Nothing, it
+ * means that given param was nullptr.
+ */
+ MOZ_CAN_RUN_SCRIPT virtual nsresult DoCommandParam(
+ Command aCommand, const Maybe<bool>& aBoolParam, TextEditor& aTextEditor,
+ nsIPrincipal* aPrincipal) const {
+ MOZ_ASSERT_UNREACHABLE("Wrong overload is called");
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ /**
+ * Called only when the result of EditorCommand::GetParamType(aCommand)
+ * includes EditorCommandParamType::CString. If aCStringParam is void, it
+ * means that given param was nullptr.
+ */
+ MOZ_CAN_RUN_SCRIPT virtual nsresult DoCommandParam(
+ Command aCommand, const nsACString& aCStringParam,
+ TextEditor& aTextEditor, nsIPrincipal* aPrincipal) const {
+ MOZ_ASSERT_UNREACHABLE("Wrong overload is called");
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ /**
+ * Called only when the result of EditorCommand::GetParamType(aCommand)
+ * includes EditorCommandParamType::String. If aStringParam is void, it
+ * means that given param was nullptr.
+ */
+ MOZ_CAN_RUN_SCRIPT virtual nsresult DoCommandParam(
+ Command aCommand, const nsAString& aStringParam, TextEditor& aTextEditor,
+ nsIPrincipal* aPrincipal) const {
+ MOZ_ASSERT_UNREACHABLE("Wrong overload is called");
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ /**
+ * Called only when the result of EditorCommand::GetParamType(aCommand) is
+ * EditorCommandParamType::Transferable. If aTransferableParam may be
+ * nullptr.
+ */
+ MOZ_CAN_RUN_SCRIPT virtual nsresult DoCommandParam(
+ Command aCommand, nsITransferable* aTransferableParam,
+ TextEditor& aTextEditor, nsIPrincipal* aPrincipal) const {
+ MOZ_ASSERT_UNREACHABLE("Wrong overload is called");
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ protected:
+ EditorCommand() = default;
+ virtual ~EditorCommand() = default;
+};
+
+#define NS_DECL_EDITOR_COMMAND_COMMON_METHODS \
+ public: \
+ MOZ_CAN_RUN_SCRIPT virtual bool IsCommandEnabled( \
+ Command aCommand, TextEditor* aTextEditor) const final; \
+ using EditorCommand::IsCommandEnabled; \
+ MOZ_CAN_RUN_SCRIPT virtual nsresult DoCommand( \
+ Command aCommand, TextEditor& aTextEditor, nsIPrincipal* aPrincipal) \
+ const final; \
+ using EditorCommand::DoCommand; \
+ MOZ_CAN_RUN_SCRIPT virtual nsresult GetCommandStateParams( \
+ Command aCommand, nsCommandParams& aParams, TextEditor* aTextEditor, \
+ nsIEditingSession* aEditingSession) const final; \
+ using EditorCommand::GetCommandStateParams; \
+ using EditorCommand::DoCommandParam;
+
+#define NS_DECL_DO_COMMAND_PARAM_DELEGATE_TO_DO_COMMAND \
+ public: \
+ MOZ_CAN_RUN_SCRIPT virtual nsresult DoCommandParam( \
+ Command aCommand, TextEditor& aTextEditor, nsIPrincipal* aPrincipal) \
+ const final { \
+ return DoCommand(aCommand, aTextEditor, aPrincipal); \
+ }
+
+#define NS_DECL_DO_COMMAND_PARAM_FOR_BOOL_PARAM \
+ public: \
+ MOZ_CAN_RUN_SCRIPT virtual nsresult DoCommandParam( \
+ Command aCommand, const Maybe<bool>& aBoolParam, \
+ TextEditor& aTextEditor, nsIPrincipal* aPrincipal) const final;
+
+#define NS_DECL_DO_COMMAND_PARAM_FOR_CSTRING_PARAM \
+ public: \
+ MOZ_CAN_RUN_SCRIPT virtual nsresult DoCommandParam( \
+ Command aCommand, const nsACString& aCStringParam, \
+ TextEditor& aTextEditor, nsIPrincipal* aPrincipal) const final;
+
+#define NS_DECL_DO_COMMAND_PARAM_FOR_STRING_PARAM \
+ public: \
+ MOZ_CAN_RUN_SCRIPT virtual nsresult DoCommandParam( \
+ Command aCommand, const nsAString& aStringParam, \
+ TextEditor& aTextEditor, nsIPrincipal* aPrincipal) const final;
+
+#define NS_DECL_DO_COMMAND_PARAM_FOR_TRANSFERABLE_PARAM \
+ public: \
+ MOZ_CAN_RUN_SCRIPT virtual nsresult DoCommandParam( \
+ Command aCommand, nsITransferable* aTransferableParam, \
+ TextEditor& aTextEditor, nsIPrincipal* aPrincipal) const final;
+
+#define NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(_cmd) \
+ public: \
+ static EditorCommand* GetInstance() { \
+ if (!sInstance) { \
+ sInstance = new _cmd(); \
+ } \
+ return sInstance; \
+ } \
+ \
+ static void Shutdown() { sInstance = nullptr; } \
+ \
+ private: \
+ static StaticRefPtr<_cmd> sInstance;
+
+#define NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(_cmd) \
+ class _cmd final : public EditorCommand { \
+ NS_DECL_EDITOR_COMMAND_COMMON_METHODS \
+ NS_DECL_DO_COMMAND_PARAM_DELEGATE_TO_DO_COMMAND \
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(_cmd) \
+ \
+ protected: \
+ _cmd() = default; \
+ virtual ~_cmd() = default; \
+ };
+
+#define NS_DECL_EDITOR_COMMAND_FOR_BOOL_PARAM(_cmd) \
+ class _cmd final : public EditorCommand { \
+ NS_DECL_EDITOR_COMMAND_COMMON_METHODS \
+ NS_DECL_DO_COMMAND_PARAM_FOR_BOOL_PARAM \
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(_cmd) \
+ \
+ protected: \
+ _cmd() = default; \
+ virtual ~_cmd() = default; \
+ };
+
+#define NS_DECL_EDITOR_COMMAND_FOR_CSTRING_PARAM(_cmd) \
+ class _cmd final : public EditorCommand { \
+ NS_DECL_EDITOR_COMMAND_COMMON_METHODS \
+ NS_DECL_DO_COMMAND_PARAM_FOR_CSTRING_PARAM \
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(_cmd) \
+ \
+ protected: \
+ _cmd() = default; \
+ virtual ~_cmd() = default; \
+ };
+
+#define NS_DECL_EDITOR_COMMAND_FOR_STRING_PARAM(_cmd) \
+ class _cmd final : public EditorCommand { \
+ NS_DECL_EDITOR_COMMAND_COMMON_METHODS \
+ NS_DECL_DO_COMMAND_PARAM_FOR_STRING_PARAM \
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(_cmd) \
+ \
+ protected: \
+ _cmd() = default; \
+ virtual ~_cmd() = default; \
+ };
+
+#define NS_DECL_EDITOR_COMMAND_FOR_TRANSFERABLE_PARAM(_cmd) \
+ class _cmd final : public EditorCommand { \
+ NS_DECL_EDITOR_COMMAND_COMMON_METHODS \
+ NS_DECL_DO_COMMAND_PARAM_FOR_TRANSFERABLE_PARAM \
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(_cmd) \
+ \
+ protected: \
+ _cmd() = default; \
+ virtual ~_cmd() = default; \
+ };
+
+// basic editor commands
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(UndoCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(RedoCommand)
+
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(CutCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(CutOrDeleteCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(CopyCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(CopyOrDeleteCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(PasteCommand)
+NS_DECL_EDITOR_COMMAND_FOR_TRANSFERABLE_PARAM(PasteTransferableCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(SwitchTextDirectionCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(DeleteCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(SelectAllCommand)
+
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(SelectionMoveCommands)
+
+// Insert content commands
+NS_DECL_EDITOR_COMMAND_FOR_STRING_PARAM(InsertPlaintextCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(InsertParagraphCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(InsertLineBreakCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(PasteQuotationCommand)
+
+/******************************************************************************
+ * Commands for HTML editor
+ ******************************************************************************/
+
+// virtual base class for commands that need to save and update Boolean state
+// (like styles etc)
+class StateUpdatingCommandBase : public EditorCommand {
+ public:
+ NS_INLINE_DECL_REFCOUNTING_INHERITED(StateUpdatingCommandBase, EditorCommand)
+
+ NS_DECL_EDITOR_COMMAND_COMMON_METHODS
+ NS_DECL_DO_COMMAND_PARAM_DELEGATE_TO_DO_COMMAND
+
+ protected:
+ StateUpdatingCommandBase() = default;
+ virtual ~StateUpdatingCommandBase() = default;
+
+ // get the current state (on or off) for this style or block format
+ MOZ_CAN_RUN_SCRIPT virtual nsresult GetCurrentState(
+ nsAtom* aTagName, HTMLEditor* aHTMLEditor,
+ nsCommandParams& aParams) const = 0;
+
+ // add/remove the style
+ MOZ_CAN_RUN_SCRIPT virtual nsresult ToggleState(
+ nsStaticAtom& aTagName, HTMLEditor& aHTMLEditor,
+ nsIPrincipal* aPrincipal) const = 0;
+
+ static nsStaticAtom* GetTagName(Command aCommand) {
+ switch (aCommand) {
+ case Command::FormatBold:
+ return nsGkAtoms::b;
+ case Command::FormatItalic:
+ return nsGkAtoms::i;
+ case Command::FormatUnderline:
+ return nsGkAtoms::u;
+ case Command::FormatTeletypeText:
+ return nsGkAtoms::tt;
+ case Command::FormatStrikeThrough:
+ return nsGkAtoms::strike;
+ case Command::FormatSuperscript:
+ return nsGkAtoms::sup;
+ case Command::FormatSubscript:
+ return nsGkAtoms::sub;
+ case Command::FormatNoBreak:
+ return nsGkAtoms::nobr;
+ case Command::FormatEmphasis:
+ return nsGkAtoms::em;
+ case Command::FormatStrong:
+ return nsGkAtoms::strong;
+ case Command::FormatCitation:
+ return nsGkAtoms::cite;
+ case Command::FormatAbbreviation:
+ return nsGkAtoms::abbr;
+ case Command::FormatAcronym:
+ return nsGkAtoms::acronym;
+ case Command::FormatCode:
+ return nsGkAtoms::code;
+ case Command::FormatSample:
+ return nsGkAtoms::samp;
+ case Command::FormatVariable:
+ return nsGkAtoms::var;
+ case Command::FormatRemoveLink:
+ return nsGkAtoms::href;
+ case Command::InsertOrderedList:
+ return nsGkAtoms::ol;
+ case Command::InsertUnorderedList:
+ return nsGkAtoms::ul;
+ case Command::InsertDefinitionTerm:
+ return nsGkAtoms::dt;
+ case Command::InsertDefinitionDetails:
+ return nsGkAtoms::dd;
+ case Command::FormatAbsolutePosition:
+ return nsGkAtoms::_empty;
+ default:
+ return nullptr;
+ }
+ }
+ friend class InsertTagCommand; // for allowing it to access GetTagName()
+};
+
+// Shared class for the various style updating commands like bold, italics etc.
+// Suitable for commands whose state is either 'on' or 'off'.
+class StyleUpdatingCommand final : public StateUpdatingCommandBase {
+ public:
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(StyleUpdatingCommand)
+
+ protected:
+ StyleUpdatingCommand() = default;
+ virtual ~StyleUpdatingCommand() = default;
+
+ // get the current state (on or off) for this style or block format
+ MOZ_CAN_RUN_SCRIPT nsresult
+ GetCurrentState(nsAtom* aTagName, HTMLEditor* aHTMLEditor,
+ nsCommandParams& aParams) const final;
+
+ // add/remove the style
+ MOZ_CAN_RUN_SCRIPT nsresult ToggleState(nsStaticAtom& aTagName,
+ HTMLEditor& aHTMLEditor,
+ nsIPrincipal* aPrincipal) const final;
+};
+
+class InsertTagCommand final : public EditorCommand {
+ public:
+ NS_INLINE_DECL_REFCOUNTING_INHERITED(InsertTagCommand, EditorCommand)
+
+ NS_DECL_EDITOR_COMMAND_COMMON_METHODS
+ NS_DECL_DO_COMMAND_PARAM_DELEGATE_TO_DO_COMMAND
+ NS_DECL_DO_COMMAND_PARAM_FOR_STRING_PARAM
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(InsertTagCommand)
+
+ protected:
+ InsertTagCommand() = default;
+ virtual ~InsertTagCommand() = default;
+
+ static nsAtom* GetTagName(Command aCommand) {
+ switch (aCommand) {
+ case Command::InsertLink:
+ return nsGkAtoms::a;
+ case Command::InsertImage:
+ return nsGkAtoms::img;
+ case Command::InsertHorizontalRule:
+ return nsGkAtoms::hr;
+ default:
+ return StateUpdatingCommandBase::GetTagName(aCommand);
+ }
+ }
+};
+
+class ListCommand final : public StateUpdatingCommandBase {
+ public:
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(ListCommand)
+
+ protected:
+ ListCommand() = default;
+ virtual ~ListCommand() = default;
+
+ // get the current state (on or off) for this style or block format
+ MOZ_CAN_RUN_SCRIPT nsresult
+ GetCurrentState(nsAtom* aTagName, HTMLEditor* aHTMLEditor,
+ nsCommandParams& aParams) const final;
+
+ // add/remove the style
+ MOZ_CAN_RUN_SCRIPT nsresult ToggleState(nsStaticAtom& aTagName,
+ HTMLEditor& aHTMLEditor,
+ nsIPrincipal* aPrincipal) const final;
+};
+
+class ListItemCommand final : public StateUpdatingCommandBase {
+ public:
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(ListItemCommand)
+
+ protected:
+ ListItemCommand() = default;
+ virtual ~ListItemCommand() = default;
+
+ // get the current state (on or off) for this style or block format
+ MOZ_CAN_RUN_SCRIPT nsresult
+ GetCurrentState(nsAtom* aTagName, HTMLEditor* aHTMLEditor,
+ nsCommandParams& aParams) const final;
+
+ // add/remove the style
+ MOZ_CAN_RUN_SCRIPT nsresult ToggleState(nsStaticAtom& aTagName,
+ HTMLEditor& aHTMLEditor,
+ nsIPrincipal* aPrincipal) const final;
+};
+
+// Base class for commands whose state consists of a string (e.g. para format)
+class MultiStateCommandBase : public EditorCommand {
+ public:
+ NS_INLINE_DECL_REFCOUNTING_INHERITED(MultiStateCommandBase, EditorCommand)
+
+ NS_DECL_EDITOR_COMMAND_COMMON_METHODS
+ NS_DECL_DO_COMMAND_PARAM_FOR_STRING_PARAM
+
+ protected:
+ MultiStateCommandBase() = default;
+ virtual ~MultiStateCommandBase() = default;
+
+ MOZ_CAN_RUN_SCRIPT virtual nsresult GetCurrentState(
+ HTMLEditor* aHTMLEditor, nsCommandParams& aParams) const = 0;
+ MOZ_CAN_RUN_SCRIPT virtual nsresult SetState(
+ HTMLEditor* aHTMLEditor, const nsAString& aNewState,
+ nsIPrincipal* aPrincipal) const = 0;
+};
+
+class ParagraphStateCommand final : public MultiStateCommandBase {
+ public:
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(ParagraphStateCommand)
+
+ protected:
+ ParagraphStateCommand() = default;
+ virtual ~ParagraphStateCommand() = default;
+
+ MOZ_CAN_RUN_SCRIPT nsresult GetCurrentState(
+ HTMLEditor* aHTMLEditor, nsCommandParams& aParams) const final;
+ MOZ_CAN_RUN_SCRIPT nsresult SetState(HTMLEditor* aHTMLEditor,
+ const nsAString& aNewState,
+ nsIPrincipal* aPrincipal) const final;
+};
+
+class FontFaceStateCommand final : public MultiStateCommandBase {
+ public:
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(FontFaceStateCommand)
+
+ protected:
+ FontFaceStateCommand() = default;
+ virtual ~FontFaceStateCommand() = default;
+
+ MOZ_CAN_RUN_SCRIPT nsresult GetCurrentState(
+ HTMLEditor* aHTMLEditor, nsCommandParams& aParams) const final;
+ MOZ_CAN_RUN_SCRIPT nsresult SetState(HTMLEditor* aHTMLEditor,
+ const nsAString& aNewState,
+ nsIPrincipal* aPrincipal) const final;
+};
+
+class FontSizeStateCommand final : public MultiStateCommandBase {
+ public:
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(FontSizeStateCommand)
+
+ protected:
+ FontSizeStateCommand() = default;
+ virtual ~FontSizeStateCommand() = default;
+
+ MOZ_CAN_RUN_SCRIPT nsresult GetCurrentState(
+ HTMLEditor* aHTMLEditor, nsCommandParams& aParams) const final;
+ MOZ_CAN_RUN_SCRIPT nsresult SetState(HTMLEditor* aHTMLEditor,
+ const nsAString& aNewState,
+ nsIPrincipal* aPrincipal) const final;
+};
+
+class HighlightColorStateCommand final : public MultiStateCommandBase {
+ public:
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(HighlightColorStateCommand)
+
+ protected:
+ HighlightColorStateCommand() = default;
+ virtual ~HighlightColorStateCommand() = default;
+
+ MOZ_CAN_RUN_SCRIPT nsresult GetCurrentState(
+ HTMLEditor* aHTMLEditor, nsCommandParams& aParams) const final;
+ MOZ_CAN_RUN_SCRIPT nsresult SetState(HTMLEditor* aHTMLEditor,
+ const nsAString& aNewState,
+ nsIPrincipal* aPrincipal) const final;
+};
+
+class FontColorStateCommand final : public MultiStateCommandBase {
+ public:
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(FontColorStateCommand)
+
+ protected:
+ FontColorStateCommand() = default;
+ virtual ~FontColorStateCommand() = default;
+
+ MOZ_CAN_RUN_SCRIPT nsresult GetCurrentState(
+ HTMLEditor* aHTMLEditor, nsCommandParams& aParams) const final;
+ MOZ_CAN_RUN_SCRIPT nsresult SetState(HTMLEditor* aHTMLEditor,
+ const nsAString& aNewState,
+ nsIPrincipal* aPrincipal) const final;
+};
+
+class AlignCommand final : public MultiStateCommandBase {
+ public:
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(AlignCommand)
+
+ protected:
+ AlignCommand() = default;
+ virtual ~AlignCommand() = default;
+
+ MOZ_CAN_RUN_SCRIPT nsresult GetCurrentState(
+ HTMLEditor* aHTMLEditor, nsCommandParams& aParams) const final;
+ MOZ_CAN_RUN_SCRIPT nsresult SetState(HTMLEditor* aHTMLEditor,
+ const nsAString& aNewState,
+ nsIPrincipal* aPrincipal) const final;
+};
+
+class BackgroundColorStateCommand final : public MultiStateCommandBase {
+ public:
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(BackgroundColorStateCommand)
+
+ protected:
+ BackgroundColorStateCommand() = default;
+ virtual ~BackgroundColorStateCommand() = default;
+
+ MOZ_CAN_RUN_SCRIPT nsresult GetCurrentState(
+ HTMLEditor* aHTMLEditor, nsCommandParams& aParams) const final;
+ MOZ_CAN_RUN_SCRIPT nsresult SetState(HTMLEditor* aHTMLEditor,
+ const nsAString& aNewState,
+ nsIPrincipal* aPrincipal) const final;
+};
+
+class AbsolutePositioningCommand final : public StateUpdatingCommandBase {
+ public:
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(AbsolutePositioningCommand)
+
+ protected:
+ AbsolutePositioningCommand() = default;
+ virtual ~AbsolutePositioningCommand() = default;
+
+ MOZ_CAN_RUN_SCRIPT nsresult
+ GetCurrentState(nsAtom* aTagName, HTMLEditor* aHTMLEditor,
+ nsCommandParams& aParams) const final;
+ MOZ_CAN_RUN_SCRIPT nsresult ToggleState(nsStaticAtom& aTagName,
+ HTMLEditor& aHTMLEditor,
+ nsIPrincipal* aPrincipal) const final;
+};
+
+// composer commands
+
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(DocumentStateCommand)
+
+class SetDocumentStateCommand final : public EditorCommand {
+ public:
+ NS_INLINE_DECL_REFCOUNTING_INHERITED(SetDocumentStateCommand, EditorCommand)
+
+ NS_DECL_EDITOR_COMMAND_COMMON_METHODS
+ NS_DECL_DO_COMMAND_PARAM_FOR_BOOL_PARAM
+ NS_DECL_DO_COMMAND_PARAM_FOR_CSTRING_PARAM
+ NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON(SetDocumentStateCommand)
+
+ private:
+ SetDocumentStateCommand() = default;
+ virtual ~SetDocumentStateCommand() = default;
+};
+
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(DecreaseZIndexCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(IncreaseZIndexCommand)
+
+// Generic commands
+
+// Edit menu
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(PasteNoFormattingCommand)
+
+// Block transformations
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(IndentCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(OutdentCommand)
+
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(RemoveListCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(RemoveStylesCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(IncreaseFontSizeCommand)
+NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE(DecreaseFontSizeCommand)
+
+// Insert content commands
+NS_DECL_EDITOR_COMMAND_FOR_STRING_PARAM(InsertHTMLCommand)
+
+#undef NS_DECL_EDITOR_COMMAND_FOR_NO_PARAM_WITH_DELEGATE
+#undef NS_DECL_EDITOR_COMMAND_FOR_BOOL_PARAM
+#undef NS_DECL_EDITOR_COMMAND_FOR_CSTRING_PARAM
+#undef NS_DECL_EDITOR_COMMAND_FOR_STRING_PARAM
+#undef NS_DECL_EDITOR_COMMAND_FOR_TRANSFERABLE_PARAM
+#undef NS_DECL_EDITOR_COMMAND_COMMON_METHODS
+#undef NS_DECL_DO_COMMAND_PARAM_DELEGATE_TO_DO_COMMAND
+#undef NS_DECL_DO_COMMAND_PARAM_FOR_BOOL_PARAM
+#undef NS_DECL_DO_COMMAND_PARAM_FOR_CSTRING_PARAM
+#undef NS_DECL_DO_COMMAND_PARAM_FOR_STRING_PARAM
+#undef NS_DECL_DO_COMMAND_PARAM_FOR_TRANSFERABLE_PARAM
+#undef NS_INLINE_DECL_EDITOR_COMMAND_MAKE_SINGLETON
+
+} // namespace mozilla
+
+#endif // #ifndef mozilla_EditorCommands_h