content/base/test/chrome/file_bug549682.xul

changeset 0
6474c204b198
     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>

mercurial