"use strict";

add_task(async function test_sessions_tab_value_private() {
  Services.obs.notifyObservers(null, "browser:purge-session-history");
  is(
    SessionStore.getClosedWindowCount(),
    0,
    "No closed window sessions at start of test"
  );

  let extension = ExtensionTestUtils.loadExtension({
    manifest: {
      browser_specific_settings: {
        gecko: {
          id: "exampleextension@mozilla.org",
        },
      },
      permissions: ["sessions"],
    },
    background() {
      browser.test.onMessage.addListener(async (msg, pbw) => {
        if (msg == "value") {
          await browser.test.assertRejects(
            browser.sessions.setWindowValue(pbw.windowId, "foo", "bar"),
            /Invalid window ID/,
            "should not be able to set incognito window session data"
          );
          await browser.test.assertRejects(
            browser.sessions.getWindowValue(pbw.windowId, "foo"),
            /Invalid window ID/,
            "should not be able to get incognito window session data"
          );
          await browser.test.assertRejects(
            browser.sessions.removeWindowValue(pbw.windowId, "foo"),
            /Invalid window ID/,
            "should not be able to remove incognito window session data"
          );
          await browser.test.assertRejects(
            browser.sessions.setTabValue(pbw.tabId, "foo", "bar"),
            /Invalid tab ID/,
            "should not be able to set incognito tab session data"
          );
          await browser.test.assertRejects(
            browser.sessions.getTabValue(pbw.tabId, "foo"),
            /Invalid tab ID/,
            "should not be able to get incognito tab session data"
          );
          await browser.test.assertRejects(
            browser.sessions.removeTabValue(pbw.tabId, "foo"),
            /Invalid tab ID/,
            "should not be able to remove incognito tab session data"
          );
        }
        if (msg == "restore") {
          await browser.test.assertRejects(
            browser.sessions.restore(),
            /Could not restore object/,
            "should not be able to restore incognito last window session data"
          );
          if (pbw) {
            await browser.test.assertRejects(
              browser.sessions.restore(pbw.sessionId),
              /Could not restore object/,
              `should not be able to restore incognito session ID ${pbw.sessionId} session data`
            );
          }
        }
        browser.test.sendMessage("done");
      });
    },
  });

  let winData = await getIncognitoWindow("http://mochi.test:8888/");
  await extension.startup();

  // Test value set/get APIs on a private window and tab.
  extension.sendMessage("value", winData.details);
  await extension.awaitMessage("done");

  // Test restoring a private tab.
  let tab = await BrowserTestUtils.openNewForegroundTab(
    winData.win.gBrowser,
    "http://example.com"
  );
  let sessionUpdatePromise = BrowserTestUtils.waitForSessionStoreUpdate(tab);
  BrowserTestUtils.removeTab(tab);
  await sessionUpdatePromise;
  let closedTabData = SessionStore.getClosedTabDataForWindow(winData.win);

  extension.sendMessage("restore", {
    sessionId: String(closedTabData[0].closedId),
  });
  await extension.awaitMessage("done");

  // Test restoring a private window.
  sessionUpdatePromise = BrowserTestUtils.waitForSessionStoreUpdate(
    winData.win.gBrowser.selectedTab
  );
  await BrowserTestUtils.closeWindow(winData.win);
  await sessionUpdatePromise;

  is(
    SessionStore.getClosedWindowCount(),
    0,
    "The closed window was added to Recently Closed Windows"
  );

  // If the window gets restored, test will fail with an unclosed window.
  extension.sendMessage("restore");
  await extension.awaitMessage("done");

  await extension.unload();
});
