Skip to content
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

Open
Ms2ger opened this issue Mar 26, 2019 · 9 comments

Comments

@Ms2ger
Copy link
Collaborator

commented Mar 26, 2019

ES claims the following (twice):

Built-in function objects that are not identified as constructors do not implement the [[Construct]] internal method unless otherwise specified in the description of a particular function.

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().

@bzbarsky

This comment has been minimized.

Copy link
Collaborator

commented Mar 26, 2019

unless otherwise specified in the description of a particular function

This is the key, no? https://heycam.github.io/webidl/#Constructor specifies otherwise:

If the [Constructor] extended attribute appears on an interface, it indicates that the interface object for this interface will have an [[Construct]] internal method

So I think we're good here: thing with a [Constructor] have [[Construct]] and things without do not, as desired.

@bzbarsky

This comment has been minimized.

Copy link
Collaborator

commented Mar 26, 2019

Though I guess that leaves open the question of the no-[Constructor] case. I just checked Gecko, and it does have a [[Constructor]] in that case, albeit one that always throws. I wonder whether the output of IsConstructor() is observable, other than by the exceptions that get thrown.

@bzbarsky

This comment has been minimized.

Copy link
Collaborator

commented Mar 26, 2019

I guess you could do something where you use a DOM interface object as the .constructor of an array and see what happens in https://tc39.github.io/ecma262/#sec-arrayspeciescreate step 6.

@bzbarsky

This comment has been minimized.

Copy link
Collaborator

commented Mar 26, 2019

And also whether a proxy for a DOM interface object ends up with a construct trap being called. So simple testcase:

<script>
  var p = new Proxy(Node, { construct: () => console.log("constructing") });
  new p()
</script>
@bzbarsky

This comment has been minimized.

Copy link
Collaborator

commented Mar 26, 2019

On that testcase, Chrome and Firefox log "constructing"; Safari does not (and the exception it throws is about p not being a constructor). Yay interop. ;)

But OK, if we want to spec Chrome/Firefox behavior here then we need to change something in the idl spec.

@bzbarsky

This comment has been minimized.

Copy link
Collaborator

commented Mar 26, 2019

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...

@domenic

This comment has been minimized.

Copy link
Collaborator

commented Apr 3, 2019

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 .constructor property, if they are not also [[Construct]]able.

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.

@bzbarsky

This comment has been minimized.

Copy link
Collaborator

commented Apr 3, 2019

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?

@rniwa

This comment has been minimized.

Copy link

commented Apr 3, 2019

What's the benefit of implementing Chrome/Firefox behavior here?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
4 participants
You can’t perform that action at this time.