Bug 48086. Be sure to update XUL document's ID-to-element map when removing generated content. r=rjc

This commit is contained in:
waterson%netscape.com 2000-08-14 21:46:04 +00:00
parent 0ff37d2869
commit 2dd8f2d2a0
2 changed files with 88 additions and 6 deletions

View File

@ -2669,7 +2669,11 @@ public:
PRBool
IsElementInWidget(nsIContent* aElement);
nsresult RemoveGeneratedContent(nsIContent* aElement);
nsresult
RemoveGeneratedContent(nsIContent* aElement);
nsresult
NoteGeneratedSubtreeRemoved(nsIContent* aElement);
PRBool
IsLazyWidgetItem(nsIContent* aElement);
@ -6239,15 +6243,20 @@ nsXULTemplateBuilder::RemoveGeneratedContent(nsIContent* aElement)
continue;
}
// If we get here, it's "generated". Bye bye! Remove it
// If we get here, it's "generated". Bye bye! Remove it
// from the content model "quietly", because we'll remove
// and re-insert the top-level element into the document
// to minimze reflow.
element->RemoveChildAt(i, PR_FALSE);
child->SetDocument(nsnull, PR_TRUE, PR_TRUE);
// Do any book-keeping that we need to do on the subtree,
// since we're "quietly" removing the element from the
// content model.
NoteGeneratedSubtreeRemoved(child);
// Remove element from the conflict set.
// XXXwaterson should this be recursive?
// XXXwaterson should this be moved into NoteGeneratedSubtreeRemoved?
MatchSet firings, retractions;
mConflictSet.Remove(ContentTestNode::Element(child), firings, retractions);
@ -6295,6 +6304,38 @@ nsXULTemplateBuilder::RemoveGeneratedContent(nsIContent* aElement)
}
nsresult
nsXULTemplateBuilder::NoteGeneratedSubtreeRemoved(nsIContent* aElement)
{
// When we remove a generated subtree from the document, we need
// to update the document's element map. (Normally, this will
// happen when content is "noisily" removed from the tree.)
if (! aElement)
return NS_ERROR_NULL_POINTER;
PRInt32 i = 0;
nsCOMPtr<nsIXULContent> xulcontent = do_QueryInterface(aElement);
if (xulcontent)
xulcontent->PeekChildCount(i);
else
aElement->ChildCount(i);
while (--i >= 0) {
nsCOMPtr<nsIContent> child;
aElement->ChildAt(i, *getter_AddRefs(child));
NoteGeneratedSubtreeRemoved(child);
}
nsresult rv;
nsAutoString id;
rv = aElement->GetAttribute(kNameSpaceID_None, nsXULAtoms::id, id);
if (rv == NS_CONTENT_ATTR_HAS_VALUE)
mDocument->RemoveElementForID(id, aElement);
return NS_OK;
}
PRBool
nsXULTemplateBuilder::IsLazyWidgetItem(nsIContent* aElement)
{

View File

@ -2669,7 +2669,11 @@ public:
PRBool
IsElementInWidget(nsIContent* aElement);
nsresult RemoveGeneratedContent(nsIContent* aElement);
nsresult
RemoveGeneratedContent(nsIContent* aElement);
nsresult
NoteGeneratedSubtreeRemoved(nsIContent* aElement);
PRBool
IsLazyWidgetItem(nsIContent* aElement);
@ -6239,15 +6243,20 @@ nsXULTemplateBuilder::RemoveGeneratedContent(nsIContent* aElement)
continue;
}
// If we get here, it's "generated". Bye bye! Remove it
// If we get here, it's "generated". Bye bye! Remove it
// from the content model "quietly", because we'll remove
// and re-insert the top-level element into the document
// to minimze reflow.
element->RemoveChildAt(i, PR_FALSE);
child->SetDocument(nsnull, PR_TRUE, PR_TRUE);
// Do any book-keeping that we need to do on the subtree,
// since we're "quietly" removing the element from the
// content model.
NoteGeneratedSubtreeRemoved(child);
// Remove element from the conflict set.
// XXXwaterson should this be recursive?
// XXXwaterson should this be moved into NoteGeneratedSubtreeRemoved?
MatchSet firings, retractions;
mConflictSet.Remove(ContentTestNode::Element(child), firings, retractions);
@ -6295,6 +6304,38 @@ nsXULTemplateBuilder::RemoveGeneratedContent(nsIContent* aElement)
}
nsresult
nsXULTemplateBuilder::NoteGeneratedSubtreeRemoved(nsIContent* aElement)
{
// When we remove a generated subtree from the document, we need
// to update the document's element map. (Normally, this will
// happen when content is "noisily" removed from the tree.)
if (! aElement)
return NS_ERROR_NULL_POINTER;
PRInt32 i = 0;
nsCOMPtr<nsIXULContent> xulcontent = do_QueryInterface(aElement);
if (xulcontent)
xulcontent->PeekChildCount(i);
else
aElement->ChildCount(i);
while (--i >= 0) {
nsCOMPtr<nsIContent> child;
aElement->ChildAt(i, *getter_AddRefs(child));
NoteGeneratedSubtreeRemoved(child);
}
nsresult rv;
nsAutoString id;
rv = aElement->GetAttribute(kNameSpaceID_None, nsXULAtoms::id, id);
if (rv == NS_CONTENT_ATTR_HAS_VALUE)
mDocument->RemoveElementForID(id, aElement);
return NS_OK;
}
PRBool
nsXULTemplateBuilder::IsLazyWidgetItem(nsIContent* aElement)
{