gecko-dev/editor/libeditor/EditorCommands.h
Masayuki Nakano 6d9c401af5 Bug 1543966 - part 1: Make "editing commands" and "editor commands" singleton classes r=m_kato
Different from the comment in `EditorCommands.h`, editing commands and
editor commands are instantiated for each editable document or each
`HTMLInputElement` or `HTMLTextareaElement`.  Therefore, even though they
are stateless, we allocate too many instances of them.  We should make
them singleton classes to reduce the footprint and save runtime allocation
cost.

Differential Revision: https://phabricator.services.mozilla.com/D27406

--HG--
extra : moz-landing-system : lando
2019-04-15 07:49:46 +00:00

118 lines
4.8 KiB
C++

/* -*- 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 EditorCommands_h_
#define EditorCommands_h_
#include "mozilla/StaticPtr.h"
#include "nsIControllerCommand.h"
#include "nsISupportsImpl.h"
#include "nscore.h"
class nsICommandParams;
class nsISupports;
namespace mozilla {
/**
* 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 EditorCommandBase : public nsIControllerCommand {
public:
NS_DECL_ISUPPORTS
NS_IMETHOD IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled) override = 0;
MOZ_CAN_RUN_SCRIPT
NS_IMETHOD DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon) override = 0;
protected:
EditorCommandBase();
virtual ~EditorCommandBase() {}
};
#define NS_DECL_EDITOR_COMMAND(_cmd) \
class _cmd final : public EditorCommandBase { \
public: \
NS_IMETHOD IsCommandEnabled(const char* aCommandName, \
nsISupports* aCommandRefCon, \
bool* aIsEnabled) override; \
MOZ_CAN_RUN_SCRIPT \
NS_IMETHOD DoCommand(const char* aCommandName, \
nsISupports* aCommandRefCon) override; \
MOZ_CAN_RUN_SCRIPT \
NS_IMETHOD DoCommandParams(const char* aCommandName, \
nsICommandParams* aParams, \
nsISupports* aCommandRefCon) override; \
NS_IMETHOD GetCommandStateParams(const char* aCommandName, \
nsICommandParams* aParams, \
nsISupports* aCommandRefCon) override; \
static _cmd* GetInstance() { \
if (!sInstance) { \
sInstance = new _cmd(); \
} \
return sInstance; \
} \
\
static void Shutdown() { sInstance = nullptr; } \
\
protected: \
_cmd() = default; \
virtual ~_cmd() = default; \
\
private: \
static StaticRefPtr<_cmd> sInstance; \
};
// basic editor commands
NS_DECL_EDITOR_COMMAND(UndoCommand)
NS_DECL_EDITOR_COMMAND(RedoCommand)
NS_DECL_EDITOR_COMMAND(CutCommand)
NS_DECL_EDITOR_COMMAND(CutOrDeleteCommand)
NS_DECL_EDITOR_COMMAND(CopyCommand)
NS_DECL_EDITOR_COMMAND(CopyOrDeleteCommand)
NS_DECL_EDITOR_COMMAND(PasteCommand)
NS_DECL_EDITOR_COMMAND(PasteTransferableCommand)
NS_DECL_EDITOR_COMMAND(SwitchTextDirectionCommand)
NS_DECL_EDITOR_COMMAND(DeleteCommand)
NS_DECL_EDITOR_COMMAND(SelectAllCommand)
NS_DECL_EDITOR_COMMAND(SelectionMoveCommands)
// Insert content commands
NS_DECL_EDITOR_COMMAND(InsertPlaintextCommand)
NS_DECL_EDITOR_COMMAND(InsertParagraphCommand)
NS_DECL_EDITOR_COMMAND(InsertLineBreakCommand)
NS_DECL_EDITOR_COMMAND(PasteQuotationCommand)
#if 0
// template for new command
NS_IMETHODIMP
FooCommand::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
FooCommand::DoCommand(const char* aCommandName,
const nsAString& aCommandParams,
nsISupports* aCommandRefCon)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
#endif
} // namespace mozilla
#endif // #ifndef EditorCommands_h_