1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
/* -*- 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,
nsISupportsWeakReference* aContext, uint32_t* aControllerId);
nsresult SetContextOnControllerById(nsIControllers* aControllers,
nsISupportsWeakReference* 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__
|