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

function test() {
  let cw;
  let win;
  let prefix;

  let getToolbar = function () {
    return win.document.getElementById("TabsToolbar");
  }

  let assertToolbarButtonExists = function () {
    isnot(getToolbar().currentSet.indexOf("tabview-button"), -1,
          prefix + ": panorama button should be in the toolbar");
  }

  let assertToolbarButtonNotExists = function () {
    is(getToolbar().currentSet.indexOf("tabview-button"), -1,
       prefix + ": panorama button should not be in the toolbar");
  }

  let assertNumberOfTabs = function (num) {
    is(win.gBrowser.tabs.length, num, prefix + ': there are ' + num + ' tabs');
  }

  let removeToolbarButton = function () {
    let toolbar = getToolbar();
    let currentSet = toolbar.currentSet.split(",");
    let buttonId = "tabview-button";
    let pos = currentSet.indexOf(buttonId);

    if (-1 < pos) {
      currentSet.splice(pos, 1);
      toolbar.setAttribute("currentset", currentSet.join(","));
      toolbar.currentSet = currentSet.join(",");
      win.document.persist(toolbar.id, "currentset");
    }
  }

  let testNameGroup = function () {
    prefix = 'name-group';
    assertToolbarButtonNotExists();
    let groupItem = cw.GroupItems.groupItems[0];

    groupItem.setTitle('title');
    assertToolbarButtonNotExists();
    groupItem.setTitle('');

    EventUtils.synthesizeMouseAtCenter(groupItem.$titleShield[0], {}, cw);
    EventUtils.synthesizeKey('t', {}, cw);
    groupItem.$title[0].blur();

    assertToolbarButtonExists();
    next();
  }

  let testDragToCreateGroup = function () {
    prefix = 'drag-to-create-group';
    assertToolbarButtonNotExists();
    let width = cw.innerWidth;
    let height = cw.innerHeight;

    let body = cw.document.body;
    EventUtils.synthesizeMouse(body, width - 10, height - 10, {type: 'mousedown'}, cw);
    EventUtils.synthesizeMouse(body, width - 200, height - 200, {type: 'mousemove'}, cw);
    EventUtils.synthesizeMouse(body, width - 200, height - 200, {type: 'mouseup'}, cw);

    assertToolbarButtonExists();
    next();
  }

  let testCreateOrphan = function (tab) {
    prefix = 'create-orphan';
    assertNumberOfTabs(1);
    assertToolbarButtonNotExists();

    let width = cw.innerWidth;
    let height = cw.innerHeight;

    let body = cw.document.body;
    EventUtils.synthesizeMouse(body, width - 10, height - 10, {}, cw);
    EventUtils.synthesizeMouse(body, width - 10, height - 10, {}, cw);

    whenTabViewIsHidden(function () {
      assertNumberOfTabs(2);
      assertToolbarButtonExists();

      next();
    }, win);
  }

  let testDragToCreateOrphan = function (tab) {
    if (!tab) {
      let tab = win.gBrowser.loadOneTab('about:blank', {inBackground: true});
      afterAllTabsLoaded(function () testDragToCreateOrphan(tab), win);
      return;
    }

    prefix = 'drag-to-create-orphan';
    assertNumberOfTabs(2);
    assertToolbarButtonNotExists();

    let width = cw.innerWidth;
    let height = cw.innerHeight;

    let target = tab._tabViewTabItem.container;
    let rect = target.getBoundingClientRect();
    EventUtils.synthesizeMouseAtCenter(target, {type: 'mousedown'}, cw);
    EventUtils.synthesizeMouse(target, rect.width - 10, rect.height - 10, {type: 'mousemove'}, cw);
    EventUtils.synthesizeMouse(target, width - 300, height - 300, {type: 'mousemove'}, cw);
    EventUtils.synthesizeMouse(target, width - 200, height - 200, {type: 'mousemove'}, cw);
    EventUtils.synthesizeMouseAtCenter(target, {type: 'mouseup'}, cw);

    assertToolbarButtonExists();
    next();
  }

  let testReAddingAfterRemoval = function () {
    prefix = 're-adding-after-removal';
    assertToolbarButtonNotExists();

    win.TabView.firstUseExperienced = true;
    assertToolbarButtonExists();
    removeToolbarButton();
    assertToolbarButtonNotExists();

    win.close();

    newWindowWithTabView(function (newWin) {
      win = newWin;
      win.TabView.firstUseExperienced = true;
      assertToolbarButtonNotExists();
      next();
    });
  }

  let tests = [testNameGroup, testDragToCreateGroup, testCreateOrphan,
               testDragToCreateOrphan, testReAddingAfterRemoval];

  let next = function () {
    let test = tests.shift();

    if (!test) {
      finish();
      return;
    }

    if (win)
      win.close();

    TabView.firstUseExperienced = false;

    let onLoad = function (newWin) {
      win = newWin;
      removeToolbarButton();
    }

    let onShow = function () {
      cw = win.TabView.getContentWindow();

      let groupItem = cw.GroupItems.groupItems[0];
      groupItem.setSize(200, 200, true);
      groupItem.setUserSize();

      SimpleTest.waitForFocus(function () {
        assertToolbarButtonNotExists();
        test();
      }, cw);
    }

    newWindowWithTabView(onShow, onLoad);
  }

  waitForExplicitFinish();
  registerCleanupFunction(function () win && win.close());

  next();
}
