Commit 89419ea1 authored by Shane Caraveo's avatar Shane Caraveo
Browse files

Bug 1748565 support persistent listener in sessions api r=zombie

parent d10bc69e
Loading
Loading
Loading
Loading
+22 −15
Original line number Diff line number Diff line
@@ -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;

@@ -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(),
      },
    };
+41 −0
Original line number Diff line number Diff line
@@ -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();
});