"use strict";

var gTestTab;
var gContentAPI;
var gContentWindow;

add_task(setup_UITourTest);

add_UITour_task(async function test_highligh_between_pageActionButtonOnUrlbar_and_buttonOnPageActionPanel() {
  let highlight = document.getElementById("UITourHighlight");
  is_element_hidden(highlight, "Highlight should initially be hidden");

  // Test highlighting the page action button on the urlbar
  let pageActionPanel = BrowserPageActions.panelNode;
  let highlightVisiblePromise = elementVisiblePromise(highlight, "Should show highlight");
  gContentAPI.showHighlight("pageActionButton");
  await highlightVisiblePromise;
  is(pageActionPanel.state, "closed", "Shouldn't open the page action panel while highlighting the pageActionButton");
  is(getShowHighlightTargetName(), "pageActionButton", "Should highlight the pageActionButton");

  // Test switching the highlight to the copyURL button on the page action panel
  let panelShownPromise = promisePanelElementShown(window, pageActionPanel);
  highlightVisiblePromise = elementVisiblePromise(highlight, "Should show highlight");
  gContentAPI.showHighlight("pageAction-copyURL");
  await highlightVisiblePromise;
  await panelShownPromise;
  is(pageActionPanel.state, "open", "Should open the page action panel for highlighting the pageAction-copyURL");
  is(getShowHighlightTargetName(), "pageAction-copyURL", "Should highlight the pageAction-copyURL");

  // Test hiding highlight
  let panelHiddenPromise = promisePanelElementHidden(window, pageActionPanel);
  let highlightHiddenPromise = elementHiddenPromise(highlight, "Should hide highlight");
  gContentAPI.hideHighlight();
  await highlightHiddenPromise;
  await panelHiddenPromise;
  is(pageActionPanel.state, "closed", "Should close the page action panel after hiding highlight");
});

add_UITour_task(async function test_highligh_between_buttonOnAppMenu_and_buttonOnPageActionPanel() {
  let highlight = document.getElementById("UITourHighlight");
  is_element_hidden(highlight, "Highlight should initially be hidden");

  let appMenu = window.PanelUI.panel;
  let pageActionPanel = BrowserPageActions.panelNode;

  // Test highlighting the addons button on the app menu
  let appMenuShownPromise = promisePanelElementShown(window, appMenu);
  let highlightVisiblePromise = elementVisiblePromise(highlight, "Should show highlight");
  gContentAPI.showHighlight("addons");
  await appMenuShownPromise;
  await highlightVisiblePromise;
  is(appMenu.state, "open", "Should open the app menu to highlight the addons button");
  is(pageActionPanel.state, "closed", "Shouldn't open the page action panel");
  is(getShowHighlightTargetName(), "addons", "Should highlight the addons button on the app menu");

  // Test switching the highlight to the copyURL button on the page action panel
  let appMenuHiddenPromise = promisePanelElementHidden(window, appMenu);
  let pageActionPanelShownPromise = promisePanelElementShown(window, pageActionPanel);
  highlightVisiblePromise = elementVisiblePromise(highlight, "Should show highlight");
  gContentAPI.showHighlight("pageAction-copyURL");
  await appMenuHiddenPromise;
  await pageActionPanelShownPromise;
  await highlightVisiblePromise;
  is(appMenu.state, "closed", "Should close the app menu after no more highlight for the addons button");
  is(pageActionPanel.state, "open", "Should open the page action panel to highlight the copyURL button");
  is(getShowHighlightTargetName(), "pageAction-copyURL", "Should highlight the copyURL button on the page action panel");

  // Test hiding highlight
  let pageActionPanelHiddenPromise = promisePanelElementHidden(window, pageActionPanel);
  let highlightHiddenPromise = elementHiddenPromise(highlight, "Should hide highlight");
  gContentAPI.hideHighlight();
  await pageActionPanelHiddenPromise;
  await highlightHiddenPromise;
  is(appMenu.state, "closed", "Shouldn't open the app menu after hiding highlight");
  is(pageActionPanel.state, "closed", "Should close the page action panel after hiding highlight");
});

