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


#ifndef nsWeakReference_h__
#include "nsWeakReference.h"            // for nsSupportsWeakReference, etc
#endif

#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 nsPIDOMWindowOuter;
class mozIDOMWindowProxy;
class nsIDOMWindow;
class nsISupports;
class nsITimer;

#define NS_EDITINGSESSION_CID                            \
{ 0xbc26ff01, 0xf2bd, 0x11d4, { 0xa7, 0x3c, 0xe5, 0xa4, 0xb5, 0xa8, 0xbd, 0xfc } }


class nsComposerCommandsUpdater;
class nsIChannel;
class nsIControllers;
class nsIDocShell;
class nsIEditor;
class nsIWebProgress;

class nsEditingSession final : public nsIEditingSession,
                               public nsIWebProgressListener,
                               public nsSupportsWeakReference
{
public:

  nsEditingSession();

  // nsISupports
  NS_DECL_ISUPPORTS

  // nsIWebProgressListener
  NS_DECL_NSIWEBPROGRESSLISTENER

  // nsIEditingSession
  NS_DECL_NSIEDITINGSESSION

protected:
  virtual         ~nsEditingSession();

  nsresult        SetupEditorCommandController(const char *aControllerClassName,
                                               mozIDOMWindowProxy* aWindow,
                                               nsISupports *aContext,
                                               uint32_t *aControllerId);

  nsresult        SetContextOnControllerById(nsIControllers* aControllers,
                                            nsISupports* aContext,
                                            uint32_t aID);

  nsresult        PrepareForEditing(nsPIDOMWindowOuter* aWindow);

  static void     TimerCallback(nsITimer *aTimer, void *aClosure);
  nsCOMPtr<nsITimer>  mLoadBlankDocTimer;

  // progress load stuff
  nsresult        StartDocumentLoad(nsIWebProgress *aWebProgress,
                                    bool isToBeMadeEditable);
  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,
                                                nsIEditor *aEditor);

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<nsComposerCommandsUpdater> mStateMaintainer;

  // 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__