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

"use strict";

requestLongerTimeout(2);

var bookmarksToolbar = document.getElementById("PersonalToolbar");
var navbar = document.getElementById("nav-bar");
var tabsToolbar = document.getElementById("TabsToolbar");

// Customization reset should restore visibility to default-visible toolbars.
add_task(async function () {
  is(navbar.collapsed, false, "Test should start with navbar visible");
  setToolbarVisibility(navbar, false);
  is(navbar.collapsed, true, "navbar should be hidden now");

  await resetCustomization();

  is(
    navbar.collapsed,
    false,
    "Customization reset should restore visibility to the navbar"
  );
});

// Customization reset should restore collapsed-state to default-collapsed toolbars.
add_task(async function () {
  ok(
    CustomizableUI.inDefaultState,
    "Everything should be in its default state"
  );

  is(
    bookmarksToolbar.collapsed,
    true,
    "Test should start with bookmarks toolbar collapsed"
  );
  ok(bookmarksToolbar.collapsed, "bookmarksToolbar should be collapsed");
  ok(!tabsToolbar.collapsed, "TabsToolbar should not be collapsed");
  is(navbar.collapsed, false, "The nav-bar should be shown by default");

  setToolbarVisibility(bookmarksToolbar, true);
  setToolbarVisibility(navbar, false);
  ok(!bookmarksToolbar.collapsed, "bookmarksToolbar should be visible now");
  ok(navbar.collapsed, "navbar should be collapsed");
  is(
    CustomizableUI.inDefaultState,
    false,
    "Should no longer be in default state"
  );

  await startCustomizing();
  await gCustomizeMode.reset();
  await endCustomizing();

  is(
    bookmarksToolbar.collapsed,
    true,
    "Customization reset should restore collapsed-state to the bookmarks toolbar"
  );
  ok(!tabsToolbar.collapsed, "TabsToolbar should not be collapsed");
  ok(
    bookmarksToolbar.collapsed,
    "The bookmarksToolbar should be collapsed after reset"
  );
  ok(
    CustomizableUI.inDefaultState,
    "Everything should be back to default state"
  );
});

// Check that the menubar will be collapsed by resetting, if the platform supports it.
add_task(async function () {
  let menubar = document.getElementById("toolbar-menubar");
  const canMenubarCollapse = CustomizableUI.isToolbarDefaultCollapsed(
    menubar.id
  );
  if (!canMenubarCollapse) {
    return;
  }
  ok(
    CustomizableUI.inDefaultState,
    "Everything should be in its default state"
  );

  is(
    menubar.getBoundingClientRect().height,
    0,
    "menubar should be hidden by default"
  );
  setToolbarVisibility(menubar, true);
  isnot(
    menubar.getBoundingClientRect().height,
    0,
    "menubar should be visible now"
  );

  await startCustomizing();
  await gCustomizeMode.reset();

  ok(
    menubar.hasAttribute("autohide"),
    "The menubar should have autohide after reset in customization mode"
  );
  is(
    menubar.getBoundingClientRect().height,
    0,
    "The menubar should have height=0 after reset in customization mode"
  );

  await endCustomizing();

  ok(
    menubar.hasAttribute("autohide"),
    "The menubar should have autohide after reset"
  );
  is(
    menubar.getBoundingClientRect().height,
    0,
    "The menubar should have height=0 after reset"
  );
});

// Customization reset should restore collapsed-state to default-collapsed toolbars.
add_task(async function () {
  ok(
    CustomizableUI.inDefaultState,
    "Everything should be in its default state"
  );
  ok(bookmarksToolbar.collapsed, "bookmarksToolbar should be collapsed");
  ok(!tabsToolbar.collapsed, "TabsToolbar should not be collapsed");

  setToolbarVisibility(bookmarksToolbar, true);
  ok(!bookmarksToolbar.collapsed, "bookmarksToolbar should be visible now");
  is(
    CustomizableUI.inDefaultState,
    false,
    "Should no longer be in default state"
  );

  await startCustomizing();

  ok(
    !bookmarksToolbar.collapsed,
    "The bookmarksToolbar should be visible before reset"
  );
  ok(!navbar.collapsed, "The navbar should be visible before reset");
  ok(!tabsToolbar.collapsed, "TabsToolbar should not be collapsed");

  await gCustomizeMode.reset();

  ok(
    bookmarksToolbar.collapsed,
    "The bookmarksToolbar should be collapsed after reset"
  );
  ok(!tabsToolbar.collapsed, "TabsToolbar should not be collapsed");
  ok(!navbar.collapsed, "The navbar should still be visible after reset");
  ok(
    CustomizableUI.inDefaultState,
    "Everything should be back to default state"
  );
  await endCustomizing();
});

// Check that the menubar will be collapsed by resetting, if the platform supports it.
add_task(async function () {
  let menubar = document.getElementById("toolbar-menubar");
  const canMenubarCollapse = CustomizableUI.isToolbarDefaultCollapsed(
    menubar.id
  );
  if (!canMenubarCollapse) {
    return;
  }
  ok(
    CustomizableUI.inDefaultState,
    "Everything should be in its default state"
  );
  await startCustomizing();
  let resetButton = document.getElementById("customization-reset-button");
  is(
    resetButton.disabled,
    true,
    "The reset button should be disabled when in default state"
  );

  setToolbarVisibility(menubar, true);
  is(
    resetButton.disabled,
    false,
    "The reset button should be enabled when not in default state"
  );
  ok(
    !CustomizableUI.inDefaultState,
    "No longer in default state when the menubar is shown"
  );

  await gCustomizeMode.reset();

  is(
    resetButton.disabled,
    true,
    "The reset button should be disabled when in default state"
  );
  ok(
    CustomizableUI.inDefaultState,
    "Everything should be in its default state"
  );

  await endCustomizing();
});
