Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
1 <!DOCTYPE HTML>
2 <html>
3 <!--
4 -->
5 <head>
6 <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
7 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
8 </head>
9 <body>
11 <script type="application/javascript;version=1.7">
12 "use strict";
14 SimpleTest.waitForExplicitFinish();
15 SpecialPowers.addPermission("browser", true, document);
16 SpecialPowers.pushPrefEnv({'set':[
17 ["dom.mozBrowserFramesEnabled", true],
18 ["dom.ipc.tabs.disabled", false]
19 ]}, function () {
21 var iframe = document.createElementNS('http://www.w3.org/1999/xhtml', 'iframe');
22 iframe.setAttribute("remote", "true");
23 SpecialPowers.wrap(iframe).mozbrowser = true;
24 document.documentElement.appendChild(iframe);
26 var mm = SpecialPowers.getBrowserFrameMessageManager(iframe);
27 mm.addMessageListener("chromeEventHandler", function (msg) {
28 msg = SpecialPowers.wrap(msg);
29 var result = msg.json;
30 is(result.processType, SpecialPowers.Ci.nsIXULRuntime.PROCESS_TYPE_CONTENT,
31 "The frame script is running in a real distinct child process");
32 ok(result.hasCorrectInterface,
33 "docshell.chromeEventHandler has nsIDOMEventTarget interface");
34 });
37 mm.addMessageListener("DOMWindowCreatedReceived", function (msg) {
38 msg = SpecialPowers.wrap(msg);
39 ok(true, "the chrome event handler looks functional");
40 var result = msg.json;
41 ok(result.stableChromeEventHandler, "docShell.chromeEventHandler is stable");
42 ok(result.iframeHasNewDocShell, "iframe spawns a new docShell");
43 ok(result.iframeHasSameChromeEventHandler, "but iframe has the same chrome event handler");
44 SimpleTest.finish();
45 });
46 // Inject a frame script in the child process:
47 mm.loadFrameScript('data:,new ' + function ContentScriptScope() {
48 var processType = Components.classes["@mozilla.org/xre/runtime;1"]
49 .getService(Components.interfaces.nsIXULRuntime)
50 .processType;
51 var chromeEventHandler = docShell.chromeEventHandler;
52 sendAsyncMessage("chromeEventHandler", {
53 processType: Services.appinfo.processType,
54 hasCorrectInterface: chromeEventHandler instanceof Components.interfaces.nsIDOMEventTarget
55 });
57 /*
58 Ensure that this chromeEventHandler actually works,
59 by creating a new window and listening for its DOMWindowCreated event
60 */
61 chromeEventHandler.addEventListener("DOMWindowCreated", function listener(evt) {
62 if (evt.target == content.document) {
63 return;
64 }
65 chromeEventHandler.removeEventListener("DOMWindowCreated", listener);
66 let new_win = evt.target.defaultView;
67 let new_docShell = new_win.QueryInterface(Ci.nsIInterfaceRequestor)
68 .getInterface(Ci.nsIWebNavigation)
69 .QueryInterface(Ci.nsIDocShell);
70 sendAsyncMessage("DOMWindowCreatedReceived", {
71 stableChromeEventHandler: chromeEventHandler === docShell.chromeEventHandler,
72 iframeHasNewDocShell: new_docShell !== docShell,
73 iframeHasSameChromeEventHandler: new_docShell.chromeEventHandler === chromeEventHandler
74 });
75 });
77 let i = content.document.createElement("iframe");
78 i.setAttribute("src", "data:text/html,foo");
79 content.document.documentElement.appendChild(i);
80 }, false);
81 });
83 </script>
84 </body>
85 </html>