|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
<html>
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
https://bugzilla.mozilla.org/show_bug.cgi?id=1034110
|
|
Packit |
f0b94e |
-->
|
|
Packit |
f0b94e |
<head>
|
|
Packit |
f0b94e |
<title>Test for Bug 1034110</title>
|
|
Packit |
f0b94e |
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
|
Packit |
f0b94e |
<script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
|
|
Packit |
f0b94e |
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
|
Packit |
f0b94e |
</head>
|
|
Packit |
f0b94e |
<body>
|
|
Packit |
f0b94e |
Mozilla Bug 1034110
|
|
Packit |
f0b94e |
<style type="text/css">
|
|
Packit |
f0b94e |
#pseudo.before::before { content: "before"; }
|
|
Packit |
f0b94e |
#pseudo.after::after { content: "after"; }
|
|
Packit |
f0b94e |
</style>
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
<video id="video"></video>
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
<script type="application/javascript">
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
/** Test for Bug 1034110 **/
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
SimpleTest.waitForExplicitFinish();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function getWalker(node) {
|
|
Packit |
f0b94e |
return SpecialPowers.createDOMWalker(node, true);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function getFirstChild(parent) {
|
|
Packit |
f0b94e |
return SpecialPowers.unwrap(getWalker(parent).firstChild);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function getLastChild(parent) {
|
|
Packit |
f0b94e |
return SpecialPowers.unwrap(getWalker(parent).lastChild);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function assertSamePseudoElement(which, node1, node2) {
|
|
Packit |
f0b94e |
is(SpecialPowers.wrap(node1).nodeName, "_moz_generated_content_" + which,
|
|
Packit |
f0b94e |
"Correct pseudo element type");
|
|
Packit |
f0b94e |
is(node1, node2,
|
|
Packit |
f0b94e |
"Referencing the same ::after element");
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
window.onload = function () {
|
|
Packit |
f0b94e |
testOneAdded();
|
|
Packit |
f0b94e |
};
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function testOneAdded() {
|
|
Packit |
f0b94e |
let parent = document.getElementById("pseudo");
|
|
Packit |
f0b94e |
var m = new MutationObserver(function(records, observer) {
|
|
Packit |
f0b94e |
is(records.length, 1, "Correct number of records");
|
|
Packit |
f0b94e |
is(records[0].type, "nativeAnonymousChildList", "Correct record type");
|
|
Packit |
f0b94e |
is(records[0].target, parent, "Correct target");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
is(records[0].addedNodes.length, 1, "Should have got addedNodes");
|
|
Packit |
f0b94e |
assertSamePseudoElement("before", records[0].addedNodes[0], getFirstChild(parent));
|
|
Packit |
f0b94e |
is(records[0].removedNodes.length, 0, "Shouldn't have got removedNodes");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
observer.disconnect();
|
|
Packit |
f0b94e |
testAddedAndRemoved();
|
|
Packit |
f0b94e |
});
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
SpecialPowers.observeMutationEvents(m, parent, true);
|
|
Packit |
f0b94e |
parent.className = "before";
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function testAddedAndRemoved() {
|
|
Packit |
f0b94e |
let parent = document.getElementById("pseudo");
|
|
Packit |
f0b94e |
let originalBeforeElement = getFirstChild(parent);
|
|
Packit |
f0b94e |
var m = new MutationObserver(function(records, observer) {
|
|
Packit |
f0b94e |
is(records.length, 2, "Correct number of records");
|
|
Packit |
f0b94e |
is(records[0].type, "nativeAnonymousChildList", "Correct record type (1)");
|
|
Packit |
f0b94e |
is(records[1].type, "nativeAnonymousChildList", "Correct record type (2)");
|
|
Packit |
f0b94e |
is(records[0].target, parent, "Correct target (1)");
|
|
Packit |
f0b94e |
is(records[1].target, parent, "Correct target (2)");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// Two records are sent - one for removed and one for added.
|
|
Packit |
f0b94e |
is(records[0].addedNodes.length, 0, "Shouldn't have got addedNodes");
|
|
Packit |
f0b94e |
is(records[0].removedNodes.length, 1, "Should have got removedNodes");
|
|
Packit |
f0b94e |
assertSamePseudoElement("before", records[0].removedNodes[0], originalBeforeElement);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
is(records[1].addedNodes.length, 1, "Should have got addedNodes");
|
|
Packit |
f0b94e |
assertSamePseudoElement("after", records[1].addedNodes[0], getLastChild(parent));
|
|
Packit |
f0b94e |
is(records[1].removedNodes.length, 0, "Shouldn't have got removedNodes");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
observer.disconnect();
|
|
Packit |
f0b94e |
testRemoved();
|
|
Packit |
f0b94e |
});
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
SpecialPowers.observeMutationEvents(m, parent, true);
|
|
Packit |
f0b94e |
parent.className = "after";
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function testRemoved() {
|
|
Packit |
f0b94e |
let parent = document.getElementById("pseudo");
|
|
Packit |
f0b94e |
let originalAfterElement = getLastChild(parent);
|
|
Packit |
f0b94e |
var m = new MutationObserver(function(records, observer) {
|
|
Packit |
f0b94e |
is(records.length, 1, "Correct number of records");
|
|
Packit |
f0b94e |
is(records[0].type, "nativeAnonymousChildList", "Correct record type");
|
|
Packit |
f0b94e |
is(records[0].target, parent, "Correct target");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
is(records[0].addedNodes.length, 0, "Shouldn't have got addedNodes");
|
|
Packit |
f0b94e |
is(records[0].removedNodes.length, 1, "Should have got removedNodes");
|
|
Packit |
f0b94e |
assertSamePseudoElement("after", records[0].removedNodes[0], originalAfterElement);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
observer.disconnect();
|
|
Packit |
f0b94e |
testMultipleAdded();
|
|
Packit |
f0b94e |
});
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
SpecialPowers.observeMutationEvents(m, parent, true);
|
|
Packit |
f0b94e |
parent.className = "";
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function testMultipleAdded() {
|
|
Packit |
f0b94e |
let parent = document.getElementById("pseudo");
|
|
Packit |
f0b94e |
var m = new MutationObserver(function(records, observer) {
|
|
Packit |
f0b94e |
is(records.length, 2, "Correct number of records");
|
|
Packit |
f0b94e |
is(records[0].type, "nativeAnonymousChildList", "Correct record type (1)");
|
|
Packit |
f0b94e |
is(records[1].type, "nativeAnonymousChildList", "Correct record type (2)");
|
|
Packit |
f0b94e |
is(records[0].target, parent, "Correct target (1)");
|
|
Packit |
f0b94e |
is(records[1].target, parent, "Correct target (2)");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
is(records[0].addedNodes.length, 1, "Should have got addedNodes");
|
|
Packit |
f0b94e |
assertSamePseudoElement("before", records[0].addedNodes[0], getFirstChild(parent));
|
|
Packit |
f0b94e |
is(records[0].removedNodes.length, 0, "Shouldn't have got removedNodes");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
is(records[1].addedNodes.length, 1, "Should have got addedNodes");
|
|
Packit |
f0b94e |
assertSamePseudoElement("after", records[1].addedNodes[0], getLastChild(parent));
|
|
Packit |
f0b94e |
is(records[1].removedNodes.length, 0, "Shouldn't have got removedNodes");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
observer.disconnect();
|
|
Packit |
f0b94e |
testRemovedDueToDisplay();
|
|
Packit |
f0b94e |
});
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
SpecialPowers.observeMutationEvents(m, parent, true);
|
|
Packit |
f0b94e |
parent.className = "before after";
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function testRemovedDueToDisplay() {
|
|
Packit |
f0b94e |
let parent = document.getElementById("pseudo");
|
|
Packit |
f0b94e |
let originalBeforeElement = getFirstChild(parent);
|
|
Packit |
f0b94e |
let originalAfterElement = getLastChild(parent);
|
|
Packit |
f0b94e |
var m = new MutationObserver(function(records, observer) {
|
|
Packit |
f0b94e |
is(records.length, 2, "Correct number of records");
|
|
Packit |
f0b94e |
is(records[0].type, "nativeAnonymousChildList", "Correct record type (1)");
|
|
Packit |
f0b94e |
is(records[1].type, "nativeAnonymousChildList", "Correct record type (2)");
|
|
Packit |
f0b94e |
is(records[0].target, parent, "Correct target (1)");
|
|
Packit |
f0b94e |
is(records[1].target, parent, "Correct target (2)");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
is(records[0].addedNodes.length, 0, "Shouldn't have got addedNodes");
|
|
Packit |
f0b94e |
is(records[0].removedNodes.length, 1, "Should have got removedNodes");
|
|
Packit |
f0b94e |
assertSamePseudoElement("after", records[0].removedNodes[0], originalAfterElement);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
is(records[1].addedNodes.length, 0, "Shouldn't have got addedNodes");
|
|
Packit |
f0b94e |
is(records[1].removedNodes.length, 1, "Should have got removedNodes");
|
|
Packit |
f0b94e |
assertSamePseudoElement("before", records[1].removedNodes[0], originalBeforeElement);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
observer.disconnect();
|
|
Packit |
f0b94e |
testAddedDueToDisplay();
|
|
Packit |
f0b94e |
});
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
SpecialPowers.observeMutationEvents(m, parent, true);
|
|
Packit |
f0b94e |
parent.style.display = "none";
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function testAddedDueToDisplay() {
|
|
Packit |
f0b94e |
let parent = document.getElementById("pseudo");
|
|
Packit |
f0b94e |
var m = new MutationObserver(function(records, observer) {
|
|
Packit |
f0b94e |
is(records.length, 2, "Correct number of records");
|
|
Packit |
f0b94e |
is(records[0].type, "nativeAnonymousChildList", "Correct record type (1)");
|
|
Packit |
f0b94e |
is(records[1].type, "nativeAnonymousChildList", "Correct record type (2)");
|
|
Packit |
f0b94e |
is(records[0].target, parent, "Correct target (1)");
|
|
Packit |
f0b94e |
is(records[1].target, parent, "Correct target (2)");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
is(records[0].addedNodes.length, 1, "Should have got addedNodes");
|
|
Packit |
f0b94e |
assertSamePseudoElement("before", records[0].addedNodes[0], getFirstChild(parent));
|
|
Packit |
f0b94e |
is(records[0].removedNodes.length, 0, "Shouldn't have got removedNodes");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
is(records[1].addedNodes.length, 1, "Should have got addedNodes");
|
|
Packit |
f0b94e |
assertSamePseudoElement("after", records[1].addedNodes[0], getLastChild(parent));
|
|
Packit |
f0b94e |
is(records[1].removedNodes.length, 0, "Shouldn't have got removedNodes");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
observer.disconnect();
|
|
Packit |
f0b94e |
testDifferentTargetNoSubtree();
|
|
Packit |
f0b94e |
});
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
SpecialPowers.observeMutationEvents(m, parent, true);
|
|
Packit |
f0b94e |
parent.style.display = "block";
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function testDifferentTargetNoSubtree() {
|
|
Packit |
f0b94e |
let parent = document.getElementById("pseudo");
|
|
Packit |
f0b94e |
var m = new MutationObserver(function(records, observer) {
|
|
Packit |
f0b94e |
ok(false,
|
|
Packit |
f0b94e |
"No mutation should fire when observing on a parent without subtree option.");
|
|
Packit |
f0b94e |
});
|
|
Packit |
f0b94e |
SpecialPowers.observeMutationEvents(m, document, true);
|
|
Packit |
f0b94e |
parent.style.display = "none";
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// Wait for the actual mutation to come through, making sure that
|
|
Packit |
f0b94e |
// the original observer never fires.
|
|
Packit |
f0b94e |
var m2 = new MutationObserver(function(records, observer) {
|
|
Packit |
f0b94e |
ok(!getFirstChild(parent), "Pseudo element has been removed, but no mutation");
|
|
Packit |
f0b94e |
ok(!getLastChild(parent), "Pseudo element has been removed, but no mutation");
|
|
Packit |
f0b94e |
observer.disconnect();
|
|
Packit |
f0b94e |
testSubtree();
|
|
Packit |
f0b94e |
});
|
|
Packit |
f0b94e |
SpecialPowers.observeMutationEvents(m2, parent, true);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function testSubtree() {
|
|
Packit |
f0b94e |
let parent = document.getElementById("pseudo");
|
|
Packit |
f0b94e |
var m = new MutationObserver(function(records, observer) {
|
|
Packit |
f0b94e |
is(records.length, 2, "Correct number of records");
|
|
Packit |
f0b94e |
is(records[0].type, "nativeAnonymousChildList", "Correct record type (1)");
|
|
Packit |
f0b94e |
is(records[1].type, "nativeAnonymousChildList", "Correct record type (2)");
|
|
Packit |
f0b94e |
is(records[0].target, parent, "Correct target (1)");
|
|
Packit |
f0b94e |
is(records[1].target, parent, "Correct target (2)");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
is(records[0].addedNodes.length, 1, "Should have got addedNodes");
|
|
Packit |
f0b94e |
assertSamePseudoElement("before", records[0].addedNodes[0], getFirstChild(parent));
|
|
Packit |
f0b94e |
is(records[0].removedNodes.length, 0, "Shouldn't have got removedNodes");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
is(records[1].addedNodes.length, 1, "Should have got addedNodes");
|
|
Packit |
f0b94e |
assertSamePseudoElement("after", records[1].addedNodes[0], getLastChild(parent));
|
|
Packit |
f0b94e |
is(records[1].removedNodes.length, 0, "Shouldn't have got removedNodes");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
observer.disconnect();
|
|
Packit |
f0b94e |
testDictionaryWithoutChromePriv();
|
|
Packit |
f0b94e |
});
|
|
Packit |
f0b94e |
SpecialPowers.observeMutationEvents(m, document, true, true);
|
|
Packit |
f0b94e |
parent.style.display = "block";
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function testDictionaryWithoutChromePriv()
|
|
Packit |
f0b94e |
{
|
|
Packit |
f0b94e |
var m = new MutationObserver(function() {});
|
|
Packit |
f0b94e |
try {
|
|
Packit |
f0b94e |
m.observe(document, { childList: true, get nativeAnonymousChildList() { throw "Foo1"; } } );
|
|
Packit |
f0b94e |
ok(true, "Shouldn't throw!");
|
|
Packit |
f0b94e |
} catch(ex) {
|
|
Packit |
f0b94e |
ok(false, "Did throw " + ex);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
try {
|
|
Packit |
f0b94e |
m.observe(document, { childList: true, get animations() { throw "Foo2"; } } );
|
|
Packit |
f0b94e |
ok(true, "Shouldn't throw!");
|
|
Packit |
f0b94e |
} catch(ex) {
|
|
Packit |
f0b94e |
ok(false, "Did throw " + ex);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
SimpleTest.finish();
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
</script>
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
</body>
|
|
Packit |
f0b94e |
</html>
|