dom/ipc/test.xul

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/dom/ipc/test.xul	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,274 @@
     1.4 +<?xml version="1.0"?>
     1.5 +<!-- This Source Code Form is subject to the terms of the Mozilla Public
     1.6 +   - License, v. 2.0. If a copy of the MPL was not distributed with this
     1.7 +   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
     1.8 +
     1.9 +<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
    1.10 +<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
    1.11 +        width="800" height="800" orient="vertical" onload="initRemoteFrameScript();">
    1.12 +  <script>
    1.13 +
    1.14 +    function dumpClientRect(r) {
    1.15 +      dump(r.left + "," + r.top + "," + r.right + "," +
    1.16 +           r.bottom + "," + r.width + "," + r.height + "\n");
    1.17 +    }
    1.18 +
    1.19 +    function handleMozAfterPaint(e) {
    1.20 +      return;
    1.21 +      dump(e.type + "\n")
    1.22 +      var rects = e.clientRects;
    1.23 +      var i;
    1.24 +      dump("\tclientRects:\n");
    1.25 +      for (i = 0; i &lt; rects.length; ++i) {
    1.26 +        var r = rects.item(i);
    1.27 +        dump("\t\t");
    1.28 +        dumpClientRect(rects.item(i));
    1.29 +      }
    1.30 +
    1.31 +      dump("\tboundingClientRect\n\t\t");
    1.32 +      dumpClientRect(e.boundingClientRect);
    1.33 +
    1.34 +      var paintRequests = e.paintRequests;
    1.35 +      dump("\tpaintRequests\n");
    1.36 +      for (i = 0; i &lt; paintRequests.length; ++i) {
    1.37 +        var pr = paintRequests.item(i);
    1.38 +        dump("\t\t");
    1.39 +        dumpClientRect(pr.clientRect);
    1.40 +        if (pr.reason)
    1.41 +          dump("\t\t" + pr.reason + "\n");
    1.42 +      }
    1.43 +    }
    1.44 +
    1.45 +    function handleMozScrolledAreaChanged(e) {
    1.46 +      return;
    1.47 +      dump(e.type + "\n");
    1.48 +      dump("\t" + e.x + "," + e.y + "," + e.width + "," + e.height + "\n");
    1.49 +    }
    1.50 +
    1.51 +    function restart() {
    1.52 +      var y = document.getElementById('page');
    1.53 +      var p = y.parentNode;
    1.54 +      p.removeChild(y);
    1.55 +      p.appendChild(y);
    1.56 +
    1.57 +      var fl = y.QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader;
    1.58 +      fl.activateFrameEvent("MozAfterPaint", true);
    1.59 +      fl.activateFrameEvent("MozScrolledAreaChanged", true);
    1.60 +      y.addEventListener("MozAfterPaint", handleMozAfterPaint, true);
    1.61 +      y.addEventListener("MozScrolledAreaChanged", handleMozScrolledAreaChanged, true);
    1.62 +    }
    1.63 +    
    1.64 +    function loadURL(url) {
    1.65 +      document.getElementById('page').setAttribute('src', url);
    1.66 +    }
    1.67 +
    1.68 +    function randomClick() {
    1.69 +       // First focus the remote frame, then dispatch click. This way remote frame gets focus before
    1.70 +       // mouse event.
    1.71 +       document.getElementById('page').focus();
    1.72 +       var frameLoader = document.getElementById('page').QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader;
    1.73 +       var x = parseInt(Math.random() * 100);
    1.74 +       var y = parseInt(Math.random() * 100);
    1.75 +       frameLoader.sendCrossProcessMouseEvent("mousedown", x, y, 0, 1, 0, false);
    1.76 +       frameLoader.sendCrossProcessMouseEvent("mouseup", x, y, 0, 1, 0, false);
    1.77 +     }
    1.78 +
    1.79 +    function keyPress() {
    1.80 +       // First focus the remote frame, then dispatch click. This way remote frame gets focus before
    1.81 +       // mouse event.
    1.82 +       document.getElementById('page').focus();
    1.83 +       var frameLoader = document.getElementById('page').QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader;
    1.84 +
    1.85 +       var keyCode = Components.interfaces.nsIDOMKeyEvent.DOM_VK_A;
    1.86 +       frameLoader.sendCrossProcessKeyEvent("keydown", keyCode, 0, 0);
    1.87 +       frameLoader.sendCrossProcessKeyEvent("keypress", keyCode, 0, 0);
    1.88 +       frameLoader.sendCrossProcessKeyEvent("keyup", keyCode, 0, 0);
    1.89 +     }
    1.90 +
    1.91 +    function openWindow() {
    1.92 +      window.open('chrome://global/content/test-ipc.xul', '_blank', 'chrome,resizable,width=800,height=800');
    1.93 +    }
    1.94 +    
    1.95 +    function closeWindow() {
    1.96 +      window.close();
    1.97 +    }
    1.98 +
    1.99 +    function initRemoteFrameScript() {
   1.100 +      // 1. Test that loading a script works, and that accessing process level mm and
   1.101 +      //     global mm works.
   1.102 +      var ppm = Components.classes["@mozilla.org/parentprocessmessagemanager;1"]
   1.103 +                          .getService(Components.interfaces.nsIMessageBroadcaster);
   1.104 +      var gm = Components.classes["@mozilla.org/globalmessagemanager;1"]
   1.105 +                         .getService(Components.interfaces.nsIMessageBroadcaster);
   1.106 +      var cpm = Components.classes["@mozilla.org/childprocessmessagemanager;1"]
   1.107 +                            .getService(Components.interfaces.nsISyncMessageSender);
   1.108 +
   1.109 +      if (ppm.childCount != 2) {
   1.110 +        alert("Should have two child processes!");
   1.111 +      }
   1.112 +      var childprocessmm = ppm.getChildAt(1); // 0 is the in-process child process mm
   1.113 +      
   1.114 +      childprocessmm.addMessageListener("ppm-sync",
   1.115 +        function(m) {
   1.116 +          if (m.target != childprocessmm) alert("Wrong target!");
   1.117 +          document.getElementById("messageLog").value += "[SYNC1 PPM]"; 
   1.118 +        }
   1.119 +      );
   1.120 +      
   1.121 +      ppm.addMessageListener("ppm-sync",
   1.122 +        function(m) {
   1.123 +          // Check that global process message manager gets the per-process mm as target.
   1.124 +          if (m.target != childprocessmm) alert("Wrong target!");
   1.125 +          document.getElementById("messageLog").value += "[SYNC2 PPM]"; 
   1.126 +        }
   1.127 +      );
   1.128 +      childprocessmm.addMessageListener("ppm-async",
   1.129 +        function(m) {
   1.130 +          if (m.target != childprocessmm) alert("Wrong target!");
   1.131 +          document.getElementById("messageLog").value += "[ASYNC1 PPM]"; 
   1.132 +        }
   1.133 +      );
   1.134 +      ppm.addMessageListener("ppm-async",
   1.135 +        function(m) {
   1.136 +          // Check that global process message manager gets the per-process mm as target.
   1.137 +          if (m.target != childprocessmm) alert("Wrong target!");
   1.138 +          document.getElementById("messageLog").value += "[ASYNC2 PPM]"; 
   1.139 +        }
   1.140 +      );
   1.141 +      messageManager.loadFrameScript("chrome://global/content/remote-test-ipc.js", true);
   1.142 +      ppm.sendAsyncMessage("cpm-async");
   1.143 +
   1.144 +      // 2. Test that adding message listener works, and that receiving a sync message works.
   1.145 +      messageManager.addMessageListener("linkclick",
   1.146 +        function(m) {
   1.147 +          // This checks that json sending works in sync messages. 
   1.148 +          document.getElementById("messageLog").value = m.name + ": " + m.json.href;
   1.149 +          return { message: "linkclick-received" };
   1.150 +        });
   1.151 +
   1.152 +      // 3. Test that returning multiple json results works.
   1.153 +      messageManager.addMessageListener("linkclick",
   1.154 +        function(m) {
   1.155 +          return { message: "linkclick-received" };
   1.156 +        });
   1.157 +
   1.158 +      // 4. Test that receiving an async message works.
   1.159 +      //    Test also that sending async message to content works.
   1.160 +      //    Test also that { receiveMessage: function(m) {} } works.
   1.161 +      messageManager.addMessageListener("linkclick-reply-object",
   1.162 +        { foobarObjectVar: true,
   1.163 +          receiveMessage: function(m) {
   1.164 +            var s = (m.json.message == "linkclick-received") &amp;&amp;
   1.165 +                    (this.foobarObjectVar) ? "PASS" : "FAIL";
   1.166 +            messageManager.broadcastAsyncMessage("chrome-message", { ok : s } );
   1.167 +          }
   1.168 +        }
   1.169 +        );
   1.170 +
   1.171 +      // 5. Final test to check that everything went ok.
   1.172 +      messageManager.addMessageListener("chrome-message-reply",
   1.173 +        function(m) {
   1.174 +          // Check that 'this' and .target values are handled correctly
   1.175 +          if (m.target == document.getElementById("page") &amp;&amp;
   1.176 +              this == messageManager) {
   1.177 +            // Check that the message properties are enumerable.
   1.178 +            var hasName = false;
   1.179 +            var hasSync = false;
   1.180 +            var hasJSON = false;
   1.181 +            for (i in m) {
   1.182 +              if (i == "name") {
   1.183 +                hasName = true;
   1.184 +              } else if (i == "sync") {
   1.185 +                hasSync = true;
   1.186 +              } else if (i == "json") {
   1.187 +                hasJSON = true;
   1.188 +              }
   1.189 +            }
   1.190 +            if (hasName &amp;&amp; hasSync &amp;&amp; hasJSON) {
   1.191 +              document.getElementById("messageLog").value += ", " + m.json.ok;
   1.192 +            }
   1.193 +          }
   1.194 +        });
   1.195 +    }
   1.196 +
   1.197 +    var speedTestStartTime = 0;
   1.198 +    var speedTestCount = 0;
   1.199 +    function messageSpeed() {
   1.200 +      speedTestCount = 0;
   1.201 +      messageManager.addMessageListener("speed-test", speedHandler);
   1.202 +      messageManager.broadcastAsyncMessage("speed-test-start");
   1.203 +    }
   1.204 +
   1.205 +    function speedHandler() {
   1.206 +      if (!speedTestCount) {
   1.207 +        speedTestStartTime = new Date().getTime();
   1.208 +      }
   1.209 +      if (++speedTestCount == 1000) {
   1.210 +        setTimeout("alert('" + speedTestCount + " in "  + (new Date().getTime() - speedTestStartTime) +  "ms')", 0);
   1.211 +        return { message: "done" };
   1.212 +      }
   1.213 +      return { message: "continue" };
   1.214 +    }
   1.215 +
   1.216 +    var addRemoveTestCount = 0;
   1.217 +
   1.218 +    function echoListener() {
   1.219 +      if (++addRemoveTestCount == 1) {
   1.220 +        alert("Expected echo message");
   1.221 +        messageManager.removeMessageListener("async-echo", echoListener);
   1.222 +        messageManager.broadcastAsyncMessage("async-echo");
   1.223 +        return;
   1.224 +      }
   1.225 +      alert("Unexpected echo message");
   1.226 +    }
   1.227 +
   1.228 +    function listenerAddRemove() {
   1.229 +      addRemoveTestCount = 0;
   1.230 +      messageManager.addMessageListener("async-echo", echoListener);
   1.231 +      messageManager.broadcastAsyncMessage("async-echo");
   1.232 +    }
   1.233 +
   1.234 +    var MozAfterPaintCount = 0;
   1.235 +    function enableMozAfterPaint() {
   1.236 +      messageManager.addMessageListener("MozAfterPaint",
   1.237 +        function(m) {
   1.238 +          document.getElementById("messageLog").value = m.name + "[" + (++MozAfterPaintCount) + "]";
   1.239 +        });
   1.240 +      messageManager.loadFrameScript("data:,addEventListener('MozAfterPaint', function(e) { sendAsyncMessage('MozAfterPaint'); },true);", false);
   1.241 +    }
   1.242 +
   1.243 +   var Ci = Components.interfaces;
   1.244 +   var Cu = Components.utils;
   1.245 +   Cu.import("resource://gre/modules/XPCOMUtils.jsm");
   1.246 +  </script>
   1.247 +
   1.248 +  <toolbar id="controls">
   1.249 +    <toolbarbutton label="Back"/>
   1.250 +    <toolbarbutton label="Forward"/>
   1.251 +    <textbox onchange="loadURL(this.value)" flex="1" id="URL"/>
   1.252 +  </toolbar>
   1.253 +  <toolbar>
   1.254 +    <toolbarbutton onclick="restart()" label="Recover"/>
   1.255 +    <toolbarbutton onclick="randomClick()" label="random click"/>
   1.256 +    <toolbarbutton onclick="keyPress()" label="key press"/>
   1.257 +    <toolbarbutton onclick="messageSpeed()" label="test message handling speed"/>
   1.258 +    <toolbarbutton onclick="listenerAddRemove()" label="test listener add/remove"/>
   1.259 +    <toolbarbutton onclick="enableMozAfterPaint()" label="MozAfterPaint"/>
   1.260 +    <toolbarbutton onclick="openWindow()" label="open new window"/>
   1.261 +    <toolbarbutton onclick="closeWindow()" label="close this window"/>
   1.262 +  </toolbar>
   1.263 +  <toolbar><label value="Load a script (URL) to content process:"/>
   1.264 +    <textbox flex="1" id="script"/><button
   1.265 +      label="send" oncommand="document.getElementById('page')
   1.266 +                                      .QueryInterface(Components.interfaces.nsIFrameLoaderOwner)
   1.267 +                                      .frameLoader.messageManager
   1.268 +                                      .loadFrameScript(this.previousSibling.value, false);"/>
   1.269 +  </toolbar>
   1.270 +  <toolbar>
   1.271 +    <label value="Eval script in chrome context"/>
   1.272 +    <textbox flex="1"/><button label="run" oncommand="eval(this.previousSibling.value);"/>
   1.273 +  </toolbar>
   1.274 +
   1.275 +  <browser type="content" src="http://www.google.com/" flex="1" id="page" remote="true"/>
   1.276 +  <label id="messageLog" value="" crop="center"/>
   1.277 +</window>

mercurial