gecko/dom/events/test/test_bug524674.xul

148 lines
5.1 KiB
XML

<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=524674
-->
<window title="Mozilla Bug 524674"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
<!-- test results are displayed in the html:body -->
<body xmlns="http://www.w3.org/1999/xhtml">
<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=524674"
target="_blank">Mozilla Bug 524674</a>
</body>
<!-- test code goes here -->
<script type="application/javascript">
<![CDATA[
/** Test for Bug 524674 **/
var els = Components.classes["@mozilla.org/eventlistenerservice;1"]
.getService(Components.interfaces.nsIEventListenerService);
const Ci = Components.interfaces;
function dummyListener() {}
var runningTest = null;
var d = document.createElementNS("http://www.w3.org/1999/xhtml", "div");
var xhr = new XMLHttpRequest();
// Test also double removals and such.
var tests = [
function() {
els.addListenerChangeListener(changeListener);
d.addEventListener("foo", dummyListener);
d.addEventListener("foo", dummyListener);
xhr.addEventListener("foo", dummyListener);
tests[0] = [{target: d, listeners: ["onfoo"]},
{target: xhr, listeners: ["onfoo"]}];
},
function() {
d.addEventListener("bar", dummyListener);
d.addEventListener("baz", dummyListener);
xhr.addEventListener("bar", dummyListener);
xhr.addEventListener("baz", dummyListener);
tests[0] = [{target: d, listeners: ["onbaz", "onbar"]},
{target: xhr, listeners: ["onbaz", "onbar"]}];
},
function() {
d.onclick = dummyListener;
d.onclick = dummyListener;
xhr.onload = dummyListener;
tests[0] = [{target: d, listeners: ["onclick"]},
{target: xhr, listeners: ["onload"]}];
},
function() {
d.onclick = function() {};
tests[0] = [{target: d, listeners: ["onclick"]}];
},
function() {
d.removeEventListener("foo", dummyListener);
d.removeEventListener("foo", dummyListener);
xhr.removeEventListener("foo", dummyListener);
tests[0] = [{target: d, listeners: ["onfoo"]},
{target: xhr, listeners: ["onfoo"]}];
},
function() {
d.removeEventListener("bar", dummyListener);
d.removeEventListener("baz", dummyListener);
xhr.removeEventListener("bar", dummyListener);
xhr.removeEventListener("baz", dummyListener);
tests[0] = [{target: d, listeners: ["onbar", "onbaz"]},
{target: xhr, listeners: ["onbar", "onbaz"]}];
},
function() {
d.onclick = null;
d.onclick = null;
xhr.onload = null;
tests[0] = [{target: d, listeners: ["onclick"]},
{target: xhr, listeners: ["onload"]}];
},
function() {
els.removeListenerChangeListener(changeListener);
// Check that once we've removed the change listener, it isn't called anymore.
d.addEventListener("foo", dummyListener);
xhr.addEventListener("foo", dummyListener);
SimpleTest.executeSoon(function() {
SimpleTest.finish();
});
}
];
SimpleTest.executeSoon(tests[0]);
function changeListener(array) {
if (typeof tests[0] == "function") {
return;
}
var expectedEventChanges = tests[0];
var eventChanges = array.enumerate();
var i = 0;
while (eventChanges.hasMoreElements() && i < expectedEventChanges.length) {
var current;
try {
current = eventChanges.getNext().QueryInterface(Ci.nsIEventListenerChange);
var expected = expectedEventChanges[i];
if (current.target == expected.target) {
// expected.target.listeners should be a subset of
// current.changedListenerNames if all expected listener changes were
// sent. We may get random other event listener changes here too, not
// just the one from the test.
is(current.target, expected.target, current.target + " = " + expected.target);
var eNames = current.changedListenerNames.enumerate();
var listeners = [];
while (eNames.hasMoreElements()) {
var listenerName = eNames.getNext().QueryInterface(Ci.nsIAtom).toString();
listeners.push(listenerName);
}
var matchAll = expected.listeners.every(function(val)
{ return listeners.indexOf(val) >= 0; });
if (!matchAll)
return;
++i;
}
} catch(ex) {
continue;
}
}
if (expectedEventChanges.length != i) {
return;
}
is(expectedEventChanges.length, i, "Should have got notification for all the changes.");
tests.shift();
ok(tests.length);
SimpleTest.executeSoon(tests[0]);
}
SimpleTest.waitForExplicitFinish();
]]>
</script>
</window>