/* 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 URIS_PINNED = ["about:license", "about:about"];
const URIS_NORMAL_A = ["about:mozilla"];
const URIS_NORMAL_B = ["about:buildconfig"];

function test() {
  waitForExplicitFinish();

  isnot(Services.prefs.getIntPref("browser.startup.page"), 3,
        "pref to save session must not be set for this test");
  ok(!Services.prefs.getBoolPref("browser.sessionstore.resume_session_once"),
     "pref to save session once must not be set for this test");

  document.documentElement.setAttribute("windowtype", "navigator:browsertestdummy");

  openWinWithCb(closeFirstWin, URIS_PINNED.concat(URIS_NORMAL_A));
}

function closeFirstWin(win) {
  win.gBrowser.pinTab(win.gBrowser.tabs[0]);
  win.gBrowser.pinTab(win.gBrowser.tabs[1]);

  let winClosed = BrowserTestUtils.windowClosed(win);
  // We need to call BrowserTryToCloseWindow in order to trigger
  // the machinery that chooses whether or not to save the session
  // for the last window.
  win.BrowserTryToCloseWindow();
  ok(win.closed, "window closed");

  winClosed.then(() => {
    openWinWithCb(checkSecondWin, URIS_NORMAL_B, URIS_PINNED.concat(URIS_NORMAL_B));
  });
}

function checkSecondWin(win) {
  is(win.gBrowser.browsers[0].currentURI.spec, URIS_PINNED[0], "first pinned tab restored");
  is(win.gBrowser.browsers[1].currentURI.spec, URIS_PINNED[1], "second pinned tab restored");
  ok(win.gBrowser.tabs[0].pinned, "first pinned tab is still pinned");
  ok(win.gBrowser.tabs[1].pinned, "second pinned tab is still pinned");

  BrowserTestUtils.closeWindow(win).then(() => {
    // cleanup
    document.documentElement.setAttribute("windowtype", "navigator:browser");
    finish();
  });
}

function openWinWithCb(cb, argURIs, expectedURIs) {
  if (!expectedURIs)
    expectedURIs = argURIs;

  var win = openDialog(getBrowserURL(), "_blank",
                       "chrome,all,dialog=no", argURIs.join("|"));

  win.addEventListener("load", function() {
    info("the window loaded");

    var expectedLoads = expectedURIs.length;

    win.gBrowser.addTabsProgressListener({
      onStateChange(aBrowser, aWebProgress, aRequest, aStateFlags, aStatus) {
        if (aRequest &&
            aStateFlags & Ci.nsIWebProgressListener.STATE_STOP &&
            aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK &&
            expectedURIs.indexOf(aRequest.QueryInterface(Ci.nsIChannel).originalURI.spec) > -1 &&
            --expectedLoads <= 0) {
          win.gBrowser.removeTabsProgressListener(this);
          info("all tabs loaded");
          is(win.gBrowser.tabs.length, expectedURIs.length, "didn't load any unexpected tabs");
          executeSoon(function() {
            cb(win);
          });
        }
      }
    });
  }, {once: true});
}