add_UITour_task(async function test_showInfo_between_buttonOnPageActionPanel_and_buttonOnAppMenu() {
  let tooltip = document.getElementById("UITourTooltip");
  is_element_hidden(tooltip, "Tooltip should initially be hidden");

  let appMenu = window.PanelUI.panel;
  let pageActionPanel = BrowserPageActions.panelNode;

  // Test showing info tooltip on the emailLink button on the page action panel
  let pageActionPanelShownPromise = promisePanelElementShown(window, pageActionPanel);
  let tooltipVisiblePromise = elementVisiblePromise(tooltip, "Should show info tooltip");
  await showInfoPromise("pageAction-emailLink", "title", "text");
  await pageActionPanelShownPromise;
  await tooltipVisiblePromise;
  is(appMenu.state, "closed", "Shouldn't open the app menu");
  is(pageActionPanel.state, "open", "Should open the page action panel to show info on the copyURL button");
  is(getShowInfoTargetName(), "pageAction-emailLink", "Should show info tooltip on the emailLink button on the page action panel");

  // Test switching info tooltip to the customize button on the app menu
  let appMenuShownPromise = promisePanelElementShown(window, appMenu);
  let pageActionPanelHiddenPromise = promisePanelElementHidden(window, pageActionPanel);
  tooltipVisiblePromise = elementVisiblePromise(tooltip, "Should show info tooltip");
  await showInfoPromise("customize", "title", "text");
  await appMenuShownPromise;
  await pageActionPanelHiddenPromise;
  await tooltipVisiblePromise;
  is(appMenu.state, "open", "Should open the app menu to show info on the customize button");
  is(pageActionPanel.state, "closed", "Should close the page action panel after no more show info for the copyURL button");
  is(getShowInfoTargetName(), "customize", "Should show info tooltip on the customize button on the app menu");

  // Test hiding info tooltip
  let appMenuHiddenPromise = promisePanelElementHidden(window, appMenu);
  let tooltipHiddenPromise = elementHiddenPromise(tooltip, "Should hide info");
  gContentAPI.hideInfo();
  await appMenuHiddenPromise;
  await tooltipHiddenPromise;
  is(appMenu.state, "closed", "Should close the app menu after hiding info");
  is(pageActionPanel.state, "closed", "Shouldn't open the page action panel after hiding info");
});

add_UITour_task(async function test_highlight_buttonOnPageActionPanel_and_showInfo_buttonOnAppMenu() {
  let highlight = document.getElementById("UITourHighlight");
  is_element_hidden(highlight, "Highlight should initially be hidden");
  let tooltip = document.getElementById("UITourTooltip");
  is_element_hidden(tooltip, "Tooltip should initially be hidden");

  let appMenu = window.PanelUI.panel;
  let pageActionPanel = BrowserPageActions.panelNode;

  // Test highlighting the sendToDevice button on the page action panel
  let pageActionPanelShownPromise = promisePanelElementShown(window, pageActionPanel);
  let highlightVisiblePromise = elementVisiblePromise(highlight, "Should show highlight");
  gContentAPI.showHighlight("pageAction-sendToDevice");
  await pageActionPanelShownPromise;
  await highlightVisiblePromise;
  is(appMenu.state, "closed", "Shouldn't open the app menu");
  is(pageActionPanel.state, "open", "Should open the page action panel to highlight the sendToDevice button");
  is(getShowHighlightTargetName(), "pageAction-sendToDevice", "Should highlight the sendToDevice button on the page action panel");

  // Test showing info tooltip on the privateWindow button on the app menu
  let appMenuShownPromise = promisePanelElementShown(window, appMenu);
  let tooltipVisiblePromise = elementVisiblePromise(tooltip, "Should show info tooltip");
  let pageActionPanelHiddenPromise = promisePanelElementHidden(window, pageActionPanel);
  let highlightHiddenPromise = elementHiddenPromise(highlight, "Should hide highlight");
  await showInfoPromise("privateWindow", "title", "text");
  await appMenuShownPromise;
  await tooltipVisiblePromise;
  await pageActionPanelHiddenPromise;
  await highlightHiddenPromise;
  is(appMenu.state, "open", "Should open the app menu to show info on the privateWindow button");
  is(pageActionPanel.state, "closed", "Should close the page action panel");
  is(getShowInfoTargetName(), "privateWindow", "Should show info tooltip on the privateWindow button on the app menu");

  // Test hiding info tooltip
  let appMenuHiddenPromise = promisePanelElementHidden(window, appMenu);
  let tooltipHiddenPromise = elementHiddenPromise(tooltip, "Should hide info");
  gContentAPI.hideInfo();
  await appMenuHiddenPromise;
  await tooltipHiddenPromise;
  is(appMenu.state, "closed", "Should close the app menu after hiding info tooltip");
});

