- From: Rick Waldron <waldron.rick@gmail.com>
- Date: Fri, 12 Apr 2013 18:51:16 -0400
- To: Dimitri Glazkov <dglazkov@google.com>
- Cc: Allen Wirfs-Brock <allen@wirfs-brock.com>, Daniel Buchner <daniel@mozilla.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: <CAHfnhfqomymHmmUFxZHztPJnZKsTBG6rnsYbGZS+pAhO9wosBQ@mail.gmail.com>
On Fri, Apr 12, 2013 at 6:20 PM, Dimitri Glazkov <dglazkov@google.com>wrote: > 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? > > Generated constructor is an unfortunate side effect of platform > constraints. Here's a nice summary: > http://lists.w3.org/Archives/Public/public-webapps/2013JanMar/0728.html. > > We'll have to live with them if we want to make progress in foreseeable > future. > > > 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_ > > Basically, <element> relies on the constructor already being already > set on the global object. Did I get this right? > > It's straightforward, but I have a couple of concerns: > > 1) there was discussion very early on about allowing custom elements > polluting the global namespace. For example, peeps may want to define > Toolkit.UI.Flinger directly. > In that case, use JJB's suggestion and provide a constructor attribute: <element name="foo" constructor="Toolkit.UI.Flinger"> <template></template> [ <script> // assumes that Toolkit.UI is in scope, otherwise this will throw a reference error Toolkit.UI.Flinger = function() { // initialize flingable thingers } </script> ] </element> Of course... that can also be in a remote script src: Toolkit = { UI: { Flinger: function() { // initialize flingable thingers } } }; > 2) since we do have to live with generated constructors -- at least > for a little while, we have two decoupled operations: > > a) create prototype > b) generate constructor. > How would they be synchronized? In other words, in your example, when > FooBar is defined, the constructor hasn't been generated yet. I guess > <element> could just stomp over it. > I'm not following you here... I might be mistaken, but I think we have a terminology mix-up: FooBar (ie. class FooBar {} ) is the constructor, nothing to generate, but I don't quite know what step you're referring to when you say "the constructor hasn't been generated yet". :\ > > > > > > Please don't trivialize valid concerns—it wasn't just John and I, Erik > and > > Allen echo'ed the same. > > Wouldn't have ever thought of it. Poking lighthearted fun--maybe. > Trivializing--never! :) > Fair enough ;) > > :DG< >
Received on Friday, 12 April 2013 22:52:04 UTC