diff options
Diffstat (limited to 'dom/base/nsScriptNameSpaceManager.h')
-rw-r--r-- | dom/base/nsScriptNameSpaceManager.h | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/dom/base/nsScriptNameSpaceManager.h b/dom/base/nsScriptNameSpaceManager.h new file mode 100644 index 000000000..3817e2c9c --- /dev/null +++ b/dom/base/nsScriptNameSpaceManager.h @@ -0,0 +1,177 @@ +/* -*- 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/. + * + * + * This Original Code has been modified by IBM Corporation. + * Modifications made by IBM described herein are + * Copyright (c) International Business Machines + * Corporation, 2000 + * + * Modifications to Mozilla code or documentation + * identified per MPL Section 3.3 + * + * Date Modified by Description of modification + * 03/27/2000 IBM Corp. Added PR_CALLBACK for Optlink + * use in OS2 + */ + +#ifndef nsScriptNameSpaceManager_h__ +#define nsScriptNameSpaceManager_h__ + +#include "mozilla/MemoryReporting.h" +#include "nsBaseHashtable.h" +#include "nsIMemoryReporter.h" +#include "nsIScriptNameSpaceManager.h" +#include "nsString.h" +#include "nsID.h" +#include "PLDHashTable.h" +#include "nsDOMClassInfo.h" +#include "nsIObserver.h" +#include "nsWeakReference.h" +#include "xpcpublic.h" + +struct nsGlobalNameStruct +{ + enum nametype { + eTypeNotInitialized, + eTypeProperty, + eTypeExternalConstructor, + eTypeClassConstructor, + eTypeClassProto, + } mType; + + bool mChromeOnly : 1; + bool mAllowXBL : 1; + + union { + int32_t mDOMClassInfoID; // eTypeClassConstructor + nsIID mIID; // eTypeClassProto + nsCID mCID; // All other types + }; +}; + +class GlobalNameMapEntry : public PLDHashEntryHdr +{ +public: + // Our hash table ops don't care about the order of these members. + nsString mKey; + nsGlobalNameStruct mGlobalName; + + size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const { + // Measurement of the following members may be added later if DMD finds it + // is worthwhile: + // - mGlobalName + return mKey.SizeOfExcludingThisIfUnshared(aMallocSizeOf); + } +}; + +class nsICategoryManager; + +class nsScriptNameSpaceManager : public nsIObserver, + public nsSupportsWeakReference, + public nsIMemoryReporter +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSIOBSERVER + NS_DECL_NSIMEMORYREPORTER + + nsScriptNameSpaceManager(); + + nsresult Init(); + + // Returns a nsGlobalNameStruct for aName, or null if one is not + // found. The returned nsGlobalNameStruct is only guaranteed to be + // valid until the next call to any of the methods in this class. + // It also returns a pointer to the string buffer of the classname + // in the nsGlobalNameStruct. + const nsGlobalNameStruct* LookupName(const nsAString& aName, + const char16_t **aClassName = nullptr); + + nsresult RegisterClassName(const char *aClassName, + int32_t aDOMClassInfoID, + bool aPrivileged, + bool aXBLAllowed, + const char16_t **aResult); + + nsresult RegisterClassProto(const char *aClassName, + const nsIID *aConstructorProtoIID, + bool *aFoundOld); + + class NameIterator : public PLDHashTable::Iterator + { + public: + typedef PLDHashTable::Iterator Base; + explicit NameIterator(PLDHashTable* aTable) : Base(aTable) {} + NameIterator(NameIterator&& aOther) : Base(mozilla::Move(aOther.mTable)) {} + + const GlobalNameMapEntry* Get() const + { + return static_cast<const GlobalNameMapEntry*>(Base::Get()); + } + + private: + NameIterator() = delete; + NameIterator(const NameIterator&) = delete; + NameIterator& operator=(const NameIterator&) = delete; + NameIterator& operator=(const NameIterator&&) = delete; + }; + + NameIterator GlobalNameIter() { return NameIterator(&mGlobalNames); } + + size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const; + +private: + virtual ~nsScriptNameSpaceManager(); + + // Adds a new entry to the hash and returns the nsGlobalNameStruct + // that aKey will be mapped to. If mType in the returned + // nsGlobalNameStruct is != eTypeNotInitialized, an entry for aKey + // already existed. + nsGlobalNameStruct *AddToHash(const char *aKey, + const char16_t **aClassName = nullptr); + + // Removes an existing entry from the hash. + void RemoveFromHash(const nsAString *aKey); + + nsresult FillHash(nsICategoryManager *aCategoryManager, + const char *aCategory); + + /** + * Add a new category entry into the hash table. + * Only some categories can be added (see the beginning of the definition). + * The other ones will be ignored. + * + * @aCategoryManager Instance of the category manager service. + * @aCategory Category where the entry comes from. + * @aEntry The entry that should be added. + */ + nsresult AddCategoryEntryToHash(nsICategoryManager* aCategoryManager, + const char* aCategory, + nsISupports* aEntry); + + /** + * Remove an existing category entry from the hash table. + * Only some categories can be removed (see the beginning of the definition). + * The other ones will be ignored. + * + * @aCategory Category where the entry will be removed from. + * @aEntry The entry that should be removed. + */ + nsresult RemoveCategoryEntryFromHash(nsICategoryManager* aCategoryManager, + const char* aCategory, + nsISupports* aEntry); + + // common helper for AddCategoryEntryToHash and RemoveCategoryEntryFromHash + nsresult OperateCategoryEntryHash(nsICategoryManager* aCategoryManager, + const char* aCategory, + nsISupports* aEntry, + bool aRemove); + + PLDHashTable mGlobalNames; +}; + +#endif /* nsScriptNameSpaceManager_h__ */ |