mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-29 21:25:35 +00:00
304 lines
12 KiB
XML
304 lines
12 KiB
XML
<?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.nsIFrameMessageManager);
|
|
var gm = Components.classes["@mozilla.org/globalmessagemanager;1"]
|
|
.getService(Components.interfaces.nsIChromeFrameMessageManager);
|
|
var cpm = Components.classes["@mozilla.org/childprocessmessagemanager;1"]
|
|
.getService(Components.interfaces.nsISyncMessageSender);
|
|
|
|
var tppm = ppm.QueryInterface(Components.interfaces.nsITreeItemFrameMessageManager);
|
|
if (tppm.childCount != 2) {
|
|
alert("Should have two child processes!");
|
|
}
|
|
var childprocessmm = tppm.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.sendAsyncMessage("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.sendAsyncMessage("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.sendAsyncMessage("async-echo");
|
|
return;
|
|
}
|
|
alert("Unexpected echo message");
|
|
}
|
|
|
|
function listenerAddRemove() {
|
|
addRemoveTestCount = 0;
|
|
messageManager.addMessageListener("async-echo", echoListener);
|
|
messageManager.sendAsyncMessage("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");
|
|
|
|
function DialogProvider() { }
|
|
|
|
DialogProvider.prototype = {
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIBrowserDOMWindow, Ci.nsIDialogCreator, Ci.nsISupports]),
|
|
openURI: function (aURI, aOpener, aWhere, aContext) {
|
|
return null;
|
|
},
|
|
isTabContentWindow: function (aWindow) {
|
|
return false;
|
|
},
|
|
openDialog: function(aType, aName, aFeatures, aArguments, aFrameElement) {
|
|
alert(aType + ", " + aName + ", " + aFeatures + ", " + aArguments + ", " + aFrameElement);
|
|
}
|
|
}
|
|
|
|
function defaultDialogs(useDefault) {
|
|
window.QueryInterface(Ci.nsIDOMChromeWindow).browserDOMWindow = useDefault ? null : new DialogProvider();
|
|
}
|
|
|
|
defaultDialogs(false);
|
|
|
|
window.addEventListener("MozDelayedModalDialog",
|
|
function(e) { alert(e.type + ", " + e.target); },
|
|
true);
|
|
|
|
</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>
|
|
<toolbar>
|
|
<checkbox label="allow dialogs from remote content"
|
|
oncommand="document.getElementById('page').QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader.delayRemoteDialogs = this.checked;"/>
|
|
</toolbar>
|
|
|
|
<browser type="content" src="http://www.google.com/" flex="1" id="page" remote="true"/>
|
|
<label id="messageLog" value="" crop="center"/>
|
|
</window>
|