| Index: sky/specs/modules.md
|
| diff --git a/sky/specs/modules.md b/sky/specs/modules.md
|
| index 033edd74559e4a3c287a37e151445bfa5c1ff376..7cdf70dec5d7593f6eeb6978d606fae1082ad518 100644
|
| --- a/sky/specs/modules.md
|
| +++ b/sky/specs/modules.md
|
| @@ -50,6 +50,24 @@ an element to the importee's element registry.
|
| ### IDL ###
|
|
|
| ```javascript
|
| +dictionary InternalElementOptions {
|
| + String tagName;
|
| + Boolean shadow = false;
|
| + Object prototype = Element;
|
| +}
|
| +interface InternalElementConstructorWithoutShadow {
|
| + constructor (Module module);
|
| + attribute String tagName;
|
| +}
|
| +interface InternalElementConstructorWithShadow {
|
| + constructor (Module module);
|
| + attribute String tagName;
|
| + attribute Boolean shadow;
|
| +}
|
| +typedef ElementRegistrationOptions (InternalElementOptions or
|
| + InternalElementConstructorWithoutShadow or
|
| + InternalElementConstructorWithShadow);
|
| +
|
| abstract class AbstractModule : EventTarget {
|
| readonly attribute Document document; // O(1) // the Documentof the module or application
|
| Promise<any> import(String url); // O(Yikes) // returns the module's exports
|
| @@ -57,23 +75,37 @@ abstract class AbstractModule : EventTarget {
|
|
|
| readonly attribute String url;
|
|
|
| - ElementConstructor registerElement(ElementRegistration options); // O(1)
|
| + ElementConstructor registerElement(Object options); // O(1)
|
| // if you call registerElement() with an object that was created by
|
| // registerElement(), it just returns the object after registering it,
|
| // rather than creating a new constructor
|
| // otherwise, it proceeds as follows:
|
| - // 1. let constructor be the constructor passed in, if any
|
| - // 2. let prototype be the constructor's prototype; if there is no
|
| - // constructor, let prototype be Element
|
| - // 3. create a new Function that:
|
| - // 1. throws if not called as a constructor
|
| - // 2. creates an actual Element object
|
| - // 3. initialises the shadow tree if shadow on the options is true
|
| - // 4. calls constructor, if it's not null, with the module as the argument
|
| - // 4. let that new Function's prototype be the aforementioned prototype
|
| - // 5. let that new Function have tagName and shadow properties set to
|
| - // the values passed in on options
|
| - // 6. register the new element
|
| + // - if options is a Function (i.e. it is either an
|
| + // InternalElementConstructorWithoutShadow object or an
|
| + // InternalElementConstructorWithShadow object), then let
|
| + // constructor be that function, and let prototype be that
|
| + // functions's prototype; otherwise, let constructor be a no-op
|
| + // function and let prototype be the prototype property of the
|
| + // object passed in (the InternalElementOptions; prototype
|
| + // defaults to Element).
|
| + // - let shadow be option's shadow property's value coerced to a
|
| + // boolean, if the property is present, or else the value false.
|
| + // - let shadow be option's tagName property's value.
|
| + // - create a new Function that:
|
| + // - throws if not called as a constructor
|
| + // - creates an actual element object (the C++-backed object)
|
| + // - initialises the shadow tree if shadow on the options is
|
| + // true
|
| + // - calls constructor, if it's not null, with the module as
|
| + // the argument
|
| + // - is marked as created by registerElement() so that it can
|
| + // be recognised if used as an argument to registerElement()
|
| + // - let that new Function's prototype be the aforementioned prototype
|
| + // - let that new Function have tagName and shadow properties set to
|
| + // the aforementioned tagName and shadow
|
| + // - register the new tagName with this constructor
|
| + // - return the new Function (which is, not coincidentally, an
|
| + // InternalElementConstructorWithShadow)
|
|
|
| readonly attribute ScriptElement? currentScript; // O(1) // returns the <script> element currently being executed if any, and if it's in this module; else null
|
| }
|
|
|