test_child_docshell.js (2954B)
1 "use strict"; 2 3 const { XPCShellContentUtils } = ChromeUtils.importESModule( 4 "resource://testing-common/XPCShellContentUtils.sys.mjs" 5 ); 6 7 XPCShellContentUtils.init(this); 8 9 add_task(async function test() { 10 let page = await XPCShellContentUtils.loadContentPage("about:blank", { 11 remote: true, 12 }); 13 14 await new Promise(resolve => { 15 let mm = page.browser.messageManager; 16 mm.addMessageListener("chromeEventHandler", function (msg) { 17 var result = msg.json; 18 equal( 19 result.processType, 20 Ci.nsIXULRuntime.PROCESS_TYPE_CONTENT, 21 "The frame script is running in a real distinct child process" 22 ); 23 ok( 24 result.hasCorrectInterface, 25 "docshell.chromeEventHandler has EventTarget interface" 26 ); 27 }); 28 29 mm.addMessageListener("DOMWindowCreatedReceived", function (msg) { 30 ok(true, "the chrome event handler looks functional"); 31 var result = msg.json; 32 ok( 33 result.stableChromeEventHandler, 34 "docShell.chromeEventHandler is stable" 35 ); 36 ok(result.iframeHasNewDocShell, "iframe spawns a new docShell"); 37 ok( 38 result.iframeHasSameChromeEventHandler, 39 "but iframe has the same chrome event handler" 40 ); 41 resolve(); 42 }); 43 44 // Inject a frame script in the child process: 45 page.loadFrameScript(async function () { 46 /* eslint-env mozilla/frame-script */ 47 var chromeEventHandler = docShell.chromeEventHandler; 48 sendAsyncMessage("chromeEventHandler", { 49 processType: Services.appinfo.processType, 50 hasCorrectInterface: 51 chromeEventHandler && EventTarget.isInstance(chromeEventHandler), 52 }); 53 54 /* 55 Ensure that this chromeEventHandler actually works, 56 by creating a new window and listening for its DOMWindowCreated event 57 */ 58 chromeEventHandler.addEventListener( 59 "DOMWindowCreated", 60 function listener(evt) { 61 if (evt.target == content.document) { 62 return; 63 } 64 chromeEventHandler.removeEventListener("DOMWindowCreated", listener); 65 let new_win = evt.target.defaultView; 66 let new_docShell = new_win.docShell; 67 sendAsyncMessage("DOMWindowCreatedReceived", { 68 stableChromeEventHandler: 69 chromeEventHandler === docShell.chromeEventHandler, 70 iframeHasNewDocShell: new_docShell !== docShell, 71 iframeHasSameChromeEventHandler: 72 new_docShell.chromeEventHandler === chromeEventHandler, 73 }); 74 } 75 ); 76 77 if (content.document.readyState != "complete") { 78 await new Promise(res => 79 addEventListener("load", res, { once: true, capture: true }) 80 ); 81 } 82 83 let iframe = content.document.createElement("iframe"); 84 iframe.setAttribute("src", "data:text/html,foo"); 85 content.document.documentElement.appendChild(iframe); 86 }); 87 }); 88 89 await page.close(); 90 });