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.

Mercurial (1aeaa33a64f9)

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 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 nsIDocumentObserver_h___
#define nsIDocumentObserver_h___

#include "mozilla/EventStates.h"
#include "mozilla/StyleSheet.h"
#include "nsISupports.h"
#include "nsIMutationObserver.h"

class nsIContent;
class nsIDocument;

#define NS_IDOCUMENT_OBSERVER_IID                    \
  {                                                  \
    0x71041fa3, 0x6dd7, 0x4cde, {                    \
      0xbb, 0x76, 0xae, 0xcc, 0x69, 0xe1, 0x75, 0x78 \
    }                                                \
  }

typedef uint32_t nsUpdateType;

#define UPDATE_CONTENT_MODEL 0x00000001
#define UPDATE_STYLE 0x00000002
#define UPDATE_ALL (UPDATE_CONTENT_MODEL | UPDATE_STYLE)

// Document observer interface
class nsIDocumentObserver : public nsIMutationObserver {
 public:
  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IDOCUMENT_OBSERVER_IID)

  /**
   * Notify that a content model update is beginning. This call can be
   * nested.
   */
  virtual void BeginUpdate(nsIDocument* aDocument,
                           nsUpdateType aUpdateType) = 0;

  /**
   * Notify that a content model update is finished. This call can be
   * nested.
   */
  virtual void EndUpdate(nsIDocument* aDocument, nsUpdateType aUpdateType) = 0;

  /**
   * Notify the observer that a document load is beginning.
   */
  virtual void BeginLoad(nsIDocument* aDocument) = 0;

  /**
   * Notify the observer that a document load has finished. Note that
   * the associated reflow of the document will be done <b>before</b>
   * EndLoad is invoked, not after.
   */
  virtual void EndLoad(nsIDocument* aDocument) = 0;

  /**
   * Notification that the state of a content node has changed.
   * (ie: gained or lost focus, became active or hovered over)
   * This method is called automatically by content objects
   * when their state is changed (therefore there is normally
   * no need to invoke this method directly).  The notification
   * is passed to any IDocumentObservers. The notification is
   * passed on to all of the document observers. <p>
   *
   * This notification is not sent when a piece of content is
   * added/removed from the document or the content itself changed
   * (the other notifications are used for that).
   *
   * @param aDocument The document being observed
   * @param aContent the piece of content that changed
   */
  virtual void ContentStateChanged(nsIDocument* aDocument, nsIContent* aContent,
                                   mozilla::EventStates aStateMask) = 0;

  /**
   * Notification that the state of the document has changed.
   *
   * @param aDocument The document being observed
   * @param aStateMask the state that changed
   */
  virtual void DocumentStatesChanged(nsIDocument* aDocument,
                                     mozilla::EventStates aStateMask) = 0;

  /**
   * A StyleSheet has just been added to the document.  This method is
   * called automatically when a StyleSheet gets added to the
   * document, even if the stylesheet is not applicable. The
   * notification is passed on to all of the document observers.
   *
   * @param aStyleSheet the StyleSheet that has been added
   * @param aDocumentSheet True if sheet is in document's style sheet list,
   *                       false if sheet is not (i.e., UA or user sheet)
   */
  virtual void StyleSheetAdded(mozilla::StyleSheet* aStyleSheet,
                               bool aDocumentSheet) = 0;

  /**
   * A StyleSheet has just been removed from the document.  This
   * method is called automatically when a StyleSheet gets removed
   * from the document, even if the stylesheet is not applicable. The
   * notification is passed on to all of the document observers.
   *
   * @param aStyleSheet the StyleSheet that has been removed
   * @param aDocumentSheet True if sheet is in document's style sheet list,
   *                       false if sheet is not (i.e., UA or user sheet)
   */
  virtual void StyleSheetRemoved(mozilla::StyleSheet* aStyleSheet,
                                 bool aDocumentSheet) = 0;

  /**
   * A StyleSheet has just changed its applicable state.
   * This method is called automatically when the applicable state
   * of a StyleSheet gets changed. The style sheet passes this
   * notification to the document. The notification is passed on
   * to all of the document observers.
   *
   * @param aStyleSheet the StyleSheet that has changed state
   */
  virtual void StyleSheetApplicableStateChanged(
      mozilla::StyleSheet* aStyleSheet) = 0;
};

NS_DEFINE_STATIC_IID_ACCESSOR(nsIDocumentObserver, NS_IDOCUMENT_OBSERVER_IID)

#define NS_DECL_NSIDOCUMENTOBSERVER_BEGINUPDATE                              \
  virtual void BeginUpdate(nsIDocument* aDocument, nsUpdateType aUpdateType) \
      override;

