/* 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/. */

function test() {
  //initialization
  waitForExplicitFinish();
  let newTabPrefName = "browser.newtab.url";
  let newTabURL;
  let testURL = "http://example.com/";
  let mode;

  function doTest(aIsPrivateMode, aWindow, aCallback) {
    openNewTab(aWindow, function () {
      if (aIsPrivateMode) {
        mode = "per window private browsing";
        newTabURL = "about:privatebrowsing";
      } else {
        mode = "normal";
        newTabURL = Services.prefs.getCharPref(newTabPrefName) || "about:blank";
      }

      // Check the new tab opened while in normal/private mode
      is(aWindow.gBrowser.selectedBrowser.currentURI.spec, newTabURL,
        "URL of NewTab should be " + newTabURL + " in " + mode +  " mode");
      // Set the custom newtab url
      Services.prefs.setCharPref(newTabPrefName, testURL);
      ok(Services.prefs.prefHasUserValue(newTabPrefName), "Custom newtab url is set");

      // Open a newtab after setting the custom newtab url
      openNewTab(aWindow, function () {
        is(aWindow.gBrowser.selectedBrowser.currentURI.spec, testURL,
           "URL of NewTab should be the custom url");

        // clear the custom url preference
        Services.prefs.clearUserPref(newTabPrefName);
        ok(!Services.prefs.prefHasUserValue(newTabPrefName), "No custom newtab url is set");

        aWindow.gBrowser.removeTab(aWindow.gBrowser.selectedTab);
        aWindow.gBrowser.removeTab(aWindow.gBrowser.selectedTab);
        aWindow.close();
        aCallback()
      });
    });
  }

  function testOnWindow(aIsPrivate, aCallback) {
    whenNewWindowLoaded({private: aIsPrivate}, function(win) {
      executeSoon(function() aCallback(win));
    });
  }

  // check whether any custom new tab url has been configured
  ok(!Services.prefs.prefHasUserValue(newTabPrefName), "No custom newtab url is set");

  // test normal mode
  testOnWindow(false, function(aWindow) {
    doTest(false, aWindow, function() {
      // test private mode
      testOnWindow(true, function(aWindow) {
        doTest(true, aWindow, function() {
          finish();
        });
      });
    });
  });
}

function openNewTab(aWindow, aCallback) {
  // Open a new tab
  aWindow.BrowserOpenTab();

  let browser = aWindow.gBrowser.selectedBrowser;
  if (browser.contentDocument.readyState == "complete") {
    executeSoon(aCallback);
    return;
  }

  browser.addEventListener("load", function onLoad() {
    browser.removeEventListener("load", onLoad, true);
    executeSoon(aCallback);
  }, true);
}
