From 2eaf19396dcf51eabf21cef3ad1b7953cdb041cd Mon Sep 17 00:00:00 2001 From: "peterv%propagandism.org" Date: Fri, 28 Mar 2008 14:09:03 +0000 Subject: [PATCH] Fix for bug 415192 (Crash (within nsCycleCollector::Shutdown and nsXBLBinding::RemoveInsertionParent) with , cloneNode). r/sr=sicking. git-svn-id: svn://10.0.0.236/trunk@248764 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/content/base/public/nsIDocument.h | 11 +++--- mozilla/content/base/src/nsContentSink.cpp | 11 +++--- mozilla/content/base/src/nsDOMAttribute.cpp | 1 + mozilla/content/base/src/nsDocument.cpp | 36 ++++++++----------- .../content/base/src/nsGenericDOMDataNode.cpp | 14 ++++++++ mozilla/content/base/src/nsGenericElement.cpp | 11 +++++- mozilla/content/base/src/nsNodeInfo.cpp | 16 +++++++-- mozilla/content/base/src/nsNodeInfo.h | 3 +- .../content/base/src/nsNodeInfoManager.cpp | 25 ++++++++++++- mozilla/content/base/src/nsNodeInfoManager.h | 12 +++++++ .../src/nsHTMLFragmentContentSink.cpp | 22 ++++++++++-- mozilla/content/xbl/src/nsBindingManager.cpp | 21 ++++++----- .../content/xul/content/src/nsXULElement.cpp | 6 ++++ .../document/src/nsXULPrototypeDocument.cpp | 2 ++ 14 files changed, 143 insertions(+), 48 deletions(-) diff --git a/mozilla/content/base/public/nsIDocument.h b/mozilla/content/base/public/nsIDocument.h index 6e8b8a0f3d6..e9b025cc13e 100644 --- a/mozilla/content/base/public/nsIDocument.h +++ b/mozilla/content/base/public/nsIDocument.h @@ -51,6 +51,7 @@ #include "nsIAtom.h" #include "nsCompatibility.h" #include "nsTObserverArray.h" +#include "nsNodeInfoManager.h" class nsIContent; class nsPresContext; @@ -80,7 +81,6 @@ class nsIObserver; class nsScriptLoader; class nsIContentSink; class nsIScriptEventManager; -class nsNodeInfoManager; class nsICSSLoader; class nsHTMLStyleSheet; class nsIHTMLCSSStyleSheet; @@ -97,8 +97,8 @@ class nsFrameLoader; // IID for the nsIDocument interface #define NS_IDOCUMENT_IID \ -{ 0xd76acf2e, 0x4b55, 0x420c, \ - { 0xaa, 0xbf, 0x5c, 0x4d, 0xbf, 0xc9, 0x81, 0x08 } } +{ 0x0cf9986f, 0x6e27, 0x4c24, \ + { 0x9f, 0x43, 0x87, 0x01, 0x52, 0xf7, 0x4c, 0x0a } } // Flag for AddStyleSheet(). #define NS_STYLESHEET_FROM_CATALOG (1 << 0) @@ -117,7 +117,6 @@ public: nsIDocument() : nsINode(nsnull), mCharacterSet(NS_LITERAL_CSTRING("ISO-8859-1")), - mBindingManager(nsnull), mNodeInfoManager(nsnull), mCompatMode(eCompatibility_FullStandards), mIsInitialDocumentInWindow(PR_FALSE), @@ -631,7 +630,7 @@ public: nsBindingManager* BindingManager() const { - return mBindingManager; + return mNodeInfoManager->GetBindingManager(); } /** @@ -966,7 +965,6 @@ protected: // releasing it) happens in the nsDocument destructor. We'd prefer to // do it here but nsNodeInfoManager is a concrete class that we don't // want to expose to users of the nsIDocument API outside of Gecko. - // XXX Same thing applies to mBindingManager } /** @@ -1001,7 +999,6 @@ protected: // We'd like these to be nsRefPtrs, but that'd require us to include // additional headers that we don't want to expose. // The cleanup is handled by the nsDocument destructor. - nsBindingManager* mBindingManager; // [STRONG] nsNodeInfoManager* mNodeInfoManager; // [STRONG] nsICSSLoader* mCSSLoader; // [STRONG] diff --git a/mozilla/content/base/src/nsContentSink.cpp b/mozilla/content/base/src/nsContentSink.cpp index 1f29329528d..f2caa26ceb5 100644 --- a/mozilla/content/base/src/nsContentSink.cpp +++ b/mozilla/content/base/src/nsContentSink.cpp @@ -165,12 +165,15 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsContentSink) if (tmp->mDocument) { tmp->mDocument->RemoveObserver(tmp); } -NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mDocument) -NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mParser) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mDocument) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mParser) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mNodeInfoManager) NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsContentSink) -NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mDocument) -NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mParser) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mDocument) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mParser) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_MEMBER(mNodeInfoManager, + nsNodeInfoManager) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END diff --git a/mozilla/content/base/src/nsDOMAttribute.cpp b/mozilla/content/base/src/nsDOMAttribute.cpp index 2a2e889d9b1..7b5500506ec 100644 --- a/mozilla/content/base/src/nsDOMAttribute.cpp +++ b/mozilla/content/base/src/nsDOMAttribute.cpp @@ -76,6 +76,7 @@ nsDOMAttribute::nsDOMAttribute(nsDOMAttributeMap *aAttrMap, NS_IMPL_CYCLE_COLLECTION_CLASS(nsDOMAttribute) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsDOMAttribute) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mNodeInfo) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mChild) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_LISTENERMANAGER NS_IMPL_CYCLE_COLLECTION_TRAVERSE_USERDATA diff --git a/mozilla/content/base/src/nsDocument.cpp b/mozilla/content/base/src/nsDocument.cpp index 22fe5121d7f..b80ece6a43c 100644 --- a/mozilla/content/base/src/nsDocument.cpp +++ b/mozilla/content/base/src/nsDocument.cpp @@ -881,11 +881,6 @@ nsDocument::~nsDocument() mStyleAttrStyleSheet->SetOwningDocument(nsnull); } - if (mBindingManager) { - mBindingManager->DropDocumentReference(); - NS_RELEASE(mBindingManager); - } - delete mHeaderData; if (mBoxObjectTable) { @@ -1025,6 +1020,8 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsDocument) return NS_OK; } + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mNodeInfo) + // Traverse the mChildren nsAttrAndChildArray. for (PRInt32 indx = PRInt32(tmp->mChildren.ChildCount()); indx > 0; --indx) { NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mChildren[i]"); @@ -1035,7 +1032,8 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsDocument) // Traverse all nsIDocument pointer members. NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mCachedRootContent) - NS_IMPL_CYCLE_COLLECTION_TRAVERSE_RAWPTR(mBindingManager) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_MEMBER(mNodeInfoManager, + nsNodeInfoManager) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mSecurityInfo) // Traverse all nsDocument nsCOMPtrs. @@ -1116,7 +1114,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END nsresult nsDocument::Init() { - if (mBindingManager || mCSSLoader || mNodeInfoManager || mScriptLoader) { + if (mCSSLoader || mNodeInfoManager || mScriptLoader) { return NS_ERROR_ALREADY_INITIALIZED; } @@ -1124,10 +1122,6 @@ nsDocument::Init() mRadioGroups.Init(); // Force initialization. - nsBindingManager *bindingManager = new nsBindingManager(this); - NS_ENSURE_TRUE(bindingManager, NS_ERROR_OUT_OF_MEMORY); - NS_ADDREF(mBindingManager = bindingManager); - nsINode::nsSlots* slots = GetSlots(); NS_ENSURE_TRUE(slots,NS_ERROR_OUT_OF_MEMORY); @@ -2707,7 +2701,7 @@ void nsDocument::BeginUpdate(nsUpdateType aUpdateType) { if (mUpdateNestLevel == 0) { - mBindingManager->BeginOutermostUpdate(); + BindingManager()->BeginOutermostUpdate(); } ++mUpdateNestLevel; @@ -2732,7 +2726,7 @@ nsDocument::EndUpdate(nsUpdateType aUpdateType) if (mUpdateNestLevel == 0) { // This set of updates may have created XBL bindings. Let the // binding manager know we're done. - mBindingManager->EndOutermostUpdate(); + BindingManager()->EndOutermostUpdate(); } if (mUpdateNestLevel == 0) { @@ -3514,7 +3508,7 @@ nsDocument::AddBinding(nsIDOMElement* aContent, const nsAString& aURI) subject = NodePrincipal(); } - return mBindingManager->AddLayeredBinding(content, uri, subject); + return BindingManager()->AddLayeredBinding(content, uri, subject); } NS_IMETHODIMP @@ -3534,7 +3528,7 @@ nsDocument::RemoveBinding(nsIDOMElement* aContent, const nsAString& aURI) } nsCOMPtr content(do_QueryInterface(aContent)); - return mBindingManager->RemoveLayeredBinding(content, uri); + return BindingManager()->RemoveLayeredBinding(content, uri); } NS_IMETHODIMP @@ -3560,7 +3554,7 @@ nsDocument::LoadBindingDocument(const nsAString& aURI) subject = NodePrincipal(); } - mBindingManager->LoadBindingDocument(this, uri, subject); + BindingManager()->LoadBindingDocument(this, uri, subject); return NS_OK; } @@ -3648,7 +3642,7 @@ nsDocument::GetAnonymousNodes(nsIDOMElement* aElement, *aResult = nsnull; nsCOMPtr content(do_QueryInterface(aElement)); - return mBindingManager->GetAnonymousNodesFor(content, aResult); + return BindingManager()->GetAnonymousNodesFor(content, aResult); } NS_IMETHODIMP @@ -3802,7 +3796,7 @@ nsDocument::GetBoxObjectFor(nsIDOMElement* aElement, nsIBoxObject** aResult) } PRInt32 namespaceID; - nsCOMPtr tag = mBindingManager->ResolveTag(content, &namespaceID); + nsCOMPtr tag = BindingManager()->ResolveTag(content, &namespaceID); nsCAutoString contractID("@mozilla.org/layout/xul-boxobject"); if (namespaceID == kNameSpaceID_XUL) { @@ -3857,19 +3851,19 @@ nsDocument::ClearBoxObjectFor(nsIContent* aContent) nsresult nsDocument::GetXBLChildNodesFor(nsIContent* aContent, nsIDOMNodeList** aResult) { - return mBindingManager->GetXBLChildNodesFor(aContent, aResult); + return BindingManager()->GetXBLChildNodesFor(aContent, aResult); } nsresult nsDocument::GetContentListFor(nsIContent* aContent, nsIDOMNodeList** aResult) { - return mBindingManager->GetContentListFor(aContent, aResult); + return BindingManager()->GetContentListFor(aContent, aResult); } void nsDocument::FlushSkinBindings() { - mBindingManager->FlushSkinBindings(); + BindingManager()->FlushSkinBindings(); } nsresult diff --git a/mozilla/content/base/src/nsGenericDOMDataNode.cpp b/mozilla/content/base/src/nsGenericDOMDataNode.cpp index 7d28235883c..1b99baa4f4b 100644 --- a/mozilla/content/base/src/nsGenericDOMDataNode.cpp +++ b/mozilla/content/base/src/nsGenericDOMDataNode.cpp @@ -61,6 +61,7 @@ #include "nsCOMArray.h" #include "nsNodeUtils.h" #include "nsBindingManager.h" +#include "nsCCUncollectableMarker.h" #include "pldhash.h" #include "prprf.h" @@ -79,6 +80,19 @@ nsGenericDOMDataNode::~nsGenericDOMDataNode() NS_IMPL_CYCLE_COLLECTION_CLASS(nsGenericDOMDataNode) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsGenericDOMDataNode) + nsIDocument* currentDoc = tmp->GetCurrentDoc(); + if (currentDoc && nsCCUncollectableMarker::InGeneration( + currentDoc->GetMarkedCCGeneration())) { + return NS_OK; + } + + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mNodeInfo) + + nsIDocument* ownerDoc = tmp->GetOwnerDoc(); + if (ownerDoc) { + ownerDoc->BindingManager()->Traverse(tmp, cb); + } + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_LISTENERMANAGER NS_IMPL_CYCLE_COLLECTION_TRAVERSE_USERDATA NS_IMPL_CYCLE_COLLECTION_TRAVERSE_PRESERVED_WRAPPER diff --git a/mozilla/content/base/src/nsGenericElement.cpp b/mozilla/content/base/src/nsGenericElement.cpp index 3b5709a681b..a5382247941 100644 --- a/mozilla/content/base/src/nsGenericElement.cpp +++ b/mozilla/content/base/src/nsGenericElement.cpp @@ -3506,9 +3506,16 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsGenericElement) cb.NoteXPCOMChild(property); } - // Traverse child content. + // Traverse attribute names and child content. { PRUint32 i; + PRUint32 attrs = tmp->mAttrsAndChildren.AttrCount(); + for (i = 0; i < attrs; i++) { + const nsAttrName* name = tmp->mAttrsAndChildren.AttrNameAt(i); + if (!name->IsAtom()) + cb.NoteXPCOMChild(name->NodeInfo()); + } + PRUint32 kids = tmp->mAttrsAndChildren.ChildCount(); for (i = 0; i < kids; i++) { NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mAttrsAndChildren[i]"); @@ -3516,6 +3523,8 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsGenericElement) } } + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mNodeInfo) + // Traverse any DOM slots of interest. { nsDOMSlots *slots = tmp->GetExistingDOMSlots(); diff --git a/mozilla/content/base/src/nsNodeInfo.cpp b/mozilla/content/base/src/nsNodeInfo.cpp index 8484670c4dd..b10091cd295 100644 --- a/mozilla/content/base/src/nsNodeInfo.cpp +++ b/mozilla/content/base/src/nsNodeInfo.cpp @@ -130,9 +130,19 @@ nsNodeInfo::Init(nsIAtom *aName, nsIAtom *aPrefix, PRInt32 aNamespaceID, // nsISupports -NS_IMPL_ADDREF(nsNodeInfo) -NS_IMPL_RELEASE_WITH_DESTROY(nsNodeInfo, LastRelease()) -NS_IMPL_QUERY_INTERFACE1(nsNodeInfo, nsINodeInfo) +NS_IMPL_CYCLE_COLLECTION_CLASS(nsNodeInfo) +NS_IMPL_CYCLE_COLLECTION_UNLINK_0(nsNodeInfo) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsNodeInfo) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_MEMBER(mOwnerManager, + nsNodeInfoManager) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END + +NS_IMPL_CYCLE_COLLECTING_ADDREF(nsNodeInfo) +NS_IMPL_CYCLE_COLLECTING_RELEASE_WITH_DESTROY(nsNodeInfo, LastRelease()) +NS_INTERFACE_TABLE_HEAD(nsNodeInfo) + NS_INTERFACE_TABLE1(nsNodeInfo, nsINodeInfo) + NS_INTERFACE_TABLE_TO_MAP_SEGUE_CYCLE_COLLECTION(nsNodeInfo) +NS_INTERFACE_MAP_END // nsINodeInfo diff --git a/mozilla/content/base/src/nsNodeInfo.h b/mozilla/content/base/src/nsNodeInfo.h index e0e44f5d3b6..cc6d07c87bc 100644 --- a/mozilla/content/base/src/nsNodeInfo.h +++ b/mozilla/content/base/src/nsNodeInfo.h @@ -55,7 +55,8 @@ class nsFixedSizeAllocator; class nsNodeInfo : public nsINodeInfo { public: - NS_DECL_ISUPPORTS + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_CLASS(nsNodeInfo) // nsINodeInfo virtual void GetQualifiedName(nsAString &aQualifiedName) const; diff --git a/mozilla/content/base/src/nsNodeInfoManager.cpp b/mozilla/content/base/src/nsNodeInfoManager.cpp index 1198e4cd16a..eb9a3c54649 100644 --- a/mozilla/content/base/src/nsNodeInfoManager.cpp +++ b/mozilla/content/base/src/nsNodeInfoManager.cpp @@ -52,6 +52,7 @@ #include "nsGkAtoms.h" #include "nsComponentManagerUtils.h" #include "nsLayoutStatics.h" +#include "nsBindingManager.h" #ifdef MOZ_LOGGING // so we can get logging even in release builds @@ -97,7 +98,8 @@ nsNodeInfoManager::nsNodeInfoManager() mPrincipal(nsnull), mTextNodeInfo(nsnull), mCommentNodeInfo(nsnull), - mDocumentNodeInfo(nsnull) + mDocumentNodeInfo(nsnull), + mBindingManager(nsnull) { nsLayoutStatics::AddRef(); @@ -124,6 +126,8 @@ nsNodeInfoManager::~nsNodeInfoManager() // Note: mPrincipal may be null here if we never got inited correctly NS_IF_RELEASE(mPrincipal); + NS_IF_RELEASE(mBindingManager); + #ifdef PR_LOGGING if (gNodeInfoManagerLeakPRLog) PR_LOG(gNodeInfoManagerLeakPRLog, PR_LOG_DEBUG, @@ -160,6 +164,14 @@ nsNodeInfoManager::Release() return count; } +NS_IMPL_CYCLE_COLLECTION_CLASS(nsNodeInfoManager) +NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(nsNodeInfoManager, AddRef) +NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(nsNodeInfoManager, Release) +NS_IMPL_CYCLE_COLLECTION_UNLINK_NATIVE_0(nsNodeInfoManager) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_BEGIN(nsNodeInfoManager) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_RAWPTR(mBindingManager) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END + nsresult nsNodeInfoManager::Init(nsIDocument *aDocument) { @@ -171,6 +183,13 @@ nsNodeInfoManager::Init(nsIDocument *aDocument) &mPrincipal); NS_ENSURE_TRUE(mPrincipal, rv); + if (aDocument) { + mBindingManager = new nsBindingManager(aDocument); + NS_ENSURE_TRUE(mBindingManager, NS_ERROR_OUT_OF_MEMORY); + + NS_ADDREF(mBindingManager); + } + mDefaultPrincipal = mPrincipal; mDocument = aDocument; @@ -187,6 +206,10 @@ nsNodeInfoManager::Init(nsIDocument *aDocument) void nsNodeInfoManager::DropDocumentReference() { + if (mBindingManager) { + mBindingManager->DropDocumentReference(); + } + mDocument = nsnull; } diff --git a/mozilla/content/base/src/nsNodeInfoManager.h b/mozilla/content/base/src/nsNodeInfoManager.h index d41e5f36d8a..d3fbf578fd9 100644 --- a/mozilla/content/base/src/nsNodeInfoManager.h +++ b/mozilla/content/base/src/nsNodeInfoManager.h @@ -44,6 +44,7 @@ #include "nsCOMPtr.h" // for already_AddRefed #include "plhash.h" +#include "nsCycleCollectionParticipant.h" class nsIAtom; class nsIDocument; @@ -57,6 +58,7 @@ class nsIDOMDocument; class nsAString; class nsIDOMNamedNodeMap; class nsXULPrototypeDocument; +class nsBindingManager; class nsNodeInfoManager { @@ -64,6 +66,8 @@ public: nsNodeInfoManager(); ~nsNodeInfoManager(); + NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(nsNodeInfoManager) + nsrefcnt AddRef(void); nsrefcnt Release(void); @@ -123,6 +127,11 @@ public: void RemoveNodeInfo(nsNodeInfo *aNodeInfo); + nsBindingManager* GetBindingManager() const + { + return mBindingManager; + } + protected: friend class nsDocument; friend class nsXULPrototypeDocument; @@ -158,6 +167,9 @@ private: nsINodeInfo *mTextNodeInfo; // WEAK to avoid circular ownership nsINodeInfo *mCommentNodeInfo; // WEAK to avoid circular ownership nsINodeInfo *mDocumentNodeInfo; // WEAK to avoid circular ownership + nsBindingManager* mBindingManager; // STRONG, but not nsCOMPtr to avoid + // include hell while inlining + // GetBindingManager(). }; #endif /* nsNodeInfoManager_h___ */ diff --git a/mozilla/content/html/document/src/nsHTMLFragmentContentSink.cpp b/mozilla/content/html/document/src/nsHTMLFragmentContentSink.cpp index 8248631c70f..de9700acc7f 100644 --- a/mozilla/content/html/document/src/nsHTMLFragmentContentSink.cpp +++ b/mozilla/content/html/document/src/nsHTMLFragmentContentSink.cpp @@ -239,8 +239,26 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsHTMLFragmentContentSink) NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIContentSink) NS_INTERFACE_MAP_END -NS_IMPL_CYCLE_COLLECTION_3(nsHTMLFragmentContentSink, mParser, mTargetDocument, - mRoot) +NS_IMPL_CYCLE_COLLECTION_CLASS(nsHTMLFragmentContentSink) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsHTMLFragmentContentSink) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mParser) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mTargetDocument) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mRoot) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mNodeInfoManager) +NS_IMPL_CYCLE_COLLECTION_UNLINK_END +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsHTMLFragmentContentSink) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mParser) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mTargetDocument) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mRoot) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_MEMBER(mNodeInfoManager, + nsNodeInfoManager) + { + PRUint32 i; + for (i = 0; i < NS_ARRAY_LENGTH(tmp->mNodeInfoCache); ++i) { + cb.NoteXPCOMChild(tmp->mNodeInfoCache[i]); + } + } +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMETHODIMP nsHTMLFragmentContentSink::WillBuildModel(void) diff --git a/mozilla/content/xbl/src/nsBindingManager.cpp b/mozilla/content/xbl/src/nsBindingManager.cpp index e68ba405aba..70507855439 100644 --- a/mozilla/content/xbl/src/nsBindingManager.cpp +++ b/mozilla/content/xbl/src/nsBindingManager.cpp @@ -1481,6 +1481,19 @@ nsBindingManager::Traverse(nsIContent *aContent, return; } + nsISupports *value; + if (mInsertionParentTable.ops && + (value = LookupObject(mInsertionParentTable, aContent))) { + NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "[via binding manager] mInsertionParentTable key"); + cb.NoteXPCOMChild(aContent); + NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "[via binding manager] mInsertionParentTable value"); + cb.NoteXPCOMChild(value); + } + + if (!aContent->IsNodeOfType(nsINode::eELEMENT)) { + return; + } + nsXBLBinding *binding = GetBinding(aContent); if (binding) { NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "[via binding manager] mBindingTable key"); @@ -1488,7 +1501,6 @@ nsBindingManager::Traverse(nsIContent *aContent, NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_PTR(binding, nsXBLBinding, "[via binding manager] mBindingTable value") } - nsISupports *value; if (mContentListTable.ops && (value = LookupObject(mContentListTable, aContent))) { NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "[via binding manager] mContentListTable key"); @@ -1503,13 +1515,6 @@ nsBindingManager::Traverse(nsIContent *aContent, NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "[via binding manager] mAnonymousNodesTable value"); cb.NoteXPCOMChild(value); } - if (mInsertionParentTable.ops && - (value = LookupObject(mInsertionParentTable, aContent))) { - NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "[via binding manager] mInsertionParentTable key"); - cb.NoteXPCOMChild(aContent); - NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "[via binding manager] mInsertionParentTable value"); - cb.NoteXPCOMChild(value); - } if (mWrapperTable.ops && (value = LookupObject(mWrapperTable, aContent))) { NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "[via binding manager] mWrapperTable key"); diff --git a/mozilla/content/xul/content/src/nsXULElement.cpp b/mozilla/content/xul/content/src/nsXULElement.cpp index 6b5269664be..3dd654175f9 100644 --- a/mozilla/content/xul/content/src/nsXULElement.cpp +++ b/mozilla/content/xul/content/src/nsXULElement.cpp @@ -2550,7 +2550,13 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_BEGIN(nsXULPrototypeNode) if (tmp->mType == nsXULPrototypeNode::eType_Element) { nsXULPrototypeElement *elem = static_cast(tmp); + cb.NoteXPCOMChild(elem->mNodeInfo); PRUint32 i; + for (i = 0; i < elem->mNumAttributes; ++i) { + const nsAttrName& name = elem->mAttributes[i].mName; + if (!name.IsAtom()) + cb.NoteXPCOMChild(name.NodeInfo()); + } for (i = 0; i < elem->mNumChildren; ++i) { NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_PTR(elem->mChildren[i], nsXULPrototypeNode, diff --git a/mozilla/content/xul/document/src/nsXULPrototypeDocument.cpp b/mozilla/content/xul/document/src/nsXULPrototypeDocument.cpp index 37a0aa0238c..80c31cf0276 100644 --- a/mozilla/content/xul/document/src/nsXULPrototypeDocument.cpp +++ b/mozilla/content/xul/document/src/nsXULPrototypeDocument.cpp @@ -200,6 +200,8 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsXULPrototypeDocument) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_MEMBER(mRoot, nsXULPrototypeElement) cb.NoteXPCOMChild(static_cast(tmp->mGlobalObject)); + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_MEMBER(mNodeInfoManager, + nsNodeInfoManager) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsXULPrototypeDocument)