/* 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";

/**
 * Constants used in various panels, shared between client and the server.
 */

/* Accessibility Panel ====================================================== */

// List of audit types.
const AUDIT_TYPE = {
  CONTRAST: "CONTRAST",
  KEYBOARD: "KEYBOARD",
  TEXT_LABEL: "TEXT_LABEL",
};

// Types of issues grouped by audit types.
const ISSUE_TYPE = {
  [AUDIT_TYPE.KEYBOARD]: {
    // Focusable accessible objects have no semantics.
    FOCUSABLE_NO_SEMANTICS: "FOCUSABLE_NO_SEMANTICS",
    // Tab index greater than 0 is provided.
    FOCUSABLE_POSITIVE_TABINDEX: "FOCUSABLE_POSITIVE_TABINDEX",
    // Interactive accesible objects do not have an associated action.
    INTERACTIVE_NO_ACTION: "INTERACTIVE_NO_ACTION",
    // Interative accessible objcets are not focusable.
    INTERACTIVE_NOT_FOCUSABLE: "INTERACTIVE_NOT_FOCUSABLE",
    // Accessible objects can only be interacted with a mouse.
    MOUSE_INTERACTIVE_ONLY: "MOUSE_INTERACTIVE_ONLY",
    // Focusable accessible objects have no focus styling.
    NO_FOCUS_VISIBLE: "NO_FOCUS_VISIBLE",
  },
  [AUDIT_TYPE.TEXT_LABEL]: {
    // <AREA> name is provided via "alt" attribute.
    AREA_NO_NAME_FROM_ALT: "AREA_NO_NAME_FROM_ALT",
    // Dialog name is not provided.
    DIALOG_NO_NAME: "DIALOG_NO_NAME",
    // Document title is not provided.
    DOCUMENT_NO_TITLE: "DOCUMENT_NO_TITLE",
    // <EMBED> name is not provided.
    EMBED_NO_NAME: "EMBED_NO_NAME",
    // <FIGURE> name is not provided.
    FIGURE_NO_NAME: "FIGURE_NO_NAME",
    // <FIELDSET> name is not provided.
    FORM_FIELDSET_NO_NAME: "FORM_FIELDSET_NO_NAME",
    // <FIELDSET> name is not provided via <LEGEND> element.
    FORM_FIELDSET_NO_NAME_FROM_LEGEND: "FORM_FIELDSET_NO_NAME_FROM_LEGEND",
    // Form element's name is not provided.
    FORM_NO_NAME: "FORM_NO_NAME",
    // Form element's name is not visible.
    FORM_NO_VISIBLE_NAME: "FORM_NO_VISIBLE_NAME",
    // <OPTGROUP> name is not provided via "label" attribute.
    FORM_OPTGROUP_NO_NAME_FROM_LABEL: "FORM_OPTGROUP_NO_NAME_FROM_LABEL",
    // <FRAME> name is not provided.
    FRAME_NO_NAME: "FRAME_NO_NAME",
    // <H{1, 2, ...}> has no content.
    HEADING_NO_CONTENT: "HEADING_NO_CONTENT",
    // <H{1, 2, ...}> name is not provided.
    HEADING_NO_NAME: "HEADING_NO_NAME",
    // <IFRAME> name is not provided via "title" attribute.
    IFRAME_NO_NAME_FROM_TITLE: "IFRAME_NO_NAME_FROM_TITLE",
    // <IMG> name is not provided (including empty name).
    IMAGE_NO_NAME: "IMAGE_NO_NAME",
    // Interactive element's name is not provided.
    INTERACTIVE_NO_NAME: "INTERACTIVE_NO_NAME",
    // <MGLYPH> name is no provided.
    MATHML_GLYPH_NO_NAME: "MATHML_GLYPH_NO_NAME",
    // Toolbar's name is not provided when more than one toolbar is present.
    TOOLBAR_NO_NAME: "TOOLBAR_NO_NAME",
  },
};

// Constants associated with WCAG guidelines score system.
const SCORES = {
  // Satisfies WCAG AA guidelines.
  AA: "AA",
  // Satisfies WCAG AAA guidelines.
  AAA: "AAA",
  // Elevates accessibility experience.
  BEST_PRACTICES: "BEST_PRACTICES",
  // Does not satisfy the baseline WCAG guidelines.
  FAIL: "FAIL",
  // Partially satisfies the WCAG AA guidelines.
  WARNING: "WARNING",
};

// List of simulation types.
const SIMULATION_TYPE = {
  // No red color blindness
  PROTANOPIA: "PROTANOPIA",
  // No green color blindness
  DEUTERANOPIA: "DEUTERANOPIA",
  // No blue color blindness
  TRITANOPIA: "TRITANOPIA",
  // Absense of color vision
  ACHROMATOPSIA: "ACHROMATOPSIA",
  // Low contrast
  CONTRAST_LOSS: "CONTRAST_LOSS",
};

/* Compatibility Panel ====================================================== */

const COMPATIBILITY_ISSUE_TYPE = {
  CSS_PROPERTY: "CSS_PROPERTY",
  CSS_PROPERTY_ALIASES: "CSS_PROPERTY_ALIASES",
};

/* Style Editor ============================================================= */

// The PageStyle actor flattens the DOM CSS objects a little bit, merging
// Rules and their Styles into one actor.  For elements (which have a style
// but no associated rule) we fake a rule with the following style id.
// This `id` is intended to be used instead of a regular CSSRule Type constant.
// See https://developer.mozilla.org/en-US/docs/Web/API/CSSRule#Type_constants
const ELEMENT_STYLE = 100;
const PRES_HINTS = 200;

/* WebConsole Panel ========================================================= */

const MESSAGE_CATEGORY = {
  CSS_PARSER: "CSS Parser",
};

/* Debugger ============================================================= */

// Map protocol pause "why" reason to a valid L10N key (in devtools/shared/locales/en-US/debugger-paused-reasons.ftl)
const DEBUGGER_PAUSED_REASONS_L10N_MAPPING = {
  debuggerStatement: "whypaused-debugger-statement",
  breakpoint: "whypaused-breakpoint",
  exception: "whypaused-exception",
  resumeLimit: "whypaused-resume-limit",
  breakpointConditionThrown: "whypaused-breakpoint-condition-thrown",
  eventBreakpoint: "whypaused-event-breakpoint",
  getWatchpoint: "whypaused-get-watchpoint",
  setWatchpoint: "whypaused-set-watchpoint",
  mutationBreakpoint: "whypaused-mutation-breakpoint",
  interrupted: "whypaused-interrupted",

  // V8
  DOM: "whypaused-breakpoint",
  EventListener: "whypaused-pause-on-dom-events",
  XHR: "whypaused-xhr",
  promiseRejection: "whypaused-promise-rejection",
  assert: "whypaused-assert",
  debugCommand: "whypaused-debug-command",
  other: "whypaused-other",
};

/* Exports ============================================================= */

module.exports = {
  accessibility: {
    AUDIT_TYPE,
    ISSUE_TYPE,
    SCORES,
    SIMULATION_TYPE,
  },
  COMPATIBILITY_ISSUE_TYPE,
  DEBUGGER_PAUSED_REASONS_L10N_MAPPING,
  MESSAGE_CATEGORY,
  style: {
    ELEMENT_STYLE,
    PRES_HINTS,
  },
};
