/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

var stateBackup = ss.getBrowserState();

var statePinned = {windows: [{tabs: [
  {entries: [{url: "http://example.com#1", triggeringPrincipal_base64}], pinned: true}
]}]};

var state = {windows: [{tabs: [
  {entries: [{url: "http://example.com#1", triggeringPrincipal_base64}]},
  {entries: [{url: "http://example.com#2", triggeringPrincipal_base64}]},
  {entries: [{url: "http://example.com#3", triggeringPrincipal_base64}]},
  {entries: [{url: "http://example.com#4", triggeringPrincipal_base64}]},
]}]};

function test() {
  waitForExplicitFinish();

  registerCleanupFunction(function() {
    TabsProgressListener.uninit();
    ss.setBrowserState(stateBackup);
  });


  TabsProgressListener.init();

  window.addEventListener("SSWindowStateReady", function() {
    let firstProgress = true;

    TabsProgressListener.setCallback(function(needsRestore, isRestoring) {
      if (firstProgress) {
        firstProgress = false;
        is(isRestoring, 3, "restoring 3 tabs concurrently");
      } else {
        ok(isRestoring <= 3, "restoring max. 2 tabs concurrently");
      }

      if (0 == needsRestore) {
        TabsProgressListener.unsetCallback();
        waitForFocus(finish);
      }
    });

    ss.setBrowserState(JSON.stringify(state));
  }, {once: true});

  ss.setBrowserState(JSON.stringify(statePinned));
}

function countTabs() {
  let needsRestore = 0, isRestoring = 0;
  let windowsEnum = Services.wm.getEnumerator("navigator:browser");

  while (windowsEnum.hasMoreElements()) {
    let window = windowsEnum.getNext();
    if (window.closed)
      continue;

    for (let i = 0; i < window.gBrowser.tabs.length; i++) {
      let browser = window.gBrowser.tabs[i].linkedBrowser;
      if (browser.__SS_restoreState == TAB_STATE_RESTORING)
        isRestoring++;
      else if (browser.__SS_restoreState == TAB_STATE_NEEDS_RESTORE)
        needsRestore++;
    }
  }

  return [needsRestore, isRestoring];
}

var TabsProgressListener = {
  init() {
    Services.obs.addObserver(this, "sessionstore-debug-tab-restored");
  },

  uninit() {
    Services.obs.removeObserver(this, "sessionstore-debug-tab-restored");
    this.unsetCallback();
 },

  setCallback(callback) {
    this.callback = callback;
  },

  unsetCallback() {
    delete this.callback;
  },

  observe(browser, topic, data) {
    TabsProgressListener.onRestored(browser);
  },

  onRestored(browser) {
    if (this.callback && browser.__SS_restoreState == TAB_STATE_RESTORING) {
      this.callback.apply(null, countTabs());
    }
  }
};
