This directory provides API definitions for CEF. Some extensions are implemented
using Mojo and others use an older JSON-based format.

  <api> is the name of the API definition (e.g. 'alarms').
  <class> is the name of the class implementation (e.g. 'AlarmManager').

To add a new extension API implemented only in CEF ***:

1. Add libcef/common/extensions/api/<api>.idl or .json file which defines the
   API.
2. Add <api>.idl or .json to the 'schema_sources' list in
   libcef/common/extensions/api/BUILD.gn. Serialization code will be
   generated based on this list in step 4.
3. Add libcef/browser/extensions/api/<api>/<api>_api.[h|cc] class implementation
   files and associated entries to the 'libcef_static' target in BUILD.gn.
4. Run the cef_create_projects script and build to generate the
   cef/libcef/common/extensions/api/<api>.h file and other serialization code
   required by the extensions system.
5. Add an entry in the libcef/common/extensions/api/_*_features.json files if
   necessary [1].
6. Add an entry in the libcef/common/extensions/api/*_manifest_overlay.json
   files if necessary [2].
7. Call `<class>::GetInstance();` or `<class>Factory::GetFactoryInstance();` [3]
   from EnsureBrowserContextKeyedServiceFactoriesBuilt in
   libcef/browser/extensions/browser_context_keyed_service_factories.cc.
8. Call `DependsOn(<class>Factory::GetInstance());` from
   CefExtensionSystemFactory::CefExtensionSystemFactory in
   libcef/browser/extensions/extension_system_factory.cc if necessary [3].

*** Note that CEF does not currently expose its own Mojo APIs. Related code is
commented out in:
  cef/BUILD.gn
  cef/libcef/common/extensions/api/BUILD.gn
  CefExtensionsBrowserClient::RegisterExtensionFunctions
  CefExtensionsClient::IsAPISchemaGenerated
  CefExtensionsClient::GetAPISchema

To add a new extension API implemented in Chrome:

1. Register the API in libcef/browser/extensions/chrome_api_registration.cc
2. Perform steps 5 through 8 above.

See https://www.chromium.org/developers/design-documents/mojo for more
information.

[1] A feature can optionally express requirements for where it can be accessed.
    See the _api_features.json and _permission_features.json files for
    additional details. For Chrome extensions this should match the definitions
    in the chrome/common/extensions/api/_*_features.json files.

[2] Service Manifest InterfaceProviderSpecs control interfaces exposed between
    processes. Mojo interfaces exposed at the frame level are controlled by the
    "navigation:frame" dictionary. Those exposed at the process level are
    controlled by the "service_manager:connector" dictionary. Failure to specify
    this correctly may result in a console error like the following:

      InterfaceProviderSpec "navigation:frame" prevented service:
      service:content_renderer from binding interface:
      mojom::Foo exposed by: service:content_browser

[3] Some Mojo APIs use singleton Factory objects that create a one-to-one
    relationship between a service and a BrowserContext. This is used primarily
    to control shutdown/destruction order and implementors must explicitly state
    which services are depended on. See comments in
    components/keyed_service/content/browser_context_keyed_service_factory.h
    for additional details.
