[
  {
    "namespace": "manifest",
    "types": [
      {
        "id": "KeyName",
        "type": "string",
        "format": "manifestShortcutKey"
      },
      {
        "$extend": "WebExtensionManifest",
        "properties": {
          "commands": {
            "type": "object",
            "optional": true,
            "additionalProperties": {
              "type": "object",
              "additionalProperties": { "$ref": "UnrecognizedProperty" },
              "properties": {
                "suggested_key": {
                  "type": "object",
                  "optional": true,
                  "properties": {
                    "default": {
                      "$ref": "KeyName",
                      "optional": true
                    },
                    "mac": {
                      "$ref": "KeyName",
                      "optional": true
                    },
                    "linux": {
                      "$ref": "KeyName",
                      "optional": true
                    },
                    "windows": {
                      "$ref": "KeyName",
                      "optional": true
                    },
                    "chromeos": {
                      "type": "string",
                      "optional": true
                    },
                    "android": {
                      "type": "string",
                      "optional": true
                    },
                    "ios": {
                      "type": "string",
                      "optional": true
                    },
                    "additionalProperties": {
                      "type": "string",
                      "deprecated": "Unknown platform name",
                      "optional": true
                    }
                  }
                },
                "description": {
                  "type": "string",
                  "preprocess": "localize",
                  "optional": true
                }
              }
            }
          }
        }
      }
    ]
  },
  {
    "namespace": "commands",
    "description": "Use the commands API to add keyboard shortcuts that trigger actions in your extension, for example, an action to open the browser action or send a command to the xtension.",
    "permissions": ["manifest:commands"],
    "types": [
      {
        "id": "Command",
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "optional": true,
            "description": "The name of the Extension Command"
          },
          "description": {
            "type": "string",
            "optional": true,
            "description": "The Extension Command description"
          },
          "shortcut": {
            "type": "string",
            "optional": true,
            "description": "The shortcut active for this command, or blank if not active."
          }
        }
      }
    ],
    "events": [
      {
        "name": "onCommand",
        "description": "Fired when a registered command is activated using a keyboard shortcut.",
        "type": "function",
        "parameters": [
          {
            "name": "command",
            "type": "string"
          },
          {
            "name": "tab",
            "$ref": "tabs.Tab",
            "optional": true,
            "description": "Details of the $(ref:tabs.Tab) where the command was activated."
          }
        ]
      },
      {
        "name": "onChanged",
        "description": "Fired when a registered command's shortcut is changed.",
        "type": "function",
        "parameters": [
          {
            "type": "object",
            "name": "changeInfo",
            "properties": {
              "name": {
                "type": "string",
                "description": "The name of the shortcut."
              },
              "newShortcut": {
                "type": "string",
                "description": "The new shortcut active for this command, or blank if not active."
              },
              "oldShortcut": {
                "type": "string",
                "description": "The old shortcut which is no longer active for this command, or blank if the shortcut was previously inactive."
              }
            }
          }
        ]
      }
    ],
    "functions": [
      {
        "name": "update",
        "type": "function",
        "async": true,
        "description": "Update the details of an already defined command.",
        "parameters": [
          {
            "type": "object",
            "name": "detail",
            "description": "The new description for the command.",
            "properties": {
              "name": {
                "type": "string",
                "description": "The name of the command."
              },
              "description": {
                "type": "string",
                "optional": true,
                "description": "The new description for the command."
              },
              "shortcut": {
                "type": "string",
                "format": "manifestShortcutKeyOrEmpty",
                "optional": true
              }
            }
          }
        ]
      },
      {
        "name": "reset",
        "type": "function",
        "async": true,
        "description": "Reset a command's details to what is specified in the manifest.",
        "parameters": [
          {
            "type": "string",
            "name": "name",
            "description": "The name of the command."
          }
        ]
      },
      {
        "name": "getAll",
        "type": "function",
        "async": "callback",
        "description": "Returns all the registered extension commands for this extension and their shortcut (if active).",
        "parameters": [
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": [
              {
                "name": "commands",
                "type": "array",
                "items": {
                  "$ref": "Command"
                }
              }
            ],
            "description": "Called to return the registered commands."
          }
        ]
      }
    ]
  }
]
