-
Notifications
You must be signed in to change notification settings - Fork 166
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Define that interface objects are constructors #698
Comments
This is the key, no? https://heycam.github.io/webidl/#Constructor specifies otherwise:
So I think we're good here: thing with a |
Though I guess that leaves open the question of the no- |
I guess you could do something where you use a DOM interface object as the |
And also whether a proxy for a DOM interface object ends up with a construct trap being called. So simple testcase:
|
On that testcase, Chrome and Firefox log "constructing"; Safari does not (and the exception it throws is about But OK, if we want to spec Chrome/Firefox behavior here then we need to change something in the idl spec. |
And admittedly it would be good if the "is a constructor" bit was near the bit that defines the steps, not way off somewhere else... |
I've always assumed they had constructors (and [[Construct]] methods), just throwing ones. I think it'd be very strange to have callable interface objects exist at all, and be reachable via the In practice it doesn't matter much, but I do prefer keeping [[Construct]] and just saying that it throws for things without a constructor in the IDL. |
There was an interesting question about feature detection that was raised the other day: how to detect a change from "no [Constructor]" to "no-arg [Constructor]". Right now, I think "call the constructor and see if it throws" is the only way in Firefox and Chrome. The Proxy thing above could be used if we changed whether [[Construct]] happens... But maybe this is enough of an edge case that it's not an issue. @rniwa would Safari be open to changing its behavior here, or do you know whom I should be asking about it? |
What's the benefit of implementing Chrome/Firefox behavior here? |
FWIW, it seems there’s a number of ways to observe this distinction beyond just Proxy — pretty much anywhere IsConstructor is used, I guess. In addition to peeking out through various programmatic APIs, it can also impact evaluation of ‘bare’ syntax (third example below). Each of the following statements will throw a TypeError if Reflect.construct(Bar, [], Foo);
customElements.define('x-x', Foo);
class Bar extends Foo {} Usually it’s throw vs don’t throw, but sometimes potentially neither throws but they still do other different things: // If Foo[[Construct]] is present, (attempts) returning new Foo.
// If Foo[[Construct]] is absent, returns new Array.
Array.from.call(Foo, []);
// In practice here, the first case throws for the specific Web IDL issue under discussion,
// though it’s the reverse of the other cases (i.e. throw when [[Construct]] _is_ present).
I agree. |
This behavior was changed in |
Thanks @shvaikalesh! Do you know if there are web platform tests for this? I looked into how we would update the Web IDL spec to be explicit about this, and it's still kinda unclear to me, largely because the ES spec is unclear. I will open an issue on tc39/ecma262 asking for guidance. |
There are tests asserting that
|
…=testonly Automatic update from web-platform-tests Test IsConstructor for all interfaces Part of whatwg/webidl#698. -- wpt-commits: 943bb28f67e315fbc16a203479ffbadd27b7e0ba wpt-pr: 28089
ES claims the following (twice):
We don't normatively identify the interface object as a constructor, even if it has a
[Constructor]
. I guess we should.A less obvious question is what we should do if there's no
[Constructor]
. Right now, I think we're aiming to install a [[Construct]] internal method that always throws, but that makes the interface object pass IsConstructor().The text was updated successfully, but these errors were encountered: