test_chromeOuterWindowID.xhtml (5393B)
1 <?xml version="1.0"?> 2 <?xml-stylesheet type="text/css" href="chrome://global/skin"?> 3 <?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?> 4 <!-- 5 https://bugzilla.mozilla.org/show_bug.cgi?id=1474662 6 Test that the chromeOuterWindowID on the MessageManager interface 7 works, and that it properly updates when swapping frameloaders between 8 windows. 9 --> 10 <window title="Mozilla Bug 1474662" 11 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 12 <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> 13 14 <!-- test results are displayed in the html:body --> 15 <body xmlns="http://www.w3.org/1999/xhtml"> 16 <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1474662" 17 target="_blank">Mozilla Bug 1474662</a> 18 </body> 19 20 <!-- test code goes here --> 21 <script type="application/javascript"><![CDATA[ 22 SimpleTest.waitForExplicitFinish(); 23 const {BrowserTestUtils} = ChromeUtils.importESModule( 24 "resource://testing-common/BrowserTestUtils.sys.mjs" 25 ); 26 27 const BROWSER_DOC = "window_chromeOuterWindowID.xhtml"; 28 const TEST_PAGE = "http://example.com"; 29 const TEST_PAGE_2 = "http://example.com/browser"; 30 31 function getOuterWindowID(win) { 32 return win.docShell.outerWindowID; 33 } 34 35 /** 36 * Takes two <xul:browser>'s that should be in the same document, and 37 * ensures that their frame script environments know the correct value 38 * of the host window's outerWindowID. 39 */ 40 async function ensureExpectedChromeOuterWindowIDs(browser1, browser2) { 41 is(browser1.ownerDocument, browser2.ownerDocument, 42 "Both browsers should belong to the same document."); 43 let winID = getOuterWindowID(browser1.ownerGlobal); 44 45 let getChildRootOuterId = () => { 46 try { 47 return docShell.browserChild?.chromeOuterWindowID; 48 } catch(ex) { } 49 50 // Not a remote tab 51 return content.top.windowRoot.ownerGlobal.docShell.outerWindowID; 52 }; 53 54 let browser1ID = await SpecialPowers.spawn(browser1, [], getChildRootOuterId); 55 let browser2ID = await SpecialPowers.spawn(browser2, [], getChildRootOuterId); 56 57 is(browser1ID, winID, 58 "Browser 1 frame script environment should have the correct chromeOuterWindowID"); 59 is(browser2ID, winID, 60 "Browser 1 frame script environment should have the correct chromeOuterWindowID"); 61 } 62 63 /** 64 * Opens up a BROWSER_DOC test window, and points each browser to a particular 65 * page. 66 * 67 * @param num (Number) 68 * An identifier number for this window. Mainly used as a suffix for the 69 * returned values. 70 * @param page (String) 71 * A URL to load in each <xul:browser> 72 * @returns Promise 73 * The Promise resolves with an object with the following properties: 74 * 75 * win<num>: a reference to the opened window 76 * remote<num>: a reference to the remote browser in the window 77 * nonRemote<num>: a reference to the non-remote browser in the window 78 */ 79 async function prepareWindow(num, page) { 80 let win = window.browsingContext.topChromeWindow.open(BROWSER_DOC, "bug1474662-" + num, "chrome,width=200,height=200"); 81 await BrowserTestUtils.waitForEvent(win, "load"); 82 let remote = win.document.getElementById("remote"); 83 let nonRemote = win.document.getElementById("non-remote"); 84 85 ok(remote && remote.isRemoteBrowser, 86 "Should have found a remote browser in test window " + num); 87 ok(nonRemote && !nonRemote.isRemoteBrowser, 88 "Should have found a non-remote browser in test window " + num); 89 90 BrowserTestUtils.startLoadingURIString(remote, page); 91 await BrowserTestUtils.browserLoaded(remote); 92 BrowserTestUtils.startLoadingURIString(nonRemote, page); 93 await BrowserTestUtils.browserLoaded(nonRemote); 94 95 let result = {}; 96 result["win" + num] = win; 97 result["remote" + num] = remote; 98 result["nonRemote" + num] = nonRemote; 99 return result; 100 } 101 102 add_task(async () => { 103 let { win1, remote1, nonRemote1 } = await prepareWindow(1, TEST_PAGE); 104 let { win2, remote2, nonRemote2 } = await prepareWindow(2, TEST_PAGE_2); 105 106 let win1ID = getOuterWindowID(win1); 107 let win2ID = getOuterWindowID(win2); 108 109 // Quick sanity-test here - if something has gone horribly wrong 110 // and the windows have the same IDs, then the rest of this test 111 // is meaningless. 112 isnot(win1ID, win2ID, 113 "The windows should definitely have different IDs."); 114 115 await ensureExpectedChromeOuterWindowIDs(remote1, nonRemote1); 116 await ensureExpectedChromeOuterWindowIDs(remote2, nonRemote2); 117 118 // Swap the frameloaders! This doesn't swap the <browser> elements though, 119 // so what's expected is that the IDs should remain the same within 120 // the browsers despite the underlying content changing. 121 remote1.swapFrameLoaders(remote2); 122 nonRemote1.swapFrameLoaders(nonRemote2); 123 124 await ensureExpectedChromeOuterWindowIDs(remote1, nonRemote1); 125 await ensureExpectedChromeOuterWindowIDs(remote2, nonRemote2); 126 127 // Now swap them back. 128 remote1.swapFrameLoaders(remote2); 129 nonRemote1.swapFrameLoaders(nonRemote2); 130 131 await ensureExpectedChromeOuterWindowIDs(remote1, nonRemote1); 132 await ensureExpectedChromeOuterWindowIDs(remote2, nonRemote2); 133 134 await BrowserTestUtils.closeWindow(win1); 135 await BrowserTestUtils.closeWindow(win2); 136 }); 137 ]]></script> 138 </window>