/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

const lameMultiWindowState = {
  windows: [
    {
      tabs: [
        {
          entries: [
            { url: "http://example.org#1", triggeringPrincipal_base64 },
          ],
          extData: { uniq: r() },
        },
        {
          entries: [
            { url: "http://example.org#2", triggeringPrincipal_base64 },
          ],
          extData: { uniq: r() },
        },
        {
          entries: [
            { url: "http://example.org#3", triggeringPrincipal_base64 },
          ],
          extData: { uniq: r() },
        },
        {
          entries: [
            { url: "http://example.org#4", triggeringPrincipal_base64 },
          ],
          extData: { uniq: r() },
        },
      ],
      selected: 1,
    },
    {
      tabs: [
        {
          entries: [
            { url: "http://example.com#1", triggeringPrincipal_base64 },
          ],
          extData: { uniq: r() },
        },
        {
          entries: [
            { url: "http://example.com#2", triggeringPrincipal_base64 },
          ],
          extData: { uniq: r() },
        },
        {
          entries: [
            { url: "http://example.com#3", triggeringPrincipal_base64 },
          ],
          extData: { uniq: r() },
        },
        {
          entries: [
            { url: "http://example.com#4", triggeringPrincipal_base64 },
          ],
          extData: { uniq: r() },
        },
      ],
      selected: 3,
    },
  ],
};

function test() {
  /** Test for Bug 615394 - Session Restore should notify when it is beginning and ending a restore **/
  waitForExplicitFinish();

  let newWindow, reopenedWindow;

  function firstWindowObserver(aSubject, aTopic, aData) {
    if (aTopic == "domwindowopened") {
      newWindow = aSubject;
      Services.ww.unregisterNotification(firstWindowObserver);
    }
  }
  Services.ww.registerNotification(firstWindowObserver);

  waitForBrowserState(lameMultiWindowState, function () {
    // Close the window which isn't window
    BrowserTestUtils.closeWindow(newWindow).then(() => {
      // Now give it time to close
      reopenedWindow = ss.undoCloseWindow(0);
      reopenedWindow.addEventListener("SSWindowStateBusy", onSSWindowStateBusy);
      reopenedWindow.addEventListener(
        "SSWindowStateReady",
        onSSWindowStateReady
      );

      reopenedWindow.addEventListener(
        "load",
        function () {
          reopenedWindow.gBrowser.tabContainer.addEventListener(
            "SSTabRestored",
            onSSTabRestored
          );
        },
        { once: true }
      );
    });
  });

  let busyEventCount = 0,
    readyEventCount = 0,
    tabRestoredCount = 0;
  // These will listen to the reopened closed window...
  function onSSWindowStateBusy(aEvent) {
    busyEventCount++;
  }

  function onSSWindowStateReady(aEvent) {
    readyEventCount++;
  }

  function onSSTabRestored(aEvent) {
    if (++tabRestoredCount < 4) {
      return;
    }

    is(busyEventCount, 1);
    is(readyEventCount, 1);

    reopenedWindow.removeEventListener(
      "SSWindowStateBusy",
      onSSWindowStateBusy
    );
    reopenedWindow.removeEventListener(
      "SSWindowStateReady",
      onSSWindowStateReady
    );
    reopenedWindow.gBrowser.tabContainer.removeEventListener(
      "SSTabRestored",
      onSSTabRestored
    );

    reopenedWindow.close();
    while (gBrowser.tabs.length > 1) {
      gBrowser.removeTab(gBrowser.tabs[1]);
    }

    finish();
  }
}
