- From: Domenic Denicola <notifications@github.com>
- Date: Thu, 07 Feb 2019 13:54:58 -0800
- To: heycam/webidl <webidl@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <heycam/webidl/pull/635/review/201334319@github.com>
domenic commented on this pull request.
> @@ -12349,12 +12363,54 @@ It is the responsibility of specifications using Web IDL to state
which global environment (or, by proxy, which global object) each platform
object is associated with.
+<div algorithm>
+ To create a <dfn export>new</dfn> object implementing the interface |interface| in the
+ Realm |realm|, with optional `new.target` value |newTarget|, perform the following steps:
I think we should not allow providing `new.target`. I cannot think of any specs that would use it.
> @@ -12349,12 +12363,60 @@ It is the responsibility of specifications using Web IDL to state
which global environment (or, by proxy, which global object) each platform
object is associated with.
+<div algorithm>
+ To <dfn export lt="new|create|create a new|create an object implementing|create an object
+ implementing the interface">create an object implementing the interface</dfn> |interface| in the
+ Realm |realm|, with optional `new.target` value |newTarget|, perform the following steps:
+
+ 1. Assert: |interface| is [=exposed=] in |realm|.
+ 1. Let prototype be the [=interface prototype object=] for |interface| in
+ |realm|.
+ 1. If |newTarget| is provided, then:
+ 1. Issue: If we just pass {{NewTarget}} through in a constructor, would this not
+ always be defined (sometimes to the [=interface object=] itself)?
If I am understanding @littledan correctly, +1. Inside a constructor "Create a new X" should implicitly grab the NewTarget that exists. Elsewhere, it should just be the X constructor. In neither case should the caller of "new" pass anything.
(In the future I think constructors would be nicer if Web IDL created the object for you, and constructor spec text elsewhere just operated on the created object using a known variable name like `this` or something. But, that's a bigger project, and maybe not worth the churn. For now we have to work with the world where all constructors say "create a new X" as their first step or so.)
>
1. Assert: |interface| is [=exposed=] in |realm|.
+ 1. Let prototype be the [=interface prototype object=] for |interface| in
+ |realm|.
+ 1. If |newTarget| is provided, then:
+ 1. Issue: If we just pass {{NewTarget}} through in a constructor, would this not
+ always be defined (sometimes to the [=interface object=] itself)?
+ 1. Let |newTargetPrototype| be [=?=] [$Get$](|newTarget|, "prototype").
Given the three-way divergence, and the extreme edge-casey nature of this `Reflect.construct` madness, I think it'll be pretty safe to pick one, write tests, and file bugs on everyone else. So I encourage us to pick Gecko. /cc @yuki3 @cdumez in case they want to weigh in, but IMO we shouldn't block.
Note that for custom elements we tried to copy ES more exactly: https://html.spec.whatwg.org/multipage/dom.html#html-element-constructors steps 7 and 8.
> + 1. If [$Type$](|newTargetPrototype|) is Object, then set |prototype| to
+ |newTargetPrototype|.
+ 1. Let |instance| be a newly created [=ECMAScript/object=] in |realm|.
+ 1. Set |instance|.\[[Prototype]] to |prototype|.
+ 1. Set |instance|'s essential internal methods to the definitions specified in
+ [=ECMA-262 Ordinary object internal methods and internal slots=].
+ 1. Let |interfaces| be the [=inclusive inherited interfaces=] of |interface|.
+ 1. [=list/iterate|For every=] [=interface=] |ancestor interface| in |interfaces|:
+ 1. [=Define the unforgeable regular operations=] of |ancestor interface| on |instance|,
+ given |realm|.
+ 1. [=Define the unforgeable regular attributes=] of |ancestor interface| on |instance|,
+ given |realm|.
+ 1. If |interface| is declared with the [{{Global}}] [=extended attribute=], then:
+ 1. [=Define the regular operations=] of |interface| on |instance|, given |realm|.
+ 1. [=Define the regular attributes=] of |interface| on |instance|, given |realm|.
+ 1. Set |instance|.\[[SetPrototypeOf]] as defined in [[#platform-object-setprototypeof]].
Oh, really sweet to make this imperative; great stuff.
> -as defined in [[#platform-object-setprototypeof]].
-
-Within a [=Realm=] |realm|,
-for each [=interface=] |interface| implemented by a [=platform object=] |obj|,
-the following steps must be run as part of |obj|'s creation:
-
-1. [=Define the unforgeable regular operations=] of |interface| on |obj|, given |realm|.
-1. [=Define the unforgeable regular attributes=] of |interface| on |obj|, given |realm|.
-
-If within a [=Realm=] |realm| a [=platform object=] |obj| implements
-an interface |interface| which is declared with the [{{Global}}] [=extended attribute=], then
-the following steps must be run as part of |obj|'s creation:
-
-1. [=Define the regular operations=] of |interface| on |obj|, given |realm|.
-1. [=Define the regular attributes=] of |interface| on |obj|, given |realm|.
-
Additionally, [=platform objects=] which implement an [=interface=]
which has a [{{Global}}] [=extended attribute=]
get properties declaratively from:
This can be deleted or rephrased too, I think.
> @@ -12349,12 +12363,60 @@ It is the responsibility of specifications using Web IDL to state
which global environment (or, by proxy, which global object) each platform
object is associated with.
+<div algorithm>
+ To <dfn export lt="new|create|create a new|create an object implementing|create an object
+ implementing the interface">create an object implementing the interface</dfn> |interface| in the
+ Realm |realm|, with optional `new.target` value |newTarget|, perform the following steps:
+
+ 1. Assert: |interface| is [=exposed=] in |realm|.
+ 1. Let prototype be the [=interface prototype object=] for |interface| in
+ |realm|.
+ 1. If |newTarget| is provided, then:
+ 1. Issue: If we just pass {{NewTarget}} through in a constructor, would this not
+ always be defined (sometimes to the [=interface object=] itself)?
I guess we should also make the Realm optional inside constructors; it should always be the current Realm, and asking people to figure that out is a recipe for badness.
> @@ -13327,7 +13363,7 @@ Each {{DOMException}} object has an associated <dfn for="DOMException">name</dfn
The <dfn constructor for="DOMException"><code>DOMException(|message|, |name|)</code></dfn>
constructor, when invoked, must run these steps:
-1. Let |e| be a new {{DOMException}} object.
+1. Let |e| be a [=new=] {{DOMException}} object in {{NewTarget}}'s Realm, with {{NewTarget}}.
It should be the current Realm, not NewTarget's realm. (But, see my comment above about making it optional.)
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/heycam/webidl/pull/635#pullrequestreview-201334319
Received on Thursday, 7 February 2019 21:55:23 UTC