Loading browser/components/extensions/parent/ext-sessions.js +22 −15 Original line number Diff line number Diff line Loading @@ -92,7 +92,25 @@ const getEncodedKey = function getEncodedKey(extensionId, key) { return `extension:${extensionId}:${key}`; }; this.sessions = class extends ExtensionAPI { this.sessions = class extends ExtensionAPIPersistent { PERSISTENT_EVENTS = { onChanged({ fire }) { let observer = () => { fire.async(); }; Services.obs.addObserver(observer, SS_ON_CLOSED_OBJECTS_CHANGED); return { unregister() { Services.obs.removeObserver(observer, SS_ON_CLOSED_OBJECTS_CHANGED); }, convert(_fire) { fire = _fire; }, }; }, }; getAPI(context) { let { extension } = context; Loading Loading @@ -251,20 +269,9 @@ this.sessions = class extends ExtensionAPI { onChanged: new EventManager({ context, name: "sessions.onChanged", register: fire => { let observer = () => { fire.async(); }; Services.obs.addObserver(observer, SS_ON_CLOSED_OBJECTS_CHANGED); return () => { Services.obs.removeObserver( observer, SS_ON_CLOSED_OBJECTS_CHANGED ); }; }, module: "sessions", event: "onChanged", extensionApi: this, }).api(), }, }; Loading browser/components/extensions/test/browser/browser_ext_sessions_restore.js +41 −0 Original line number Diff line number Diff line Loading @@ -191,3 +191,44 @@ add_task(async function test_sessions_restore() { await extension.unload(); }); add_task(async function test_sessions_event_page() { await SpecialPowers.pushPrefEnv({ set: [["extensions.eventPages.enabled", true]], }); let extension = ExtensionTestUtils.loadExtension({ useAddonManager: "permanent", manifest: { applications: { gecko: { id: "eventpage@sessions" } }, permissions: ["sessions", "tabs"], background: { persistent: false }, }, background() { browser.sessions.onChanged.addListener(() => { browser.test.sendMessage("changed"); }); browser.test.sendMessage("ready"); }, }); await extension.startup(); await extension.awaitMessage("ready"); // test events waken background await extension.terminateBackground(); let win = await BrowserTestUtils.openNewBrowserWindow(); BrowserTestUtils.loadURI(win.gBrowser.selectedBrowser, "about:config"); await BrowserTestUtils.browserLoaded(win.gBrowser.selectedBrowser); for (let url of ["about:robots", "about:mozilla"]) { await BrowserTestUtils.openNewForegroundTab(win.gBrowser, url); } await BrowserTestUtils.closeWindow(win); await extension.awaitMessage("ready"); await extension.awaitMessage("changed"); ok(true, "persistent event woke background"); await extension.unload(); await SpecialPowers.popPrefEnv(); }); Loading
browser/components/extensions/parent/ext-sessions.js +22 −15 Original line number Diff line number Diff line Loading @@ -92,7 +92,25 @@ const getEncodedKey = function getEncodedKey(extensionId, key) { return `extension:${extensionId}:${key}`; }; this.sessions = class extends ExtensionAPI { this.sessions = class extends ExtensionAPIPersistent { PERSISTENT_EVENTS = { onChanged({ fire }) { let observer = () => { fire.async(); }; Services.obs.addObserver(observer, SS_ON_CLOSED_OBJECTS_CHANGED); return { unregister() { Services.obs.removeObserver(observer, SS_ON_CLOSED_OBJECTS_CHANGED); }, convert(_fire) { fire = _fire; }, }; }, }; getAPI(context) { let { extension } = context; Loading Loading @@ -251,20 +269,9 @@ this.sessions = class extends ExtensionAPI { onChanged: new EventManager({ context, name: "sessions.onChanged", register: fire => { let observer = () => { fire.async(); }; Services.obs.addObserver(observer, SS_ON_CLOSED_OBJECTS_CHANGED); return () => { Services.obs.removeObserver( observer, SS_ON_CLOSED_OBJECTS_CHANGED ); }; }, module: "sessions", event: "onChanged", extensionApi: this, }).api(), }, }; Loading
browser/components/extensions/test/browser/browser_ext_sessions_restore.js +41 −0 Original line number Diff line number Diff line Loading @@ -191,3 +191,44 @@ add_task(async function test_sessions_restore() { await extension.unload(); }); add_task(async function test_sessions_event_page() { await SpecialPowers.pushPrefEnv({ set: [["extensions.eventPages.enabled", true]], }); let extension = ExtensionTestUtils.loadExtension({ useAddonManager: "permanent", manifest: { applications: { gecko: { id: "eventpage@sessions" } }, permissions: ["sessions", "tabs"], background: { persistent: false }, }, background() { browser.sessions.onChanged.addListener(() => { browser.test.sendMessage("changed"); }); browser.test.sendMessage("ready"); }, }); await extension.startup(); await extension.awaitMessage("ready"); // test events waken background await extension.terminateBackground(); let win = await BrowserTestUtils.openNewBrowserWindow(); BrowserTestUtils.loadURI(win.gBrowser.selectedBrowser, "about:config"); await BrowserTestUtils.browserLoaded(win.gBrowser.selectedBrowser); for (let url of ["about:robots", "about:mozilla"]) { await BrowserTestUtils.openNewForegroundTab(win.gBrowser, url); } await BrowserTestUtils.closeWindow(win); await extension.awaitMessage("ready"); await extension.awaitMessage("changed"); ok(true, "persistent event woke background"); await extension.unload(); await SpecialPowers.popPrefEnv(); });