Bug 1463330 - Move CanPasteTransferable and PreDestroy to out of nsIEditor. r?masayuki
CanPasteTransferable and PreDestroy aren't used from script (inc. comm-central
and bluegriffon), so we should move these to out of nsIEditor.
MozReview-Commit-ID: GRfBobAm2qi
--- a/editor/libeditor/EditorBase.cpp
+++ b/editor/libeditor/EditorBase.cpp
@@ -484,21 +484,22 @@ EditorBase::GetDesiredSpellCheckState()
// return true and let the spellchecker figure it out.
nsCOMPtr<nsIHTMLDocument> doc = do_QueryInterface(content->GetComposedDoc());
return doc && doc->IsEditingOn();
}
return element->Spellcheck();
}
-NS_IMETHODIMP
+void
EditorBase::PreDestroy(bool aDestroyingFrames)
{
- if (mDidPreDestroy)
- return NS_OK;
+ if (mDidPreDestroy) {
+ return;
+ }
Selection* selection = GetSelection();
if (selection) {
selection->RemoveSelectionListener(this);
}
IMEStateManager::OnEditorDestroying(*this);
@@ -532,17 +533,16 @@ EditorBase::PreDestroy(bool aDestroyingF
if (mTransactionManager) {
DebugOnly<bool> disabledUndoRedo = DisableUndoRedo();
NS_WARNING_ASSERTION(disabledUndoRedo,
"Failed to disable undo/redo transactions");
mTransactionManager = nullptr;
}
mDidPreDestroy = true;
- return NS_OK;
}
NS_IMETHODIMP
EditorBase::GetFlags(uint32_t* aFlags)
{
// NOTE: If you need to override this method, you need to make Flags()
// virtual.
*aFlags = Flags();
@@ -1185,23 +1185,16 @@ EditorBase::PasteTransferable(nsITransfe
NS_IMETHODIMP
EditorBase::CanPaste(int32_t aSelectionType, bool* aCanPaste)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
-EditorBase::CanPasteTransferable(nsITransferable* aTransferable,
- bool* aCanPaste)
-{
- return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
EditorBase::SetAttribute(Element* aElement,
const nsAString& aAttribute,
const nsAString& aValue)
{
if (NS_WARN_IF(aAttribute.IsEmpty())) {
return NS_ERROR_INVALID_ARG;
}
if (NS_WARN_IF(!aElement)) {
--- a/editor/libeditor/EditorBase.h
+++ b/editor/libeditor/EditorBase.h
@@ -964,16 +964,25 @@ protected:
public:
/**
* PostCreate should be called after Init, and is the time that the editor
* tells its documentStateObservers that the document has been created.
*/
nsresult PostCreate();
+ /**
+ * PreDestroy is called before the editor goes away, and gives the editor a
+ * chance to tell its documentStateObservers that the document is going away.
+ * @param aDestroyingFrames set to true when the frames being edited
+ * are being destroyed (so there is no need to modify any nsISelections,
+ * nor is it safe to do so)
+ */
+ virtual void PreDestroy(bool aDestroyingFrames);
+
/**
* All editor operations which alter the doc should be prefaced
* with a call to StartOperation, naming the action and direction.
*/
virtual nsresult StartOperation(EditAction opID,
nsIEditor::EDirection aDirection);
/**
--- a/editor/libeditor/EditorCommands.cpp
+++ b/editor/libeditor/EditorCommands.cpp
@@ -601,17 +601,18 @@ PasteTransferableCommand::IsCommandEnabl
if (!editor) {
return NS_OK;
}
TextEditor* textEditor = editor->AsTextEditor();
MOZ_ASSERT(textEditor);
if (!textEditor->IsSelectionEditable()) {
return NS_OK;
}
- return textEditor->CanPasteTransferable(nullptr, aIsEnabled);
+ *aIsEnabled = textEditor->CanPasteTransferable(nullptr);
+ return NS_OK;
}
NS_IMETHODIMP
PasteTransferableCommand::DoCommand(const char* aCommandName,
nsISupports* aCommandRefCon)
{
return NS_ERROR_FAILURE;
}
@@ -662,23 +663,18 @@ PasteTransferableCommand::GetCommandStat
trans = do_QueryInterface(supports);
if (NS_WARN_IF(!trans)) {
return NS_ERROR_FAILURE;
}
TextEditor* textEditor = editor->AsTextEditor();
MOZ_ASSERT(textEditor);
- bool canPaste;
- nsresult rv = textEditor->CanPasteTransferable(trans, &canPaste);
- if (NS_WARN_IF(NS_FAILED(rv))) {
- return rv;
- }
-
- return aParams->SetBooleanValue(STATE_ENABLED, canPaste);
+ return aParams->SetBooleanValue(STATE_ENABLED,
+ textEditor->CanPasteTransferable(trans));
}
/******************************************************************************
* mozilla::SwitchTextDirectionCommand
******************************************************************************/
NS_IMETHODIMP
SwitchTextDirectionCommand::IsCommandEnabled(const char* aCommandName,
--- a/editor/libeditor/HTMLEditor.cpp
+++ b/editor/libeditor/HTMLEditor.cpp
@@ -327,37 +327,37 @@ HTMLEditor::Init(nsIDocument& aDoc,
AddOverrideStyleSheet(NS_LITERAL_STRING("resource://gre/res/EditorOverride.css"));
}
}
NS_ENSURE_SUCCESS(rulesRv, rulesRv);
return NS_OK;
}
-NS_IMETHODIMP
+void
HTMLEditor::PreDestroy(bool aDestroyingFrames)
{
if (mDidPreDestroy) {
- return NS_OK;
+ return;
}
nsCOMPtr<nsIDocument> document = GetDocument();
if (document) {
document->RemoveMutationObserver(this);
}
while (!mStyleSheetURLs.IsEmpty()) {
RemoveOverrideStyleSheet(mStyleSheetURLs[0]);
}
// Clean up after our anonymous content -- we don't want these nodes to
// stay around (which they would, since the frames have an owning reference).
HideAnonymousEditingUIs();
- return TextEditor::PreDestroy(aDestroyingFrames);
+ EditorBase::PreDestroy(aDestroyingFrames);
}
NS_IMETHODIMP
HTMLEditor::NotifySelectionChanged(nsIDocument* aDocument,
Selection* aSelection,
int16_t aReason)
{
if (NS_WARN_IF(!aDocument) || NS_WARN_IF(!aSelection)) {
--- a/editor/libeditor/HTMLEditor.h
+++ b/editor/libeditor/HTMLEditor.h
@@ -128,16 +128,17 @@ public:
nsAtom* aAttribute,
bool aSuppressTransaction) override;
virtual nsresult SetAttributeOrEquivalent(Element* aElement,
nsAtom* aAttribute,
const nsAString& aValue,
bool aSuppressTransaction) override;
using EditorBase::RemoveAttributeOrEquivalent;
using EditorBase::SetAttributeOrEquivalent;
+ virtual bool CanPasteTransferable(nsITransferable* aTransferable) override;
// nsStubMutationObserver overrides
NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED
NS_DECL_NSIMUTATIONOBSERVER_CONTENTINSERTED
NS_DECL_NSIMUTATIONOBSERVER_CONTENTREMOVED
// nsIHTMLEditor methods
NS_DECL_NSIHTMLEDITOR
@@ -207,17 +208,17 @@ public:
bool* outIsSpace,
bool* outIsNBSP,
nsIContent** outNode = nullptr,
int32_t* outOffset = 0);
// Overrides of EditorBase interface methods
virtual nsresult EndUpdateViewBatch() override;
- NS_IMETHOD PreDestroy(bool aDestroyingFrames) override;
+ virtual void PreDestroy(bool aDestroyingFrames) override;
virtual nsresult GetPreferredIMEState(widget::IMEState* aState) override;
/**
* @param aElement Must not be null.
*/
static bool NodeIsBlockStatic(const nsINode* aElement);
@@ -324,18 +325,16 @@ protected:
public:
// XXX Why don't we move following methods above for grouping by the origins?
NS_IMETHOD SetFlags(uint32_t aFlags) override;
NS_IMETHOD Paste(int32_t aSelectionType) override;
NS_IMETHOD CanPaste(int32_t aSelectionType, bool* aCanPaste) override;
NS_IMETHOD PasteTransferable(nsITransferable* aTransferable) override;
- NS_IMETHOD CanPasteTransferable(nsITransferable* aTransferable,
- bool* aCanPaste) override;
NS_IMETHOD DebugUnitTests(int32_t* outNumTests,
int32_t* outNumTestsFailed) override;
/**
* All editor operations which alter the doc should be prefaced
* with a call to StartOperation, naming the action and direction.
*/
--- a/editor/libeditor/HTMLEditorDataTransfer.cpp
+++ b/editor/libeditor/HTMLEditorDataTransfer.cpp
@@ -1424,17 +1424,17 @@ HTMLEditor::Paste(int32_t aSelectionType
infoStr.Assign(text.get(), infoLen / 2);
}
}
return InsertFromTransferable(trans, nullptr, contextStr, infoStr,
bHavePrivateHTMLFlavor, true);
}
-NS_IMETHODIMP
+nsresult
HTMLEditor::PasteTransferable(nsITransferable* aTransferable)
{
// Use an invalid value for the clipboard type as data comes from aTransferable
// and we don't currently implement a way to put that in the data transfer yet.
if (!FireClipboardEvent(ePaste, nsIClipboard::kGlobalClipboard)) {
return NS_OK;
}
@@ -1520,61 +1520,54 @@ HTMLEditor::CanPaste(int32_t aSelectionT
aSelectionType, &haveFlavors);
}
NS_ENSURE_SUCCESS(rv, rv);
*aCanPaste = haveFlavors;
return NS_OK;
}
-NS_IMETHODIMP
-HTMLEditor::CanPasteTransferable(nsITransferable* aTransferable,
- bool* aCanPaste)
+bool
+HTMLEditor::CanPasteTransferable(nsITransferable* aTransferable)
{
- NS_ENSURE_ARG_POINTER(aCanPaste);
-
// can't paste if readonly
if (!IsModifiable()) {
- *aCanPaste = false;
- return NS_OK;
+ return false;
}
// If |aTransferable| is null, assume that a paste will succeed.
if (!aTransferable) {
- *aCanPaste = true;
- return NS_OK;
+ return true;
}
// Peek in |aTransferable| to see if it contains a supported MIME type.
// Use the flavors depending on the current editor mask
const char ** flavors;
- unsigned length;
+ size_t length;
if (IsPlaintextEditor()) {
flavors = textEditorFlavors;
length = ArrayLength(textEditorFlavors);
} else {
flavors = textHtmlEditorFlavors;
length = ArrayLength(textHtmlEditorFlavors);
}
- for (unsigned int i = 0; i < length; i++, flavors++) {
+ for (size_t i = 0; i < length; i++, flavors++) {
nsCOMPtr<nsISupports> data;
uint32_t dataLen;
nsresult rv = aTransferable->GetTransferData(*flavors,
getter_AddRefs(data),
&dataLen);
if (NS_SUCCEEDED(rv) && data) {
- *aCanPaste = true;
- return NS_OK;
+ return true;
}
}
- *aCanPaste = false;
- return NS_OK;
+ return false;
}
/**
* HTML PasteAsQuotation: Paste in a blockquote type=cite.
*/
NS_IMETHODIMP
HTMLEditor::PasteAsQuotation(int32_t aSelectionType)
{
--- a/editor/libeditor/TextEditor.h
+++ b/editor/libeditor/TextEditor.h
@@ -68,23 +68,28 @@ public:
NS_IMETHOD Cut() override;
NS_IMETHOD CanCut(bool* aCanCut) override;
NS_IMETHOD Copy() override;
NS_IMETHOD CanCopy(bool* aCanCopy) override;
NS_IMETHOD CanDelete(bool* aCanDelete) override;
NS_IMETHOD Paste(int32_t aSelectionType) override;
NS_IMETHOD CanPaste(int32_t aSelectionType, bool* aCanPaste) override;
NS_IMETHOD PasteTransferable(nsITransferable* aTransferable) override;
- NS_IMETHOD CanPasteTransferable(nsITransferable* aTransferable,
- bool* aCanPaste) override;
NS_IMETHOD OutputToString(const nsAString& aFormatType,
uint32_t aFlags,
nsAString& aOutputString) override;
+ /** Can we paste |aTransferable| or, if |aTransferable| is null, will a call
+ * to pasteTransferable later possibly succeed if given an instance of
+ * nsITransferable then? True if the doc is modifiable, and, if
+ * |aTransfeable| is non-null, we have pasteable data in |aTransfeable|.
+ */
+ virtual bool CanPasteTransferable(nsITransferable* aTransferable);
+
// Overrides of EditorBase
virtual nsresult RemoveAttributeOrEquivalent(
Element* aElement,
nsAtom* aAttribute,
bool aSuppressTransaction) override;
virtual nsresult SetAttributeOrEquivalent(Element* aElement,
nsAtom* aAttribute,
const nsAString& aValue,
--- a/editor/libeditor/TextEditorDataTransfer.cpp
+++ b/editor/libeditor/TextEditorDataTransfer.cpp
@@ -369,47 +369,39 @@ TextEditor::CanPaste(int32_t aSelectionT
ArrayLength(textEditorFlavors),
aSelectionType, &haveFlavors);
NS_ENSURE_SUCCESS(rv, rv);
*aCanPaste = haveFlavors;
return NS_OK;
}
-
-NS_IMETHODIMP
-TextEditor::CanPasteTransferable(nsITransferable* aTransferable,
- bool* aCanPaste)
+bool
+TextEditor::CanPasteTransferable(nsITransferable* aTransferable)
{
- NS_ENSURE_ARG_POINTER(aCanPaste);
-
// can't paste if readonly
if (!IsModifiable()) {
- *aCanPaste = false;
- return NS_OK;
+ return false;
}
// If |aTransferable| is null, assume that a paste will succeed.
if (!aTransferable) {
- *aCanPaste = true;
- return NS_OK;
+ return true;
}
nsCOMPtr<nsISupports> data;
uint32_t dataLen;
nsresult rv = aTransferable->GetTransferData(kUnicodeMime,
getter_AddRefs(data),
&dataLen);
if (NS_SUCCEEDED(rv) && data) {
- *aCanPaste = true;
- } else {
- *aCanPaste = false;
+ return true;
}
- return NS_OK;
+ return false;
}
bool
TextEditor::IsSafeToInsertData(nsIDocument* aSourceDoc)
{
// Try to determine whether we should use a sanitizing fragment sink
bool isSafe = false;
--- a/editor/nsIEditor.idl
+++ b/editor/nsIEditor.idl
@@ -54,25 +54,16 @@ interface nsIEditor : nsISupports
void setAttributeOrEquivalent(in Element element,
in AString sourceAttrName,
in AString sourceAttrValue,
in boolean aSuppressTransaction);
void removeAttributeOrEquivalent(in Element element,
in DOMString sourceAttrName,
in boolean aSuppressTransaction);
- /**
- * preDestroy is called before the editor goes away, and gives the editor a
- * chance to tell its documentStateObservers that the document is going away.
- * @param aDestroyingFrames set to true when the frames being edited
- * are being destroyed (so there is no need to modify any nsISelections,
- * nor is it safe to do so)
- */
- void preDestroy(in boolean aDestroyingFrames);
-
/** edit flags for this editor. May be set at any time. */
attribute unsigned long flags;
/**
* the MimeType of the document
*/
attribute string contentsMIMEType;
@@ -294,23 +285,16 @@ interface nsIEditor : nsISupports
*/
void pasteTransferable(in nsITransferable aTransferable);
/** Can we paste? True if the doc is modifiable, and we have
* pasteable data in the clipboard.
*/
boolean canPaste(in long aSelectionType);
- /** Can we paste |aTransferable| or, if |aTransferable| is null, will a call
- * to pasteTransferable later possibly succeed if given an instance of
- * nsITransferable then? True if the doc is modifiable, and, if
- * |aTransfeable| is non-null, we have pasteable data in |aTransfeable|.
- */
- boolean canPasteTransferable([optional] in nsITransferable aTransferable);
-
/* ------------ Selection methods -------------- */
/** sets the document selection to the entire contents of the document */
void selectAll();
/**
* Collapses selection at start of the document. If it's an HTML editor,
* collapses selection at start of current editing host (<body> element if