2003-01-16 17:59:09 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 15:12:37 +04:00
|
|
|
/* 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/. */
|
2003-01-16 17:59:09 +03:00
|
|
|
|
2019-04-26 05:20:22 +03:00
|
|
|
#include "mozilla/EditorCommands.h"
|
|
|
|
|
2019-05-25 20:46:15 +03:00
|
|
|
#include "mozilla/HTMLEditor.h" // for HTMLEditor
|
|
|
|
#include "mozilla/TextEditor.h" // for TextEditor
|
|
|
|
#include "mozilla/dom/Document.h" // for Document
|
|
|
|
#include "nsCommandParams.h" // for nsCommandParams
|
|
|
|
#include "nsIDocShell.h" // for nsIDocShell
|
|
|
|
#include "nsIEditingSession.h" // for nsIEditingSession, etc
|
2019-06-10 13:27:07 +03:00
|
|
|
#include "nsIPrincipal.h" // for nsIPrincipal
|
2019-05-25 20:46:15 +03:00
|
|
|
#include "nsISelectionController.h" // for nsISelectionController
|
|
|
|
#include "nsISupportsImpl.h" // for nsPresContext::Release
|
|
|
|
#include "nsISupportsUtils.h" // for NS_IF_ADDREF
|
|
|
|
#include "nsIURI.h" // for nsIURI
|
|
|
|
#include "nsPresContext.h" // for nsPresContext
|
2003-01-16 17:59:09 +03:00
|
|
|
|
|
|
|
// defines
|
|
|
|
#define STATE_ENABLED "state_enabled"
|
2012-03-23 23:03:42 +04:00
|
|
|
#define STATE_ALL "state_all"
|
2003-01-16 17:59:09 +03:00
|
|
|
#define STATE_ATTRIBUTE "state_attribute"
|
|
|
|
#define STATE_DATA "state_data"
|
|
|
|
|
2018-06-15 19:13:31 +03:00
|
|
|
namespace mozilla {
|
2003-04-15 17:53:51 +04:00
|
|
|
|
2019-04-15 10:29:17 +03:00
|
|
|
/*****************************************************************************
|
|
|
|
* mozilla::SetDocumentStateCommand
|
|
|
|
*
|
2003-01-16 17:59:09 +03:00
|
|
|
* Commands for document state that may be changed via doCommandParams
|
|
|
|
* As of 11/11/02, this is just "cmd_setDocumentModified"
|
2019-04-15 10:29:17 +03:00
|
|
|
* Note that you can use the same command class, SetDocumentStateCommand,
|
2003-01-16 17:59:09 +03:00
|
|
|
* for more than one of this type of command
|
|
|
|
* We check the input command param for different behavior
|
2019-04-15 10:29:17 +03:00
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
StaticRefPtr<SetDocumentStateCommand> SetDocumentStateCommand::sInstance;
|
2003-01-16 17:59:09 +03:00
|
|
|
|
2019-04-30 07:24:49 +03:00
|
|
|
bool SetDocumentStateCommand::IsCommandEnabled(Command aCommand,
|
2019-04-26 16:11:24 +03:00
|
|
|
TextEditor* aTextEditor) const {
|
2019-05-03 05:15:18 +03:00
|
|
|
// These commands are always enabled if given editor is an HTMLEditor.
|
|
|
|
return aTextEditor && aTextEditor->AsHTMLEditor();
|
2003-01-16 17:59:09 +03:00
|
|
|
}
|
|
|
|
|
2019-04-30 07:24:49 +03:00
|
|
|
nsresult SetDocumentStateCommand::DoCommand(Command aCommand,
|
2019-06-10 13:27:07 +03:00
|
|
|
TextEditor& aTextEditor,
|
|
|
|
nsIPrincipal* aPrincipal) const {
|
2003-01-16 17:59:09 +03:00
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
2019-05-21 10:44:39 +03:00
|
|
|
nsresult SetDocumentStateCommand::DoCommandParam(
|
2019-06-10 13:27:07 +03:00
|
|
|
Command aCommand, const Maybe<bool>& aBoolParam, TextEditor& aTextEditor,
|
|
|
|
nsIPrincipal* aPrincipal) const {
|
2019-05-21 10:44:39 +03:00
|
|
|
if (NS_WARN_IF(aBoolParam.isNothing())) {
|
2018-07-17 18:30:05 +03:00
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
2019-05-03 05:15:18 +03:00
|
|
|
if (NS_WARN_IF(!aTextEditor.AsHTMLEditor())) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2019-04-30 07:24:49 +03:00
|
|
|
switch (aCommand) {
|
|
|
|
case Command::SetDocumentModified: {
|
2019-05-21 10:44:39 +03:00
|
|
|
if (aBoolParam.value()) {
|
2019-04-30 07:24:49 +03:00
|
|
|
nsresult rv = aTextEditor.IncrementModificationCount(1);
|
2019-05-21 10:44:39 +03:00
|
|
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
|
|
|
"IncrementModificationCount() failed");
|
2018-07-17 18:30:05 +03:00
|
|
|
return rv;
|
|
|
|
}
|
2019-05-21 10:44:39 +03:00
|
|
|
nsresult rv = aTextEditor.ResetModificationCount();
|
|
|
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "ResetModificationCount() failed");
|
|
|
|
return rv;
|
2016-10-24 05:27:45 +03:00
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
case Command::SetDocumentReadOnly: {
|
|
|
|
ErrorResult error;
|
2019-05-21 10:44:39 +03:00
|
|
|
if (aBoolParam.value()) {
|
2019-04-30 07:24:49 +03:00
|
|
|
nsresult rv =
|
|
|
|
aTextEditor.AddFlags(nsIPlaintextEditor::eEditorReadonlyMask);
|
2019-05-21 10:44:39 +03:00
|
|
|
NS_WARNING_ASSERTION(
|
|
|
|
NS_SUCCEEDED(rv),
|
|
|
|
"AddFlags(nsIPlaintextEditor::eEditorReadonlyMask) failed");
|
|
|
|
return rv;
|
2019-04-30 07:24:49 +03:00
|
|
|
}
|
2018-07-17 18:30:05 +03:00
|
|
|
nsresult rv =
|
2019-04-30 07:24:49 +03:00
|
|
|
aTextEditor.RemoveFlags(nsIPlaintextEditor::eEditorReadonlyMask);
|
2019-05-21 10:44:39 +03:00
|
|
|
NS_WARNING_ASSERTION(
|
|
|
|
NS_SUCCEEDED(rv),
|
|
|
|
"RemoveFlags(nsIPlaintextEditor::eEditorReadonlyMask) failed");
|
|
|
|
return rv;
|
2018-07-17 18:30:05 +03:00
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
case Command::SetDocumentUseCSS: {
|
2019-05-21 10:44:39 +03:00
|
|
|
nsresult rv =
|
|
|
|
aTextEditor.AsHTMLEditor()->SetIsCSSEnabled(aBoolParam.value());
|
|
|
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "SetIsCSSEnabled() failed");
|
|
|
|
return rv;
|
2018-07-17 18:30:05 +03:00
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
case Command::SetDocumentInsertBROnEnterKeyPress: {
|
2019-05-21 10:44:39 +03:00
|
|
|
nsresult rv =
|
|
|
|
aTextEditor.AsHTMLEditor()->SetReturnInParagraphCreatesNewParagraph(
|
|
|
|
!aBoolParam.value());
|
|
|
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
|
|
|
"SetReturnInParagraphCreatesNewParagraph() failed");
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
case Command::ToggleObjectResizers: {
|
|
|
|
MOZ_KnownLive(aTextEditor.AsHTMLEditor())
|
|
|
|
->EnableObjectResizer(aBoolParam.value());
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
case Command::ToggleInlineTableEditor: {
|
|
|
|
MOZ_KnownLive(aTextEditor.AsHTMLEditor())
|
|
|
|
->EnableInlineTableEditor(aBoolParam.value());
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
case Command::ToggleAbsolutePositionEditor: {
|
|
|
|
MOZ_KnownLive(aTextEditor.AsHTMLEditor())
|
|
|
|
->EnableAbsolutePositionEditor(aBoolParam.value());
|
2019-04-30 07:24:49 +03:00
|
|
|
return NS_OK;
|
2018-07-17 18:30:05 +03:00
|
|
|
}
|
2019-05-21 10:44:39 +03:00
|
|
|
default:
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-21 10:45:22 +03:00
|
|
|
nsresult SetDocumentStateCommand::DoCommandParam(
|
2019-06-10 13:27:07 +03:00
|
|
|
Command aCommand, const nsACString& aCStringParam, TextEditor& aTextEditor,
|
|
|
|
nsIPrincipal* aPrincipal) const {
|
2019-05-21 10:45:22 +03:00
|
|
|
if (NS_WARN_IF(aCStringParam.IsVoid())) {
|
2019-05-21 10:44:39 +03:00
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (NS_WARN_IF(!aTextEditor.AsHTMLEditor())) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (aCommand) {
|
2019-04-30 07:24:49 +03:00
|
|
|
case Command::SetDocumentDefaultParagraphSeparator: {
|
2019-05-21 10:45:22 +03:00
|
|
|
if (aCStringParam.LowerCaseEqualsLiteral("div")) {
|
|
|
|
aTextEditor.AsHTMLEditor()->SetDefaultParagraphSeparator(
|
|
|
|
ParagraphSeparator::div);
|
2019-04-30 07:24:49 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2019-05-21 10:45:22 +03:00
|
|
|
if (aCStringParam.LowerCaseEqualsLiteral("p")) {
|
|
|
|
aTextEditor.AsHTMLEditor()->SetDefaultParagraphSeparator(
|
|
|
|
ParagraphSeparator::p);
|
2019-04-30 07:24:49 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2019-05-21 10:45:22 +03:00
|
|
|
if (aCStringParam.LowerCaseEqualsLiteral("br")) {
|
2019-04-30 07:24:49 +03:00
|
|
|
// Mozilla extension for backwards compatibility
|
2019-05-21 10:45:22 +03:00
|
|
|
aTextEditor.AsHTMLEditor()->SetDefaultParagraphSeparator(
|
|
|
|
ParagraphSeparator::br);
|
2019-04-30 07:24:49 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2016-08-24 15:53:52 +03:00
|
|
|
|
2019-04-30 07:24:49 +03:00
|
|
|
// This should not be reachable from nsHTMLDocument::ExecCommand
|
2019-05-21 10:45:22 +03:00
|
|
|
// XXX Shouldn't return error in this case because Chrome does not throw
|
|
|
|
// exception in this case.
|
2019-04-30 07:24:49 +03:00
|
|
|
NS_WARNING("Invalid default paragraph separator");
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
2016-08-24 15:53:52 +03:00
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
default:
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
2016-08-24 15:53:52 +03:00
|
|
|
}
|
2003-01-16 17:59:09 +03:00
|
|
|
}
|
|
|
|
|
2019-04-27 10:35:56 +03:00
|
|
|
nsresult SetDocumentStateCommand::GetCommandStateParams(
|
2019-04-30 07:24:49 +03:00
|
|
|
Command aCommand, nsCommandParams& aParams, TextEditor* aTextEditor,
|
2019-04-27 10:35:56 +03:00
|
|
|
nsIEditingSession* aEditingSession) const {
|
Bug 1449564 - part 1: Disable object resizer and inline table editor in default r=m_kato
Gecko supports resizers of <img> elements and <table>, <td>, <th> elements and
has UI to remove existing table row or column in default. However, the other
browsers don't have such UI and web apps need to disable this feature with
calling both:
document.execCommand("enableObjectResizing", false, false);
document.execCommand("enableInlineTableEditing", false, false);
for avoiding conflicting with their own features to edit such elements.
Therefore, it doesn't make sense to keep enabling them in default only on
Gecko. If web apps want to keep using these features, they should call:
document.execCommand("enableObjectResizing", false, true);
document.execCommand("enableInlineTableEditing", false, true);
at initializing the editor.
And also this patch fixes bugs of
document.queryCommandState("enableObjectResizing") and
document.queryCommandState("enableInlineTableEditing"). They always return
false even after calling document.execCommand(..., false, true) since
nsSetDocumentStateCommand::GetCommandStateParams() sets bool value as
STATE_ATTRIBUTE. However, nsHTMLDocument::QueryCommandValue() which is the
caller referring STATE_ATTRIBUTE doesn't treat it as bool value. And also
those commands are related to state of document. Therefore, they should be
return as bool value of STATE_ALL instead. Then,
nsHTMLDocument::QueryCommandState() returns the state as expected. Note that
those commands are supported only by Gecko. So, we don't need to worry about
the compatibility.
Finally, this patch rewrites 2 existing tests to check basic behavior of
resizers and appearance of resizers.
Note that this patch does not add new tests to test inline table editor
since it's difficult to test the behavior with current API. Perhaps, we
should add an API to nsIHTMLEditor to retrieve each anonymous elements in
another bug since it requires to add wrapping API of SpecialPowers.
MozReview-Commit-ID: 1FhYo5vcV60
--HG--
rename : editor/libeditor/tests/test_objectResizing.html => editor/libeditor/tests/test_resizers_appearance.html
rename : editor/libeditor/tests/test_bug640321.html => editor/libeditor/tests/test_resizers_resizing_elements.html
extra : rebase_source : a707de5a64ef1f8ce974cdf1be093d1b4f61c7bc
2018-04-02 11:26:46 +03:00
|
|
|
// If the result is set to STATE_ATTRIBUTE as CString value,
|
|
|
|
// queryCommandValue() returns the string value.
|
|
|
|
// Otherwise, ignored.
|
|
|
|
|
2003-01-16 17:59:09 +03:00
|
|
|
// The base editor owns most state info
|
2019-04-27 10:35:56 +03:00
|
|
|
if (NS_WARN_IF(!aTextEditor)) {
|
2017-08-07 12:27:16 +03:00
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
2019-05-03 05:15:18 +03:00
|
|
|
|
|
|
|
if (NS_WARN_IF(!aTextEditor->AsHTMLEditor())) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2003-01-16 17:59:09 +03:00
|
|
|
// Always get the enabled state
|
2019-04-30 07:24:49 +03:00
|
|
|
nsresult rv =
|
|
|
|
aParams.SetBool(STATE_ENABLED, IsCommandEnabled(aCommand, aTextEditor));
|
2018-07-17 18:30:05 +03:00
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
return rv;
|
|
|
|
}
|
2003-01-16 17:59:09 +03:00
|
|
|
|
2019-04-30 07:24:49 +03:00
|
|
|
switch (aCommand) {
|
|
|
|
case Command::SetDocumentModified: {
|
|
|
|
bool modified;
|
|
|
|
rv = aTextEditor->GetDocumentModified(&modified);
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
// XXX Nobody refers this result due to wrong type.
|
|
|
|
rv = aParams.SetBool(STATE_ATTRIBUTE, modified);
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
return NS_OK;
|
2018-07-17 18:30:05 +03:00
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
case Command::SetDocumentReadOnly: {
|
|
|
|
// XXX Nobody refers this result due to wrong type.
|
|
|
|
rv = aParams.SetBool(STATE_ATTRIBUTE, aTextEditor->IsReadonly());
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
return NS_OK;
|
2016-08-24 15:53:52 +03:00
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
case Command::SetDocumentUseCSS: {
|
|
|
|
HTMLEditor* htmlEditor = aTextEditor->AsHTMLEditor();
|
|
|
|
if (NS_WARN_IF(!htmlEditor)) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
2018-07-17 18:30:05 +03:00
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
rv = aParams.SetBool(STATE_ALL, htmlEditor->IsCSSEnabled());
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
return rv;
|
2018-07-17 18:30:05 +03:00
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
case Command::SetDocumentInsertBROnEnterKeyPress: {
|
|
|
|
HTMLEditor* htmlEditor = aTextEditor->AsHTMLEditor();
|
|
|
|
if (NS_WARN_IF(!htmlEditor)) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
bool createPOnReturn;
|
|
|
|
htmlEditor->GetReturnInParagraphCreatesNewParagraph(&createPOnReturn);
|
|
|
|
// XXX Nobody refers this result due to wrong type.
|
|
|
|
rv = aParams.SetBool(STATE_ATTRIBUTE, !createPOnReturn);
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
return rv;
|
2018-07-17 18:30:05 +03:00
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
return NS_OK;
|
2016-08-24 15:53:52 +03:00
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
case Command::SetDocumentDefaultParagraphSeparator: {
|
|
|
|
HTMLEditor* htmlEditor = aTextEditor->AsHTMLEditor();
|
|
|
|
if (NS_WARN_IF(!htmlEditor)) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
2016-08-24 15:53:52 +03:00
|
|
|
|
2019-04-30 07:24:49 +03:00
|
|
|
switch (htmlEditor->GetDefaultParagraphSeparator()) {
|
|
|
|
case ParagraphSeparator::div: {
|
|
|
|
DebugOnly<nsresult> rv =
|
|
|
|
aParams.SetCString(STATE_ATTRIBUTE, NS_LITERAL_CSTRING("div"));
|
|
|
|
NS_WARNING_ASSERTION(
|
|
|
|
NS_SUCCEEDED(rv),
|
|
|
|
"Failed to set command params to return \"div\"");
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
case ParagraphSeparator::p: {
|
|
|
|
DebugOnly<nsresult> rv =
|
|
|
|
aParams.SetCString(STATE_ATTRIBUTE, NS_LITERAL_CSTRING("p"));
|
|
|
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
|
|
|
"Failed to set command params to return \"p\"");
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
case ParagraphSeparator::br: {
|
|
|
|
DebugOnly<nsresult> rv =
|
|
|
|
aParams.SetCString(STATE_ATTRIBUTE, NS_LITERAL_CSTRING("br"));
|
|
|
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
|
|
|
"Failed to set command params to return \"br\"");
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
MOZ_ASSERT_UNREACHABLE("Invalid paragraph separator value");
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
}
|
2018-07-17 18:30:05 +03:00
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
case Command::ToggleObjectResizers: {
|
|
|
|
HTMLEditor* htmlEditor = aTextEditor->AsHTMLEditor();
|
|
|
|
if (NS_WARN_IF(!htmlEditor)) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
// We returned the result as STATE_ATTRIBUTE with bool value 60 or
|
|
|
|
// earlier. So, the result was ignored by both
|
|
|
|
// nsHTMLDocument::QueryCommandValue() and
|
|
|
|
// nsHTMLDocument::QueryCommandState().
|
|
|
|
rv = aParams.SetBool(STATE_ALL, htmlEditor->IsObjectResizerEnabled());
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
return NS_OK;
|
2017-08-07 12:27:16 +03:00
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
case Command::ToggleInlineTableEditor: {
|
|
|
|
HTMLEditor* htmlEditor = aTextEditor->AsHTMLEditor();
|
|
|
|
if (NS_WARN_IF(!htmlEditor)) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
// We returned the result as STATE_ATTRIBUTE with bool value 60 or
|
|
|
|
// earlier. So, the result was ignored by both
|
|
|
|
// nsHTMLDocument::QueryCommandValue() and
|
|
|
|
// nsHTMLDocument::QueryCommandState().
|
|
|
|
rv = aParams.SetBool(STATE_ALL, htmlEditor->IsInlineTableEditorEnabled());
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
return NS_OK;
|
2018-07-17 18:30:05 +03:00
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
case Command::ToggleAbsolutePositionEditor: {
|
|
|
|
HTMLEditor* htmlEditor = aTextEditor->AsHTMLEditor();
|
|
|
|
if (NS_WARN_IF(!htmlEditor)) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
return aParams.SetBool(STATE_ALL,
|
|
|
|
htmlEditor->IsAbsolutePositionEditorEnabled());
|
2018-04-04 16:27:49 +03:00
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
default:
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
2018-04-04 16:27:49 +03:00
|
|
|
}
|
2003-01-16 17:59:09 +03:00
|
|
|
}
|
|
|
|
|
2019-04-15 10:29:17 +03:00
|
|
|
/*****************************************************************************
|
|
|
|
* mozilla::DocumentStateCommand
|
|
|
|
*
|
2015-05-28 18:58:42 +03:00
|
|
|
* Commands just for state notification
|
2003-01-16 17:59:09 +03:00
|
|
|
* As of 11/21/02, possible commands are:
|
|
|
|
* "obs_documentCreated"
|
|
|
|
* "obs_documentWillBeDestroyed"
|
|
|
|
* "obs_documentLocationChanged"
|
2019-04-15 10:29:17 +03:00
|
|
|
* Note that you can use the same command class, DocumentStateCommand
|
2003-01-16 17:59:09 +03:00
|
|
|
* for these or future observer commands.
|
|
|
|
* We check the input command param for different behavior
|
|
|
|
*
|
|
|
|
* How to use:
|
2019-04-03 15:51:38 +03:00
|
|
|
* 1. Get the nsCommandManager for the current editor
|
2003-01-16 17:59:09 +03:00
|
|
|
* 2. Implement an nsIObserve object, e.g:
|
|
|
|
*
|
2015-05-28 18:58:42 +03:00
|
|
|
* void Observe(
|
2019-04-03 15:51:38 +03:00
|
|
|
* in nsISupports aSubject, // The nsCommandManager calling this
|
2018-11-28 03:54:56 +03:00
|
|
|
* // Observer
|
2003-01-16 17:59:09 +03:00
|
|
|
* in string aTopic, // command name, e.g.:"obs_documentCreated"
|
|
|
|
* // or "obs_documentWillBeDestroyed"
|
|
|
|
in wstring aData ); // ignored (set to "command_status_changed")
|
|
|
|
*
|
|
|
|
* 3. Add the observer by:
|
|
|
|
* commandManager.addObserver(observeobject, obs_documentCreated);
|
2015-05-28 18:58:42 +03:00
|
|
|
* 4. In the appropriate location in editorSession, editor, or commands code,
|
2003-01-16 17:59:09 +03:00
|
|
|
* trigger the notification of this observer by something like:
|
|
|
|
*
|
2019-04-03 15:51:38 +03:00
|
|
|
* RefPtr<nsCommandManager> commandManager = mDocShell->GetCommandManager();
|
|
|
|
* commandManager->CommandStatusChanged(obs_documentCreated);
|
2003-01-16 17:59:09 +03:00
|
|
|
*
|
|
|
|
* 5. Use GetCommandStateParams() to obtain state information
|
2015-05-28 18:58:42 +03:00
|
|
|
* e.g., any creation state codes when creating an editor are
|
|
|
|
* supplied for "obs_documentCreated" command in the
|
2003-01-16 17:59:09 +03:00
|
|
|
* "state_data" param's value
|
2019-04-15 10:29:17 +03:00
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
StaticRefPtr<DocumentStateCommand> DocumentStateCommand::sInstance;
|
2003-01-16 17:59:09 +03:00
|
|
|
|
2019-04-30 07:24:49 +03:00
|
|
|
bool DocumentStateCommand::IsCommandEnabled(Command aCommand,
|
2019-04-26 16:11:24 +03:00
|
|
|
TextEditor* aTextEditor) const {
|
2003-01-16 17:59:09 +03:00
|
|
|
// Always return false to discourage callers from using DoCommand()
|
2019-04-26 16:11:24 +03:00
|
|
|
return false;
|
2003-01-16 17:59:09 +03:00
|
|
|
}
|
|
|
|
|
2019-04-30 07:24:49 +03:00
|
|
|
nsresult DocumentStateCommand::DoCommand(Command aCommand,
|
2019-06-10 13:27:07 +03:00
|
|
|
TextEditor& aTextEditor,
|
|
|
|
nsIPrincipal* aPrincipal) const {
|
2003-01-16 17:59:09 +03:00
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
2019-04-27 10:35:56 +03:00
|
|
|
nsresult DocumentStateCommand::GetCommandStateParams(
|
2019-04-30 07:24:49 +03:00
|
|
|
Command aCommand, nsCommandParams& aParams, TextEditor* aTextEditor,
|
2019-04-27 10:35:56 +03:00
|
|
|
nsIEditingSession* aEditingSession) const {
|
2019-04-30 07:24:49 +03:00
|
|
|
switch (aCommand) {
|
|
|
|
case Command::EditorObserverDocumentCreated: {
|
|
|
|
uint32_t editorStatus = nsIEditingSession::eEditorErrorUnknown;
|
|
|
|
if (aEditingSession) {
|
|
|
|
// Current context is initially set to nsIEditingSession until editor is
|
|
|
|
// successfully created and source doc is loaded. Embedder gets error
|
|
|
|
// status if this fails. If called before startup is finished,
|
|
|
|
// status will be eEditorCreationInProgress.
|
|
|
|
nsresult rv = aEditingSession->GetEditorStatus(&editorStatus);
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
} else if (aTextEditor) {
|
|
|
|
// If current context is an editor, then everything started up OK!
|
|
|
|
editorStatus = nsIEditingSession::eEditorOK;
|
2018-07-17 18:30:05 +03:00
|
|
|
}
|
2016-10-24 05:27:45 +03:00
|
|
|
|
2019-04-30 07:24:49 +03:00
|
|
|
// Note that if refCon is not-null, but is neither
|
|
|
|
// an nsIEditingSession or nsIEditor, we return "eEditorErrorUnknown"
|
|
|
|
DebugOnly<nsresult> rv = aParams.SetInt(STATE_DATA, editorStatus);
|
|
|
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to set editor status");
|
2016-10-24 05:27:45 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
case Command::EditorObserverDocumentLocationChanged: {
|
|
|
|
if (!aTextEditor) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
Document* document = aTextEditor->GetDocument();
|
|
|
|
if (NS_WARN_IF(!document)) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
nsIURI* uri = document->GetDocumentURI();
|
|
|
|
if (NS_WARN_IF(!uri)) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
nsresult rv = aParams.SetISupports(STATE_DATA, uri);
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
return NS_OK;
|
2018-07-17 18:30:05 +03:00
|
|
|
}
|
2019-04-30 07:24:49 +03:00
|
|
|
default:
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
2015-05-28 18:58:42 +03:00
|
|
|
}
|
2003-01-16 17:59:09 +03:00
|
|
|
}
|
2018-06-15 19:13:31 +03:00
|
|
|
|
|
|
|
} // namespace mozilla
|