--- a/editor/libeditor/EditorCommands.cpp
+++ b/editor/libeditor/EditorCommands.cpp
@@ -4,29 +4,29 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "EditorCommands.h"
#include "mozilla/ArrayUtils.h"
#include "mozilla/Assertions.h"
#include "mozilla/FlushType.h"
#include "mozilla/TextEditor.h"
+#include "mozilla/dom/Selection.h"
#include "nsCOMPtr.h"
#include "nsCRT.h"
#include "nsDebug.h"
#include "nsError.h"
#include "nsIClipboard.h"
#include "nsICommandParams.h"
#include "nsID.h"
#include "nsIDOMDocument.h"
#include "nsIDocument.h"
#include "nsIEditor.h"
#include "nsIEditorMailSupport.h"
#include "nsIPlaintextEditor.h"
-#include "nsISelection.h"
#include "nsISelectionController.h"
#include "nsITransferable.h"
#include "nsString.h"
#include "nsAString.h"
class nsISupports;
#define STATE_ENABLED "state_enabled"
@@ -48,39 +48,46 @@ NS_IMPL_ISUPPORTS(EditorCommandBase, nsI
* mozilla::UndoCommand
******************************************************************************/
NS_IMETHODIMP
UndoCommand::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
- NS_ENSURE_ARG_POINTER(aIsEnabled);
- nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor) {
- bool isEnabled, isEditable = false;
- nsresult rv = editor->GetIsSelectionEditable(&isEditable);
- NS_ENSURE_SUCCESS(rv, rv);
- if (isEditable)
- return editor->CanUndo(&isEnabled, aIsEnabled);
+ if (NS_WARN_IF(!aIsEnabled)) {
+ return NS_ERROR_INVALID_ARG;
}
*aIsEnabled = false;
- return NS_OK;
+
+ nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
+ if (!editor) {
+ return NS_OK;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ if (!textEditor->IsSelectionEditable()) {
+ return NS_OK;
+ }
+ bool isEnabled = false;
+ return editor->CanUndo(&isEnabled, aIsEnabled);
}
NS_IMETHODIMP
UndoCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor)
- return editor->Undo(1);
-
- return NS_ERROR_FAILURE;
+ if (!editor) {
+ return NS_ERROR_FAILURE;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ return textEditor->Undo(1);
}
NS_IMETHODIMP
UndoCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
return DoCommand(aCommandName, aCommandRefCon);
@@ -100,39 +107,46 @@ UndoCommand::GetCommandStateParams(const
* mozilla::RedoCommand
******************************************************************************/
NS_IMETHODIMP
RedoCommand::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
- NS_ENSURE_ARG_POINTER(aIsEnabled);
- nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor) {
- bool isEnabled, isEditable = false;
- nsresult rv = editor->GetIsSelectionEditable(&isEditable);
- NS_ENSURE_SUCCESS(rv, rv);
- if (isEditable)
- return editor->CanRedo(&isEnabled, aIsEnabled);
+ if (NS_WARN_IF(!aIsEnabled)) {
+ return NS_ERROR_INVALID_ARG;
}
*aIsEnabled = false;
- return NS_OK;
+
+ nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
+ if (!editor) {
+ return NS_OK;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ if (!textEditor->IsSelectionEditable()) {
+ return NS_OK;
+ }
+ bool isEnabled = false;
+ return editor->CanRedo(&isEnabled, aIsEnabled);
}
NS_IMETHODIMP
RedoCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor)
- return editor->Redo(1);
-
- return NS_ERROR_FAILURE;
+ if (!editor) {
+ return NS_ERROR_FAILURE;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ return textEditor->Redo(1);
}
NS_IMETHODIMP
RedoCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
return DoCommand(aCommandName, aCommandRefCon);
@@ -152,35 +166,42 @@ RedoCommand::GetCommandStateParams(const
* mozilla::ClearUndoCommand
******************************************************************************/
NS_IMETHODIMP
ClearUndoCommand::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
- NS_ENSURE_ARG_POINTER(aIsEnabled);
+ if (NS_WARN_IF(!aIsEnabled)) {
+ return NS_ERROR_INVALID_ARG;
+ }
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor)
- return editor->GetIsSelectionEditable(aIsEnabled);
-
- *aIsEnabled = false;
+ if (!editor) {
+ *aIsEnabled = false;
+ return NS_OK;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ *aIsEnabled = textEditor->IsSelectionEditable();
return NS_OK;
}
NS_IMETHODIMP
ClearUndoCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- NS_ENSURE_TRUE(editor, NS_ERROR_NOT_IMPLEMENTED);
-
- editor->EnableUndo(false); // Turning off undo clears undo/redo stacks.
- editor->EnableUndo(true); // This re-enables undo/redo.
-
+ if (!editor) {
+ return NS_ERROR_FAILURE;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ textEditor->EnableUndo(false); // Turning off undo clears undo/redo stacks.
+ textEditor->EnableUndo(true); // This re-enables undo/redo.
return NS_OK;
}
NS_IMETHODIMP
ClearUndoCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
@@ -205,39 +226,45 @@ ClearUndoCommand::GetCommandStateParams(
* mozilla::CutCommand
******************************************************************************/
NS_IMETHODIMP
CutCommand::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
- NS_ENSURE_ARG_POINTER(aIsEnabled);
- nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor) {
- bool isEditable = false;
- nsresult rv = editor->GetIsSelectionEditable(&isEditable);
- NS_ENSURE_SUCCESS(rv, rv);
- if (isEditable)
- return editor->CanCut(aIsEnabled);
+ if (NS_WARN_IF(!aIsEnabled)) {
+ return NS_ERROR_INVALID_ARG;
}
*aIsEnabled = false;
- return NS_OK;
+
+ nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
+ if (!editor) {
+ return NS_OK;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ if (!textEditor->IsSelectionEditable()) {
+ return NS_OK;
+ }
+ return editor->CanCut(aIsEnabled);
}
NS_IMETHODIMP
CutCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor)
- return editor->Cut();
-
- return NS_ERROR_FAILURE;
+ if (!editor) {
+ return NS_ERROR_FAILURE;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ return textEditor->Cut();
}
NS_IMETHODIMP
CutCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
return DoCommand(aCommandName, aCommandRefCon);
@@ -257,40 +284,45 @@ CutCommand::GetCommandStateParams(const
* mozilla::CutOrDeleteCommand
******************************************************************************/
NS_IMETHODIMP
CutOrDeleteCommand::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
- NS_ENSURE_ARG_POINTER(aIsEnabled);
+ if (NS_WARN_IF(!aIsEnabled)) {
+ return NS_ERROR_INVALID_ARG;
+ }
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor)
- return editor->GetIsSelectionEditable(aIsEnabled);
-
- *aIsEnabled = false;
+ if (!editor) {
+ *aIsEnabled = false;
+ return NS_OK;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ *aIsEnabled = textEditor->IsSelectionEditable();
return NS_OK;
}
NS_IMETHODIMP
CutOrDeleteCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor) {
- nsCOMPtr<nsISelection> selection;
- nsresult rv = editor->GetSelection(getter_AddRefs(selection));
- if (NS_SUCCEEDED(rv) && selection && selection->Collapsed()) {
- return editor->DeleteSelection(nsIEditor::eNext, nsIEditor::eStrip);
- }
- return editor->Cut();
+ if (!editor) {
+ return NS_ERROR_FAILURE;
}
-
- return NS_ERROR_FAILURE;
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ dom::Selection* selection = textEditor->GetSelection();
+ if (selection && selection->Collapsed()) {
+ return textEditor->DeleteSelection(nsIEditor::eNext, nsIEditor::eStrip);
+ }
+ return textEditor->Cut();
}
NS_IMETHODIMP
CutOrDeleteCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
return DoCommand(aCommandName, aCommandRefCon);
@@ -310,34 +342,40 @@ CutOrDeleteCommand::GetCommandStateParam
* mozilla::CopyCommand
******************************************************************************/
NS_IMETHODIMP
CopyCommand::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
- NS_ENSURE_ARG_POINTER(aIsEnabled);
+ if (NS_WARN_IF(!aIsEnabled)) {
+ return NS_ERROR_INVALID_ARG;
+ }
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor)
- return editor->CanCopy(aIsEnabled);
-
- *aIsEnabled = false;
- return NS_OK;
+ if (!editor) {
+ *aIsEnabled = false;
+ return NS_OK;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ return textEditor->CanCopy(aIsEnabled);
}
NS_IMETHODIMP
CopyCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor)
- return editor->Copy();
-
- return NS_ERROR_FAILURE;
+ if (!editor) {
+ return NS_ERROR_FAILURE;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ return textEditor->Copy();
}
NS_IMETHODIMP
CopyCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
return DoCommand(aCommandName, aCommandRefCon);
@@ -357,40 +395,46 @@ CopyCommand::GetCommandStateParams(const
* mozilla::CopyOrDeleteCommand
******************************************************************************/
NS_IMETHODIMP
CopyOrDeleteCommand::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
- NS_ENSURE_ARG_POINTER(aIsEnabled);
+ if (NS_WARN_IF(!aIsEnabled)) {
+ return NS_ERROR_INVALID_ARG;
+ }
+
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor)
- return editor->GetIsSelectionEditable(aIsEnabled);
-
- *aIsEnabled = false;
+ if (!editor) {
+ *aIsEnabled = false;
+ return NS_OK;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ *aIsEnabled = textEditor->IsSelectionEditable();
return NS_OK;
}
NS_IMETHODIMP
CopyOrDeleteCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor) {
- nsCOMPtr<nsISelection> selection;
- nsresult rv = editor->GetSelection(getter_AddRefs(selection));
- if (NS_SUCCEEDED(rv) && selection && selection->Collapsed()) {
- return editor->DeleteSelection(nsIEditor::eNextWord, nsIEditor::eStrip);
- }
- return editor->Copy();
+ if (!editor) {
+ return NS_ERROR_FAILURE;
}
-
- return NS_ERROR_FAILURE;
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ dom::Selection* selection = textEditor->GetSelection();
+ if (selection && selection->Collapsed()) {
+ return textEditor->DeleteSelection(nsIEditor::eNextWord, nsIEditor::eStrip);
+ }
+ return textEditor->Copy();
}
NS_IMETHODIMP
CopyOrDeleteCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
return DoCommand(aCommandName, aCommandRefCon);
@@ -410,45 +454,48 @@ CopyOrDeleteCommand::GetCommandStatePara
* mozilla::CopyAndCollapseToEndCommand
******************************************************************************/
NS_IMETHODIMP
CopyAndCollapseToEndCommand::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
- NS_ENSURE_ARG_POINTER(aIsEnabled);
+ if (NS_WARN_IF(!aIsEnabled)) {
+ return NS_ERROR_INVALID_ARG;
+ }
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor)
- return editor->CanCopy(aIsEnabled);
-
- *aIsEnabled = false;
- return NS_OK;
+ if (!editor) {
+ *aIsEnabled = false;
+ return NS_OK;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ return textEditor->CanCopy(aIsEnabled);
}
NS_IMETHODIMP
CopyAndCollapseToEndCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor) {
- nsresult rv = editor->Copy();
- if (NS_FAILED(rv)) {
- return rv;
- }
-
- nsCOMPtr<nsISelection> selection;
- rv = editor->GetSelection(getter_AddRefs(selection));
- if (NS_SUCCEEDED(rv) && selection) {
- selection->CollapseToEnd();
- }
+ if (!editor) {
+ return NS_ERROR_FAILURE;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ nsresult rv = textEditor->Copy();
+ if (NS_FAILED(rv)) {
return rv;
}
-
- return NS_ERROR_FAILURE;
+ RefPtr<dom::Selection> selection = textEditor->GetSelection();
+ if (selection) {
+ selection->CollapseToEnd();
+ }
+ return NS_OK;
}
NS_IMETHODIMP
CopyAndCollapseToEndCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
return DoCommand(aCommandName, aCommandRefCon);
@@ -468,38 +515,45 @@ CopyAndCollapseToEndCommand::GetCommandS
* mozilla::PasteCommand
******************************************************************************/
NS_IMETHODIMP
PasteCommand::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
- NS_ENSURE_ARG_POINTER(aIsEnabled);
- nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor) {
- bool isEditable = false;
- nsresult rv = editor->GetIsSelectionEditable(&isEditable);
- NS_ENSURE_SUCCESS(rv, rv);
- if (isEditable)
- return editor->CanPaste(nsIClipboard::kGlobalClipboard, aIsEnabled);
+ if (NS_WARN_IF(!aIsEnabled)) {
+ return NS_ERROR_INVALID_ARG;
}
*aIsEnabled = false;
- return NS_OK;
+
+ nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
+ if (!editor) {
+ return NS_OK;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ if (!textEditor->IsSelectionEditable()) {
+ return NS_OK;
+ }
+ return textEditor->CanPaste(nsIClipboard::kGlobalClipboard, aIsEnabled);
}
NS_IMETHODIMP
PasteCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- NS_ENSURE_TRUE(editor, NS_ERROR_FAILURE);
-
- return editor->Paste(nsIClipboard::kGlobalClipboard);
+ if (NS_WARN_IF(!editor)) {
+ return NS_ERROR_FAILURE;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ return textEditor->Paste(nsIClipboard::kGlobalClipboard);
}
NS_IMETHODIMP
PasteCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
return DoCommand(aCommandName, aCommandRefCon);
@@ -519,105 +573,135 @@ PasteCommand::GetCommandStateParams(cons
* mozilla::PasteTransferableCommand
******************************************************************************/
NS_IMETHODIMP
PasteTransferableCommand::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
- NS_ENSURE_ARG_POINTER(aIsEnabled);
- nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor) {
- bool isEditable = false;
- nsresult rv = editor->GetIsSelectionEditable(&isEditable);
- NS_ENSURE_SUCCESS(rv, rv);
- if (isEditable)
- return editor->CanPasteTransferable(nullptr, aIsEnabled);
+ if (NS_WARN_IF(!aIsEnabled)) {
+ return NS_ERROR_INVALID_ARG;
}
*aIsEnabled = false;
- return NS_OK;
+
+ nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
+ if (!editor) {
+ return NS_OK;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ if (!textEditor->IsSelectionEditable()) {
+ return NS_OK;
+ }
+ return textEditor->CanPasteTransferable(nullptr, aIsEnabled);
}
NS_IMETHODIMP
PasteTransferableCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
PasteTransferableCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- NS_ENSURE_TRUE(editor, NS_ERROR_FAILURE);
+ if (NS_WARN_IF(!editor)) {
+ return NS_ERROR_FAILURE;
+ }
nsCOMPtr<nsISupports> supports;
aParams->GetISupportsValue("transferable", getter_AddRefs(supports));
- NS_ENSURE_TRUE(supports, NS_ERROR_FAILURE);
+ if (NS_WARN_IF(!supports)) {
+ return NS_ERROR_FAILURE;
+ }
nsCOMPtr<nsITransferable> trans = do_QueryInterface(supports);
- NS_ENSURE_TRUE(trans, NS_ERROR_FAILURE);
+ if (NS_WARN_IF(!trans)) {
+ return NS_ERROR_FAILURE;
+ }
- return editor->PasteTransferable(trans);
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ return textEditor->PasteTransferable(trans);
}
NS_IMETHODIMP
PasteTransferableCommand::GetCommandStateParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- NS_ENSURE_TRUE(editor, NS_ERROR_FAILURE);
-
- nsCOMPtr<nsITransferable> trans;
+ if (NS_WARN_IF(!editor)) {
+ return NS_ERROR_FAILURE;
+ }
nsCOMPtr<nsISupports> supports;
aParams->GetISupportsValue("transferable", getter_AddRefs(supports));
- if (supports) {
- trans = do_QueryInterface(supports);
- NS_ENSURE_TRUE(trans, NS_ERROR_FAILURE);
+ if (NS_WARN_IF(!supports)) {
+ return NS_ERROR_FAILURE;
}
+ nsCOMPtr<nsITransferable> trans;
+ trans = do_QueryInterface(supports);
+ if (NS_WARN_IF(!trans)) {
+ return NS_ERROR_FAILURE;
+ }
+
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+
bool canPaste;
- nsresult rv = editor->CanPasteTransferable(trans, &canPaste);
- NS_ENSURE_SUCCESS(rv, rv);
+ nsresult rv = textEditor->CanPasteTransferable(trans, &canPaste);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
return aParams->SetBooleanValue(STATE_ENABLED, canPaste);
}
/******************************************************************************
* mozilla::SwitchTextDirectionCommand
******************************************************************************/
NS_IMETHODIMP
SwitchTextDirectionCommand::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
- NS_ENSURE_ARG_POINTER(aIsEnabled);
+ if (NS_WARN_IF(!aIsEnabled)) {
+ return NS_ERROR_INVALID_ARG;
+ }
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor)
- return editor->GetIsSelectionEditable(aIsEnabled);
-
- *aIsEnabled = false;
+ if (!editor) {
+ *aIsEnabled = false;
+ return NS_OK;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ *aIsEnabled = textEditor->IsSelectionEditable();
return NS_OK;
}
NS_IMETHODIMP
SwitchTextDirectionCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- NS_ENSURE_TRUE(editor, NS_ERROR_FAILURE);
-
- return editor->SwitchTextDirection();
+ if (NS_WARN_IF(!editor)) {
+ return NS_ERROR_FAILURE;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ return textEditor->SwitchTextDirection();
}
NS_IMETHODIMP
SwitchTextDirectionCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
return DoCommand(aCommandName, aCommandRefCon);
@@ -637,44 +721,52 @@ SwitchTextDirectionCommand::GetCommandSt
* mozilla::DeleteCommand
******************************************************************************/
NS_IMETHODIMP
DeleteCommand::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
- NS_ENSURE_ARG_POINTER(aIsEnabled);
- nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
+ if (NS_WARN_IF(!aIsEnabled)) {
+ return NS_ERROR_INVALID_ARG;
+ }
+
*aIsEnabled = false;
+ nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
if (!editor) {
return NS_OK;
}
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+
// We can generally delete whenever the selection is editable. However,
// cmd_delete doesn't make sense if the selection is collapsed because it's
// directionless, which is the same condition under which we can't cut.
- nsresult rv = editor->GetIsSelectionEditable(aIsEnabled);
- NS_ENSURE_SUCCESS(rv, rv);
+ *aIsEnabled = textEditor->IsSelectionEditable();
if (!nsCRT::strcmp("cmd_delete", aCommandName) && *aIsEnabled) {
- rv = editor->CanDelete(aIsEnabled);
- NS_ENSURE_SUCCESS(rv, rv);
+ nsresult rv = textEditor->CanDelete(aIsEnabled);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
}
-
return NS_OK;
}
NS_IMETHODIMP
DeleteCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- NS_ENSURE_TRUE(editor, NS_ERROR_FAILURE);
+ if (NS_WARN_IF(!editor)) {
+ return NS_ERROR_FAILURE;
+ }
nsIEditor::EDirection deleteDir = nsIEditor::eNone;
if (!nsCRT::strcmp("cmd_delete", aCommandName)) {
// Really this should probably be eNone, but it only makes a difference if
// the selection is collapsed, and then this command is disabled. So let's
// keep it as it always was to avoid breaking things.
deleteDir = nsIEditor::ePrevious;
@@ -689,17 +781,19 @@ DeleteCommand::DoCommand(const char* aCo
} else if (!nsCRT::strcmp("cmd_deleteToBeginningOfLine", aCommandName)) {
deleteDir = nsIEditor::eToBeginningOfLine;
} else if (!nsCRT::strcmp("cmd_deleteToEndOfLine", aCommandName)) {
deleteDir = nsIEditor::eToEndOfLine;
} else {
MOZ_CRASH("Unrecognized nsDeleteCommand");
}
- return editor->DeleteSelection(deleteDir, nsIEditor::eStrip);
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ return textEditor->DeleteSelection(deleteDir, nsIEditor::eStrip);
}
NS_IMETHODIMP
DeleteCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
return DoCommand(aCommandName, aCommandRefCon);
@@ -727,36 +821,43 @@ SelectAllCommand::IsCommandEnabled(const
NS_ENSURE_ARG_POINTER(aIsEnabled);
nsresult rv = NS_OK;
// You can always select all, unless the selection is editable,
// and the editable region is empty!
*aIsEnabled = true;
bool docIsEmpty;
- // you can select all if there is an editor which is non-empty
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor) {
- rv = editor->GetDocumentIsEmpty(&docIsEmpty);
- NS_ENSURE_SUCCESS(rv, rv);
- *aIsEnabled = !docIsEmpty;
+ if (!editor) {
+ return NS_OK;
}
- return rv;
+ // You can select all if there is an editor which is non-empty
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ rv = textEditor->GetDocumentIsEmpty(&docIsEmpty);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ *aIsEnabled = !docIsEmpty;
+ return NS_OK;
}
NS_IMETHODIMP
SelectAllCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor)
- return editor->SelectAll();
-
- return NS_ERROR_FAILURE;
+ if (!editor) {
+ return NS_ERROR_FAILURE;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ return textEditor->SelectAll();
}
NS_IMETHODIMP
SelectAllCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
return DoCommand(aCommandName, aCommandRefCon);
@@ -778,20 +879,23 @@ SelectAllCommand::GetCommandStateParams(
NS_IMETHODIMP
SelectionMoveCommands::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
NS_ENSURE_ARG_POINTER(aIsEnabled);
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor)
- return editor->GetIsSelectionEditable(aIsEnabled);
-
- *aIsEnabled = false;
+ if (!editor) {
+ *aIsEnabled = false;
+ return NS_OK;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ *aIsEnabled = textEditor->IsSelectionEditable();
return NS_OK;
}
static const struct ScrollCommand {
const char *reverseScroll;
const char *forwardScroll;
nsresult (NS_STDCALL nsISelectionController::*scroll)(bool);
} scrollCommands[] = {
@@ -854,63 +958,68 @@ static const struct PhysicalCommand {
nsISelectionController::MOVE_DOWN, 1 }
};
NS_IMETHODIMP
SelectionMoveCommands::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- NS_ENSURE_TRUE(editor, NS_ERROR_FAILURE);
+ if (NS_WARN_IF(!editor)) {
+ return NS_ERROR_FAILURE;
+ }
- nsCOMPtr<nsIDOMDocument> domDoc;
- editor->GetDocument(getter_AddRefs(domDoc));
- nsCOMPtr<nsIDocument> doc = do_QueryInterface(domDoc);
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ nsCOMPtr<nsIDocument> doc = textEditor->GetDocument();
if (doc) {
// Most of the commands below (possibly all of them) need layout to
// be up to date.
doc->FlushPendingNotifications(FlushType::Layout);
}
- nsCOMPtr<nsISelectionController> selCont;
- nsresult rv = editor->GetSelectionController(getter_AddRefs(selCont));
- NS_ENSURE_SUCCESS(rv, rv);
- NS_ENSURE_TRUE(selCont, NS_ERROR_FAILURE);
+ nsCOMPtr<nsISelectionController> selectionController =
+ textEditor->GetSelectionController();
+ if (NS_WARN_IF(!selectionController)) {
+ return NS_ERROR_FAILURE;
+ }
// scroll commands
for (size_t i = 0; i < mozilla::ArrayLength(scrollCommands); i++) {
const ScrollCommand &cmd = scrollCommands[i];
if (!nsCRT::strcmp(aCommandName, cmd.reverseScroll)) {
- return (selCont->*(cmd.scroll))(false);
+ return (selectionController->*(cmd.scroll))(false);
} else if (!nsCRT::strcmp(aCommandName, cmd.forwardScroll)) {
- return (selCont->*(cmd.scroll))(true);
+ return (selectionController->*(cmd.scroll))(true);
}
}
// caret movement/selection commands
for (size_t i = 0; i < mozilla::ArrayLength(moveCommands); i++) {
const MoveCommand &cmd = moveCommands[i];
if (!nsCRT::strcmp(aCommandName, cmd.reverseMove)) {
- return (selCont->*(cmd.move))(false, false);
+ return (selectionController->*(cmd.move))(false, false);
} else if (!nsCRT::strcmp(aCommandName, cmd.forwardMove)) {
- return (selCont->*(cmd.move))(true, false);
+ return (selectionController->*(cmd.move))(true, false);
} else if (!nsCRT::strcmp(aCommandName, cmd.reverseSelect)) {
- return (selCont->*(cmd.move))(false, true);
+ return (selectionController->*(cmd.move))(false, true);
} else if (!nsCRT::strcmp(aCommandName, cmd.forwardSelect)) {
- return (selCont->*(cmd.move))(true, true);
+ return (selectionController->*(cmd.move))(true, true);
}
}
// physical-direction movement/selection
for (size_t i = 0; i < mozilla::ArrayLength(physicalCommands); i++) {
const PhysicalCommand &cmd = physicalCommands[i];
if (!nsCRT::strcmp(aCommandName, cmd.move)) {
- return selCont->PhysicalMove(cmd.direction, cmd.amount, false);
+ return selectionController->PhysicalMove(cmd.direction, cmd.amount,
+ false);
} else if (!nsCRT::strcmp(aCommandName, cmd.select)) {
- return selCont->PhysicalMove(cmd.direction, cmd.amount, true);
+ return selectionController->PhysicalMove(cmd.direction, cmd.amount,
+ true);
}
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
SelectionMoveCommands::DoCommandParams(const char* aCommandName,
@@ -934,54 +1043,68 @@ SelectionMoveCommands::GetCommandStatePa
* mozilla::InsertPlaintextCommand
******************************************************************************/
NS_IMETHODIMP
InsertPlaintextCommand::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
- NS_ENSURE_ARG_POINTER(aIsEnabled);
+ if (NS_WARN_IF(!aIsEnabled)) {
+ return NS_ERROR_INVALID_ARG;
+ }
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor)
- return editor->GetIsSelectionEditable(aIsEnabled);
-
- *aIsEnabled = false;
- return NS_ERROR_NOT_IMPLEMENTED;
+ if (NS_WARN_IF(!editor)) {
+ *aIsEnabled = false;
+ return NS_ERROR_FAILURE;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ *aIsEnabled = textEditor->IsSelectionEditable();
+ return NS_OK;
}
NS_IMETHODIMP
InsertPlaintextCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
// No value is equivalent to empty string
- nsCOMPtr<nsIPlaintextEditor> editor = do_QueryInterface(aCommandRefCon);
+ nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
if (NS_WARN_IF(!editor)) {
- return NS_ERROR_NOT_IMPLEMENTED;
+ return NS_ERROR_FAILURE;
}
-
- return editor->InsertText(EmptyString());
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ return textEditor->InsertText(EmptyString());
}
NS_IMETHODIMP
InsertPlaintextCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
- NS_ENSURE_ARG_POINTER(aParams);
+ if (NS_WARN_IF(!aParams)) {
+ return NS_ERROR_INVALID_ARG;
+ }
- nsCOMPtr<nsIPlaintextEditor> editor = do_QueryInterface(aCommandRefCon);
- NS_ENSURE_TRUE(editor, NS_ERROR_NOT_IMPLEMENTED);
+ nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
+ if (NS_WARN_IF(!editor)) {
+ return NS_ERROR_FAILURE;
+ }
// Get text to insert from command params
nsAutoString text;
nsresult rv = aParams->GetStringValue(STATE_DATA, text);
- NS_ENSURE_SUCCESS(rv, rv);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
- return editor->InsertText(text);
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ return textEditor->InsertText(text);
}
NS_IMETHODIMP
InsertPlaintextCommand::GetCommandStateParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
if (NS_WARN_IF(!aParams)) {
@@ -1003,33 +1126,36 @@ InsertParagraphCommand::IsCommandEnabled
bool* aIsEnabled)
{
if (NS_WARN_IF(!aIsEnabled)) {
return NS_ERROR_INVALID_ARG;
}
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
if (NS_WARN_IF(!editor)) {
*aIsEnabled = false;
- return NS_ERROR_NOT_IMPLEMENTED;
+ return NS_ERROR_FAILURE;
}
- return editor->GetIsSelectionEditable(aIsEnabled);
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ *aIsEnabled = textEditor->IsSelectionEditable();
+ return NS_OK;
}
NS_IMETHODIMP
InsertParagraphCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
- nsCOMPtr<nsIPlaintextEditor> editor = do_QueryInterface(aCommandRefCon);
+ nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
if (NS_WARN_IF(!editor)) {
- return NS_ERROR_NOT_IMPLEMENTED;
+ return NS_ERROR_FAILURE;
}
- TextEditor* textEditor = static_cast<TextEditor*>(editor.get());
-
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
return textEditor->TypedText(EmptyString(), TextEditor::eTypedBreak);
}
NS_IMETHODIMP
InsertParagraphCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
@@ -1060,33 +1186,36 @@ InsertLineBreakCommand::IsCommandEnabled
bool* aIsEnabled)
{
if (NS_WARN_IF(!aIsEnabled)) {
return NS_ERROR_INVALID_ARG;
}
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
if (NS_WARN_IF(!editor)) {
*aIsEnabled = false;
- return NS_ERROR_NOT_IMPLEMENTED;
+ return NS_ERROR_FAILURE;
}
- return editor->GetIsSelectionEditable(aIsEnabled);
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ *aIsEnabled = textEditor->IsSelectionEditable();
+ return NS_OK;
}
NS_IMETHODIMP
InsertLineBreakCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
- nsCOMPtr<nsIPlaintextEditor> editor = do_QueryInterface(aCommandRefCon);
+ nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
if (NS_WARN_IF(!editor)) {
- return NS_ERROR_NOT_IMPLEMENTED;
+ return NS_ERROR_FAILURE;
}
- TextEditor* textEditor = static_cast<TextEditor*>(editor.get());
-
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
return textEditor->TypedText(EmptyString(), TextEditor::eTypedBR);
}
NS_IMETHODIMP
InsertLineBreakCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
@@ -1111,62 +1240,71 @@ InsertLineBreakCommand::GetCommandStateP
* mozilla::PasteQuotationCommand
******************************************************************************/
NS_IMETHODIMP
PasteQuotationCommand::IsCommandEnabled(const char* aCommandName,
nsISupports* aCommandRefCon,
bool* aIsEnabled)
{
- NS_ENSURE_ARG_POINTER(aIsEnabled);
-
- nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- nsCOMPtr<nsIEditorMailSupport> mailEditor = do_QueryInterface(aCommandRefCon);
- if (editor && mailEditor) {
- uint32_t flags;
- editor->GetFlags(&flags);
- if (!(flags & nsIPlaintextEditor::eEditorSingleLineMask))
- return editor->CanPaste(nsIClipboard::kGlobalClipboard, aIsEnabled);
+ if (NS_WARN_IF(!aIsEnabled)) {
+ return NS_ERROR_INVALID_ARG;
}
*aIsEnabled = false;
- return NS_OK;
+
+ nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
+ if (!editor) {
+ return NS_OK;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ if (textEditor->IsSingleLineEditor()) {
+ return NS_OK;
+ }
+ return textEditor->CanPaste(nsIClipboard::kGlobalClipboard, aIsEnabled);
}
NS_IMETHODIMP
PasteQuotationCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
- nsCOMPtr<nsIEditorMailSupport> mailEditor = do_QueryInterface(aCommandRefCon);
- if (mailEditor)
- return mailEditor->PasteAsQuotation(nsIClipboard::kGlobalClipboard);
-
- return NS_ERROR_NOT_IMPLEMENTED;
+ nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
+ if (NS_WARN_IF(!editor)) {
+ return NS_ERROR_FAILURE;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ return textEditor->PasteAsQuotation(nsIClipboard::kGlobalClipboard);
}
NS_IMETHODIMP
PasteQuotationCommand::DoCommandParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
- nsCOMPtr<nsIEditorMailSupport> mailEditor = do_QueryInterface(aCommandRefCon);
- if (mailEditor)
- return mailEditor->PasteAsQuotation(nsIClipboard::kGlobalClipboard);
-
- return NS_ERROR_NOT_IMPLEMENTED;
+ nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
+ if (!editor) {
+ return NS_ERROR_FAILURE;
+ }
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ return textEditor->PasteAsQuotation(nsIClipboard::kGlobalClipboard);
}
NS_IMETHODIMP
PasteQuotationCommand::GetCommandStateParams(const char* aCommandName,
nsICommandParams* aParams,
nsISupports* aCommandRefCon)
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
- if (editor) {
- bool enabled = false;
- editor->CanPaste(nsIClipboard::kGlobalClipboard, &enabled);
- aParams->SetBooleanValue(STATE_ENABLED, enabled);
+ if (!editor) {
+ return NS_OK;
}
-
+ TextEditor* textEditor = editor->AsTextEditor();
+ MOZ_ASSERT(textEditor);
+ bool enabled = false;
+ textEditor->CanPaste(nsIClipboard::kGlobalClipboard, &enabled);
+ aParams->SetBooleanValue(STATE_ENABLED, enabled);
return NS_OK;
}
} // namespace mozilla