forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			145 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
API Schemas
 | 
						|
===========
 | 
						|
Anything that a WebExtension API exposes to extensions via Javascript
 | 
						|
is described by the API's schema.  The format of API schemas uses some
 | 
						|
of the same syntax as `JSON Schema <http://json-schema.org/>`_.
 | 
						|
JSON Schema provides a way to specify constraints on JSON documents and
 | 
						|
the same method is used by WebExtensions to specify constraints on,
 | 
						|
for example, parameters passed to an API function.  But the syntax for
 | 
						|
describing functions, namespaces, etc. is all ad hoc.  This section
 | 
						|
describes that syntax.
 | 
						|
 | 
						|
An individual API schema consists of structured descriptions of
 | 
						|
items in one or more *namespaces* using a structure like this:
 | 
						|
 | 
						|
.. code-block:: js
 | 
						|
 | 
						|
   [
 | 
						|
     {
 | 
						|
       "namespace": "namespace1",
 | 
						|
       // declarations for namespace 1...
 | 
						|
     },
 | 
						|
     {
 | 
						|
       "namespace": "namespace2",
 | 
						|
       // declarations for namespace 2...
 | 
						|
     },
 | 
						|
     // other namespaces...
 | 
						|
   ]
 | 
						|
 | 
						|
Most of the namespaces correspond to objects available to extensions
 | 
						|
Javascript code under the ``browser`` global.  For example, entries in the
 | 
						|
namespace ``example`` are accessible to extension Javascript code as
 | 
						|
properties on ``browser.example``.
 | 
						|
The namespace ``"manifest"`` is handled specially, it describes the
 | 
						|
structure of WebExtension manifests (i.e., ``manifest.json`` files).
 | 
						|
Manifest schemas are explained in detail below.
 | 
						|
 | 
						|
Declarations within a namespace look like:
 | 
						|
 | 
						|
.. code-block:: js
 | 
						|
 | 
						|
   {
 | 
						|
     "namespace": "namespace1",
 | 
						|
     "types": [
 | 
						|
       { /* type definition */ },
 | 
						|
       ...
 | 
						|
     ],
 | 
						|
     "properties": {
 | 
						|
       "NAME": { /* property definition */ },
 | 
						|
       ...
 | 
						|
     },
 | 
						|
     "functions": [
 | 
						|
       { /* function definition */ },
 | 
						|
       ...
 | 
						|
     ],
 | 
						|
     "events": [
 | 
						|
       { /* event definition */ },
 | 
						|
       ...
 | 
						|
     ]
 | 
						|
   }
 | 
						|
 | 
						|
The four types of objects that can be defined inside a namespace are:
 | 
						|
 | 
						|
- **types**: A type is a reusable schema fragment.  A common use of types
 | 
						|
  is to define in one place an object with a particular set of typed fields
 | 
						|
  that is used in multiple places in an API.
 | 
						|
 | 
						|
- **properties**: A property is a fixed Javascript value available to
 | 
						|
  extensions via Javascript.  Note that the format for defining
 | 
						|
  properties in a schema is different from the format for types, functions,
 | 
						|
  and events.  The next subsection describes creating properties in detail.
 | 
						|
 | 
						|
- **functions** and **events**:
 | 
						|
  These entries create functions and events respectively, which are
 | 
						|
  usable from Javascript by extensions.  Details on how to implement
 | 
						|
  them are later in this section.
 | 
						|
 | 
						|
Implementing a fixed Javascript property
 | 
						|
----------------------------------------
 | 
						|
A static property is made available to extensions via Javascript
 | 
						|
entirely from the schema, using a fragment like this one:
 | 
						|
 | 
						|
.. code-block:: js
 | 
						|
 | 
						|
   [
 | 
						|
     "namespace": "myapi",
 | 
						|
     "properties": {
 | 
						|
       "SOME_PROPERTY": {
 | 
						|
        "value": 24,
 | 
						|
        "description": "Description of my property here."
 | 
						|
       }
 | 
						|
     }
 | 
						|
   ]
 | 
						|
 | 
						|
If a WebExtension API with this fragment in its schema is loaded for
 | 
						|
a particular extension context, that extension will be able to access
 | 
						|
``browser.myapi.SOME_PROPERTY`` and read the fixed value 24.
 | 
						|
The contents of ``value`` can be any JSON serializable object.
 | 
						|
 | 
						|
Schema Items
 | 
						|
------------
 | 
						|
Most definitions of individual items in a schema have a common format:
 | 
						|
 | 
						|
.. code-block:: js
 | 
						|
 | 
						|
   {
 | 
						|
     "type": "SOME TYPE",
 | 
						|
     /* type-specific parameters... */
 | 
						|
   }
 | 
						|
 | 
						|
Type-specific parameters will be described in subsequent sections,
 | 
						|
but there are some optional properties that can appear in many
 | 
						|
different types of items in an API schema:
 | 
						|
 | 
						|
- ``description``: This string-valued property serves as documentation
 | 
						|
  for anybody reading or editing the schema.
 | 
						|
 | 
						|
- ``permissions``: This property is an array of strings.
 | 
						|
  If present, the item in which this property appears is only made
 | 
						|
  available to extensions that have all the permissions listed in the array.
 | 
						|
 | 
						|
- ``unsupported``: This property must be a boolean.
 | 
						|
  If it is true, the item in which it appears is ignored.
 | 
						|
  By using this property, a schema can define how a particular API
 | 
						|
  is intended to work, before it is implemented.
 | 
						|
 | 
						|
- ``deprecated``: This property must be a boolean.  If it is true,
 | 
						|
  any uses of the item in which it appears will cause a warning to
 | 
						|
  be logged to the browser console, to indicate to extension authors
 | 
						|
  that they are using a feature that is deprecated or otherwise
 | 
						|
  not fully supported.
 | 
						|
 | 
						|
 | 
						|
Describing constrained values
 | 
						|
-----------------------------
 | 
						|
There are many places where API schemas specify constraints on the type
 | 
						|
and possibly contents of some JSON value (e.g., the manifest property
 | 
						|
``name`` must be a string) or Javascript value (e.g., the first argument
 | 
						|
to ``browser.tabs.get()`` must be a non-negative integer).
 | 
						|
These items are defined using `JSON Schema <http://json-schema.org/>`_.
 | 
						|
Specifically, these items are specified by using one of the following
 | 
						|
values for the ``type`` property: ``boolean``, ``integer``, ``number``,
 | 
						|
``string``, ``array``, ``object``, or ``any``.
 | 
						|
Refer to the documentation and examples at the
 | 
						|
`JSON Schema site <http://json-schema.org/>`_ for details on how these
 | 
						|
items are defined in a schema.
 |