blob: 9cb185f6eb333d149ee686b7beeff6683f90f2ff [file] [log] [blame] [view]
Sky IDL
=======
The Sky IDL language is used to describe JS APIs found in Sky, in
particular, the JS APIs exposed by the four magical imports defined in
this document.
Sky IDL definitions are typically compiled to C++ that exposes the C++
implementations of the APIs to JavaScript.
Sky IDL works more or less the same as Web IDL but the syntax is a bit
different.
```javascript
module 'sky:modulename' {
// this is a comment
typedef NewType OldType; // useful when OldType is a commonly-used union
callback CallbackName ReturnType (ArgumentType argumentName);
class ClassName {
// a class corresponds to a JavaScript prototype
// corresponds to a WebIDL 'interface'
}
abstract class Superclass {
// an abstract class can't have a non-abstract constructor
// an abstract class may have abstract constructors and methods
// an abstract class may have everything else a class can have
abstract constructor ();
// this indicates that non-abstract subclasses must have a constructor with the given arguments
abstract ReturnType methodCallback();
// this method does nothing, but is included to describe the interface that subclasses will implement
// a non-abstract class must have an explicit implementation of all inherited abstract methods
}
class Subclass : Superclass {
// properties
readonly attribute ReturnType attributeName; // getter
attribute ReturnType attributeName; // getter and setter
// methods and constructors
constructor ();
ReturnType method();
// When the platform calls this method, it always invokes the "real" method, even if it's been
// deleted from the prototypes (as if it took a reference to the method at startup, and stored
// state using Symbols)
// Calling a method with fewer arguments than defined will throw.
// Calling a method with more arguments ignores the extra arguments.
virtual ReturnType methodCallback();
// when the platform calls this, it actually calls it the way JS would, so author overrides do
// affect what gets called. Make sure if you override it that you call the superclass implementation!
// The default implementations of 'virtual' methods all end by calling the identically named method
// on the superclass, if there is such a method.
// non-abstract classes cannot have abstract constructors or methods, and in particular, must
// have explicit non-abstract versions of any inherited abstract constructors or methods
// properties on the constructor
constructor readonly attribute ReturnType staticName;
// private APIs - see below
private void method();
// arguments and overloading are done as follows
// note that the argument names are only for documentation purposes
ReturnType method(ArgumentType argumentName1, ArgumentType argumentName2);
// the last argument's type can have "..." appended to it to indicate a varargs-like situation
ReturnType method(ArgumentType argumentName1, ArgumentType... allSubsequentArguments);
// trailing arguments can have a default value, which must be a literal of the given type
ReturnType method(ArgumentType argumentName1, ArgumentType argumentName2 = defaultValue);
}
dictionary Options {
String foo; // if there's no default, the property must be specified or it's a TypeError
Integer bar = 4; // properties can have default values
}
// the module can have properties and methods also
attribute String Foo;
void method();
interface InterfaceName {
// describes a template of a prototype, in the same syntax as a class
// not actually exposed in the runtime
}
}
```
### Private APIs ###
Private APIs are only accessible via Symbol objects, which are then
exposed on the sky:debug module's exports object as the name of the
member given in the IDL.
For example, consider:
```javascript
class Foo {
private void Bar();
}
```
In a script with a ``foo`` object of type ``Foo``, ``foo.Bar`` is
undefined. However, it can be obtained as follows:
```html
<import src="sky:debug" as="debug"/>
<!-- ... import whatever defines 'foo' ... -->
<script>
foo[debug.Bar]
</script>
```
### Types ###
The following types are available:
* ``Integer`` - WebIDL ``long long``
* ``Float`` - WebIDL ``double``
* ``Infinity`` - singleton type with value ``Infinity``
* ``String`` - WebIDL ``USVString``
* ``Boolean`` - WebIDL ``boolean``
# ``Object`` - WebIDL ``object`` (``ClassName`` can be used as a literal for this type)
* ``ClassName`` - an instance of the class ClassName
* ``Class<ClassName>`` - a class ClassName or one of its subclasses (not an instance)
* ``DictionaryName`` - an instance of the dictionary DictionaryName
* ``Promise<Type>`` - WebIDL ``Promise<T>``
* ``Generator<Type>`` - An ECMAScript generator function that returns data of the given type
* ``Array<Type>`` - WebIDL ``sequence<T>``
* ``Dictionary<Type>`` - unordered set of name-value String-Type pairs with no duplicate names
* ``Type?`` - union of Type and the singleton type with value ``null`` (WebIDL nullable)
* ``(Type1 or Type2)`` - union of Type1 and Type2 (WebIDL union)
* ``any`` - union of all types (WebIDL ``any``)
Methods that return nothing (undefined, in JS) use the keyword "void"
instead of a type.
TODO(ianh): Define in detail how this actually works
Mojom IDL
---------
The Mojom IDL language is used to describe the APIs exposed over Mojo
pipes.
Mojom IDL definitions are typically compiled to wrappers in each
language, which are then used as imports.
TODO(ianh): Define in detail how this actually works