"use strict"; const ROOT = getRootDirectory(gTestPath); const URI = ROOT + "browser_tab_dragdrop2_frame1.xhtml"; // Load the test page (which runs some child popup tests) in a new window. // After the tests were run, tear off the tab into a new window and run popup // tests a second time. We don't care about tests results, exceptions and // crashes will be caught. add_task(async function() { // Open a new window. let args = "chrome,all,dialog=no"; let win = window.openDialog( AppConstants.BROWSER_CHROME_URL, "_blank", args, URI ); // Wait until the tests were run. await promiseTestsDone(win); ok(true, "tests succeeded"); // Create a second tab so that we can move the original one out. BrowserTestUtils.addTab(win.gBrowser, "about:blank", { skipAnimation: true }); // Tear off the original tab. let browser = win.gBrowser.selectedBrowser; let tabClosed = BrowserTestUtils.waitForEvent(browser, "pagehide", true); let win2 = win.gBrowser.replaceTabWithWindow(win.gBrowser.tabs[0]); // Add a 'TestsDone' event listener to ensure that the docShells is properly // swapped to the new window instead of the page being loaded again. If this // works fine we should *NOT* see a TestsDone event. let onTestsDone = () => ok(false, "shouldn't run tests when tearing off"); win2.addEventListener("TestsDone", onTestsDone); // Wait until the original tab is gone and the new window is ready. await Promise.all([tabClosed, promiseDelayedStartupFinished(win2)]); // Remove the 'TestsDone' event listener as now // we're kicking off a new test run manually. win2.removeEventListener("TestsDone", onTestsDone); // Run tests once again. let promise = promiseTestsDone(win2); let browser2 = win2.gBrowser.selectedBrowser; await SpecialPowers.spawn(browser2, [], async () => { content.test_panels(); }); await promise; ok(true, "tests succeeded a second time"); // Cleanup. await promiseWindowClosed(win2); await promiseWindowClosed(win); }); function promiseTestsDone(win) { return BrowserTestUtils.waitForEvent(win, "TestsDone"); } function promiseDelayedStartupFinished(win) { return new Promise(resolve => whenDelayedStartupFinished(win, resolve)); }