<?xml version="1.0"?> <?xml-stylesheet type="text/css" href="chrome://global/skin"?> <?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?> <window title="Docshell swap test" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> <!-- test results are displayed in the html:body --> <body xmlns="http://www.w3.org/1999/xhtml"> </body> <!-- test code goes here --> <script type="application/javascript"> <![CDATA[ SimpleTest.waitForExplicitFinish(); // Create two identical windows, each with a <browser> element. let win1 = window.openDialog("window_docshell_swap.xul", "_blank","chrome,width=300,height=200"); let win2 = window.openDialog("window_docshell_swap.xul", "_blank","chrome,width=300,height=200"); let loadCount = 0; function loadHandler() { loadCount++; if (loadCount < 2) return; let browser1 = win1.document.getElementById("browser"); let browser2 = win2.document.getElementById("browser"); let flo1 = browser1.QueryInterface(Components.interfaces.nsIFrameLoaderOwner); let flo2 = browser2.QueryInterface(Components.interfaces.nsIFrameLoaderOwner); let pongCount = 0; function gotPong(target_ok) { pongCount++; ok(target_ok, "message went to correct target"); if (pongCount == 1) { win1.close(); win2.close(); SimpleTest.finish(); } } let mm1 = flo1.frameLoader.messageManager; let mm2 = flo2.frameLoader.messageManager; // Swap docshells. Everything should be identical to before, since there was nothing to // distinguish these docshells. flo1.swapFrameLoaders(flo2); // mm1 shouldn't change here, but we update it in case it does due to a bug. mm1 = flo1.frameLoader.messageManager; // Load ping-pong code into first window. mm1.loadFrameScript("data:,addMessageListener('ping', () => sendAsyncMessage('pong'));", false); // A pong message received in win1 means success. win1.messageManager.addMessageListener("pong", () => { gotPong(true); }); // A pong message received in win2 means failure! win2.messageManager.addMessageListener("pong", () => { gotPong(false); }); // Send the ping to win1. mm1.sendAsyncMessage("ping"); } win1.addEventListener("load", loadHandler, false); win2.addEventListener("load", loadHandler, false); ]]> </script> </window>