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

// Tests various aspects of the details view

var gManagerWindow;
var gCategoryUtilities;
var gProvider;

function test() {
  waitForExplicitFinish();

  gProvider = new MockProvider();

  gProvider.createAddons([{
    id: "tabsettings@tests.mozilla.org",
    name: "Tab Settings",
    version: "1",
    optionsURL: CHROMEROOT + "addon_prefs.xul",
    optionsType: AddonManager.OPTIONS_TYPE_TAB
  }]);

  open_manager("addons://list/extension", function(aWindow) {
    gManagerWindow = aWindow;
    gCategoryUtilities = new CategoryUtilities(gManagerWindow);

    run_next_test();
  });
}

function end_test() {
  close_manager(gManagerWindow, function() {
    finish();
  });
}

add_test(function() {
  var addon = get_addon_element(gManagerWindow, "tabsettings@tests.mozilla.org");
  is(addon.mAddon.optionsType, AddonManager.OPTIONS_TYPE_TAB, "Options should be inline type");
  addon.parentNode.ensureElementIsVisible(addon);

  var button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "preferences-btn");
  is_element_visible(button, "Preferences button should be visible");

  if (gUseInContentUI) {
    EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);

    var browser = gBrowser.selectedTab.linkedBrowser;
    browser.addEventListener("DOMContentLoaded", function() {
      browser.removeEventListener("DOMContentLoaded", arguments.callee, false);
      is(browser.currentURI.spec, addon.mAddon.optionsURL, "New tab should have loaded the options URL");
      browser.contentWindow.close();
      run_next_test();
    }, false);
    return;
  }

  let instantApply = Services.prefs.getBoolPref("browser.preferences.instantApply");

  function observer(aSubject, aTopic, aData) {
    switch (aTopic) {
      case "domwindowclosed":
        // Give the preference window a chance to finish closing before
        // closing the add-ons manager.
        waitForFocus(function () {
          Services.ww.unregisterNotification(observer);
          run_next_test();
        });
        break;
      case "domwindowopened":
        let win = aSubject.QueryInterface(Ci.nsIDOMEventTarget);
        waitForFocus(function () {
          // If the openDialog privileges are wrong a new browser window
          // will open, let the test proceed (and fail) rather than timeout.
          if (win.location != addon.mAddon.optionsURL &&
              win.location != "chrome://browser/content/browser.xul")
            return;

          is(win.location, addon.mAddon.optionsURL,
             "The correct addon pref window should have opened");

          let chromeFlags = win.QueryInterface(Ci.nsIInterfaceRequestor).
                                getInterface(Ci.nsIWebNavigation).
                                QueryInterface(Ci.nsIDocShellTreeItem).treeOwner.
                                QueryInterface(Ci.nsIInterfaceRequestor).
                                getInterface(Ci.nsIXULWindow).chromeFlags;
          ok(chromeFlags & Ci.nsIWebBrowserChrome.CHROME_OPENAS_CHROME &&
             (instantApply || chromeFlags & Ci.nsIWebBrowserChrome.CHROME_OPENAS_DIALOG),
             "Window was open as a chrome dialog.");

          win.close();
        }, win);
        break;
    }
  }

  Services.ww.registerNotification(observer);
  EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
});
