// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
[
  {
    "namespace": "manifest",
    "types": [
      {
        "$extend": "WebExtensionManifest",
        "properties": {
          "omnibox": {
            "type": "object",
            "additionalProperties": { "$ref": "UnrecognizedProperty" },
            "properties": {
              "keyword": {
                "type": "string",
                "pattern": "^[^?\\s:]([^\\s:]*[^/\\s:])?$"
              }
            },
            "optional": true
          }
        }
      }
    ]
  },
  {
    "namespace": "omnibox",
    "description": "The omnibox API allows you to register a keyword with Firefox's address bar.",
    "permissions": ["manifest:omnibox"],
    "types": [
      {
        "id": "DescriptionStyleType",
        "type": "string",
        "description": "The style type.",
        "enum": ["url", "match", "dim"]
      },
      {
        "id": "OnInputEnteredDisposition",
        "type": "string",
        "enum": ["currentTab", "newForegroundTab", "newBackgroundTab"],
        "description": "The window disposition for the omnibox query. This is the recommended context to display results. For example, if the omnibox command is to navigate to a certain URL, a disposition of 'newForegroundTab' means the navigation should take place in a new selected tab."
      },
      {
        "id": "SuggestResult",
        "type": "object",
        "description": "A suggest result.",
        "properties": {
          "content": {
            "type": "string",
            "minLength": 1,
            "description": "The text that is put into the URL bar, and that is sent to the extension when the user chooses this entry."
          },
          "description": {
            "type": "string",
            "minLength": 1,
            "description": "The text that is displayed in the URL dropdown. Can contain XML-style markup for styling. The supported tags are 'url' (for a literal URL), 'match' (for highlighting text that matched what the user's query), and 'dim' (for dim helper text). The styles can be nested, eg. <dim><match>dimmed match</match></dim>. You must escape the five predefined entities to display them as text: stackoverflow.com/a/1091953/89484 "
          },
          "descriptionStyles": {
            "optional": true,
            "unsupported": true,
            "type": "array",
            "description": "An array of style ranges for the description, as provided by the extension.",
            "items": {
              "type": "object",
              "description": "The style ranges for the description, as provided by the extension.",
              "properties": {
                "offset": { "type": "integer" },
                "type": { "description": "The style type", "$ref": "DescriptionStyleType"},
                "length": { "type": "integer", "optional": true }
              }
            }
          },
          "descriptionStylesRaw": {
            "optional": true,
            "unsupported": true,
            "type": "array",
            "description": "An array of style ranges for the description, as provided by ToValue().",
            "items": {
              "type": "object",
              "description": "The style ranges for the description, as provided by ToValue().",
              "properties": {
                "offset": { "type": "integer" },
                "type": { "type": "integer" }
              }
            }
          }
        }
      },
      {
        "id": "DefaultSuggestResult",
        "type": "object",
        "description": "A suggest result.",
        "properties": {
          "description": {
            "type": "string",
            "minLength": 1,
            "description": "The text that is displayed in the URL dropdown."
          },
          "descriptionStyles": {
            "optional": true,
            "unsupported": true,
            "type": "array",
            "description": "An array of style ranges for the description, as provided by the extension.",
            "items": {
              "type": "object",
              "description": "The style ranges for the description, as provided by the extension.",
              "properties": {
                "offset": { "type": "integer" },
                "type": { "description": "The style type", "$ref": "DescriptionStyleType"},
                "length": { "type": "integer", "optional": true }
              }
            }
          },
          "descriptionStylesRaw": {
            "optional": true,
            "unsupported": true,
            "type": "array",
            "description": "An array of style ranges for the description, as provided by ToValue().",
            "items": {
              "type": "object",
              "description": "The style ranges for the description, as provided by ToValue().",
              "properties": {
                "offset": { "type": "integer" },
                "type": { "type": "integer" }
              }
            }
          }
        }
      }
    ],
    "functions": [
      {
        "name": "setDefaultSuggestion",
        "type": "function",
        "description": "Sets the description and styling for the default suggestion. The default suggestion is the text that is displayed in the first suggestion row underneath the URL bar.",
        "parameters": [
          {
            "name": "suggestion",
            "$ref": "DefaultSuggestResult",
            "description": "A partial SuggestResult object, without the 'content' parameter."
          }
        ]
      }
    ],
    "events": [
      {
        "name": "onInputStarted",
        "type": "function",
        "description": "User has started a keyword input session by typing the extension's keyword. This is guaranteed to be sent exactly once per input session, and before any onInputChanged events.",
        "parameters": []
      },
      {
        "name": "onInputChanged",
        "type": "function",
        "description": "User has changed what is typed into the omnibox.",
        "parameters": [
          {
            "type": "string",
            "name": "text"
          },
          {
            "name": "suggest",
            "type": "function",
            "description": "A callback passed to the onInputChanged event used for sending suggestions back to the browser.",
            "parameters": [
              {
                "name": "suggestResults",
                "type": "array",
                "description": "Array of suggest results",
                "items": {
                  "$ref": "SuggestResult"
                }
              }
            ]
          }
        ]
      },
      {
        "name": "onInputEntered",
        "type": "function",
        "description": "User has accepted what is typed into the omnibox.",
        "parameters": [
          {
            "type": "string",
            "name": "text"
          },
          {
            "name": "disposition",
            "$ref": "OnInputEnteredDisposition"
          }
        ]
      },
      {
        "name": "onInputCancelled",
        "type": "function",
        "description": "User has ended the keyword input session without accepting the input.",
        "parameters": []
      }
    ]
  },
  {
    "namespace": "omnibox_internal",
    "description": "The internal namespace used by the omnibox API.",
    "defaultContexts": ["addon_parent_only"],
    "functions": [
      {
        "name": "addSuggestions",
        "type": "function",
        "async": "callback",
        "description": "Internal function used by omnibox.onInputChanged for adding search suggestions",
        "parameters": [
          {
            "name": "id",
            "type": "integer",
            "description": "The ID of the callback received by onInputChangedInternal"
          },
          {
            "name": "suggestResults",
            "type": "array",
            "description": "Array of suggest results",
            "items": {
              "$ref": "omnibox.SuggestResult"
            }
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": []
          }
        ]
      }
    ],
    "events": [
      {
        "name": "onInputChanged",
        "type": "function",
        "description": "Identical to omnibox.onInputChanged except no 'suggest' callback is provided.",
        "parameters": [
          {
            "type": "string",
            "name": "text"
          }
        ]
      }
    ]
  }
]