- From: Daniel Buchner <daniel@mozilla.com>
- Date: Fri, 12 Apr 2013 14:02:00 -0700
- To: Rick Waldron <waldron.rick@gmail.com>
- Cc: Dimitri Glazkov <dglazkov@google.com>, Allen Wirfs-Brock <allen@wirfs-brock.com>, John J Barton <johnjbarton@johnjbarton.com>, Scott Miles <sjmiles@google.com>, Rafael Weinstein <rafaelw@google.com>, public-webapps <public-webapps@w3.org>, Blake Kaplan <mrbkap@mozilla.com>, William Chen <wchen@mozilla.com>, Jonas Sicking <jonas@sicking.cc>, Steve Orvell <sorvell@google.com>, Dave Herman <dherman@mozilla.com>, Boris Zbarsky <bzbarsky@mit.edu>
- Message-ID: <CAHZ6zJF4KdOs=wUu8udF8VBK1cdaJj3GU0S92O7Sb8J=7enHWw@mail.gmail.com>
Dimitri, Web-Component-Companions, Is it possible to create an HTMLElement-inheriting object for the custom element in question in a defined way when the parser hits the <element> tag, so that the developer can just refer to the object within the <script> tag? Here's what I mean: <element tagname="x-foo"> <template>...</template> <script> HTMLXFooElement.prototype.bar = function(){...} HTMLXFooElement.prototype.readyCallback = function(){...} </script> </element> Benefits: - The script tag need only execute once to define the prototype - No new scoping behavior or attributes are needed for the script tag - Allows developers to extend the prototype of their custom element as they normally would any other script block - All code that needs to run when an instance of the custom element is created, happens in the callbacks - as expected/intended. Requirements: - We would need to specify the HTMLElement-inherited object name, but this seems just fine. I would envision the specification sounding something like this: "Global element object names shall be generated using the declared tag name. The name shall start with 'HTML', followed by a camel cased version of the user-declared tag name (x-foo --> XFoo), with 'Element' appended" - The newly generated global element object name would need to be inserted into the global scope prior to parsing script tags within the <element> tag. Thoughts? Daniel J. Buchner Product Manager, Developer Ecosystem Mozilla Corporation On Fri, Apr 12, 2013 at 1:25 PM, Rick Waldron <waldron.rick@gmail.com>wrote: > > > > On Fri, Apr 12, 2013 at 3:30 PM, Dimitri Glazkov <dglazkov@google.com>wrote: > >> ... or "How the heck do we initialize custom elements in declarative >> syntax?" >> >> There were good questions raised about the nature of <script> element >> in the "platonic form" thread. Consider this syntax: >> >> <element name="foo-bar"> >> <script> ...</script> >> <template> ... </template> >> </element> >> >> The way <element> should work is like this: >> a) when </element> is seen >> b) generate a constructor for this element >> > > Based on what? Is this more magic? What if a constructor is provided? > > Here are a few use case, followed by a proposed set of semantics: > > > Given the following custom element: > > <element name="foo-bar"> > <template></template> > [ > <script> > class FooBar {} > </script> > ] > </element> > > The braces are used to illustrate that the script tag is optional, so it > might also look like: > > <element name="foo-bar"> > <template></template> > </element> > > > OR > <!-- elsewhere in the document --> > <script> > class FooBar {} > </script> > > OR > (in a remote src file) > class FooBar {} > > OR > (in a module) > module CustomElements { > export class FooBar {} > } > > (that's later imported) > import { FooBar } from "CustomElements"; > > > > (None of the following is precise, just a basic idea that works with every > example I've given above) > > > Script tags inside <element> are treated the same way as any script tag in > an HTML document would be treated. > > > [[ConvertName]] is an imaginary operation the does the following: > Let _converted_ be the result of > 1. replacing the first character of argument _val_ with same character > converted to ASCII uppercase > 2. replacing each U+002D (HYPHEN-MINUS character '-') that is followed > by a lowercase ASCII letter, by removing the U+002D and converting the > lowercase letter that followed with the same uppercase ASCII character. > Return _converted_. > > > For each <element> > Parse <template> (I don't know what happens here, so just play along) > Let _val_ be the value of the **name** attribute of <element> > Let _name_ be the result of calling [[ConvertName]] with the argument > _val_ > Let _ctor_ be the result of calling Get([[Global]], _name_) > If _ctor_ is undefined > - Create a new class whose Identifier is _name_ which extends from > HTMLElement > (This is just an assumption, replace with whatever makes the most > sense) > Call document.register with arguments _val_ and _ctor_ > > > >> b) run document.register >> c) run initialization code >> >> As I see it, the problem is twofold: >> >> 1) The <script> element timing is weird. Since <script> is >> initialization code, it has to run after the </element> is seen. This >> is already contrary to a typical <script> element expectations. >> >> 2) The <script> element needs a way to refer to the custom element >> prototype it is initializing. Enclosing it in a function and calling >> it with <element> as |this| seemed like a simplest thing to do, but >> Rick and John had allergic reactions and had to be hospitalized. >> > > Please don't trivialize valid concerns—it wasn't just John and I, Erik and > Allen echo'ed the same. > > >> >> So far, I haven't seen any other workable alternatives. TC39 peeps and >> others, help me find them. >> > > see above. > > >> >> :DG< >> > > > Rick > >
Received on Friday, 12 April 2013 21:03:02 UTC