test_bug524674.xhtml (4330B)
1 <?xml version="1.0"?> 2 <?xml-stylesheet type="text/css" href="chrome://global/skin"?> 3 <?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?> 4 <!-- 5 https://bugzilla.mozilla.org/show_bug.cgi?id=524674 6 --> 7 <window title="Mozilla Bug 524674" 8 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 9 <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> 10 11 <!-- test results are displayed in the html:body --> 12 <body xmlns="http://www.w3.org/1999/xhtml"> 13 <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=524674" 14 target="_blank">Mozilla Bug 524674</a> 15 </body> 16 17 <!-- test code goes here --> 18 <script type="application/javascript"> 19 <![CDATA[ 20 /** Test for Bug 524674 */ 21 22 var els = Cc["@mozilla.org/eventlistenerservice;1"] 23 .getService(Ci.nsIEventListenerService); 24 25 function dummyListener() {} 26 27 var runningTest = null; 28 var d = document.createElementNS("http://www.w3.org/1999/xhtml", "div"); 29 var xhr = new XMLHttpRequest(); 30 31 // Test also double removals and such. 32 var tests = [ 33 function() { 34 els.addListenerChangeListener(changeListener); 35 d.addEventListener("foo", dummyListener); 36 d.addEventListener("foo", dummyListener); 37 xhr.addEventListener("foo", dummyListener); 38 tests[0] = [{target: d, listeners: ["onfoo"]}, 39 {target: xhr, listeners: ["onfoo"]}]; 40 }, 41 function() { 42 d.addEventListener("bar", dummyListener); 43 d.addEventListener("baz", dummyListener); 44 xhr.addEventListener("bar", dummyListener); 45 xhr.addEventListener("baz", dummyListener); 46 tests[0] = [{target: d, listeners: ["onbaz", "onbar"]}, 47 {target: xhr, listeners: ["onbaz", "onbar"]}]; 48 }, 49 function() { 50 d.onclick = dummyListener; 51 d.onclick = dummyListener; 52 xhr.onload = dummyListener; 53 tests[0] = [{target: d, listeners: ["onclick"]}, 54 {target: xhr, listeners: ["onload"]}]; 55 }, 56 function() { 57 d.onclick = function() {}; 58 tests[0] = [{target: d, listeners: ["onclick"]}]; 59 }, 60 function() { 61 d.removeEventListener("foo", dummyListener); 62 d.removeEventListener("foo", dummyListener); 63 xhr.removeEventListener("foo", dummyListener); 64 tests[0] = [{target: d, listeners: ["onfoo"]}, 65 {target: xhr, listeners: ["onfoo"]}]; 66 }, 67 function() { 68 d.removeEventListener("bar", dummyListener); 69 d.removeEventListener("baz", dummyListener); 70 xhr.removeEventListener("bar", dummyListener); 71 xhr.removeEventListener("baz", dummyListener); 72 tests[0] = [{target: d, listeners: ["onbar", "onbaz"]}, 73 {target: xhr, listeners: ["onbar", "onbaz"]}]; 74 }, 75 function() { 76 d.onclick = null; 77 d.onclick = null; 78 xhr.onload = null; 79 tests[0] = [{target: d, listeners: ["onclick"]}, 80 {target: xhr, listeners: ["onload"]}]; 81 }, 82 function() { 83 els.removeListenerChangeListener(changeListener); 84 // Check that once we've removed the change listener, it isn't called anymore. 85 d.addEventListener("foo", dummyListener); 86 xhr.addEventListener("foo", dummyListener); 87 SimpleTest.executeSoon(function() { 88 SimpleTest.finish(); 89 }); 90 } 91 ]; 92 93 SimpleTest.executeSoon(tests[0]); 94 95 function changeListener(array) { 96 if (typeof tests[0] == "function") { 97 return; 98 } 99 var expectedEventChanges = tests[0]; 100 var eventChanges = array.enumerate(); 101 var i = 0; 102 while (eventChanges.hasMoreElements() && i < expectedEventChanges.length) { 103 var current; 104 try { 105 current = eventChanges.getNext().QueryInterface(Ci.nsIEventListenerChange); 106 var expected = expectedEventChanges[i]; 107 108 if (current.target == expected.target) { 109 is(current.target, expected.target, current.target + " = " + expected.target); 110 ++i; 111 } 112 } catch(ex) { 113 continue; 114 } 115 } 116 if (expectedEventChanges.length != i) { 117 return; 118 } 119 120 is(expectedEventChanges.length, i, "Should have got notification for all the changes."); 121 tests.shift(); 122 123 ok(tests.length); 124 SimpleTest.executeSoon(tests[0]); 125 } 126 127 SimpleTest.waitForExplicitFinish(); 128 ]]> 129 </script> 130 </window>