- From: Hayato Ito <notifications@github.com>
- Date: Mon, 06 Jul 2015 00:40:26 -0700
- To: w3c/webcomponents <webcomponents@noreply.github.com>
- Message-ID: <w3c/webcomponents/issues/214@github.com>
Title: [Custom]: A tag name should be associated with the constructor and not the prototype (bugzilla: 24020)
Migrated from: https://www.w3.org/Bugs/Public/show_bug.cgi?id=24020
----
comment: 0
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=24020#c0
*Erik Arvidsson* wrote on 2013-12-06 15:58:32 +0000.
Given how WebIdl works with interfaces that are realized as ES constructor functions with a prototype we should associate the tag name with a function and not the prototype.
class MyElement extends HTMLElement {}
associate('my-element, MyElement)
When an element is created for 'my-element' we find the registered Function and call its @@create-(this-is-inserted-to-avoid-notification-in-migration). Here is how HTMLElement @@create-(this-is-inserted-to-avoid-notification-in-migration) is implemented.
var constructorToNameMap = new WeakMap();
function associate(name, constr) {
constructorToNameMap.set(constr, name);
}
HTMLElement[Symbol.create] = function() {
var name = constructorToNameMap.get(this);
if (!name)
throw new TypeError('Illegal constructor');
// $Internal_createElementWithName(name);
return document.createElement(name);
};
The common case is that people do not override @@create-(this-is-inserted-to-avoid-notification-in-migration) so we do not need to run any user code to create an instance. When the user does a `new MyElement` we do run the constructor, just like for all other js constructors.
----
comment: 1
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=24020#c1
*Dominic Cooney* wrote on 2013-12-08 00:32:29 +0000.
I think this should be addressed in Level 2 of the Custom Elements spec, or in a related spec. Chrome is not in a position to implement this now.
The current implementation in Chrome associates the registered element name with the generated constructor. This is effectively the same data as the constructorToNameMap. So I think Chrome would have no problem implementing requirements based on your proposal.
I do not think the specification needs to be as literal as the JavaScript you have provided here, but it is a good informative sketch.
I think that the requirement that registering a Custom Element with a prototype that is an interface prototype object should be relaxed to allow multiple element names to share a prototype as is the case with built-in elements like HTMLHeadingElement, etc. Perhaps misuse of a built-in interface prototype object should be disallowed, however Chrome would not have a problem with a completely laissez-faire approach.
Relaxing the interface prototype object restriction would be a forward-compatible change because it makes errors into non-errors.
----
comment: 2
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=24020#c2
*Dimitri Glazkov* wrote on 2014-05-12 22:08:11 +0000.
I am trying to work out what is the significance of storing constructor, rather than prototype in custom element definition. Can you help me understand that?
----
comment: 3
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=24020#c3
*Erik Arvidsson* wrote on 2014-05-13 13:56:04 +0000.
I think this is mostly conceptual since we are locking down the prototype and constructor properties so we can go back and forth as needed.
However, ES/WebIDL works with Functions and ES6 has meta operations for creating new objects from a constructor, not from its prototype (since the prototype does not have any relevance to how the instance is created).
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-createfromconstructor
----
comment: 4
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=24020#c4
*Dimitri Glazkov* wrote on 2014-05-13 14:22:28 +0000.
(In reply to Erik Arvidsson from comment #3)
> I think this is mostly conceptual since we are locking down the prototype
> and constructor properties so we can go back and forth as needed.
>
> However, ES/WebIDL works with Functions and ES6 has meta operations for
> creating new objects from a constructor, not from its prototype (since the
> prototype does not have any relevance to how the instance is created).
>
> http://people.mozilla.org/~jorendorff/es6-draft.html#sec-
> createfromconstructor
Ah! That makes sense. I will leave the bug open and block it on bug 25669.
---
Reply to this email directly or view it on GitHub:
https://github.com/w3c/webcomponents/issues/214
Received on Monday, 6 July 2015 07:41:14 UTC