|
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> |
|
10 |
|
11 <script type="application/javascript;version=1.7"> |
|
12 "use strict"; |
|
13 |
|
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 () { |
|
20 |
|
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); |
|
25 |
|
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 }); |
|
35 |
|
36 |
|
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 }); |
|
56 |
|
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 }); |
|
76 |
|
77 let i = content.document.createElement("iframe"); |
|
78 i.setAttribute("src", "data:text/html,foo"); |
|
79 content.document.documentElement.appendChild(i); |
|
80 }, false); |
|
81 }); |
|
82 |
|
83 </script> |
|
84 </body> |
|
85 </html> |