DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (e5ef045527c6)

VCS Links

Line Code
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 170
/* -*- 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;

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(nsIDocShell& aDocShell);

  /**
   * Restore JS and plugins (enable/disable them) according to the state they
   * were before the last call to disableJSAndPlugins.
   */
  nsresult RestoreJSAndPlugins(nsPIDOMWindowOuter* 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__