A collection of broadcaster fixes. Make sure observes are unhooked when removed from the doc. ALso suppress notifications on hookup, since they result in double frame construction. Bug 167445. r/sr=ben/bryner

This commit is contained in:
hyatt%netscape.com 2002-09-12 04:40:22 +00:00
Родитель 75e2072ee8
Коммит b815570db2
1 изменённых файлов: 25 добавлений и 3 удалений

Просмотреть файл

@ -1880,7 +1880,7 @@ nsXULDocument::SynchronizeBroadcastListener(nsIDOMElement *aBroadcaster,
nsAutoString value;
broadcaster->GetAttr(nameSpaceID, name, value);
listener->SetAttr(nameSpaceID, name, value, PR_TRUE);
listener->SetAttr(nameSpaceID, name, value, PR_FALSE);
#if 0
// XXX we don't fire the |onbroadcast| handler during
@ -1901,10 +1901,10 @@ nsXULDocument::SynchronizeBroadcastListener(nsIDOMElement *aBroadcaster,
if (rv == NS_CONTENT_ATTR_NO_VALUE ||
rv == NS_CONTENT_ATTR_HAS_VALUE) {
listener->SetAttr(kNameSpaceID_None, name, value, PR_TRUE);
listener->SetAttr(kNameSpaceID_None, name, value, PR_FALSE);
}
else {
listener->UnsetAttr(kNameSpaceID_None, name, PR_TRUE);
listener->UnsetAttr(kNameSpaceID_None, name, PR_FALSE);
}
#if 0
@ -3932,6 +3932,28 @@ nsXULDocument::RemoveSubtreeFromDocument(nsIContent* aElement)
if (NS_FAILED(rv)) return rv;
}
// 4. Remove the element from our broadcaster map, since it is no longer
// in the document.
// Do a getElementById to retrieve the broadcaster
nsCOMPtr<nsIDOMElement> broadcaster;
nsAutoString observesVal;
aElement->GetAttr(kNameSpaceID_None, nsXULAtoms::observes, observesVal);
GetElementById(observesVal, getter_AddRefs(broadcaster));
if (broadcaster) {
nsCOMPtr<nsIDOMElement> elt(do_QueryInterface(aElement));
RemoveBroadcastListenerFor(broadcaster,
elt,
NS_LITERAL_STRING("*"));
}
aElement->GetAttr(kNameSpaceID_None, nsXULAtoms::command, observesVal);
GetElementById(observesVal, getter_AddRefs(broadcaster));
if (broadcaster) {
nsCOMPtr<nsIDOMElement> elt(do_QueryInterface(aElement));
RemoveBroadcastListenerFor(broadcaster,
elt,
NS_LITERAL_STRING("*"));
}
return NS_OK;
}