summaryrefslogtreecommitdiffstats
path: root/editor/libeditor/TextEditor.h
diff options
context:
space:
mode:
Diffstat (limited to 'editor/libeditor/TextEditor.h')
-rw-r--r--editor/libeditor/TextEditor.h246
1 files changed, 246 insertions, 0 deletions
diff --git a/editor/libeditor/TextEditor.h b/editor/libeditor/TextEditor.h
new file mode 100644
index 000000000..872cd91d3
--- /dev/null
+++ b/editor/libeditor/TextEditor.h
@@ -0,0 +1,246 @@
+/* -*- 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_TextEditor_h
+#define mozilla_TextEditor_h
+
+#include "mozilla/EditorBase.h"
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsIEditor.h"
+#include "nsIEditorMailSupport.h"
+#include "nsIPlaintextEditor.h"
+#include "nsISupportsImpl.h"
+#include "nscore.h"
+
+class nsIContent;
+class nsIDOMDocument;
+class nsIDOMElement;
+class nsIDOMEvent;
+class nsIDOMKeyEvent;
+class nsIDOMNode;
+class nsIDocumentEncoder;
+class nsIEditRules;
+class nsIOutputStream;
+class nsISelectionController;
+class nsITransferable;
+
+namespace mozilla {
+
+class AutoEditInitRulesTrigger;
+class HTMLEditRules;
+class TextEditRules;
+namespace dom {
+class Selection;
+} // namespace dom
+
+/**
+ * The text editor implementation.
+ * Use to edit text document represented as a DOM tree.
+ */
+class TextEditor : public EditorBase
+ , public nsIPlaintextEditor
+ , public nsIEditorMailSupport
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(TextEditor, EditorBase)
+
+ enum ETypingAction
+ {
+ eTypedText, /* user typed text */
+ eTypedBR, /* user typed shift-enter to get a br */
+ eTypedBreak /* user typed enter */
+ };
+
+ TextEditor();
+
+ // nsIPlaintextEditor methods
+ NS_DECL_NSIPLAINTEXTEDITOR
+
+ // nsIEditorMailSupport overrides
+ NS_DECL_NSIEDITORMAILSUPPORT
+
+ // Overrides of EditorBase interface methods
+ NS_IMETHOD SetAttributeOrEquivalent(nsIDOMElement* aElement,
+ const nsAString& aAttribute,
+ const nsAString& aValue,
+ bool aSuppressTransaction) override;
+ NS_IMETHOD RemoveAttributeOrEquivalent(nsIDOMElement* aElement,
+ const nsAString& aAttribute,
+ bool aSuppressTransaction) override;
+
+ NS_IMETHOD Init(nsIDOMDocument* aDoc, nsIContent* aRoot,
+ nsISelectionController* aSelCon, uint32_t aFlags,
+ const nsAString& aValue) override;
+
+ NS_IMETHOD GetDocumentIsEmpty(bool* aDocumentIsEmpty) override;
+ NS_IMETHOD GetIsDocumentEditable(bool* aIsDocumentEditable) override;
+
+ NS_IMETHOD DeleteSelection(EDirection aAction,
+ EStripWrappers aStripWrappers) override;
+
+ NS_IMETHOD SetDocumentCharacterSet(const nsACString& characterSet) override;
+
+ NS_IMETHOD Undo(uint32_t aCount) override;
+ NS_IMETHOD Redo(uint32_t aCount) override;
+
+ 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;
+
+ NS_IMETHOD OutputToStream(nsIOutputStream* aOutputStream,
+ const nsAString& aFormatType,
+ const nsACString& aCharsetOverride,
+ uint32_t aFlags) override;
+
+ /**
+ * All editor operations which alter the doc should be prefaced
+ * with a call to StartOperation, naming the action and direction.
+ */
+ NS_IMETHOD StartOperation(EditAction opID,
+ nsIEditor::EDirection aDirection) override;
+
+ /**
+ * All editor operations which alter the doc should be followed
+ * with a call to EndOperation.
+ */
+ NS_IMETHOD EndOperation() override;
+
+ /**
+ * Make the given selection span the entire document.
+ */
+ virtual nsresult SelectEntireDocument(Selection* aSelection) override;
+
+ virtual nsresult HandleKeyPressEvent(nsIDOMKeyEvent* aKeyEvent) override;
+
+ virtual already_AddRefed<dom::EventTarget> GetDOMEventTarget() override;
+
+ virtual nsresult BeginIMEComposition(WidgetCompositionEvent* aEvent) override;
+ virtual nsresult UpdateIMEComposition(nsIDOMEvent* aTextEvent) override;
+
+ virtual already_AddRefed<nsIContent> GetInputEventTargetContent() override;
+
+ // Utility Routines, not part of public API
+ NS_IMETHOD TypedText(const nsAString& aString, ETypingAction aAction);
+
+ nsresult InsertTextAt(const nsAString& aStringToInsert,
+ nsIDOMNode* aDestinationNode,
+ int32_t aDestOffset,
+ bool aDoDeleteSelection);
+
+ virtual nsresult InsertFromDataTransfer(dom::DataTransfer* aDataTransfer,
+ int32_t aIndex,
+ nsIDOMDocument* aSourceDoc,
+ nsIDOMNode* aDestinationNode,
+ int32_t aDestOffset,
+ bool aDoDeleteSelection) override;
+
+ virtual nsresult InsertFromDrop(nsIDOMEvent* aDropEvent) override;
+
+ /**
+ * Extends the selection for given deletion operation
+ * If done, also update aAction to what's actually left to do after the
+ * extension.
+ */
+ nsresult ExtendSelectionForDelete(Selection* aSelection,
+ nsIEditor::EDirection* aAction);
+
+ /**
+ * Return true if the data is safe to insert as the source and destination
+ * principals match, or we are in a editor context where this doesn't matter.
+ * Otherwise, the data must be sanitized first.
+ */
+ bool IsSafeToInsertData(nsIDOMDocument* aSourceDoc);
+
+ static void GetDefaultEditorPrefs(int32_t& aNewLineHandling,
+ int32_t& aCaretStyle);
+
+protected:
+ virtual ~TextEditor();
+
+ NS_IMETHOD InitRules();
+ void BeginEditorInit();
+ nsresult EndEditorInit();
+
+ NS_IMETHOD GetAndInitDocEncoder(const nsAString& aFormatType,
+ uint32_t aFlags,
+ const nsACString& aCharset,
+ nsIDocumentEncoder** encoder);
+
+ NS_IMETHOD CreateBR(nsIDOMNode* aNode, int32_t aOffset,
+ nsCOMPtr<nsIDOMNode>* outBRNode,
+ EDirection aSelect = eNone);
+ already_AddRefed<Element> CreateBRImpl(nsCOMPtr<nsINode>* aInOutParent,
+ int32_t* aInOutOffset,
+ EDirection aSelect);
+ nsresult CreateBRImpl(nsCOMPtr<nsIDOMNode>* aInOutParent,
+ int32_t* aInOutOffset,
+ nsCOMPtr<nsIDOMNode>* outBRNode,
+ EDirection aSelect);
+ nsresult InsertBR(nsCOMPtr<nsIDOMNode>* outBRNode);
+
+ /**
+ * Factored methods for handling insertion of data from transferables
+ * (drag&drop or clipboard).
+ */
+ NS_IMETHOD PrepareTransferable(nsITransferable** transferable);
+ NS_IMETHOD InsertTextFromTransferable(nsITransferable* transferable,
+ nsIDOMNode* aDestinationNode,
+ int32_t aDestOffset,
+ bool aDoDeleteSelection);
+
+ /**
+ * Shared outputstring; returns whether selection is collapsed and resulting
+ * string.
+ */
+ nsresult SharedOutputString(uint32_t aFlags, bool* aIsCollapsed,
+ nsAString& aResult);
+
+ /**
+ * Small utility routine to test the eEditorReadonly bit.
+ */
+ bool IsModifiable();
+
+ enum PasswordFieldAllowed
+ {
+ ePasswordFieldAllowed,
+ ePasswordFieldNotAllowed
+ };
+ bool CanCutOrCopy(PasswordFieldAllowed aPasswordFieldAllowed);
+ bool FireClipboardEvent(EventMessage aEventMessage,
+ int32_t aSelectionType,
+ bool* aActionTaken = nullptr);
+
+ bool UpdateMetaCharset(nsIDOMDocument* aDocument,
+ const nsACString& aCharacterSet);
+
+protected:
+ nsCOMPtr<nsIEditRules> mRules;
+ int32_t mWrapColumn;
+ int32_t mMaxTextLength;
+ int32_t mInitTriggerCounter;
+ int32_t mNewlineHandling;
+ int32_t mCaretStyle;
+
+ friend class AutoEditInitRulesTrigger;
+ friend class HTMLEditRules;
+ friend class TextEditRules;
+};
+
+} // namespace mozilla
+
+#endif // #ifndef mozilla_TextEditor_h