1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/ipc/tests/test_child_docshell.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,85 @@ 1.4 +<!DOCTYPE HTML> 1.5 +<html> 1.6 +<!-- 1.7 +--> 1.8 +<head> 1.9 + <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> 1.10 + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 1.11 +</head> 1.12 +<body> 1.13 + 1.14 +<script type="application/javascript;version=1.7"> 1.15 +"use strict"; 1.16 + 1.17 +SimpleTest.waitForExplicitFinish(); 1.18 +SpecialPowers.addPermission("browser", true, document); 1.19 +SpecialPowers.pushPrefEnv({'set':[ 1.20 + ["dom.mozBrowserFramesEnabled", true], 1.21 + ["dom.ipc.tabs.disabled", false] 1.22 +]}, function () { 1.23 + 1.24 + var iframe = document.createElementNS('http://www.w3.org/1999/xhtml', 'iframe'); 1.25 + iframe.setAttribute("remote", "true"); 1.26 + SpecialPowers.wrap(iframe).mozbrowser = true; 1.27 + document.documentElement.appendChild(iframe); 1.28 + 1.29 + var mm = SpecialPowers.getBrowserFrameMessageManager(iframe); 1.30 + mm.addMessageListener("chromeEventHandler", function (msg) { 1.31 + msg = SpecialPowers.wrap(msg); 1.32 + var result = msg.json; 1.33 + is(result.processType, SpecialPowers.Ci.nsIXULRuntime.PROCESS_TYPE_CONTENT, 1.34 + "The frame script is running in a real distinct child process"); 1.35 + ok(result.hasCorrectInterface, 1.36 + "docshell.chromeEventHandler has nsIDOMEventTarget interface"); 1.37 + }); 1.38 + 1.39 + 1.40 + mm.addMessageListener("DOMWindowCreatedReceived", function (msg) { 1.41 + msg = SpecialPowers.wrap(msg); 1.42 + ok(true, "the chrome event handler looks functional"); 1.43 + var result = msg.json; 1.44 + ok(result.stableChromeEventHandler, "docShell.chromeEventHandler is stable"); 1.45 + ok(result.iframeHasNewDocShell, "iframe spawns a new docShell"); 1.46 + ok(result.iframeHasSameChromeEventHandler, "but iframe has the same chrome event handler"); 1.47 + SimpleTest.finish(); 1.48 + }); 1.49 + // Inject a frame script in the child process: 1.50 + mm.loadFrameScript('data:,new ' + function ContentScriptScope() { 1.51 + var processType = Components.classes["@mozilla.org/xre/runtime;1"] 1.52 + .getService(Components.interfaces.nsIXULRuntime) 1.53 + .processType; 1.54 + var chromeEventHandler = docShell.chromeEventHandler; 1.55 + sendAsyncMessage("chromeEventHandler", { 1.56 + processType: Services.appinfo.processType, 1.57 + hasCorrectInterface: chromeEventHandler instanceof Components.interfaces.nsIDOMEventTarget 1.58 + }); 1.59 + 1.60 + /* 1.61 + Ensure that this chromeEventHandler actually works, 1.62 + by creating a new window and listening for its DOMWindowCreated event 1.63 + */ 1.64 + chromeEventHandler.addEventListener("DOMWindowCreated", function listener(evt) { 1.65 + if (evt.target == content.document) { 1.66 + return; 1.67 + } 1.68 + chromeEventHandler.removeEventListener("DOMWindowCreated", listener); 1.69 + let new_win = evt.target.defaultView; 1.70 + let new_docShell = new_win.QueryInterface(Ci.nsIInterfaceRequestor) 1.71 + .getInterface(Ci.nsIWebNavigation) 1.72 + .QueryInterface(Ci.nsIDocShell); 1.73 + sendAsyncMessage("DOMWindowCreatedReceived", { 1.74 + stableChromeEventHandler: chromeEventHandler === docShell.chromeEventHandler, 1.75 + iframeHasNewDocShell: new_docShell !== docShell, 1.76 + iframeHasSameChromeEventHandler: new_docShell.chromeEventHandler === chromeEventHandler 1.77 + }); 1.78 + }); 1.79 + 1.80 + let i = content.document.createElement("iframe"); 1.81 + i.setAttribute("src", "data:text/html,foo"); 1.82 + content.document.documentElement.appendChild(i); 1.83 + }, false); 1.84 +}); 1.85 + 1.86 +</script> 1.87 +</body> 1.88 +</html>