Bug 468210. Do a better job of unhooking our anonymous content. r+sr=sicking

This commit is contained in:
Boris Zbarsky 2008-12-12 14:26:07 -05:00
parent 4d0acd8eae
commit 89cfc393d2
3 changed files with 61 additions and 0 deletions

View File

@ -1143,6 +1143,14 @@ nsXBLBinding::ChangeDocument(nsIDocument* aOldDocument, nsIDocument* aNewDocumen
#endif
nsAutoScriptBlocker scriptBlocker;
// Unbind the _kids_ of the anonymous content, not just the anonymous
// content itself, since they are bound to some other parent. Basically
// we want to undo the mess that InstallAnonymousContent created.
PRUint32 childCount = anonymous->GetChildCount();
for (PRUint32 i = 0; i < childCount; i++) {
anonymous->GetChildAt(i)->UnbindFromTree();
}
anonymous->UnbindFromTree(); // Kill it.
#ifdef MOZ_XUL

View File

@ -66,6 +66,7 @@ _TEST_FILES = \
file_bug379959_data.html \
file_bug379959_cross.html \
file_bug379959_xbl.xml \
test_bug468210.xhtml \
$(NULL)
libs:: $(_TEST_FILES)

View File

@ -0,0 +1,52 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=468210
-->
<head>
<title>Test for Bug 468210</title>
<script type="application/javascript" src="/MochiKit/packed.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<!-- Keep the stuff inside <content> without spaces, so that the getAnonymousNodes works right -->
<bindings xmlns="http://www.mozilla.org/xbl">
<binding id="foo">
<content><span xmlns='http://www.w3.org/1999/xhtml'><children xmlns="http://www.mozilla.org/xbl"/></span></content>
</binding>
</bindings>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=468210">Mozilla Bug 468210</a>
<p id="display">
<div id="d" style="-moz-binding: url(#foo);"></div>
<a name="foo"></a>
</p>
<div id="content" style="display: none">
</div>
<pre id="test">
<script type="application/javascript">
<![CDATA[
/** Test for Bug 468210 **/
SimpleTest.waitForExplicitFinish();
addLoadEvent(function() {
var div = $("d");
var n = document.anchors.length;
is(n, 1, "Unexpected number of anchors");
var anon = document.getAnonymousNodes(div)[0];
is(anon instanceof HTMLSpanElement, true, "Unexpected node");
is(anon.parentNode, div, "Unexpected parent");
document.body.appendChild(div);
is(anon.parentNode, null, "Parent should have become null");
// An attr set to test notifications
anon.setAttribute("h", "i");
});
addLoadEvent(SimpleTest.finish);
]]>
</script>
</pre>
</body>
</html>