summaryrefslogtreecommitdiffstats
path: root/editor/composer/nsEditingSession.h
blob: ee2c035586142d65fa26aa66ad5d101bf4e114f5 (plain)
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
/* -*- 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__