summaryrefslogtreecommitdiffstats
path: root/editor/composer/nsEditingSession.h
diff options
context:
space:
mode:
Diffstat (limited to 'editor/composer/nsEditingSession.h')
-rw-r--r--editor/composer/nsEditingSession.h168
1 files changed, 168 insertions, 0 deletions
diff --git a/editor/composer/nsEditingSession.h b/editor/composer/nsEditingSession.h
new file mode 100644
index 0000000000..ee2c035586
--- /dev/null
+++ b/editor/composer/nsEditingSession.h
@@ -0,0 +1,168 @@
+/* -*- 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 nsEditingSession_h__
+#define nsEditingSession_h__
+
+#include "nsCOMPtr.h" // for nsCOMPtr
+#include "nsISupportsImpl.h" // for NS_DECL_ISUPPORTS
+#include "nsIWeakReferenceUtils.h" // for nsWeakPtr
+#include "nsWeakReference.h" // for nsSupportsWeakReference, etc
+#include "nscore.h" // for nsresult
+
+#ifndef __gen_nsIWebProgressListener_h__
+# include "nsIWebProgressListener.h"
+#endif
+
+#ifndef __gen_nsIEditingSession_h__
+# include "nsIEditingSession.h" // for NS_DECL_NSIEDITINGSESSION, etc
+#endif
+
+#include "nsString.h" // for nsCString
+
+class mozIDOMWindowProxy;
+class nsBaseCommandController;
+class nsIDOMWindow;
+class nsISupports;
+class nsITimer;
+class nsIChannel;
+class nsIControllers;
+class nsIDocShell;
+class nsIWebProgress;
+class nsIPIDOMWindowOuter;
+class nsIPIDOMWindowInner;
+
+namespace mozilla {
+class ComposerCommandsUpdater;
+class HTMLEditor;
+} // namespace mozilla
+
+class nsEditingSession final : public nsIEditingSession,
+ public nsIWebProgressListener,
+ public nsSupportsWeakReference {
+ public:
+ nsEditingSession();
+
+ // nsISupports
+ NS_DECL_ISUPPORTS
+
+ // nsIWebProgressListener
+ NS_DECL_NSIWEBPROGRESSLISTENER
+
+ // nsIEditingSession
+ NS_DECL_NSIEDITINGSESSION
+
+ /**
+ * Removes all the editor's controllers/listeners etc and makes the window
+ * uneditable.
+ */
+ nsresult DetachFromWindow(nsPIDOMWindowOuter* aWindow);
+
+ /**
+ * Undos DetachFromWindow(), reattaches this editing session/editor
+ * to the window.
+ */
+ nsresult ReattachToWindow(nsPIDOMWindowOuter* aWindow);
+
+ protected:
+ virtual ~nsEditingSession();
+
+ typedef already_AddRefed<nsBaseCommandController> (*ControllerCreatorFn)();
+
+ nsresult SetupEditorCommandController(
+ ControllerCreatorFn aControllerCreatorFn, mozIDOMWindowProxy* aWindow,
+ nsISupports* aContext, uint32_t* aControllerId);
+
+ nsresult SetContextOnControllerById(nsIControllers* aControllers,
+ nsISupports* aContext, uint32_t aID);
+
+ /**
+ * Set the editor on the controller(s) for this window
+ */
+ nsresult SetEditorOnControllers(nsPIDOMWindowOuter& aWindow,
+ mozilla::HTMLEditor* aEditor);
+
+ /**
+ * Setup editor and related support objects
+ */
+ MOZ_CAN_RUN_SCRIPT nsresult SetupEditorOnWindow(nsPIDOMWindowOuter& aWindow);
+
+ nsresult PrepareForEditing(nsPIDOMWindowOuter* aWindow);
+
+ static void TimerCallback(nsITimer* aTimer, void* aClosure);
+ nsCOMPtr<nsITimer> mLoadBlankDocTimer;
+
+ // progress load stuff
+ nsresult StartDocumentLoad(nsIWebProgress* aWebProgress,
+ bool isToBeMadeEditable);
+ MOZ_CAN_RUN_SCRIPT_BOUNDARY
+ nsresult EndDocumentLoad(nsIWebProgress* aWebProgress, nsIChannel* aChannel,
+ nsresult aStatus, bool isToBeMadeEditable);
+ nsresult StartPageLoad(nsIChannel* aChannel);
+ nsresult EndPageLoad(nsIWebProgress* aWebProgress, nsIChannel* aChannel,
+ nsresult aStatus);
+
+ bool IsProgressForTargetDocument(nsIWebProgress* aWebProgress);
+
+ void RemoveEditorControllers(nsPIDOMWindowOuter* aWindow);
+ void RemoveWebProgressListener(nsPIDOMWindowOuter* aWindow);
+ void RestoreAnimationMode(nsPIDOMWindowOuter* aWindow);
+ void RemoveListenersAndControllers(nsPIDOMWindowOuter* aWindow,
+ mozilla::HTMLEditor* aHTMLEditor);
+
+ /**
+ * Disable scripts in aDocShell.
+ */
+ nsresult DisableJS(nsPIDOMWindowInner* aWindow);
+
+ /**
+ * Restore JS (enable/disable) according to the state it
+ * was before the last call to DisableJS.
+ */
+ nsresult RestoreJS(nsPIDOMWindowInner* aWindow);
+
+ protected:
+ bool mDoneSetup; // have we prepared for editing yet?
+
+ // Used to prevent double creation of editor because nsIWebProgressListener
+ // receives a STATE_STOP notification before the STATE_START
+ // for our document, so we wait for the STATE_START, then STATE_STOP
+ // before creating an editor
+ bool mCanCreateEditor;
+
+ bool mInteractive;
+ bool mMakeWholeDocumentEditable;
+
+ bool mDisabledJS;
+
+ // True if scripts were enabled before the editor turned scripts
+ // off, otherwise false.
+ bool mScriptsEnabled;
+
+ bool mProgressListenerRegistered;
+
+ // The image animation mode before it was turned off.
+ uint16_t mImageAnimationMode;
+
+ // THE REMAINING MEMBER VARIABLES WILL BECOME A SET WHEN WE EDIT
+ // MORE THAN ONE EDITOR PER EDITING SESSION
+ RefPtr<mozilla::ComposerCommandsUpdater> mComposerCommandsUpdater;
+
+ // Save the editor type so we can create the editor after loading uri
+ nsCString mEditorType;
+ uint32_t mEditorFlags;
+ uint32_t mEditorStatus;
+ uint32_t mBaseCommandControllerId;
+ uint32_t mDocStateControllerId;
+ uint32_t mHTMLCommandControllerId;
+
+ // Make sure the docshell we use is safe
+ nsWeakPtr mDocShell;
+
+ // See if we can reuse an existing editor
+ nsWeakPtr mExistingEditor;
+};
+
+#endif // nsEditingSession_h__