#define NS_DECL_NSIDOCUMENTOBSERVER_ENDUPDATE                              \
  virtual void EndUpdate(nsIDocument* aDocument, nsUpdateType aUpdateType) \
      override;

#define NS_DECL_NSIDOCUMENTOBSERVER_BEGINLOAD \
  virtual void BeginLoad(nsIDocument* aDocument) override;

#define NS_DECL_NSIDOCUMENTOBSERVER_ENDLOAD \
  virtual void EndLoad(nsIDocument* aDocument) override;

#define NS_DECL_NSIDOCUMENTOBSERVER_CONTENTSTATECHANGED    \
  virtual void ContentStateChanged(nsIDocument* aDocument, \
                                   nsIContent* aContent,   \
                                   mozilla::EventStates aStateMask) override;

#define NS_DECL_NSIDOCUMENTOBSERVER_DOCUMENTSTATESCHANGED \
  virtual void DocumentStatesChanged(                     \
      nsIDocument* aDocument, mozilla::EventStates aStateMask) override;

#define NS_DECL_NSIDOCUMENTOBSERVER_STYLESHEETADDED              \
  virtual void StyleSheetAdded(mozilla::StyleSheet* aStyleSheet, \
                               bool aDocumentSheet) override;

#define NS_DECL_NSIDOCUMENTOBSERVER_STYLESHEETREMOVED              \
  virtual void StyleSheetRemoved(mozilla::StyleSheet* aStyleSheet, \
                                 bool aDocumentSheet) override;

#define NS_DECL_NSIDOCUMENTOBSERVER_STYLESHEETAPPLICABLESTATECHANGED \
  virtual void StyleSheetApplicableStateChanged(                     \
      mozilla::StyleSheet* aStyleSheet) override;

#define NS_DECL_NSIDOCUMENTOBSERVER                            \
  NS_DECL_NSIDOCUMENTOBSERVER_BEGINUPDATE                      \
  NS_DECL_NSIDOCUMENTOBSERVER_ENDUPDATE                        \
  NS_DECL_NSIDOCUMENTOBSERVER_BEGINLOAD                        \
  NS_DECL_NSIDOCUMENTOBSERVER_ENDLOAD                          \
  NS_DECL_NSIDOCUMENTOBSERVER_CONTENTSTATECHANGED              \
  NS_DECL_NSIDOCUMENTOBSERVER_DOCUMENTSTATESCHANGED            \
  NS_DECL_NSIDOCUMENTOBSERVER_STYLESHEETADDED                  \
  NS_DECL_NSIDOCUMENTOBSERVER_STYLESHEETREMOVED                \
  NS_DECL_NSIDOCUMENTOBSERVER_STYLESHEETAPPLICABLESTATECHANGED \
  NS_DECL_NSIMUTATIONOBSERVER

#define NS_IMPL_NSIDOCUMENTOBSERVER_CORE_STUB(_class)                          \
  void _class::BeginUpdate(nsIDocument* aDocument, nsUpdateType aUpdateType) { \
  }                                                                            \
  void _class::EndUpdate(nsIDocument* aDocument, nsUpdateType aUpdateType) {}  \
  NS_IMPL_NSIMUTATIONOBSERVER_CORE_STUB(_class)

#define NS_IMPL_NSIDOCUMENTOBSERVER_LOAD_STUB(_class) \
  void _class::BeginLoad(nsIDocument* aDocument) {}   \
  void _class::EndLoad(nsIDocument* aDocument) {}

#define NS_IMPL_NSIDOCUMENTOBSERVER_STATE_STUB(_class)                 \
  void _class::ContentStateChanged(nsIDocument* aDocument,             \
                                   nsIContent* aContent,               \
                                   mozilla::EventStates aStateMask) {} \
                                                                       \
  void _class::DocumentStatesChanged(nsIDocument* aDocument,           \
                                     mozilla::EventStates aStateMask) {}

#define NS_IMPL_NSIDOCUMENTOBSERVER_CONTENT(_class) \
  NS_IMPL_NSIMUTATIONOBSERVER_CONTENT(_class)

#define NS_IMPL_NSIDOCUMENTOBSERVER_STYLE_STUB(_class)             \
  void _class::StyleSheetAdded(mozilla::StyleSheet* aStyleSheet,   \
                               bool aDocumentSheet) {}             \
  void _class::StyleSheetRemoved(mozilla::StyleSheet* aStyleSheet, \
                                 bool aDocumentSheet) {}           \
  void _class::StyleSheetApplicableStateChanged(                   \
      mozilla::StyleSheet* aStyleSheet) {}

#endif /* nsIDocumentObserver_h___ */