add_UITour_task(async function test_showInfo_buttonOnAppMenu_and_highlight_buttonOnPageActionPanel() {
  let highlight = document.getElementById("UITourHighlight");
  is_element_hidden(highlight, "Highlight should initially be hidden");
  let tooltip = document.getElementById("UITourTooltip");
  is_element_hidden(tooltip, "Tooltip should initially be hidden");

  let appMenu = window.PanelUI.panel;
  let pageActionPanel = BrowserPageActions.panelNode;

  // Test showing info tooltip on the privateWindow button on the app menu
  let appMenuShownPromise = promisePanelElementShown(window, appMenu);
  let tooltipVisiblePromise = elementVisiblePromise(tooltip, "Should show info tooltip");
  await showInfoPromise("privateWindow", "title", "text");
  await appMenuShownPromise;
  await tooltipVisiblePromise;
  is(appMenu.state, "open", "Should open the app menu to show info on the privateWindow button");
  is(pageActionPanel.state, "closed", "Shouldn't open the page action panel");
  is(getShowInfoTargetName(), "privateWindow", "Should show info tooltip on the privateWindow button on the app menu");

  // Test highlighting the sendToDevice button on the page action panel
  let pageActionPanelShownPromise = promisePanelElementShown(window, pageActionPanel);
  let highlightVisiblePromise = elementVisiblePromise(highlight, "Should show highlight");
  let appMenuHiddenPromise = promisePanelElementHidden(window, appMenu);
  let tooltipHiddenPromise = elementHiddenPromise(tooltip, "Should hide info");
  gContentAPI.showHighlight("pageAction-sendToDevice");
  await pageActionPanelShownPromise;
  await highlightVisiblePromise;
  await appMenuHiddenPromise;
  await tooltipHiddenPromise;
  is(appMenu.state, "closed", "Should close the app menu");
  is(pageActionPanel.state, "open", "Should open the page action panel to highlight the sendToDevice button");
  is(getShowHighlightTargetName(), "pageAction-sendToDevice", "Should highlight the sendToDevice button on the page action panel");

  // Test hiding highlight
  let pageActionPanelHiddenPromise = promisePanelElementHidden(window, pageActionPanel);
  let highlightHiddenPromise = elementHiddenPromise(highlight, "Should hide highlight");
  gContentAPI.hideHighlight();
  await pageActionPanelHiddenPromise;
  await highlightHiddenPromise;
  is(pageActionPanel.state, "closed", "Should close the page action panel after hiding highlight");
});

