[
  {
    "namespace": "manifest",
    "types": [
      {
        "$extend": "Permission",
        "choices": [{
          "type": "string",
          "enum": [
            "proxy"
          ]
        }]
      }
    ]
  },
  {
    "namespace": "proxy",
    "description": "Use the browser.proxy API to register proxy scripts in Firefox. Proxy scripts in Firefox are proxy auto-config files with extra contextual information and support for additional return types.",
    "permissions": ["proxy"],
    "types": [
      {
        "id": "ProxyConfig",
        "type": "object",
        "description": "An object which describes proxy settings.",
        "properties": {
          "proxyType": {
            "type": "string",
            "optional": true,
            "enum": [
              "none",
              "autoDetect",
              "system",
              "manual",
              "autoConfig"
            ],
            "description": "The type of proxy to use."
          },
          "http": {
            "type": "string",
            "optional": true,
            "description": "The address of the http proxy, can include a port."
          },
          "httpProxyAll":{
            "type": "boolean",
            "optional": true,
            "description": "Use the http proxy server for all protocols."
          },
          "ftp": {
            "type": "string",
            "optional": true,
            "description": "The address of the ftp proxy, can include a port."
          },
          "ssl": {
            "type": "string",
            "optional": true,
            "description": "The address of the ssl proxy, can include a port."
          },
          "socks": {
            "type": "string",
            "optional": true,
            "description": "The address of the socks proxy, can include a port."
          },
          "socksVersion": {
            "type": "integer",
            "optional": true,
            "description": "The version of the socks proxy.",
            "minimum": 4,
            "maximum": 5
          },
          "passthrough": {
            "type": "string",
            "optional": true,
            "description": "A list of hosts which should not be proxied."
          },
          "autoConfigUrl": {
            "type": "string",
            "optional": true,
            "description": "A URL to use to configure the proxy."
          },
          "autoLogin": {
            "type": "boolean",
            "optional": true,
            "description": "Do not prompt for authentication if password is saved."
          },
          "proxyDNS": {
            "type": "boolean",
            "optional": true,
            "description": "Proxy DNS when using SOCKS v5."
          }
        }
      }
    ],
    "properties": {
      "settings": {
        "$ref": "types.Setting",
        "description": "Configures proxy settings. This setting's value is an object of type ProxyConfig."
      }
    },
    "functions": [
      {
        "name": "register",
        "type": "function",
        "deprecated": "proxy.register has been deprecated and will be removed in Firefox 71.",
        "description": "Registers the proxy script for the extension.",
        "async": true,
        "parameters": [
          {
            "name": "url",
            "type": "string",
            "format": "strictRelativeUrl"
          }
        ]
      },
      {
        "name": "unregister",
        "type": "function",
        "deprecated": "proxy.unregister has been deprecated and will be removed in Firefox 71.",
        "description": "Unregisters the proxy script for the extension.",
        "async": true,
        "parameters": []
      },
      {
        "name": "registerProxyScript",
        "type": "function",
        "deprecated": "proxy.registerProxyScript has been deprecated and will be removed in Firefox 71.",
        "description": "Registers the proxy script for the extension. This is an alias for proxy.register.",
        "async": true,
        "parameters": [
          {
            "name": "url",
            "type": "string",
            "format": "strictRelativeUrl"
          }
        ]
      }
    ],
    "events": [
      {
        "name": "onRequest",
        "type": "function",
        "description": "Fired when proxy data is needed for a request.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "requestId": {"type": "string", "description": "The ID of the request. Request IDs are unique within a browser session. As a result, they could be used to relate different events of the same request."},
              "url": {"type": "string"},
              "method": {"type": "string", "description": "Standard HTTP method."},
              "frameId": {"type": "integer", "description": "The value 0 indicates that the request happens in the main frame; a positive value indicates the ID of a subframe in which the request happens. If the document of a (sub-)frame is loaded (<code>type</code> is <code>main_frame</code> or <code>sub_frame</code>), <code>frameId</code> indicates the ID of this frame, not the ID of the outer frame. Frame IDs are unique within a tab."},
              "parentFrameId": {"type": "integer", "description": "ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists."},
              "incognito": {"type": "boolean", "optional": true, "description": "True for private browsing requests."},
              "cookieStoreId": {"type": "string", "optional": true, "description": "The cookie store ID of the contextual identity."},
              "originUrl": {"type": "string", "optional": true, "description": "URL of the resource that triggered this request."},
              "documentUrl": {"type": "string", "optional": true, "description": "URL of the page into which the requested resource will be loaded."},
              "tabId": {"type": "integer", "description": "The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab."},
              "type": {"$ref": "webRequest.ResourceType", "description": "How the requested resource will be used."},
              "timeStamp": {"type": "number", "description": "The time when this signal is triggered, in milliseconds since the epoch."},
              "ip": {"type": "string", "optional": true, "description": "The server IP address that the request was actually sent to. Note that it may be a literal IPv6 address."},
              "fromCache": {"type": "boolean", "description": "Indicates if this response was fetched from disk cache."},
              "requestHeaders": {"$ref": "webRequest.HttpHeaders", "optional": true, "description": "The HTTP request headers that are going to be sent out with this request."}
            }
          }
        ],
        "extraParameters": [
          {
            "$ref": "webRequest.RequestFilter",
            "name": "filter",
            "description": "A set of filters that restricts the events that will be sent to this listener."
          },
          {
            "type": "array",
            "optional": true,
            "name": "extraInfoSpec",
            "description": "Array of extra information that should be passed to the listener function.",
            "items": {
              "type": "string",
              "enum": ["requestHeaders"]
            }
          }
        ]
      },
      {
        "name": "onError",
        "type": "function",
        "description": "Notifies about errors caused by the invalid use of the proxy API.",
        "parameters": [
          {
            "name": "error",
            "type": "object"
          }
        ]
      },
      {
        "name": "onProxyError",
        "type": "function",
        "deprecated": "proxy.onProxyError has been deprecated and will be removed in Firefox 71. Use proxy.onError instead.",
        "description": "Please use $(ref:proxy.onError).",
        "parameters": [
          {
            "name": "error",
            "type": "object"
          }
        ]
      }
    ]
  }
]