| OLD | NEW |
| (Empty) |
| 1 Sky IDL | |
| 2 ======= | |
| 3 | |
| 4 The Sky IDL language is used to describe JS APIs found in Sky, in | |
| 5 particular, the JS APIs exposed by the four magical imports defined in | |
| 6 this document. | |
| 7 | |
| 8 Sky IDL definitions are typically compiled to C++ that exposes the C++ | |
| 9 implementations of the APIs to JavaScript. | |
| 10 | |
| 11 Sky IDL works more or less the same as Web IDL but the syntax is a bit | |
| 12 different. | |
| 13 | |
| 14 ```javascript | |
| 15 module 'sky:modulename' { | |
| 16 | |
| 17 // this is a comment | |
| 18 | |
| 19 typedef NewType OldType; // useful when OldType is a commonly-used union | |
| 20 | |
| 21 callback CallbackName ReturnType (ArgumentType argumentName); | |
| 22 | |
| 23 class ClassName { | |
| 24 // a class corresponds to a JavaScript prototype | |
| 25 // corresponds to a WebIDL 'interface' | |
| 26 } | |
| 27 | |
| 28 abstract class Superclass { | |
| 29 // an abstract class can't have a non-abstract constructor | |
| 30 // an abstract class may have abstract constructors and methods | |
| 31 // an abstract class may have everything else a class can have | |
| 32 | |
| 33 abstract constructor (); | |
| 34 // this indicates that non-abstract subclasses must have a constructor wit
h the given arguments | |
| 35 | |
| 36 abstract ReturnType methodCallback(); | |
| 37 // this method does nothing, but is included to describe the interface tha
t subclasses will implement | |
| 38 // a non-abstract class must have an explicit implementation of all inheri
ted abstract methods | |
| 39 | |
| 40 } | |
| 41 | |
| 42 class Subclass : Superclass { | |
| 43 // properties | |
| 44 readonly attribute ReturnType attributeName; // getter | |
| 45 attribute ReturnType attributeName; // getter and setter | |
| 46 | |
| 47 // methods and constructors | |
| 48 constructor (); | |
| 49 ReturnType method(); | |
| 50 // When the platform calls this method, it always invokes the "real" metho
d, even if it's been | |
| 51 // deleted from the prototypes (as if it took a reference to the method at
startup, and stored | |
| 52 // state using Symbols) | |
| 53 // Calling a method with fewer arguments than defined will throw. | |
| 54 // Calling a method with more arguments ignores the extra arguments. | |
| 55 virtual ReturnType methodCallback(); | |
| 56 // when the platform calls this, it actually calls it the way JS would, so
author overrides do | |
| 57 // affect what gets called. Make sure if you override it that you call the
superclass implementation! | |
| 58 // The default implementations of 'virtual' methods all end by calling the
identically named method | |
| 59 // on the superclass, if there is such a method. | |
| 60 | |
| 61 // non-abstract classes cannot have abstract constructors or methods, and in
particular, must | |
| 62 // have explicit non-abstract versions of any inherited abstract constructor
s or methods | |
| 63 | |
| 64 // properties on the constructor | |
| 65 constructor readonly attribute ReturnType staticName; | |
| 66 | |
| 67 // private APIs - see below | |
| 68 private void method(); | |
| 69 | |
| 70 // arguments and overloading are done as follows | |
| 71 // note that the argument names are only for documentation purposes | |
| 72 ReturnType method(ArgumentType argumentName1, ArgumentType argumentName2); | |
| 73 // the last argument's type can have "..." appended to it to indicate a vara
rgs-like situation | |
| 74 ReturnType method(ArgumentType argumentName1, ArgumentType... allSubsequentA
rguments); | |
| 75 // trailing arguments can have a default value, which must be a literal of t
he given type | |
| 76 ReturnType method(ArgumentType argumentName1, ArgumentType argumentName2 = d
efaultValue); | |
| 77 } | |
| 78 | |
| 79 dictionary Options { | |
| 80 String foo; // if there's no default, the property must be specified or it's
a TypeError | |
| 81 Integer bar = 4; // properties can have default values | |
| 82 } | |
| 83 | |
| 84 // the module can have properties and methods also | |
| 85 attribute String Foo; | |
| 86 void method(); | |
| 87 | |
| 88 interface InterfaceName { | |
| 89 // describes a template of a prototype, in the same syntax as a class | |
| 90 // not actually exposed in the runtime | |
| 91 } | |
| 92 | |
| 93 } | |
| 94 ``` | |
| 95 | |
| 96 ### Private APIs ### | |
| 97 | |
| 98 Private APIs are only accessible via Symbol objects, which are then | |
| 99 exposed on the sky:debug module's exports object as the name of the | |
| 100 member given in the IDL. | |
| 101 | |
| 102 For example, consider: | |
| 103 | |
| 104 ```javascript | |
| 105 class Foo { | |
| 106 private void Bar(); | |
| 107 } | |
| 108 ``` | |
| 109 | |
| 110 In a script with a ``foo`` object of type ``Foo``, ``foo.Bar`` is | |
| 111 undefined. However, it can be obtained as follows: | |
| 112 | |
| 113 ```html | |
| 114 <import src="sky:debug" as="debug"/> | |
| 115 <!-- ... import whatever defines 'foo' ... --> | |
| 116 <script> | |
| 117 foo[debug.Bar] | |
| 118 </script> | |
| 119 ``` | |
| 120 | |
| 121 ### Types ### | |
| 122 | |
| 123 The following types are available: | |
| 124 | |
| 125 * ``Integer`` - WebIDL ``long long`` | |
| 126 * ``Float`` - WebIDL ``double`` | |
| 127 * ``Infinity`` - singleton type with value ``Infinity`` | |
| 128 * ``String`` - WebIDL ``USVString`` | |
| 129 * ``Boolean`` - WebIDL ``boolean`` | |
| 130 * ``Object`` - WebIDL ``object`` (``ClassName`` can be used as a literal for thi
s type) | |
| 131 * ``ClassName`` - an instance of the class ClassName | |
| 132 * ``Class<ClassName>`` - a class ClassName or one of its subclasses (not an inst
ance) | |
| 133 * ``DictionaryName`` - an instance of the dictionary DictionaryName | |
| 134 * ``Promise<Type>`` - WebIDL ``Promise<T>`` | |
| 135 * ``Generator<Type>`` - An ECMAScript generator function that returns data of th
e given type | |
| 136 * ``Array<Type>`` - WebIDL ``sequence<T>`` | |
| 137 * ``Dictionary<Type>`` - unordered set of name-value String-Type pairs with no d
uplicate names | |
| 138 * ``Type?`` - union of Type and the singleton type with value ``null`` (WebIDL n
ullable) | |
| 139 * ``(Type1 or Type2)`` - union of Type1 and Type2 (WebIDL union) | |
| 140 * ``any`` - union of all types (WebIDL ``any``) | |
| 141 | |
| 142 Methods that return nothing (undefined, in JS) use the keyword "void" | |
| 143 instead of a type. | |
| 144 | |
| 145 | |
| 146 TODO(ianh): Define in detail how this actually works | |
| 147 | |
| 148 | |
| 149 Mojom IDL | |
| 150 --------- | |
| 151 | |
| 152 The Mojom IDL language is used to describe the APIs exposed over Mojo | |
| 153 pipes. | |
| 154 | |
| 155 Mojom IDL definitions are typically compiled to wrappers in each | |
| 156 language, which are then used as imports. | |
| 157 | |
| 158 TODO(ianh): Define in detail how this actually works | |
| OLD | NEW |