Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  nsNodeInfoManager.h   Sprache: C

 
/* -*- 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/. */


/*
 * A class for handing out nodeinfos and ensuring sharing of them as needed.
 */


#ifndef nsNodeInfoManager_h___
#define nsNodeInfoManager_h___

#include "mozilla/Attributes.h"  // for final
#include "mozilla/dom/NodeInfo.h"
#include "mozilla/dom/DOMArena.h"
#include "mozilla/MruCache.h"
#include "nsCOMPtr.h"                      // for member
#include "nsCycleCollectionParticipant.h"  // for NS_DECL_CYCLE_*
#include "nsTHashMap.h"
#include "nsStringFwd.h"

class nsAtom;
class nsIPrincipal;
class nsWindowSizes;
template <class T>
struct already_AddRefed;

namespace mozilla::dom {
class Document;
}  // namespace mozilla::dom

class nsNodeInfoManager final {
 private:
  ~nsNodeInfoManager();

 public:
  explicit nsNodeInfoManager(mozilla::dom::Document* aDocument,
                             nsIPrincipal* aPrincipal);

  NS_DECL_CYCLE_COLLECTION_SKIPPABLE_NATIVE_CLASS(nsNodeInfoManager)

  NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(nsNodeInfoManager)

  /**
   * Release the reference to the document, this will be called when
   * the document is going away.
   */

  void DropDocumentReference();

  /**
   * Methods for creating nodeinfo's from atoms and/or strings.
   */

  already_AddRefed<mozilla::dom::NodeInfo> GetNodeInfo(
      nsAtom* aName, nsAtom* aPrefix, int32_t aNamespaceID, uint16_t aNodeType,
      nsAtom* aExtraName = nullptr);
  nsresult GetNodeInfo(const nsAString& aName, nsAtom* aPrefix,
                       int32_t aNamespaceID, uint16_t aNodeType,
                       mozilla::dom::NodeInfo** aNodeInfo);
  nsresult GetNodeInfo(const nsAString& aName, nsAtom* aPrefix,
                       const nsAString& aNamespaceURI, uint16_t aNodeType,
                       mozilla::dom::NodeInfo** aNodeInfo);

  /**
   * Returns the nodeinfo for text nodes. Can return null if OOM.
   */

  already_AddRefed<mozilla::dom::NodeInfo> GetTextNodeInfo();

  /**
   * Returns the nodeinfo for comment nodes. Can return null if OOM.
   */

  already_AddRefed<mozilla::dom::NodeInfo> GetCommentNodeInfo();

  /**
   * Returns the nodeinfo for the document node. Can return null if OOM.
   */

  already_AddRefed<mozilla::dom::NodeInfo> GetDocumentNodeInfo();

  /**
   * Retrieve a pointer to the document that owns this node info
   * manager.
   */

  mozilla::dom::Document* GetDocument() const { return mDocument; }

  /**
   * Gets the principal of the document this nodeinfo manager belongs to.
   */

  nsIPrincipal* DocumentPrincipal() const {
    NS_ASSERTION(mPrincipal, "How'd that happen?");
    return mPrincipal;
  }

  void RemoveNodeInfo(mozilla::dom::NodeInfo* aNodeInfo);

  /**
   * Returns true if SVG nodes in this document have real SVG semantics.
   */

  bool SVGEnabled() {
    return mSVGEnabled.valueOrFrom([this] { return InternalSVGEnabled(); });
  }

  /**
   * Returns true if MathML nodes in this document have real MathML semantics.
   */

  bool MathMLEnabled() {
    return mMathMLEnabled.valueOrFrom(
        [this] { return InternalMathMLEnabled(); });
  }

  mozilla::dom::DOMArena* GetArenaAllocator() { return mArena; }
  void SetArenaAllocator(mozilla::dom::DOMArena* aArena);

  void* Allocate(size_t aSize);

  void Free(void* aPtr) { free(aPtr); }

  bool HasAllocated() { return mHasAllocated; }

  void AddSizeOfIncludingThis(nsWindowSizes& aSizes) const;

 protected:
  friend class mozilla::dom::Document;
  friend class nsXULPrototypeDocument;

  /**
   * Sets the principal of the document this nodeinfo manager belongs to.
   */

  void SetDocumentPrincipal(nsIPrincipal* aPrincipal);

 private:
  bool InternalSVGEnabled();
  bool InternalMathMLEnabled();

  class NodeInfoInnerKey
      : public nsPtrHashKey<mozilla::dom::NodeInfo::NodeInfoInner> {
   public:
    explicit NodeInfoInnerKey(KeyTypePointer aKey) : nsPtrHashKey(aKey) {}
    NodeInfoInnerKey(NodeInfoInnerKey&&) = default;
    ~NodeInfoInnerKey() = default;
    bool KeyEquals(KeyTypePointer aKey) const { return *mKey == *aKey; }
    static PLDHashNumber HashKey(KeyTypePointer aKey) { return aKey->Hash(); }
  };

  struct NodeInfoCache
      : public mozilla::MruCache<mozilla::dom::NodeInfo::NodeInfoInner,
                                 mozilla::dom::NodeInfo*, NodeInfoCache> {
    static mozilla::HashNumber Hash(
        const mozilla::dom::NodeInfo::NodeInfoInner& aKey) {
      return aKey.Hash();
    }
    static bool Match(const mozilla::dom::NodeInfo::NodeInfoInner& aKey,
                      const mozilla::dom::NodeInfo* aVal) {
      return (aKey.Hash() == aVal->mInner.Hash()) && (aKey == aVal->mInner);
    }
  };

  nsTHashMap<NodeInfoInnerKey, mozilla::dom::NodeInfo*> mNodeInfoHash;
  mozilla::dom::Document* MOZ_NON_OWNING_REF mDocument;  // WEAK
  uint32_t mNonDocumentNodeInfos;

  // Note: it's important that mPrincipal is declared before mDefaultPrincipal,
  // since the latter is initialized to the value of the former in the
  // constructor's init list:
  nsCOMPtr<nsIPrincipal> mPrincipal;         // Never null
  nsCOMPtr<nsIPrincipal> mDefaultPrincipal;  // Never null

  mozilla::dom::NodeInfo* MOZ_NON_OWNING_REF
      mTextNodeInfo;  // WEAK to avoid circular ownership
  mozilla::dom::NodeInfo* MOZ_NON_OWNING_REF
      mCommentNodeInfo;  // WEAK to avoid circular ownership
  mozilla::dom::NodeInfo* MOZ_NON_OWNING_REF
      mDocumentNodeInfo;  // WEAK to avoid circular ownership
  NodeInfoCache mRecentlyUsedNodeInfos;
  mozilla::Maybe<bool> mSVGEnabled;     // Lazily initialized.
  mozilla::Maybe<bool> mMathMLEnabled;  // Lazily initialized.

  // For dom_arena_allocator_enabled
  RefPtr<mozilla::dom::DOMArena> mArena;
  bool mHasAllocated = false;
};

#endif /* nsNodeInfoManager_h___ */

100%


¤ Dauer der Verarbeitung: 0.27 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge