mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-25 13:51:41 +00:00
ae436f55ec
This is slightly complicated by the fact that the editor code wants to be able to set this from the content process, so we really need separate BrowsingContext and WindowContext flags, the latter of which can be set by the owning process. Differential Revision: https://phabricator.services.mozilla.com/D114899
173 lines
5.3 KiB
C++
173 lines
5.3 KiB
C++
/* -*- 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 and plugins in aDocShell.
|
|
*/
|
|
nsresult DisableJSAndPlugins(nsPIDOMWindowInner* aWindow);
|
|
|
|
/**
|
|
* Restore JS and plugins (enable/disable them) according to the state they
|
|
* were before the last call to disableJSAndPlugins.
|
|
*/
|
|
nsresult RestoreJSAndPlugins(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 mDisabledJSAndPlugins;
|
|
|
|
// True if scripts were enabled before the editor turned scripts
|
|
// off, otherwise false.
|
|
bool mScriptsEnabled;
|
|
|
|
// True if plugins were enabled before the editor turned plugins
|
|
// off, otherwise false.
|
|
bool mPluginsEnabled;
|
|
|
|
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__
|