add_UITour_task(async function test_show_appMenu_and_highligh_buttonOnPageActionPanel() {
  let highlight = document.getElementById("UITourHighlight");
  is_element_hidden(highlight, "Highlight should initially be hidden");

  let appMenu = window.PanelUI.panel;
  let pageActionPanel = BrowserPageActions.panelNode;

  // Test explicity asking for opening the app menu
  let appMenuShownPromise = promisePanelElementShown(window, appMenu);
  gContentAPI.showMenu("appMenu");
  await appMenuShownPromise;
  is(appMenu.state, "open", "Should open the app menu");
  is(pageActionPanel.state, "closed", "Shouldn't open the page action panel");

  // Test highlighting the sendToDevice button on the page action panel
  let pageActionPanelShownPromise = promisePanelElementShown(window, pageActionPanel);
  let highlightVisiblePromise = elementVisiblePromise(highlight, "Should show highlight");
  gContentAPI.showHighlight("pageAction-sendToDevice");
  await pageActionPanelShownPromise;
  await highlightVisiblePromise;
  is(appMenu.state, "open", "Shouldn't close the app menu because it is opened explictly by api user.");
  is(pageActionPanel.state, "open", "Should open the page action panel to highlight the sendToDevice button");
  is(getShowHighlightTargetName(), "pageAction-sendToDevice", "Should highlight the sendToDevice button on the page action panel");

  // Test hiding the app menu wouldn't affect the highlight on the page action panel
  let appMenuHiddenPromise = promisePanelElementHidden(window, appMenu);
  gContentAPI.hideMenu("appMenu");
  await appMenuHiddenPromise;
  is_element_visible(highlight, "Highlight should still be visible");
  is(appMenu.state, "closed", "Should close the app menu");
  is(pageActionPanel.state, "open", "Shouldn't close the page action panel");
  is(getShowHighlightTargetName(), "pageAction-sendToDevice", "Should still highlight the sendToDevice button on the page action panel");

  // Test hiding highlight
  let pageActionPanelHiddenPromise = promisePanelElementHidden(window, pageActionPanel);
  let highlightHiddenPromise = elementHiddenPromise(highlight, "Should hide highlight");
  gContentAPI.hideHighlight();
  await pageActionPanelHiddenPromise;
  await highlightHiddenPromise;
  is(appMenu.state, "closed", "Shouldn't open the app menu");
  is(pageActionPanel.state, "closed", "Should close the page action panel after hiding highlight");
});

add_UITour_task(async function test_show_pageActionPanel_and_showInfo_buttonOnAppMenu() {
  let tooltip = document.getElementById("UITourTooltip");
  is_element_hidden(tooltip, "Tooltip should initially be hidden");

  let appMenu = window.PanelUI.panel;
  let pageActionPanel = BrowserPageActions.panelNode;

  // Test explicity asking for opening the page action panel
  let pageActionPanelShownPromise = promisePanelElementShown(window, pageActionPanel);
  gContentAPI.showMenu("pageActionPanel");
  await pageActionPanelShownPromise;
  is(appMenu.state, "closed", "Shouldn't open the app menu");
  is(pageActionPanel.state, "open", "Should open the page action panel");

  // Test showing info tooltip on the privateWindow button on the app menu
  let appMenuShownPromise = promisePanelElementShown(window, appMenu);
  let tooltipVisiblePromise = elementVisiblePromise(tooltip, "Should show info tooltip");
  await showInfoPromise("privateWindow", "title", "text");
  await appMenuShownPromise;
  await tooltipVisiblePromise;
  is(appMenu.state, "open", "Should open the app menu to show info on the privateWindow button");
  is(pageActionPanel.state, "open", "Shouldn't close the page action panel because it is opened explictly by api user.");
  is(getShowInfoTargetName(), "privateWindow", "Should show info tooltip on the privateWindow button on the app menu");

  // Test hiding the page action panel wouldn't affect the info tooltip on the app menu
  let pageActionPanelHiddenPromise = promisePanelElementHidden(window, pageActionPanel);
  gContentAPI.hideMenu("pageActionPanel");
  await pageActionPanelHiddenPromise;
  is_element_visible(tooltip, "Tooltip should still be visible");
  is(appMenu.state, "open", "Shouldn't close the app menu");
  is(pageActionPanel.state, "closed", "Should close the page action panel after hideMenu");
  is(getShowInfoTargetName(), "privateWindow", "Should still show info tooltip on the privateWindow button on the app menu");

  // Test hiding info tooltip
  let appMenuHiddenPromise = promisePanelElementHidden(window, appMenu);
  let tooltipHiddenPromise = elementHiddenPromise(tooltip, "Should hide info");
  gContentAPI.hideInfo();
  await appMenuHiddenPromise;
  await tooltipHiddenPromise;
  is(appMenu.state, "closed", "Should close the app menu after hideInfo");
  is(pageActionPanel.state, "closed", "Shouldn't open the page action panel");
});
