diff --git a/content/base/public/nsIContent.h b/content/base/public/nsIContent.h index 5f45e1f856a..ce4a81ae738 100644 --- a/content/base/public/nsIContent.h +++ b/content/base/public/nsIContent.h @@ -122,7 +122,7 @@ public: * Get the parent content for this content. * @return the parent, or null if no parent */ - virtual nsIContent* GetParent() const + nsIContent* GetParent() const { return NS_REINTERPRET_CAST(nsIContent *, mParentPtrBits & ~kParentBitMask); } diff --git a/content/base/public/nsIDocument.h b/content/base/public/nsIDocument.h index e4322c014b8..726471b6f0f 100644 --- a/content/base/public/nsIDocument.h +++ b/content/base/public/nsIDocument.h @@ -626,27 +626,6 @@ public: */ virtual PRInt32 GetDefaultNamespaceID() const = 0; - /** - * Returns false if aContent is an orphan (an orphan is a node that is not a - * descendant of this document but whose ownerDocument pointer points to this - * document). - */ - virtual PRBool IsOrphan(nsIContent* aContent) = 0; - - /** - * Add aContent as an orphan of this document (an orphan is a node that is - * not a descendant of this document but whose ownerDocument pointer points - * to this document). - */ - virtual PRBool AddOrphan(nsIContent* aContent) = 0; - - /** - * Remove aContent as an orphan of this document (an orphan is a node that is - * not a descendant of this document but whose ownerDocument pointer points - * to this document). - */ - virtual void RemoveOrphan(nsIContent* aContent) = 0; - protected: nsString mDocumentTitle; nsCOMPtr mDocumentURI; diff --git a/content/base/src/nsAttrAndChildArray.cpp b/content/base/src/nsAttrAndChildArray.cpp index 949aca38865..d9c582dc19e 100644 --- a/content/base/src/nsAttrAndChildArray.cpp +++ b/content/base/src/nsAttrAndChildArray.cpp @@ -72,9 +72,7 @@ nsAttrAndChildArray::~nsAttrAndChildArray() return; } - NS_ASSERTION(!mImpl->mMappedAttrs && - mImpl->mAttrAndChildCount == 0, - "Call nsAttrAndChildArray::Clear() before destruction."); + Clear(); PR_Free(mImpl); } diff --git a/content/base/src/nsAttrAndChildArray.h b/content/base/src/nsAttrAndChildArray.h index 1f4cc7e6698..9488e562a17 100644 --- a/content/base/src/nsAttrAndChildArray.h +++ b/content/base/src/nsAttrAndChildArray.h @@ -108,12 +108,13 @@ public: void WalkMappedAttributeStyleRules(nsRuleWalker* aRuleWalker); void Compact(); - void Clear(); private: nsAttrAndChildArray(const nsAttrAndChildArray& aOther); // Not to be implemented nsAttrAndChildArray& operator=(const nsAttrAndChildArray& aOther); // Not to be implemented + void Clear(); + PRUint32 NonMappedAttrCount() const; PRUint32 MappedAttrCount() const; diff --git a/content/base/src/nsCommentNode.cpp b/content/base/src/nsCommentNode.cpp index ca696a51d62..b6b9b4555ca 100644 --- a/content/base/src/nsCommentNode.cpp +++ b/content/base/src/nsCommentNode.cpp @@ -82,13 +82,9 @@ NS_NewCommentNode(nsIContent** aInstancePtrResult, nsIDocument *aOwnerDocument) { *aInstancePtrResult = nsnull; - nsCOMPtr instance = new nsCommentNode(aOwnerDocument); + nsCOMPtr instance = new nsCommentNode(nsnull); NS_ENSURE_TRUE(instance, NS_ERROR_OUT_OF_MEMORY); - if (aOwnerDocument && !aOwnerDocument->AddOrphan(instance)) { - return NS_ERROR_OUT_OF_MEMORY; - } - instance.swap(*aInstancePtrResult); return NS_OK; @@ -162,7 +158,7 @@ nsCommentNode::CloneNode(PRBool aDeep, nsIDOMNode** aReturn) already_AddRefed nsCommentNode::CloneContent(PRBool aCloneText, nsIDocument *aOwnerDocument) { - nsCommentNode* it = new nsCommentNode(aOwnerDocument); + nsCommentNode* it = new nsCommentNode(nsnull); if (!it) return nsnull; @@ -172,10 +168,6 @@ nsCommentNode::CloneContent(PRBool aCloneText, nsIDocument *aOwnerDocument) NS_ADDREF(it); - if (aOwnerDocument && !aOwnerDocument->AddOrphan(it)) { - NS_RELEASE(it); - } - return it; } diff --git a/content/base/src/nsDocument.cpp b/content/base/src/nsDocument.cpp index 6115f7aaa07..3be7991710f 100644 --- a/content/base/src/nsDocument.cpp +++ b/content/base/src/nsDocument.cpp @@ -499,14 +499,6 @@ NS_IMPL_ADDREF_USING_AGGREGATOR(nsXPathDocumentTearoff, mDocument) NS_IMPL_RELEASE_USING_AGGREGATOR(nsXPathDocumentTearoff, mDocument) -class OrphansEntry : public PLDHashEntryHdr -{ -public: - nsIContent *mKey; // must be first, to look like PLDHashEntryStub -}; - -PLDHashTable nsDocument::sOrphans; - // ================================================================== // = // ================================================================== @@ -562,8 +554,6 @@ nsDocument::~nsDocument() mSubDocuments = nsnull; } - RemoveOrphans(); - if (mRootContent) { if (mRootContent->GetDocument()) { // The root content still has a pointer back to the document, @@ -683,15 +673,6 @@ NS_INTERFACE_MAP_END NS_IMPL_ADDREF(nsDocument) NS_IMPL_RELEASE(nsDocument) -// static -void -nsDocument::Shutdown() -{ - if (sOrphans.entrySize) { - PL_DHashTableFinish(&sOrphans); - } -} - nsresult nsDocument::Init() { @@ -767,8 +748,6 @@ nsDocument::ResetToURI(nsIURI *aURI, nsILoadGroup *aLoadGroup) mSubDocuments = nsnull; } - RemoveOrphans(); - mRootContent = nsnull; PRInt32 count, i; count = mChildren.Count(); @@ -1808,8 +1787,6 @@ nsDocument::SetScriptGlobalObject(nsIScriptGlobalObject *aScriptGlobalObject) mIsGoingAway = PR_TRUE; - RemoveOrphans(); - for (indx = 0; indx < count; ++indx) { mChildren[indx]->SetDocument(nsnull, PR_TRUE, PR_TRUE); } @@ -4461,93 +4438,3 @@ nsDocument::CreateElement(nsINodeInfo *aNodeInfo, PRInt32 aElementType, return NS_OK; } - -PRBool -nsDocument::IsOrphan(nsIContent* aContent) -{ - if (mOrphanCache == aContent) { - return PR_TRUE; - } - - if (!sOrphans.ops) { - return PR_FALSE; - } - - PLDHashEntryHdr *entry = PL_DHashTableOperate(&sOrphans, aContent, - PL_DHASH_LOOKUP); - - return PL_DHASH_ENTRY_IS_BUSY(entry); -} - -PRBool -nsDocument::AddOrphan(nsIContent* aContent) -{ - if (mIsGoingAway || mInDestructor) { - return PR_FALSE; - } - - if (mOrphanCache) { - if (!sOrphans.ops && - !PL_DHashTableInit(&sOrphans, PL_DHashGetStubOps(), nsnull, - sizeof(OrphansEntry), 5)) { - return PR_FALSE; - } - - PLDHashEntryHdr *entry = PL_DHashTableOperate(&sOrphans, mOrphanCache, - PL_DHASH_ADD); - if (!entry) { - return PR_FALSE; - } - - NS_REINTERPRET_CAST(OrphansEntry*, entry)->mKey = mOrphanCache; - } - - mOrphanCache = aContent; - - return PR_TRUE; -} - -void -nsDocument::RemoveOrphan(nsIContent* aContent) -{ - if (mOrphanCache == aContent) { - mOrphanCache = nsnull; - } - else if (sOrphans.ops) { - PL_DHashTableOperate(&sOrphans, aContent, PL_DHASH_REMOVE); - } -} - -PR_STATIC_CALLBACK(PLDHashOperator) -RemoveOrphanFromDocument(PLDHashTable *aTable, PLDHashEntryHdr *aHeader, - PRUint32 aNumber, void *aArg) -{ - nsIContent *content = NS_REINTERPRET_CAST(OrphansEntry*, - aHeader)->mKey; - nsIDocument *document = content->GetOwnerDoc(); - - if (document == NS_STATIC_CAST(nsIDocument*, aArg)) { - content->SetDocument(nsnull, PR_TRUE, PR_TRUE); - - return PL_DHASH_REMOVE; - } - - // XXX Not an orphan anymore if the document pointer has already been - // cleared. This shouldn't happen, but until we clean up - // SetDocument and SetParent it will. - return document ? PL_DHASH_NEXT : PL_DHASH_REMOVE; -} - -void -nsDocument::RemoveOrphans() -{ - if (mOrphanCache) { - mOrphanCache->SetDocument(nsnull, PR_TRUE, PR_TRUE); - mOrphanCache = nsnull; - } - - if (sOrphans.ops) { - PL_DHashTableEnumerate(&sOrphans, RemoveOrphanFromDocument, - NS_STATIC_CAST(nsIDocument*, this)); - } -} diff --git a/content/base/src/nsDocument.h b/content/base/src/nsDocument.h index 11c271ee4a7..b508642f417 100644 --- a/content/base/src/nsDocument.h +++ b/content/base/src/nsDocument.h @@ -502,8 +502,6 @@ public: // virtual nsIPrincipal* GetPrincipal(); // Already declared in nsIDocument - static void Shutdown(); - virtual nsresult Init(); virtual nsresult AddXMLEventsContent(nsIContent * aXMLEventsElement); @@ -513,10 +511,6 @@ public: PRBool aDocumentDefaultType, nsIContent **aResult); - PRBool IsOrphan(nsIContent* aContent); - PRBool AddOrphan(nsIContent* aContent); - void RemoveOrphan(nsIContent* aContent); - protected: void RetrieveRelevantHeaders(nsIChannel *aChannel); @@ -606,11 +600,6 @@ private: nsDocument& operator=(const nsDocument& aOther); nsXPathDocumentTearoff* mXPathDocument; - - void RemoveOrphans(); - nsIContent *mOrphanCache; - - static PLDHashTable sOrphans; }; diff --git a/content/base/src/nsGenericDOMDataNode.cpp b/content/base/src/nsGenericDOMDataNode.cpp index 434a8025790..c1c246c3586 100644 --- a/content/base/src/nsGenericDOMDataNode.cpp +++ b/content/base/src/nsGenericDOMDataNode.cpp @@ -58,8 +58,8 @@ #include "prprf.h" nsGenericDOMDataNode::nsGenericDOMDataNode(nsIDocument *aDocument) + : mDocument(aDocument) { - mParentPtrBits = NS_REINTERPRET_CAST(PtrBits, aDocument); } nsGenericDOMDataNode::~nsGenericDOMDataNode() @@ -73,13 +73,6 @@ nsGenericDOMDataNode::~nsGenericDOMDataNode() PL_DHashTableOperate(&nsGenericElement::sRangeListsHash, this, PL_DHASH_REMOVE); } - - if (ParentIsDocument()) { - nsIDocument *document = ParentPtrBitsAsDocument(); - if (document) { - document->RemoveOrphan(this); - } - } } @@ -121,11 +114,11 @@ nsGenericDOMDataNode::GetParentNode(nsIDOMNode** aParentNode) if (parent) { rv = CallQueryInterface(parent, aParentNode); } + else if (mDocument) { + rv = CallQueryInterface(mDocument, aParentNode); + } else { - nsIDocument *doc = ParentPtrBitsAsDocument(); - if (doc && !doc->IsOrphan(this)) { - rv = CallQueryInterface(doc, aParentNode); - } + *aParentNode = nsnull; } NS_ASSERTION(NS_SUCCEEDED(rv), "Must be a DOM Node"); @@ -146,13 +139,10 @@ nsGenericDOMDataNode::GetPreviousSibling(nsIDOMNode** aPrevSibling) sibling = parent->GetChildAt(pos - 1); } } - else { - nsIDocument *doc = ParentPtrBitsAsDocument(); - if (doc) { - PRInt32 pos = doc->IndexOf(this); - if (pos > 0) { - sibling = doc->GetChildAt(pos - 1); - } + else if (mDocument) { + PRInt32 pos = mDocument->IndexOf(this); + if (pos > 0) { + sibling = mDocument->GetChildAt(pos - 1); } } @@ -179,13 +169,10 @@ nsGenericDOMDataNode::GetNextSibling(nsIDOMNode** aNextSibling) sibling = parent->GetChildAt(pos + 1); } } - else { - nsIDocument *doc = ParentPtrBitsAsDocument(); - if (doc) { - PRInt32 pos = doc->IndexOf(this); - if (pos > 0) { - sibling = doc->GetChildAt(pos + 1); - } + else if (mDocument) { + PRInt32 pos = mDocument->IndexOf(this); + if (pos > 0) { + sibling = mDocument->GetChildAt(pos + 1); } } @@ -598,67 +585,17 @@ nsGenericDOMDataNode::ToCString(nsAString& aBuf, PRInt32 aOffset, nsIDocument* nsGenericDOMDataNode::GetDocument() const { - nsIContent *parent = GetParent(); - if (parent) { - return parent->GetDocument(); - } - - nsIDocument *document = ParentPtrBitsAsDocument(); - if (document && - document->IsOrphan(NS_CONST_CAST(nsGenericDOMDataNode*, this))) { - return nsnull; - } - - return document; + return GetCurrentDoc(); } void nsGenericDOMDataNode::SetDocument(nsIDocument* aDocument, PRBool aDeep, PRBool aCompileEventHandlers) { - if (aDocument) { - if (ParentIsDocument()) { - nsIDocument *document = ParentPtrBitsAsDocument(); - if (document) { - document->RemoveOrphan(this); - } - - mParentPtrBits = - NS_REINTERPRET_CAST(PtrBits, aDocument) | - (mParentPtrBits & PARENT_BIT_RANGELISTS_OR_LISTENERMANAGER); - } - - if (mText.IsBidi()) { - aDocument->SetBidiEnabled(PR_TRUE); - } + mDocument = aDocument; + if (mDocument && mText.IsBidi()) { + aDocument->SetBidiEnabled(PR_TRUE); } - else if (ParentIsDocument()) { - // XXX We should call AddOrphan here, but we first need ClearDocumentPointer - // so that RemoveOrphan/RemoveOrphans don't end up here. - mParentPtrBits &= nsIContent::kParentBitMask; - } -} - -nsIDocument* -nsGenericDOMDataNode::GetOwnerDoc() const -{ - nsIContent *parent = GetParent(); - - return parent ? parent->GetOwnerDoc() : ParentPtrBitsAsDocument(); -} - -PRBool -nsGenericDOMDataNode::IsInDoc() const -{ - nsIContent *parent = GetParent(); - if (parent) { - return parent->IsInDoc(); - } - - nsIDocument *document = ParentPtrBitsAsDocument(); - - return document && !document->IsOrphan(NS_CONST_CAST(nsGenericDOMDataNode*, - this)); } void @@ -666,28 +603,9 @@ nsGenericDOMDataNode::SetParent(nsIContent* aParent) { PtrBits new_bits = NS_REINTERPRET_CAST(PtrBits, aParent); - if (aParent) { - if (ParentIsDocument()) { - nsIDocument *document = ParentPtrBitsAsDocument(); - if (document) { - document->RemoveOrphan(this); - } - } + new_bits |= mParentPtrBits & nsIContent::kParentBitMask; - new_bits |= PARENT_BIT_BITPTR_IS_CONTENT; - } - else { - nsIContent *parent = GetParent(); - if (parent) { - nsIDocument *document = parent->GetOwnerDoc(); - if (document && document->AddOrphan(this)) { - new_bits = NS_REINTERPRET_CAST(PtrBits, document); - } - } - } - - mParentPtrBits = new_bits | - (mParentPtrBits & PARENT_BIT_RANGELISTS_OR_LISTENERMANAGER); + mParentPtrBits = new_bits; } PRBool @@ -1041,9 +959,8 @@ nsGenericDOMDataNode::GetBaseURI() const } nsIURI *uri; - nsIDocument *document = ParentPtrBitsAsDocument(); - if (document) { - NS_IF_ADDREF(uri = document->GetBaseURI()); + if (mDocument) { + NS_IF_ADDREF(uri = mDocument->GetBaseURI()); } else { uri = nsnull; diff --git a/content/base/src/nsGenericDOMDataNode.h b/content/base/src/nsGenericDOMDataNode.h index d2cc304454c..5348a41d8d7 100644 --- a/content/base/src/nsGenericDOMDataNode.h +++ b/content/base/src/nsGenericDOMDataNode.h @@ -56,7 +56,6 @@ class nsINodeInfo; class nsURI; #define PARENT_BIT_RANGELISTS_OR_LISTENERMANAGER ((PtrBits)0x1 << 0) -#define PARENT_BIT_BITPTR_IS_CONTENT ((PtrBits)0x1 << 1) class nsGenericDOMDataNode : public nsITextContent { @@ -169,12 +168,27 @@ public: nsIDocument* GetDocument() const; virtual void SetDocument(nsIDocument* aDocument, PRBool aDeep, PRBool aCompileEventHandlers); - PRBool IsInDoc() const; - nsIDocument *GetOwnerDoc() const; - nsIContent *GetParent() const + PRBool IsInDoc() const { - return ParentIsContent() ? ParentPtrBitsAsContent() : nsnull; + return !!mDocument; } + + nsIDocument *GetCurrentDoc() const + { + return mDocument; + } + + nsIDocument *GetOwnerDoc() const + { + if (mDocument) { + return mDocument; + } + + nsIContent *parent = GetParent(); + + return parent ? parent->GetOwnerDoc() : nsnull; + } + virtual void SetParent(nsIContent* aParent); virtual PRBool IsNativeAnonymous() const; virtual void SetNativeAnonymous(PRBool aAnonymous); @@ -291,24 +305,7 @@ private: nsGenericElement::sEventListenerManagersHash.ops); } - PRBool ParentIsDocument() const - { - return !(mParentPtrBits & PARENT_BIT_BITPTR_IS_CONTENT); - } - nsIDocument *ParentPtrBitsAsDocument() const - { - return NS_REINTERPRET_CAST(nsIDocument *, - mParentPtrBits & ~kParentBitMask); - } - PRBool ParentIsContent() const - { - return mParentPtrBits & PARENT_BIT_BITPTR_IS_CONTENT; - } - nsIContent *ParentPtrBitsAsContent() const - { - return NS_REINTERPRET_CAST(nsIContent *, - mParentPtrBits & ~kParentBitMask); - } + nsIDocument *mDocument; }; //---------------------------------------------------------------------- diff --git a/content/base/src/nsGenericElement.cpp b/content/base/src/nsGenericElement.cpp index 88501e93103..24454c75b86 100644 --- a/content/base/src/nsGenericElement.cpp +++ b/content/base/src/nsGenericElement.cpp @@ -858,8 +858,6 @@ nsGenericElement::~nsGenericElement() delete slots; } - mAttrsAndChildren.Clear(); - // No calling GetFlags() beyond this point... } diff --git a/content/base/src/nsGenericElement.h b/content/base/src/nsGenericElement.h index 0e8e4a1393e..5ae62efbb46 100644 --- a/content/base/src/nsGenericElement.h +++ b/content/base/src/nsGenericElement.h @@ -362,7 +362,7 @@ public: } nsIDocument *GetOwnerDoc() const { - return mNodeInfo->GetDocument(); + return nsContentUtils::GetDocument(mNodeInfo); } virtual void SetParent(nsIContent* aParent); virtual PRBool IsNativeAnonymous() const; diff --git a/content/base/src/nsTextNode.cpp b/content/base/src/nsTextNode.cpp index c55fb3ee64d..03e2cbf3c60 100644 --- a/content/base/src/nsTextNode.cpp +++ b/content/base/src/nsTextNode.cpp @@ -136,13 +136,9 @@ NS_NewTextNode(nsITextContent** aInstancePtrResult, { *aInstancePtrResult = nsnull; - nsCOMPtr instance = new nsTextNode(aOwnerDocument); + nsCOMPtr instance = new nsTextNode(nsnull); NS_ENSURE_TRUE(instance, NS_ERROR_OUT_OF_MEMORY); - if (aOwnerDocument && !aOwnerDocument->AddOrphan(instance)) { - return NS_ERROR_OUT_OF_MEMORY; - } - instance.swap(*aInstancePtrResult); return NS_OK; @@ -214,7 +210,7 @@ nsTextNode::CloneNode(PRBool aDeep, nsIDOMNode** aReturn) already_AddRefed nsTextNode::CloneContent(PRBool aCloneText, nsIDocument *aOwnerDocument) { - nsTextNode* it = new nsTextNode(aOwnerDocument); + nsTextNode* it = new nsTextNode(nsnull); if (!it) return nsnull; @@ -224,10 +220,6 @@ nsTextNode::CloneContent(PRBool aCloneText, nsIDocument *aOwnerDocument) NS_ADDREF(it); - if (aOwnerDocument && !aOwnerDocument->AddOrphan(it)) { - NS_RELEASE(it); - } - return it; } diff --git a/content/html/document/src/nsHTMLContentSink.cpp b/content/html/document/src/nsHTMLContentSink.cpp index 53bf8115e13..0b99103f65b 100644 --- a/content/html/document/src/nsHTMLContentSink.cpp +++ b/content/html/document/src/nsHTMLContentSink.cpp @@ -1594,6 +1594,8 @@ SinkContext::AddComment(const nsIParserNode& aNode) domComment->AppendData(aNode.GetText()); + comment->SetDocument(mSink->mDocument, PR_FALSE, PR_TRUE); + NS_ASSERTION(mStackPos > 0, "stack out of bounds"); if (mStackPos <= 0) { return NS_ERROR_FAILURE; @@ -1860,6 +1862,9 @@ SinkContext::FlushText(PRBool* aDidFlush, PRBool aReleaseLast) mLastTextNode = textContent; + // Set the content's document + mLastTextNode->SetDocument(mSink->mDocument, PR_FALSE, PR_TRUE); + // Set the text in the text node mLastTextNode->SetText(mText, mTextLength, PR_FALSE); @@ -3169,6 +3174,7 @@ HTMLContentSink::SetDocumentTitle(const nsAString& aTitle) text->SetText(mTitle, PR_TRUE); it->AppendChildTo(text, PR_FALSE, PR_FALSE); + text->SetDocument(mDocument, PR_FALSE, PR_TRUE); mHead->AppendChildTo(it, PR_FALSE, PR_FALSE); @@ -4219,6 +4225,7 @@ HTMLContentSink::ProcessSCRIPTTag(const nsIParserNode& aNode) text->SetText(script, PR_TRUE); element->AppendChildTo(text, PR_FALSE, PR_FALSE); + text->SetDocument(mDocument, PR_FALSE, PR_TRUE); } nsCOMPtr loader; diff --git a/content/svg/content/src/nsSVGElement.cpp b/content/svg/content/src/nsSVGElement.cpp index 998ed99f985..f2b1b5a5894 100644 --- a/content/svg/content/src/nsSVGElement.cpp +++ b/content/svg/content/src/nsSVGElement.cpp @@ -75,7 +75,6 @@ nsSVGElement::~nsSVGElement() for (i = 0; i < count; ++i) { mMappedAttributes.AttrAt(i)->GetSVGValue()->RemoveObserver(this); } - mMappedAttributes.Clear(); } //---------------------------------------------------------------------- diff --git a/content/xml/content/src/nsXMLCDATASection.cpp b/content/xml/content/src/nsXMLCDATASection.cpp index 12baadb2bf0..b4ab4b7d3d7 100644 --- a/content/xml/content/src/nsXMLCDATASection.cpp +++ b/content/xml/content/src/nsXMLCDATASection.cpp @@ -84,13 +84,9 @@ NS_NewXMLCDATASection(nsIContent** aInstancePtrResult, { *aInstancePtrResult = nsnull; - nsCOMPtr instance = new nsXMLCDATASection(aOwnerDocument); + nsCOMPtr instance = new nsXMLCDATASection(nsnull); NS_ENSURE_TRUE(instance, NS_ERROR_OUT_OF_MEMORY); - if (aOwnerDocument && !aOwnerDocument->AddOrphan(instance)) { - return NS_ERROR_OUT_OF_MEMORY; - } - instance.swap(*aInstancePtrResult); return NS_OK; @@ -170,7 +166,7 @@ nsXMLCDATASection::CloneNode(PRBool aDeep, nsIDOMNode** aReturn) already_AddRefed nsXMLCDATASection::CloneContent(PRBool aCloneText, nsIDocument *aOwnerDocument) { - nsXMLCDATASection* it = new nsXMLCDATASection(aOwnerDocument); + nsXMLCDATASection* it = new nsXMLCDATASection(nsnull); if (!it) return nsnull; @@ -180,10 +176,6 @@ nsXMLCDATASection::CloneContent(PRBool aCloneText, nsIDocument *aOwnerDocument) NS_ADDREF(it); - if (aOwnerDocument && !aOwnerDocument->AddOrphan(it)) { - NS_RELEASE(it); - } - return it; } diff --git a/content/xml/content/src/nsXMLProcessingInstruction.cpp b/content/xml/content/src/nsXMLProcessingInstruction.cpp index 6ccc1189f8f..a2024e1912b 100644 --- a/content/xml/content/src/nsXMLProcessingInstruction.cpp +++ b/content/xml/content/src/nsXMLProcessingInstruction.cpp @@ -57,13 +57,9 @@ NS_NewXMLProcessingInstruction(nsIContent** aInstancePtrResult, nsCOMPtr instance; instance = new nsXMLProcessingInstruction(aTarget, aData, - aOwnerDocument); + nsnull); NS_ENSURE_TRUE(instance, NS_ERROR_OUT_OF_MEMORY); - if (aOwnerDocument && !aOwnerDocument->AddOrphan(instance)) { - return NS_ERROR_OUT_OF_MEMORY; - } - instance.swap(*aInstancePtrResult); return NS_OK; @@ -171,15 +167,11 @@ nsXMLProcessingInstruction::CloneNode(PRBool aDeep, nsIDOMNode** aReturn) nsIDocument *document = GetOwnerDoc(); nsXMLProcessingInstruction *pi = - new nsXMLProcessingInstruction(mTarget, data, document); + new nsXMLProcessingInstruction(mTarget, data, nsnull); if (!pi) { return NS_ERROR_OUT_OF_MEMORY; } - if (document) { - document->AddOrphan(pi); - } - NS_ADDREF(*aReturn = pi); return NS_OK; diff --git a/content/xml/content/src/nsXMLStylesheetPI.cpp b/content/xml/content/src/nsXMLStylesheetPI.cpp index 63fdddc9263..e4a32aa0e70 100644 --- a/content/xml/content/src/nsXMLStylesheetPI.cpp +++ b/content/xml/content/src/nsXMLStylesheetPI.cpp @@ -132,16 +132,11 @@ nsXMLStylesheetPI::CloneNode(PRBool aDeep, nsIDOMNode** aReturn) nsAutoString data; GetData(data); - nsIDocument *document = GetOwnerDoc(); - nsXMLStylesheetPI *pi = new nsXMLStylesheetPI(data, document); + nsXMLStylesheetPI *pi = new nsXMLStylesheetPI(data, nsnull); if (!pi) { return NS_ERROR_OUT_OF_MEMORY; } - if (document) { - document->AddOrphan(pi); - } - NS_ADDREF(*aReturn = pi); return NS_OK; @@ -246,15 +241,11 @@ NS_NewXMLStylesheetProcessingInstruction(nsIContent** aInstancePtrResult, { *aInstancePtrResult = nsnull; - nsCOMPtr instance = new nsXMLStylesheetPI(aData, aOwnerDocument); + nsCOMPtr instance = new nsXMLStylesheetPI(aData, nsnull); if (!instance) { return NS_ERROR_OUT_OF_MEMORY; } - if (aOwnerDocument && !aOwnerDocument->AddOrphan(instance)) { - return NS_ERROR_OUT_OF_MEMORY; - } - instance.swap(*aInstancePtrResult); return NS_OK; diff --git a/content/xml/document/src/nsXMLContentSink.cpp b/content/xml/document/src/nsXMLContentSink.cpp index 2effda6fafb..4c8ba67f5aa 100644 --- a/content/xml/document/src/nsXMLContentSink.cpp +++ b/content/xml/document/src/nsXMLContentSink.cpp @@ -738,6 +738,9 @@ nsXMLContentSink::FlushText(PRBool aCreateTextNode, PRBool* aDidFlush) rv = NS_NewTextNode(getter_AddRefs(textContent)); NS_ENSURE_SUCCESS(rv, rv); + // Set the content's document + textContent->SetDocument(mDocument, PR_FALSE, PR_TRUE); + // Set the text in the text node textContent->SetText(mText, mTextLength, PR_FALSE); @@ -1081,6 +1084,7 @@ nsXMLContentSink::HandleComment(const PRUnichar *aName) nsCOMPtr domComment = do_QueryInterface(comment, &result); if (domComment) { domComment->AppendData(nsDependentString(aName)); + comment->SetDocument(mDocument, PR_FALSE, PR_TRUE); result = AddContentAsLeaf(comment); } } @@ -1104,6 +1108,7 @@ nsXMLContentSink::HandleCDataSection(const PRUnichar *aData, nsCOMPtr domCDATA = do_QueryInterface(cdata); if (domCDATA) { domCDATA->SetData(nsDependentString(aData, aLength)); + cdata->SetDocument(mDocument, PR_FALSE, PR_TRUE); result = AddContentAsLeaf(cdata); } } diff --git a/content/xul/content/src/nsXULElement.cpp b/content/xul/content/src/nsXULElement.cpp index 546f419505e..2eae4a0dd89 100644 --- a/content/xul/content/src/nsXULElement.cpp +++ b/content/xul/content/src/nsXULElement.cpp @@ -464,8 +464,6 @@ nsXULElement::Init() nsXULElement::~nsXULElement() { - mAttrsAndChildren.Clear(); - if (mPrototype) mPrototype->Release(); diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index e0a568d7cd1..9b2f0ded865 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -1489,6 +1489,7 @@ nsCSSFrameConstructor::CreateGeneratedFrameFor(nsPresContext* aPresContext // Set aContent as the parent content so that event handling works. content->SetParent(aContent); + content->SetDocument(aDocument, PR_TRUE, PR_TRUE); content->SetNativeAnonymous(PR_TRUE); content->SetBindingParent(content); @@ -1552,6 +1553,7 @@ nsCSSFrameConstructor::CreateGeneratedFrameFor(nsPresContext* aPresContext // Set aContent as the parent content so that event handling works. textContent->SetParent(aContent); + textContent->SetDocument(aDocument, PR_TRUE, PR_TRUE); textContent->SetNativeAnonymous(PR_TRUE); textContent->SetBindingParent(textContent); @@ -10172,6 +10174,7 @@ nsCSSFrameConstructor::ConstructAlternateFrame(nsIPresShell* aPresShell, // Set aContent as the parent content. altTextContent->SetParent(aContent); + altTextContent->SetDocument(mDocument, PR_TRUE, PR_TRUE); // Create either an inline frame, block frame, or area frame nsIFrame* containerFrame; diff --git a/layout/build/nsLayoutModule.cpp b/layout/build/nsLayoutModule.cpp index 040a43332b2..4848ce851f3 100644 --- a/layout/build/nsLayoutModule.cpp +++ b/layout/build/nsLayoutModule.cpp @@ -147,7 +147,6 @@ #include "nsScriptNameSpaceManager.h" #include "nsIControllerContext.h" #include "nsDOMScriptObjectFactory.h" -#include "nsDocument.h" class nsIDocumentLoaderFactory; @@ -356,7 +355,6 @@ Shutdown() gInitialized = PR_FALSE; - nsDocument::Shutdown(); nsRange::Shutdown(); nsGenericElement::Shutdown(); nsEventListenerManager::Shutdown(); diff --git a/layout/html/style/src/nsCSSFrameConstructor.cpp b/layout/html/style/src/nsCSSFrameConstructor.cpp index e0a568d7cd1..9b2f0ded865 100644 --- a/layout/html/style/src/nsCSSFrameConstructor.cpp +++ b/layout/html/style/src/nsCSSFrameConstructor.cpp @@ -1489,6 +1489,7 @@ nsCSSFrameConstructor::CreateGeneratedFrameFor(nsPresContext* aPresContext // Set aContent as the parent content so that event handling works. content->SetParent(aContent); + content->SetDocument(aDocument, PR_TRUE, PR_TRUE); content->SetNativeAnonymous(PR_TRUE); content->SetBindingParent(content); @@ -1552,6 +1553,7 @@ nsCSSFrameConstructor::CreateGeneratedFrameFor(nsPresContext* aPresContext // Set aContent as the parent content so that event handling works. textContent->SetParent(aContent); + textContent->SetDocument(aDocument, PR_TRUE, PR_TRUE); textContent->SetNativeAnonymous(PR_TRUE); textContent->SetBindingParent(textContent); @@ -10172,6 +10174,7 @@ nsCSSFrameConstructor::ConstructAlternateFrame(nsIPresShell* aPresShell, // Set aContent as the parent content. altTextContent->SetParent(aContent); + altTextContent->SetDocument(mDocument, PR_TRUE, PR_TRUE); // Create either an inline frame, block frame, or area frame nsIFrame* containerFrame; diff --git a/layout/html/tests/TestAttributes.cpp b/layout/html/tests/TestAttributes.cpp index 2ec5c39f9e2..c96214fe6b5 100644 --- a/layout/html/tests/TestAttributes.cpp +++ b/layout/html/tests/TestAttributes.cpp @@ -264,6 +264,8 @@ int main(int argc, char** argv) txt->AppendData(tmp); NS_RELEASE(txt); + text->SetDocument(myDoc, PR_FALSE, PR_TRUE); + #if 0 // Query ITextContent interface nsITextContent* textContent;