diff --git a/content/base/public/nsINodeInfo.h b/content/base/public/nsINodeInfo.h index 981e368b3b2c..8d3f216baf36 100644 --- a/content/base/public/nsINodeInfo.h +++ b/content/base/public/nsINodeInfo.h @@ -309,7 +309,7 @@ public: */ nsIDocument* GetDocument() const { - return mOwnerManager->GetDocument(); + return mDocument; } protected: @@ -359,6 +359,8 @@ protected: // nsNodeInfoManager needs to pass mInner to the hash table. friend class nsNodeInfoManager; + nsIDocument* mDocument; // Weak. Cache of mOwnerManager->mDocument + nsNodeInfoInner mInner; nsCOMPtr mIDAttributeAtom; diff --git a/content/base/src/nsNodeInfo.cpp b/content/base/src/nsNodeInfo.cpp index 8004e51915b4..e9e82ad4b3a7 100644 --- a/content/base/src/nsNodeInfo.cpp +++ b/content/base/src/nsNodeInfo.cpp @@ -120,6 +120,8 @@ nsNodeInfo::nsNodeInfo(nsIAtom *aName, nsIAtom *aPrefix, PRInt32 aNamespaceID, NS_ADDREF(mOwnerManager = aOwnerManager); NS_IF_ADDREF(mInner.mExtraName = aExtraName); + mDocument = aOwnerManager->GetDocument(); + // Now compute our cached members. // Qualified name. If we have no prefix, use ToString on diff --git a/content/base/src/nsNodeInfoManager.cpp b/content/base/src/nsNodeInfoManager.cpp index c57556451454..66c5ab7ff2d6 100644 --- a/content/base/src/nsNodeInfoManager.cpp +++ b/content/base/src/nsNodeInfoManager.cpp @@ -194,6 +194,14 @@ nsNodeInfoManager::Init(nsIDocument *aDocument) return NS_OK; } +// static +PRIntn +nsNodeInfoManager::DropNodeInfoDocument(PLHashEntry *he, PRIntn hashIndex, void *arg) +{ + static_cast(he->value)->mDocument = nsnull; + return HT_ENUMERATE_NEXT; +} + void nsNodeInfoManager::DropDocumentReference() { @@ -201,6 +209,8 @@ nsNodeInfoManager::DropDocumentReference() mBindingManager->DropDocumentReference(); } + PL_HashTableEnumerateEntries(mNodeInfoHash, DropNodeInfoDocument, nsnull); + mDocument = nsnull; } diff --git a/content/base/src/nsNodeInfoManager.h b/content/base/src/nsNodeInfoManager.h index 02a23d8dc57f..87e3eab2f4d4 100644 --- a/content/base/src/nsNodeInfoManager.h +++ b/content/base/src/nsNodeInfoManager.h @@ -153,6 +153,8 @@ protected: private: static PRIntn NodeInfoInnerKeyCompare(const void *key1, const void *key2); static PLHashNumber GetNodeInfoInnerHashValue(const void *key); + static PRIntn DropNodeInfoDocument(PLHashEntry *he, PRIntn hashIndex, + void *arg); PLHashTable *mNodeInfoHash; nsIDocument *mDocument; // WEAK