/* eslint-env mozilla/chrome-script */ "use strict"; const { AppConstants } = ChromeUtils.importESModule( "resource://gre/modules/AppConstants.sys.mjs" ); let listener = msg => { void (msg instanceof Ci.nsIConsoleMessage); dump(`Console message: ${msg}\n`); }; Services.console.registerListener(listener); let getBrowserApp, getTabBrowser; if (AppConstants.MOZ_BUILD_APP === "mobile/android") { getBrowserApp = win => win.BrowserApp; getTabBrowser = tab => tab.browser; } else { getBrowserApp = win => win.gBrowser; getTabBrowser = tab => tab.linkedBrowser; } function* iterBrowserWindows() { for (let win of Services.wm.getEnumerator("navigator:browser")) { if (!win.closed && getBrowserApp(win)) { yield win; } } } let initialTabs = new Map(); for (let win of iterBrowserWindows()) { initialTabs.set(win, new Set(getBrowserApp(win).tabs)); } addMessageListener("check-cleanup", () => { Services.console.unregisterListener(listener); let results = { extraWindows: [], extraTabs: [], }; for (let win of iterBrowserWindows()) { if (initialTabs.has(win)) { let tabs = initialTabs.get(win); for (let tab of getBrowserApp(win).tabs) { if (!tabs.has(tab)) { results.extraTabs.push(getTabBrowser(tab).currentURI.spec); } } } else { results.extraWindows.push( Array.from(win.gBrowser.tabs, tab => getTabBrowser(tab).currentURI.spec) ); } } initialTabs = null; sendAsyncMessage("cleanup-results", results); });