1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/content/base/test/chrome/file_bug549682.xul Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,226 @@ 1.4 +<?xml version="1.0"?> 1.5 +<?xml-stylesheet href="chrome://global/skin" type="text/css"?> 1.6 +<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" 1.7 + type="text/css"?> 1.8 +<!-- 1.9 +https://bugzilla.mozilla.org/show_bug.cgi?id=549682 1.10 +--> 1.11 +<window title="Mozilla Bug 549682" 1.12 + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" 1.13 + onload="run()"> 1.14 + <label value="Mozilla Bug 549682"/> 1.15 + <!-- test code goes here --> 1.16 + <script type="application/javascript"><![CDATA[ 1.17 + var Cc = Components.classes; 1.18 + var Ci = Components.interfaces; 1.19 + var Cr = Components.results; 1.20 + var Cu = Components.utils; 1.21 + 1.22 + var didRunAsync = false; 1.23 + var didRunLocal = false; 1.24 + 1.25 + var global = Cc["@mozilla.org/globalmessagemanager;1"] 1.26 + .getService(Components.interfaces.nsIMessageBroadcaster); 1.27 + var ppm = Cc["@mozilla.org/parentprocessmessagemanager;1"] 1.28 + .getService(Components.interfaces.nsIMessageBroadcaster); 1.29 + var cpm = Cc["@mozilla.org/childprocessmessagemanager;1"] 1.30 + .getService(Components.interfaces.nsISyncMessageSender); 1.31 + 1.32 + Cu.import("resource://gre/modules/XPCOMUtils.jsm"); 1.33 + 1.34 + function ok(cond, msg) { 1.35 + opener.wrappedJSObject.ok(cond, msg); 1.36 + } 1.37 + 1.38 + function is(actual, expected, msg) { 1.39 + opener.wrappedJSObject.is(actual, expected, msg); 1.40 + } 1.41 + 1.42 + var asyncPPML = false; 1.43 + function ppmASL(m) { 1.44 + asyncPPML = true; 1.45 + } 1.46 + var syncPPML = false; 1.47 + function ppmSL(m) { 1.48 + syncPPML = true; 1.49 + } 1.50 + ppm.addMessageListener("processmessageAsync", ppmASL); 1.51 + ppm.addMessageListener("processmessageSync", ppmSL); 1.52 + 1.53 + cpm.sendAsyncMessage("processmessageAsync", ""); 1.54 + cpm.sendSyncMessage("processmessageSync", ""); 1.55 + 1.56 + var asyncCPML = false; 1.57 + function cpmASL(m) { 1.58 + asyncCPML = true; 1.59 + } 1.60 + cpm.addMessageListener("childprocessmessage", cpmASL); 1.61 + ppm.broadcastAsyncMessage("childprocessmessage", ""); 1.62 + 1.63 + function checkPMMMessages() { 1.64 + ok(asyncPPML, "should have handled async message"); 1.65 + ok(syncPPML, "should have handled sync message"); 1.66 + ok(asyncCPML, "should have handled async message"); 1.67 + ppm.removeMessageListener("processmessageAsync", ppmASL); 1.68 + ppm.removeMessageListener("processmessageSync", ppmSL); 1.69 + cpm.removeMessageListener("childprocessmessage", cpmASL); 1.70 + } 1.71 + 1.72 + var globalListenerCallCount = 0; 1.73 + function globalListener(m) { 1.74 + ++globalListenerCallCount; 1.75 + if (m.name == "sync") { 1.76 + global.removeMessageListener("async", globalListener); 1.77 + global.removeMessageListener("sync", globalListener); 1.78 + global.removeMessageListener("global-sync", globalListener); 1.79 + // Note, the result depends on what other windows are open. 1.80 + ok(globalListenerCallCount >= 4, 1.81 + "Global listener should have been called at least 4 times!"); 1.82 + ok(didRunLocal, "Local message received."); 1.83 + } 1.84 + } 1.85 + 1.86 + function asyncL(m) { 1.87 + didRunAsync = true; 1.88 + is(m.name, "async", "Wrong message!"); 1.89 + is(m.json.data, 1234, "Wrong data!"); 1.90 + } 1.91 + 1.92 + function syncL(m) { 1.93 + is(m.name, "sync", "Wrong message!"); 1.94 + is(m.json.data, 1234, "Wrong data!"); 1.95 + ok(didRunAsync, "Should have run async!"); 1.96 + } 1.97 + 1.98 + function localL(m) { 1.99 + is(m.name, "lasync", "Wrong message!"); 1.100 + is(m.json.data, 2345, "Wrong data!"); 1.101 + didRunLocal = true; 1.102 + } 1.103 + 1.104 + var weakMessageReceived = false; 1.105 + var weakListener = { 1.106 + QueryInterface: XPCOMUtils.generateQI([Ci.nsIMessageListener, 1.107 + Ci.nsISupportsWeakReference]), 1.108 + 1.109 + receiveMessage: function(msg) { 1.110 + if (weakMessageReceived) { 1.111 + ok(false, 'Weak listener fired twice.'); 1.112 + return; 1.113 + } 1.114 + 1.115 + ok(true, 'Weak listener fired once.'); 1.116 + weakMessageReceived = true; 1.117 + document.getElementById('ifr').messageManager 1.118 + .removeWeakMessageListener('weak', weakListener); 1.119 + } 1.120 + }; 1.121 + 1.122 + var weakListener2 = { 1.123 + QueryInterface: XPCOMUtils.generateQI([Ci.nsIMessageListener, 1.124 + Ci.nsISupportsWeakReference]), 1.125 + 1.126 + receiveMessage: function(msg) { 1.127 + ok(false, 'Should not have received a message.'); 1.128 + } 1.129 + }; 1.130 + 1.131 + function weakDoneListener() { 1.132 + ok(weakMessageReceived, 'Got "weak" message.'); 1.133 + finish(); 1.134 + } 1.135 + 1.136 + function finish() { 1.137 + opener.setTimeout("done()", 0); 1.138 + var i = document.getElementById("ifr"); 1.139 + i.parentNode.removeChild(i); // This is a crash test! 1.140 + window.close(); 1.141 + } 1.142 + 1.143 + function loadScript() { 1.144 + // Async should be processed first! 1.145 + messageManager.loadFrameScript("data:,\ 1.146 + sendAsyncMessage('async', { data: 1234 });\ 1.147 + sendSyncMessage('sync', { data: 1234 });\ 1.148 + sendAsyncMessage('weak', {});\ 1.149 + sendAsyncMessage('weak', {});\ 1.150 + sendAsyncMessage('weakdone', {});", false); 1.151 + } 1.152 + 1.153 + function run() { 1.154 + var localmm = document.getElementById('ifr').messageManager; 1.155 + 1.156 + var wn = document.getElementById('ifr').contentWindow 1.157 + .getInterface(Components.interfaces.nsIWebNavigation); 1.158 + ok(wn, "Should have webnavigation"); 1.159 + var cfmm = wn.getInterface(Components.interfaces.nsIContentFrameMessageManager); 1.160 + ok(cfmm, "Should have content messageManager"); 1.161 + 1.162 + var didGetSyncMessage = false; 1.163 + function syncContinueTestFn() { 1.164 + didGetSyncMessage = true; 1.165 + } 1.166 + localmm.addMessageListener("syncContinueTest", syncContinueTestFn); 1.167 + cfmm.sendSyncMessage("syncContinueTest", {}); 1.168 + localmm.removeMessageListener("syncContinueTest", syncContinueTestFn); 1.169 + ok(didGetSyncMessage, "Should have got sync message!"); 1.170 + 1.171 + localmm.addMessageListener("lasync", localL); 1.172 + localmm.loadFrameScript("data:,sendAsyncMessage('lasync', { data: 2345 })", false); 1.173 + 1.174 + messageManager.addMessageListener("async", asyncL); 1.175 + messageManager.addMessageListener("sync", syncL); 1.176 + global.addMessageListener("async", globalListener); 1.177 + global.addMessageListener("sync", globalListener); 1.178 + global.addMessageListener("global-sync", globalListener); 1.179 + global.loadFrameScript("data:,sendSyncMessage('global-sync', { data: 1234 });", true); 1.180 + var toBeRemovedScript = "data:,sendAsyncMessage('toberemoved', { data: 2345 })"; 1.181 + var c = 0; 1.182 + messageManager.addMessageListener("toberemoved", function() { 1.183 + ++c; 1.184 + is(c, 1, "Should be called only once!"); 1.185 + }); 1.186 + // This loads the script in the existing <browser> 1.187 + messageManager.loadFrameScript(toBeRemovedScript, true); 1.188 + // But it won't be loaded in the dynamically created <browser> 1.189 + messageManager.removeDelayedFrameScript(toBeRemovedScript); 1.190 + 1.191 + var oldValue = globalListenerCallCount; 1.192 + var b = document.createElement("browser"); 1.193 + b.setAttribute("type", "content"); 1.194 + document.documentElement.appendChild(b); 1.195 + is(globalListenerCallCount, oldValue + 1, 1.196 + "Wrong message count"); 1.197 + 1.198 + localmm.addWeakMessageListener('weak', weakListener); 1.199 + localmm.addMessageListener('weakdone', weakDoneListener); 1.200 + 1.201 + // Add weakListener2 as a weak message listener, then force weakListener2 1.202 + // to be gc'ed. weakListener2 shouldn't be run. 1.203 + var weakRef = Cu.getWeakReference(weakListener2); 1.204 + localmm.addWeakMessageListener('weak', weakListener2); 1.205 + weakListener2 = null; 1.206 + 1.207 + // Force a gc/cc in a loop until weakRef's referent has gone away. 1.208 + function waitForWeakRefToDie() { 1.209 + if (weakRef.get()) { 1.210 + var mgr = Cc["@mozilla.org/memory-reporter-manager;1"] 1.211 + .getService(Ci.nsIMemoryReporterManager); 1.212 + mgr.minimizeMemoryUsage(waitForWeakRefToDie); 1.213 + 1.214 + // Print a message so that if the test hangs in a minimizeMemoryUsage 1.215 + // loop, we'll be able to see it in the log. 1.216 + ok(true, "waitForWeakRefToDie spinning..."); 1.217 + return; 1.218 + } 1.219 + 1.220 + setTimeout(checkPMMMessages, 0); 1.221 + setTimeout(loadScript, 0); 1.222 + } 1.223 + 1.224 + waitForWeakRefToDie(); 1.225 + } 1.226 + 1.227 + ]]></script> 1.228 + <browser type="content" src="about:blank" id="ifr"/> 1.229 +</window>