dom/xbl/nsBindingManager.h

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #ifndef nsBindingManager_h_
     7 #define nsBindingManager_h_
     9 #include "nsIContent.h"
    10 #include "nsStubMutationObserver.h"
    11 #include "nsHashKeys.h"
    12 #include "nsInterfaceHashtable.h"
    13 #include "nsRefPtrHashtable.h"
    14 #include "nsURIHashKey.h"
    15 #include "nsCycleCollectionParticipant.h"
    16 #include "nsXBLBinding.h"
    17 #include "nsTArray.h"
    18 #include "nsThreadUtils.h"
    20 struct ElementDependentRuleProcessorData;
    21 class nsIXPConnectWrappedJS;
    22 class nsIAtom;
    23 class nsIDOMNodeList;
    24 class nsIDocument;
    25 class nsIURI;
    26 class nsXBLDocumentInfo;
    27 class nsIStreamListener;
    28 class nsStyleSet;
    29 class nsXBLBinding;
    30 template<class E> class nsRefPtr;
    31 typedef nsTArray<nsRefPtr<nsXBLBinding> > nsBindingList;
    32 class nsIPrincipal;
    33 class nsCSSStyleSheet;
    35 class nsBindingManager MOZ_FINAL : public nsStubMutationObserver
    36 {
    37 public:
    38   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
    40   NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED
    41   NS_DECL_NSIMUTATIONOBSERVER_CONTENTINSERTED
    42   NS_DECL_NSIMUTATIONOBSERVER_CONTENTREMOVED
    44   nsBindingManager(nsIDocument* aDocument);
    45   ~nsBindingManager();
    47   nsXBLBinding* GetBindingWithContent(nsIContent* aContent);
    49   void AddBoundContent(nsIContent* aContent);
    50   void RemoveBoundContent(nsIContent* aContent);
    52   /**
    53    * Notify the binding manager that an element
    54    * has been removed from its document,
    55    * so that it can update any bindings or
    56    * nsIAnonymousContentCreator-created anonymous
    57    * content that may depend on the document.
    58    * @param aContent the element that's being moved
    59    * @param aOldDocument the old document in which the
    60    *   content resided.
    61    */
    62   void RemovedFromDocument(nsIContent* aContent, nsIDocument* aOldDocument)
    63   {
    64     if (aContent->HasFlag(NODE_MAY_BE_IN_BINDING_MNGR)) {
    65       RemovedFromDocumentInternal(aContent, aOldDocument);
    66     }
    67   }
    68   void RemovedFromDocumentInternal(nsIContent* aContent,
    69                                    nsIDocument* aOldDocument);
    71   nsIAtom* ResolveTag(nsIContent* aContent, int32_t* aNameSpaceID);
    73   /**
    74    * Return the nodelist of "anonymous" kids for this node.  This might
    75    * actually include some of the nodes actual DOM kids, if there are
    76    * <children> tags directly as kids of <content>.  This will only end up
    77    * returning a non-null list for nodes which have a binding attached.
    78    */
    79   nsresult GetAnonymousNodesFor(nsIContent* aContent, nsIDOMNodeList** aResult);
    80   nsINodeList* GetAnonymousNodesFor(nsIContent* aContent);
    82   nsresult ClearBinding(nsIContent* aContent);
    83   nsresult LoadBindingDocument(nsIDocument* aBoundDoc, nsIURI* aURL,
    84                                nsIPrincipal* aOriginPrincipal);
    86   nsresult AddToAttachedQueue(nsXBLBinding* aBinding);
    87   void RemoveFromAttachedQueue(nsXBLBinding* aBinding);
    88   void ProcessAttachedQueue(uint32_t aSkipSize = 0);
    90   void ExecuteDetachedHandlers();
    92   nsresult PutXBLDocumentInfo(nsXBLDocumentInfo* aDocumentInfo);
    93   nsXBLDocumentInfo* GetXBLDocumentInfo(nsIURI* aURI);
    94   void RemoveXBLDocumentInfo(nsXBLDocumentInfo* aDocumentInfo);
    96   nsresult PutLoadingDocListener(nsIURI* aURL, nsIStreamListener* aListener);
    97   nsIStreamListener* GetLoadingDocListener(nsIURI* aURL);
    98   void RemoveLoadingDocListener(nsIURI* aURL);
   100   void FlushSkinBindings();
   102   nsresult GetBindingImplementation(nsIContent* aContent, REFNSIID aIID, void** aResult);
   104   // Style rule methods
   105   nsresult WalkRules(nsIStyleRuleProcessor::EnumFunc aFunc,
   106                      ElementDependentRuleProcessorData* aData,
   107                      bool* aCutOffInheritance);
   109   void WalkAllRules(nsIStyleRuleProcessor::EnumFunc aFunc,
   110                     ElementDependentRuleProcessorData* aData);
   111   /**
   112    * Do any processing that needs to happen as a result of a change in
   113    * the characteristics of the medium, and return whether this rule
   114    * processor's rules have changed (e.g., because of media queries).
   115    */
   116   nsresult MediumFeaturesChanged(nsPresContext* aPresContext,
   117                                  bool* aRulesChanged);
   119   void AppendAllSheets(nsTArray<nsCSSStyleSheet*>& aArray);
   121   NS_HIDDEN_(void) Traverse(nsIContent *aContent,
   122                             nsCycleCollectionTraversalCallback &cb);
   124   NS_DECL_CYCLE_COLLECTION_CLASS(nsBindingManager)
   126   // Notify the binding manager when an outermost update begins and
   127   // ends.  The end method can execute script.
   128   void BeginOutermostUpdate();
   129   void EndOutermostUpdate();
   131   // When removing an insertion point or a parent of one, clear the insertion
   132   // points and their insertion parents.
   133   void ClearInsertionPointsRecursively(nsIContent* aContent);
   135   // Called when the document is going away
   136   void DropDocumentReference();
   138   nsIContent* FindNestedInsertionPoint(nsIContent* aContainer,
   139                                        nsIContent* aChild);
   141   nsIContent* FindNestedSingleInsertionPoint(nsIContent* aContainer, bool* aMulti);
   143 protected:
   144   nsIXPConnectWrappedJS* GetWrappedJS(nsIContent* aContent);
   145   nsresult SetWrappedJS(nsIContent* aContent, nsIXPConnectWrappedJS* aResult);
   147   // Called by ContentAppended and ContentInserted to handle a single child
   148   // insertion.  aChild must not be null.  aContainer may be null.
   149   // aIndexInContainer is the index of the child in the parent.  aAppend is
   150   // true if this child is being appended, not inserted.
   151   void HandleChildInsertion(nsIContent* aContainer, nsIContent* aChild,
   152                             uint32_t aIndexInContainer, bool aAppend);
   154   // Same as ProcessAttachedQueue, but also nulls out
   155   // mProcessAttachedQueueEvent
   156   void DoProcessAttachedQueue();
   158   // Post an event to process the attached queue.
   159   void PostProcessAttachedQueueEvent();
   161 // MEMBER VARIABLES
   162 protected:
   163   // A set of nsIContent that currently have a binding installed.
   164   nsAutoPtr<nsTHashtable<nsRefPtrHashKey<nsIContent> > > mBoundContentSet;
   166   // A mapping from nsIContent* to nsIXPWrappedJS* (an XPConnect
   167   // wrapper for JS objects).  For XBL bindings that implement XPIDL
   168   // interfaces, and that get referred to from C++, this table caches
   169   // the XPConnect wrapper for the binding.  By caching it, I control
   170   // its lifetime, and I prevent a re-wrap of the same script object
   171   // (in the case where multiple bindings in an XBL inheritance chain
   172   // both implement an XPIDL interface).
   173   typedef nsInterfaceHashtable<nsISupportsHashKey, nsIXPConnectWrappedJS> WrapperHashtable;
   174   nsAutoPtr<WrapperHashtable> mWrapperTable;
   176   // A mapping from a URL (a string) to nsXBLDocumentInfo*.  This table
   177   // is the cache of all binding documents that have been loaded by a
   178   // given bound document.
   179   nsAutoPtr<nsRefPtrHashtable<nsURIHashKey,nsXBLDocumentInfo> > mDocumentTable;
   181   // A mapping from a URL (a string) to a nsIStreamListener. This
   182   // table is the currently loading binding docs.  If they're in this
   183   // table, they have not yet finished loading.
   184   nsAutoPtr<nsInterfaceHashtable<nsURIHashKey,nsIStreamListener> > mLoadingDocTable;
   186   // A queue of binding attached event handlers that are awaiting execution.
   187   nsBindingList mAttachedStack;
   188   bool mProcessingAttachedStack;
   189   bool mDestroyed;
   190   uint32_t mAttachedStackSizeOnOutermost;
   192   // Our posted event to process the attached queue, if any
   193   friend class nsRunnableMethod<nsBindingManager>;
   194   nsRefPtr< nsRunnableMethod<nsBindingManager> > mProcessAttachedQueueEvent;
   196   // Our document.  This is a weak ref; the document owns us
   197   nsIDocument* mDocument;
   198 };
   200 #endif

mercurial