<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
                 type="text/css"?>
<window title="Taskbar Previews Test"
  xmlns:html="http://www.w3.org/1999/xhtml"
  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
  onload="loaded();">

  <title>Previews - yeah!</title>
  <script type="application/javascript"
          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
  <script class="testbody" type="application/javascript">
  <![CDATA[
    let Cc = Components.classes;
    let Ci = Components.interfaces;
    let Cu = Components.utils;
    Cu.import("resource://gre/modules/XPCOMUtils.jsm");

    let taskbar = Cc["@mozilla.org/windows-taskbar;1"].getService(Ci.nsIWinTaskbar);

    function IsWin7OrHigher() {
      try {
        var sysInfo = Cc["@mozilla.org/system-info;1"].
                      getService(Ci.nsIPropertyBag2);
        var ver = parseFloat(sysInfo.getProperty("version"));
        if (ver >= 6.1)
          return true;
      } catch (ex) { }
      return false;
    }
    isnot(taskbar, null, "Taskbar service is defined");
    is(taskbar.available, IsWin7OrHigher(), "Expected availability of taskbar");

    SimpleTest.waitForExplicitFinish();

    function stdPreviewSuite(p) {
      p.visible = !p.visible;
      p.visible = !p.visible;
      p.visible = true;
      p.invalidate();
      p.visible = false;
    }

    function loaded()
    {
      if (!taskbar.available)
        SimpleTest.finish();
      let controller = {
        width: 400,
        height: 400,
        thumbnailAspectRatio: 1.0,
        drawThumbnail: function () { return false; },
        drawPreview: function () { return false; },
        get wrappedJSObject() { return this; }
      }
      // HACK from mconnor:
      var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
      let win = wm.getMostRecentWindow("navigator:browser");
      let docShell = win.gBrowser.docShell;

      let winPreview = taskbar.getTaskbarWindowPreview(docShell);
      isnot(winPreview, null, "Window preview is not null");
      winPreview.controller = controller;
      let button = winPreview.getButton(0);
      isnot(button, null, "Could get button at valid index");
      try {
        winPreview.getButton(-1);
        ok(false, "Got button at negative index");
      } catch (ex) {}
      try {
        winPreview.getButton(Ci.nsITaskbarWindowPreview.NUM_TOOLBAR_BUTTONS);
        ok(false, "Got button at index that is too large");
      } catch (ex) {}
      button.image = null;
      stdPreviewSuite(winPreview);
      // Let's not perma-hide this window from the taskbar
      winPreview.visible = true;

      let tabP = taskbar.createTaskbarTabPreview(docShell, controller);
      isnot(tabP, null, "Tab preview is not null");
      is(tabP.controller.wrappedJSObject, controller, "Controllers match");
      is(tabP.icon, null, "Default icon is null (windows default)");
      tabP.icon = null;
      tabP.move(null);
      try {
        tabP.move(tabP);
        ok(false, "Moved a preview next to itself!");
      } catch (ex) {}
      stdPreviewSuite(tabP);

      let tabP2 = taskbar.createTaskbarTabPreview(docShell, controller);
      tabP.visible = true;
      tabP2.visible = true;

      isnot(tabP2, null, "2nd Tab preview is not null");
      isnot(tabP,tabP2, "Tab previews are different");
      tabP.active = true;
      ok(tabP.active && !tabP2.active, "Only one tab is active (part 1)");
      tabP2.active = true;
      ok(!tabP.active && tabP2.active, "Only one tab is active (part 2)");
      tabP.active = true;
      ok(tabP.active && !tabP2.active, "Only one tab is active (part 3)");
      tabP.active = false;
      ok(!tabP.active && !tabP2.active, "Neither tab is active");
      is(winPreview.active, false, "Window preview is not active");
      tabP.active = true;
      winPreview.active = true;
      ok(winPreview.active && !tabP.active, "Tab preview takes activation from window");
      tabP.active = true;
      ok(tabP.active && !winPreview.active, "Tab preview takes activation from window");

      tabP.visible = false;
      tabP2.visible = false;

      SimpleTest.finish();
    }
  ]]>
  </script>

  <body xmlns="http://www.w3.org/1999/xhtml">
    <p id="display"></p>
    <div id="content" style="display: none"></div>
    <pre id="test"></pre>
  </body>

</window>