123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- <?xml version="1.0"?>
- <!-- This Source Code Form is subject to the terms of the Mozilla Public
- - License, v. 2.0. If a copy of the MPL was not distributed with this
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
- <?xml-stylesheet href="chrome://global/skin" type="text/css"?>
- <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
- width="800" height="800" orient="vertical" onload="initRemoteFrameScript();">
- <script>
- function dumpClientRect(r) {
- dump(r.left + "," + r.top + "," + r.right + "," +
- r.bottom + "," + r.width + "," + r.height + "\n");
- }
- function handleMozAfterPaint(e) {
- return;
- dump(e.type + "\n")
- var rects = e.clientRects;
- var i;
- dump("\tclientRects:\n");
- for (i = 0; i < rects.length; ++i) {
- var r = rects.item(i);
- dump("\t\t");
- dumpClientRect(rects.item(i));
- }
- dump("\tboundingClientRect\n\t\t");
- dumpClientRect(e.boundingClientRect);
- var paintRequests = e.paintRequests;
- dump("\tpaintRequests\n");
- for (i = 0; i < paintRequests.length; ++i) {
- var pr = paintRequests.item(i);
- dump("\t\t");
- dumpClientRect(pr.clientRect);
- if (pr.reason)
- dump("\t\t" + pr.reason + "\n");
- }
- }
- function handleMozScrolledAreaChanged(e) {
- return;
- dump(e.type + "\n");
- dump("\t" + e.x + "," + e.y + "," + e.width + "," + e.height + "\n");
- }
- function restart() {
- var y = document.getElementById('page');
- var p = y.parentNode;
- p.removeChild(y);
- p.appendChild(y);
- var fl = y.QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader;
- fl.activateFrameEvent("MozAfterPaint", true);
- fl.activateFrameEvent("MozScrolledAreaChanged", true);
- y.addEventListener("MozAfterPaint", handleMozAfterPaint, true);
- y.addEventListener("MozScrolledAreaChanged", handleMozScrolledAreaChanged, true);
- }
-
- function loadURL(url) {
- document.getElementById('page').setAttribute('src', url);
- }
- function randomClick() {
- // First focus the remote frame, then dispatch click. This way remote frame gets focus before
- // mouse event.
- document.getElementById('page').focus();
- var frameLoader = document.getElementById('page').QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader;
- var x = parseInt(Math.random() * 100);
- var y = parseInt(Math.random() * 100);
- frameLoader.sendCrossProcessMouseEvent("mousedown", x, y, 0, 1, 0, false);
- frameLoader.sendCrossProcessMouseEvent("mouseup", x, y, 0, 1, 0, false);
- }
- function keyPress() {
- // First focus the remote frame, then dispatch click. This way remote frame gets focus before
- // mouse event.
- document.getElementById('page').focus();
- var frameLoader = document.getElementById('page').QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader;
- var keyCode = Components.interfaces.nsIDOMKeyEvent.DOM_VK_A;
- frameLoader.sendCrossProcessKeyEvent("keydown", keyCode, 0, 0);
- frameLoader.sendCrossProcessKeyEvent("keypress", keyCode, 0, 0);
- frameLoader.sendCrossProcessKeyEvent("keyup", keyCode, 0, 0);
- }
- function openWindow() {
- window.open('chrome://global/content/test-ipc.xul', '_blank', 'chrome,resizable,width=800,height=800');
- }
-
- function closeWindow() {
- window.close();
- }
- function initRemoteFrameScript() {
- // 1. Test that loading a script works, and that accessing process level mm and
- // global mm works.
- var ppm = Components.classes["@mozilla.org/parentprocessmessagemanager;1"]
- .getService(Components.interfaces.nsIMessageBroadcaster);
- var gm = Components.classes["@mozilla.org/globalmessagemanager;1"]
- .getService(Components.interfaces.nsIMessageBroadcaster);
- var cpm = Components.classes["@mozilla.org/childprocessmessagemanager;1"]
- .getService(Components.interfaces.nsISyncMessageSender);
- if (ppm.childCount != 2) {
- alert("Should have two child processes!");
- }
- var childprocessmm = ppm.getChildAt(1); // 0 is the in-process child process mm
-
- childprocessmm.addMessageListener("ppm-sync",
- function(m) {
- if (m.target != childprocessmm) alert("Wrong target!");
- document.getElementById("messageLog").value += "[SYNC1 PPM]";
- }
- );
-
- ppm.addMessageListener("ppm-sync",
- function(m) {
- // Check that global process message manager gets the per-process mm as target.
- if (m.target != childprocessmm) alert("Wrong target!");
- document.getElementById("messageLog").value += "[SYNC2 PPM]";
- }
- );
- childprocessmm.addMessageListener("ppm-async",
- function(m) {
- if (m.target != childprocessmm) alert("Wrong target!");
- document.getElementById("messageLog").value += "[ASYNC1 PPM]";
- }
- );
- ppm.addMessageListener("ppm-async",
- function(m) {
- // Check that global process message manager gets the per-process mm as target.
- if (m.target != childprocessmm) alert("Wrong target!");
- document.getElementById("messageLog").value += "[ASYNC2 PPM]";
- }
- );
- messageManager.loadFrameScript("chrome://global/content/remote-test-ipc.js", true);
- ppm.sendAsyncMessage("cpm-async");
- // 2. Test that adding message listener works, and that receiving a sync message works.
- messageManager.addMessageListener("linkclick",
- function(m) {
- // This checks that json sending works in sync messages.
- document.getElementById("messageLog").value = m.name + ": " + m.json.href;
- return { message: "linkclick-received" };
- });
- // 3. Test that returning multiple json results works.
- messageManager.addMessageListener("linkclick",
- function(m) {
- return { message: "linkclick-received" };
- });
- // 4. Test that receiving an async message works.
- // Test also that sending async message to content works.
- // Test also that { receiveMessage: function(m) {} } works.
- messageManager.addMessageListener("linkclick-reply-object",
- { foobarObjectVar: true,
- receiveMessage: function(m) {
- var s = (m.json.message == "linkclick-received") &&
- (this.foobarObjectVar) ? "PASS" : "FAIL";
- messageManager.broadcastAsyncMessage("chrome-message", { ok : s } );
- }
- }
- );
- // 5. Final test to check that everything went ok.
- messageManager.addMessageListener("chrome-message-reply",
- function(m) {
- // Check that 'this' and .target values are handled correctly
- if (m.target == document.getElementById("page") &&
- this == messageManager) {
- // Check that the message properties are enumerable.
- var hasName = false;
- var hasSync = false;
- var hasJSON = false;
- for (i in m) {
- if (i == "name") {
- hasName = true;
- } else if (i == "sync") {
- hasSync = true;
- } else if (i == "json") {
- hasJSON = true;
- }
- }
- if (hasName && hasSync && hasJSON) {
- document.getElementById("messageLog").value += ", " + m.json.ok;
- }
- }
- });
- }
- var speedTestStartTime = 0;
- var speedTestCount = 0;
- function messageSpeed() {
- speedTestCount = 0;
- messageManager.addMessageListener("speed-test", speedHandler);
- messageManager.broadcastAsyncMessage("speed-test-start");
- }
- function speedHandler() {
- if (!speedTestCount) {
- speedTestStartTime = new Date().getTime();
- }
- if (++speedTestCount == 1000) {
- setTimeout("alert('" + speedTestCount + " in " + (new Date().getTime() - speedTestStartTime) + "ms')", 0);
- return { message: "done" };
- }
- return { message: "continue" };
- }
- var addRemoveTestCount = 0;
- function echoListener() {
- if (++addRemoveTestCount == 1) {
- alert("Expected echo message");
- messageManager.removeMessageListener("async-echo", echoListener);
- messageManager.broadcastAsyncMessage("async-echo");
- return;
- }
- alert("Unexpected echo message");
- }
- function listenerAddRemove() {
- addRemoveTestCount = 0;
- messageManager.addMessageListener("async-echo", echoListener);
- messageManager.broadcastAsyncMessage("async-echo");
- }
- var MozAfterPaintCount = 0;
- function enableMozAfterPaint() {
- messageManager.addMessageListener("MozAfterPaint",
- function(m) {
- document.getElementById("messageLog").value = m.name + "[" + (++MozAfterPaintCount) + "]";
- });
- messageManager.loadFrameScript("data:,addEventListener('MozAfterPaint', function(e) { sendAsyncMessage('MozAfterPaint'); },true);", false);
- }
- var Ci = Components.interfaces;
- var Cu = Components.utils;
- Cu.import("resource://gre/modules/XPCOMUtils.jsm");
- </script>
- <toolbar id="controls">
- <toolbarbutton label="Back"/>
- <toolbarbutton label="Forward"/>
- <textbox onchange="loadURL(this.value)" flex="1" id="URL"/>
- </toolbar>
- <toolbar>
- <toolbarbutton onclick="restart()" label="Recover"/>
- <toolbarbutton onclick="randomClick()" label="random click"/>
- <toolbarbutton onclick="keyPress()" label="key press"/>
- <toolbarbutton onclick="messageSpeed()" label="test message handling speed"/>
- <toolbarbutton onclick="listenerAddRemove()" label="test listener add/remove"/>
- <toolbarbutton onclick="enableMozAfterPaint()" label="MozAfterPaint"/>
- <toolbarbutton onclick="openWindow()" label="open new window"/>
- <toolbarbutton onclick="closeWindow()" label="close this window"/>
- </toolbar>
- <toolbar><label value="Load a script (URL) to content process:"/>
- <textbox flex="1" id="script"/><button
- label="send" oncommand="document.getElementById('page')
- .QueryInterface(Components.interfaces.nsIFrameLoaderOwner)
- .frameLoader.messageManager
- .loadFrameScript(this.previousSibling.value, false);"/>
- </toolbar>
- <toolbar>
- <label value="Eval script in chrome context"/>
- <textbox flex="1"/><button label="run" oncommand="eval(this.previousSibling.value);"/>
- </toolbar>
- <browser type="content" src="http://www.google.com/" flex="1" id="page" remote="true"/>
- <label id="messageLog" value="" crop="center"/>
- </window>
|