- From: Hayato Ito <notifications@github.com>
- Date: Mon, 06 Jul 2015 00:40:19 -0700
- To: w3c/webcomponents <webcomponents@noreply.github.com>
- Message-ID: <w3c/webcomponents/issues/211@github.com>
Title: [Custom]: What should be the name of the generated constructor returned by registerElement? (bugzilla: 25830)
Migrated from: https://www.w3.org/Bugs/Public/show_bug.cgi?id=25830
----
comment: 0
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=25830#c0
*johnjbarton* wrote on 2014-05-20 15:54:42 +0000.
Two parts of the definition of Custom Elements conflict:
http://w3c.github.io/webcomponents/spec/custom/#dfn-custom-element-type
"The custom element type identifies a custom element interface and is a sequence of characters that must match the NCName production, must contain a U+002D HYPHEN-MINUS character, and must not contain any uppercase ASCII letters."
http://w3c.github.io/webcomponents/spec/custom/#dfn-custom-element-constructor
"All custom elements must be constructable with a function object, called custom element constructor. "
A name defined as containing a dash cannot be parsed as a function name in JavaScript. Consequently the two definitions above prevent mocking of Custom Elements in a way fully compatible with the standard.
----
comment: 1
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=25830#c1
*Dimitri Glazkov* wrote on 2014-05-20 16:51:48 +0000.
(In reply to johnjbarton from comment #0)
> Two parts of the definition of Custom Elements conflict:
>
> http://w3c.github.io/webcomponents/spec/custom/#dfn-custom-element-type
> "The custom element type identifies a custom element interface and is a
> sequence of characters that must match the NCName production, must contain a
> U+002D HYPHEN-MINUS character, and must not contain any uppercase ASCII
> letters."
>
> http://w3c.github.io/webcomponents/spec/custom/#dfn-custom-element-
> constructor
> "All custom elements must be constructable with a function object, called
> custom element constructor. "
>
> A name defined as containing a dash cannot be parsed as a function name in
> JavaScript. Consequently the two definitions above prevent mocking of Custom
> Elements in a way fully compatible with the standard.
\<_< ... Is the problem with the meaning of the word "identifies"? Where is the custom element type parsed into a function name in the spec?
----
comment: 2
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=25830#c2
*johnjbarton* wrote on 2014-05-20 17:00:14 +0000.
This issue arose when mocking or faking Custom Elements. I needed to create a representation for the constructor function returned by document.registerElement(). It's not currently possible because registerElement() requires a function name identifier that is invalid in JavaScript. That seems unfortunate given the focus on JavaScript for the API.
----
comment: 3
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=25830#c3
*Dimitri Glazkov* wrote on 2014-05-20 17:03:11 +0000.
(In reply to johnjbarton from comment #2)
> This issue arose when mocking or faking Custom Elements. I needed to create
> a representation for the constructor function returned by
> document.registerElement(). It's not currently possible because
> registerElement() requires a function name identifier that is invalid in
> JavaScript. That seems unfortunate given the focus on JavaScript for the
> API.
Can you help me understand where in the spec the custom element type and function name are connected? They should be two separate concepts that are associated together in a definition via the process of registration.
----
comment: 4
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=25830#c4
*johnjbarton* wrote on 2014-05-20 17:31:48 +0000.
Yes, the type name is passed in to registerElement():
---
partial interface Document {
Function registerElement(DOMString type, optional ElementRegistrationOptions options);
};
---
and a Function is returned. The 'name' property of the returned function object will be a string matching 'type'.
The section on es6
http://w3c.github.io/webcomponents/spec/custom/#es6
has a different API and here it seems even more problematic:
---
The steps run when calling registerElement will change to:
Input
DOCUMENT, method's context object, a document
TYPE, the custom element type of the element being registered
FUNCTION, the custom element constructor, optional
---
The 'custom element constructor' is
http://w3c.github.io/webcomponents/spec/custom/#dfn-custom-element-constructor
which says in part
---
Let CONSTRUCTOR be the interface object whose interface prototype object is PROTOTYPE and when called as a constructor, executes these steps:
Let ELEMENT be the context object
Let TYPE be the custom element type in DEFINITION
Let NAME be the local name in DEFINITION
---
I don't see how one can supply the constructor function required by this API through ordinary JS code.
To be sure I am not able to see exactly where the standard connects the "local name" with the TYPE. Experimentally you can see the connection in Chrome by typing into devtools console:
document.registerElement('x-foo')
gives
function x-foo() { [native code] }
----
comment: 5
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=25830#c5
*Dimitri Glazkov* wrote on 2014-05-20 17:37:20 +0000.
(In reply to johnjbarton from comment #4)
> Yes, the type name is passed in to registerElement():
> ---
> partial interface Document {
> Function registerElement(DOMString type, optional
> ElementRegistrationOptions options);
> };
> ---
> and a Function is returned. The 'name' property of the returned function
> object will be a string matching 'type'.
Well, no, that's not specified anywhere.
>
>
> The section on es6
> http://w3c.github.io/webcomponents/spec/custom/#es6
> has a different API and here it seems even more problematic:
> ---
> The steps run when calling registerElement will change to:
>
> Input
> DOCUMENT, method's context object, a document
> TYPE, the custom element type of the element being registered
> FUNCTION, the custom element constructor, optional
> ---
> The 'custom element constructor' is
> http://w3c.github.io/webcomponents/spec/custom/#dfn-custom-element-
> constructor
> which says in part
> ---
> Let CONSTRUCTOR be the interface object whose interface prototype object is
> PROTOTYPE and when called as a constructor, executes these steps:
> Let ELEMENT be the context object
> Let TYPE be the custom element type in DEFINITION
> Let NAME be the local name in DEFINITION
> ---
> I don't see how one can supply the constructor function required by this API
> through ordinary JS code.
No, you're just not reading the rest of the monkey-patching of the spec down below. The meaning of custom element constructor will change for ES6.
>
> To be sure I am not able to see exactly where the standard connects the
> "local name" with the TYPE. Experimentally you can see the connection in
> Chrome by typing into devtools console:
>
> document.registerElement('x-foo')
> gives
> function x-foo() { [native code] }
This just seems like a bug in Chrome. It's not anything that spec describes.
----
comment: 6
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=25830#c6
*Dimitri Glazkov* wrote on 2014-05-20 17:42:41 +0000.
Filed https://code.google.com/p/chromium/issues/detail?id=375357
----
comment: 7
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=25830#c7
*johnjbarton* wrote on 2014-05-20 17:46:02 +0000.
What value does the spec say the constructor function name should have?
----
comment: 8
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=25830#c8
*Dimitri Glazkov* wrote on 2014-05-20 17:48:12 +0000.
(In reply to johnjbarton from comment #7)
> What value does the spec say the constructor function name should have?
Now, that's a good question. Can it be anonymous function?
----
comment: 9
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=25830#c9
*johnjbarton* wrote on 2014-05-20 17:57:48 +0000.
Yes seems like anonymous is fine:
>function fakeRegisterElement() { return function() { console.log('born'); } }
undefined
>var xFoo = fakeRegisterElement()
undefined
> new xFoo
born VM2040:2
Object {}
----
comment: 10
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=25830#c10
*Erik Arvidsson* wrote on 2014-05-20 17:59:35 +0000.
Anonymous sounds reasonable to me. The name should be "".
var f = function() {};
console.log(f.name); // ""
----
comment: 11
comment_url: https://www.w3.org/Bugs/Public/show_bug.cgi?id=25830#c11
*Dominic Cooney* wrote on 2014-05-22 02:04:24 +0000.
Blink implementor feedback:
Blink names the function after the Custom Element name. My thinking was it is helpful for the developer to have a hint about what the function relates to when playing with it interactively. It is not a valid JavaScript identifier, although for that matter [native code] is not a valid function body; I'm not sure what spec requires these names to be valid.
>From this bug and feedback from our test suite submission authors apparently people expect the spec to have a requirement for this.
I think it will not be a problem for Blink to implement a different name.
---
Reply to this email directly or view it on GitHub:
https://github.com/w3c/webcomponents/issues/211
Received on Monday, 6 July 2015 07:41:13 UTC