Re: [webcomponents]: Changing API from constructable ShadowRoot to factory-like

2012-12-03 Thread Alex Russell
Sorry for the late response.

Adding more "create*" methods feels like a bug. I understand that there are
a couple of concerns/arguments here:

   - Current implementations that aren't self-hosting are going to have
   trouble with the idea of unattached ("floating") ShadowRoot instances
   - As a result, the mental model implementers seem to have is that "new
   ShadowRoot(element)" has side-effects *on the element*, and that pretty
   clearly feels wrong. A future when re-attaching a ShadowRoot to a different
   element solves this (root.attach(element)?), but it's not planned for now.
   - "new" may lead to errors when a ShadowRoot instance is allocated out
   of one window and an element to attach to is from another. The general DOM
   solution of "allocate out of the element's ownerDocument window" feels
   right here, but isn't elegant in some corner cases.

So while I still favor something like "new ShadowRoot().attach(element)" or
"new ShadowRoot(element)", I think I can live with the create*() version
for now.

I would like for us to support one of the forward-looking versions,
however, if only in a known-limited form.


On Tue, Nov 20, 2012 at 12:08 AM, Dimitri Glazkov wrote:

> I made the change to the editor's draft:
> http://dvcs.w3.org/hg/webcomponents/rev/e0dfe2ac8104
>
> You can read the shiny new parts of the spec here:
>
> http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-element
>
> Please let me know if I goofed up something, preferably by filing bugs :)
>
> :DG<
>
>


Re: [webcomponents]: Changing API from constructable ShadowRoot to factory-like

2012-11-19 Thread Dimitri Glazkov
I made the change to the editor's draft:
http://dvcs.w3.org/hg/webcomponents/rev/e0dfe2ac8104

You can read the shiny new parts of the spec here:
http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-element

Please let me know if I goofed up something, preferably by filing bugs :)

:DG<



Re: [webcomponents]: Changing API from constructable ShadowRoot to factory-like

2012-11-09 Thread Elliott Sprehn
Sounds good to me. :)



On Fri, Nov 9, 2012 at 12:30 PM, Maciej Stachowiak  wrote:

>
> I think a factory function is better here for the reasons Dimitri stated.
> But I also agree that an addFoo function returning a new object seems
> strange. I think that createShadowRoot may be better than either option.
>
>  - Maciej
>
> On Nov 8, 2012, at 11:42 AM, Erik Arvidsson  wrote:
>
> > addShadowRoot seem wrong to me to. Usually add* methods takes an
> > argument of something that is supposed to be added to the context
> > object.
> >
> > If we are going with a factory function I think that createShadowRoot
> > is the right name even though create methods have a lot of bad history
> > in the DOM APIs.
> >
> > On Thu, Nov 8, 2012 at 1:01 PM, Elliott Sprehn 
> wrote:
> >> True, though that's actually one character longer, probably two with
> normal
> >> formatting ;P
> >>
> >> new ShadowRoot(element,{
> >> element.addShadowRoot({
> >>
> >> I'm more concerned about the constructor with irreversible side effects
> of
> >> course.
> >>
> >> - E
> >>
> >>
> >> On Thu, Nov 8, 2012 at 9:57 AM, Dimitri Glazkov 
> wrote:
> >>>
> >>> That _is_ pretty nice, but we can add this as a second argument to the
> >>> constructor, as well:
> >>>
> >>> root = new ShadowRoot(element, {
> >>>  applyAuthorSheets: false,
> >>>  resetStyleInheritance: true
> >>> });
> >>>
> >>> At this point, the stakes are primarily in aesthetics... Which makes
> >>> the whole question so much more difficult to address objectively.
> >>>
> >>> :DG<
> >>>
> >>> On Thu, Nov 8, 2012 at 9:54 AM, Elliott Sprehn 
> wrote:
>  The real sugar I think is in the dictionary version of addShadowRoot:
> 
>  root = element.addShadowRoot({
>   applyAuthorSheets: false,
>   resetStyleInheritance: true
>  })
> 
> 
>  On Thu, Nov 8, 2012 at 9:49 AM, Dimitri Glazkov 
>  wrote:
> >
> > Sure. Here's a simple example without getting into traversable shadow
> > trees (those are still being discussed in a different thread):
> >
> > A1) Using constructable ShadowRoot:
> >
> > var element = document.querySelector('div#foo');
> > // let's add a shadow root to element
> > var shadowRoot = new ShadowRoot(element);
> > // do work with it..
> > shadowRoot.applyAuthorSheets = false;
> > shadowRoot.appendChild(myDocumentFragment);
> >
> > A2) Using addShadowRoot:
> >
> > var element = document.querySelector('div#foo');
> > // let's add a shadow root to element
> > var shadowRoot = element.addShadowRoot();
> > // do work with it..
> > shadowRoot.applyAuthorSheets = false;
> > shadowRoot.appendChild(myDocumentFragment);
> >
> > Now with traversable shadow trees:
> >
> > B1) Using constructable ShadowRoot:
> >
> > var element = document.querySelector('div#foo');
> > alert(element.shadowRoot); // null
> > var root = new ShadowRoot(element);
> > alert(root === element.shadowRoot); // true
> > var root2 = new ShadowRoot(element);
> > alert(root === element.shadowRoot); // false
> > alert(root2 === element.shadowRoot); // true
> >
> > B2) Using addShadowRoot:
> >
> > var element = document.querySelector('div#foo');
> > alert(element.shadowRoot); // null
> > var root = element.addShadowRoot();
> > alert(root === element.shadowRoot); // true
> > var root2 = element.addShadowRoot();
> > alert(root === element.shadowRoot); // false
> > alert(root2 === element.shadowRoot); // true
> >
> > :DG<
> >
> > On Thu, Nov 8, 2012 at 9:42 AM, Maciej Stachowiak 
> > wrote:
> >>
> >> Could you please provide equivalent code examples using both
> >> versions?
> >>
> >> Cheers,
> >> Maciej
> >>
> >> On Nov 7, 2012, at 10:36 AM, Dimitri Glazkov 
> >> wrote:
> >>
> >>> Folks,
> >>>
> >>> Throughout the year-long (whoa!) history of the Shadow DOM spec,
> >>> various people commented on how odd the constructable ShadowRoot
> >>> pattern was:
> >>>
> >>> var root = new ShadowRoot(host); // both creates an instance *and*
> >>> makes an association between this instance and host.
> >>>
> >>> People (I cc'd most of them) noted various quirks, from the
> >>> side-effectey constructor to relatively uncommon style of the API.
> >>>
> >>> I once was of the strong opinion that having a nice, constructable
> >>> object has better ergonomics and would overcome the mentioned code
> >>> smells.
> >>>
> >>> But... As we're discussing traversable shadows and the possibility
> >>> of
> >>> having Element.shadowRoot, the idea of changing to a factory
> pattern
> >>> now looks more appealing:
> >>>
> >>> var element = document.querySelector('div#foo');
> >>> alert(element.shadowRoot); // null
> >>> var root = element.addShadowRoot({ resetStyleInheritance: true });
> 

Re: [webcomponents]: Changing API from constructable ShadowRoot to factory-like

2012-11-09 Thread Maciej Stachowiak

I think a factory function is better here for the reasons Dimitri stated. But I 
also agree that an addFoo function returning a new object seems strange. I 
think that createShadowRoot may be better than either option.

 - Maciej

On Nov 8, 2012, at 11:42 AM, Erik Arvidsson  wrote:

> addShadowRoot seem wrong to me to. Usually add* methods takes an
> argument of something that is supposed to be added to the context
> object.
> 
> If we are going with a factory function I think that createShadowRoot
> is the right name even though create methods have a lot of bad history
> in the DOM APIs.
> 
> On Thu, Nov 8, 2012 at 1:01 PM, Elliott Sprehn  wrote:
>> True, though that's actually one character longer, probably two with normal
>> formatting ;P
>> 
>> new ShadowRoot(element,{
>> element.addShadowRoot({
>> 
>> I'm more concerned about the constructor with irreversible side effects of
>> course.
>> 
>> - E
>> 
>> 
>> On Thu, Nov 8, 2012 at 9:57 AM, Dimitri Glazkov  wrote:
>>> 
>>> That _is_ pretty nice, but we can add this as a second argument to the
>>> constructor, as well:
>>> 
>>> root = new ShadowRoot(element, {
>>>  applyAuthorSheets: false,
>>>  resetStyleInheritance: true
>>> });
>>> 
>>> At this point, the stakes are primarily in aesthetics... Which makes
>>> the whole question so much more difficult to address objectively.
>>> 
>>> :DG<
>>> 
>>> On Thu, Nov 8, 2012 at 9:54 AM, Elliott Sprehn  wrote:
 The real sugar I think is in the dictionary version of addShadowRoot:
 
 root = element.addShadowRoot({
  applyAuthorSheets: false,
  resetStyleInheritance: true
 })
 
 
 On Thu, Nov 8, 2012 at 9:49 AM, Dimitri Glazkov 
 wrote:
> 
> Sure. Here's a simple example without getting into traversable shadow
> trees (those are still being discussed in a different thread):
> 
> A1) Using constructable ShadowRoot:
> 
> var element = document.querySelector('div#foo');
> // let's add a shadow root to element
> var shadowRoot = new ShadowRoot(element);
> // do work with it..
> shadowRoot.applyAuthorSheets = false;
> shadowRoot.appendChild(myDocumentFragment);
> 
> A2) Using addShadowRoot:
> 
> var element = document.querySelector('div#foo');
> // let's add a shadow root to element
> var shadowRoot = element.addShadowRoot();
> // do work with it..
> shadowRoot.applyAuthorSheets = false;
> shadowRoot.appendChild(myDocumentFragment);
> 
> Now with traversable shadow trees:
> 
> B1) Using constructable ShadowRoot:
> 
> var element = document.querySelector('div#foo');
> alert(element.shadowRoot); // null
> var root = new ShadowRoot(element);
> alert(root === element.shadowRoot); // true
> var root2 = new ShadowRoot(element);
> alert(root === element.shadowRoot); // false
> alert(root2 === element.shadowRoot); // true
> 
> B2) Using addShadowRoot:
> 
> var element = document.querySelector('div#foo');
> alert(element.shadowRoot); // null
> var root = element.addShadowRoot();
> alert(root === element.shadowRoot); // true
> var root2 = element.addShadowRoot();
> alert(root === element.shadowRoot); // false
> alert(root2 === element.shadowRoot); // true
> 
> :DG<
> 
> On Thu, Nov 8, 2012 at 9:42 AM, Maciej Stachowiak 
> wrote:
>> 
>> Could you please provide equivalent code examples using both
>> versions?
>> 
>> Cheers,
>> Maciej
>> 
>> On Nov 7, 2012, at 10:36 AM, Dimitri Glazkov 
>> wrote:
>> 
>>> Folks,
>>> 
>>> Throughout the year-long (whoa!) history of the Shadow DOM spec,
>>> various people commented on how odd the constructable ShadowRoot
>>> pattern was:
>>> 
>>> var root = new ShadowRoot(host); // both creates an instance *and*
>>> makes an association between this instance and host.
>>> 
>>> People (I cc'd most of them) noted various quirks, from the
>>> side-effectey constructor to relatively uncommon style of the API.
>>> 
>>> I once was of the strong opinion that having a nice, constructable
>>> object has better ergonomics and would overcome the mentioned code
>>> smells.
>>> 
>>> But... As we're discussing traversable shadows and the possibility
>>> of
>>> having Element.shadowRoot, the idea of changing to a factory pattern
>>> now looks more appealing:
>>> 
>>> var element = document.querySelector('div#foo');
>>> alert(element.shadowRoot); // null
>>> var root = element.addShadowRoot({ resetStyleInheritance: true });
>>> alert(root === element.shadowRoot); // true
>>> var root2 = element.addShadowRoot();
>>> alert(root === element.shadowRoot); // false
>>> alert(root2 === element.shadowRoot); // true
>>> 
>>> You gotta admit this looks very consistent and natural relative to
>>> how
>>> DOM APIs work today.
>>> 

Re: [webcomponents]: Changing API from constructable ShadowRoot to factory-like

2012-11-08 Thread Erik Arvidsson
addShadowRoot seem wrong to me to. Usually add* methods takes an
argument of something that is supposed to be added to the context
object.

If we are going with a factory function I think that createShadowRoot
is the right name even though create methods have a lot of bad history
in the DOM APIs.

On Thu, Nov 8, 2012 at 1:01 PM, Elliott Sprehn  wrote:
> True, though that's actually one character longer, probably two with normal
> formatting ;P
>
> new ShadowRoot(element,{
> element.addShadowRoot({
>
> I'm more concerned about the constructor with irreversible side effects of
> course.
>
> - E
>
>
> On Thu, Nov 8, 2012 at 9:57 AM, Dimitri Glazkov  wrote:
>>
>> That _is_ pretty nice, but we can add this as a second argument to the
>> constructor, as well:
>>
>> root = new ShadowRoot(element, {
>>   applyAuthorSheets: false,
>>   resetStyleInheritance: true
>> });
>>
>> At this point, the stakes are primarily in aesthetics... Which makes
>> the whole question so much more difficult to address objectively.
>>
>> :DG<
>>
>> On Thu, Nov 8, 2012 at 9:54 AM, Elliott Sprehn  wrote:
>> > The real sugar I think is in the dictionary version of addShadowRoot:
>> >
>> > root = element.addShadowRoot({
>> >   applyAuthorSheets: false,
>> >   resetStyleInheritance: true
>> > })
>> >
>> >
>> > On Thu, Nov 8, 2012 at 9:49 AM, Dimitri Glazkov 
>> > wrote:
>> >>
>> >> Sure. Here's a simple example without getting into traversable shadow
>> >> trees (those are still being discussed in a different thread):
>> >>
>> >> A1) Using constructable ShadowRoot:
>> >>
>> >> var element = document.querySelector('div#foo');
>> >> // let's add a shadow root to element
>> >> var shadowRoot = new ShadowRoot(element);
>> >> // do work with it..
>> >> shadowRoot.applyAuthorSheets = false;
>> >> shadowRoot.appendChild(myDocumentFragment);
>> >>
>> >> A2) Using addShadowRoot:
>> >>
>> >> var element = document.querySelector('div#foo');
>> >> // let's add a shadow root to element
>> >> var shadowRoot = element.addShadowRoot();
>> >> // do work with it..
>> >> shadowRoot.applyAuthorSheets = false;
>> >> shadowRoot.appendChild(myDocumentFragment);
>> >>
>> >> Now with traversable shadow trees:
>> >>
>> >> B1) Using constructable ShadowRoot:
>> >>
>> >> var element = document.querySelector('div#foo');
>> >> alert(element.shadowRoot); // null
>> >> var root = new ShadowRoot(element);
>> >> alert(root === element.shadowRoot); // true
>> >> var root2 = new ShadowRoot(element);
>> >> alert(root === element.shadowRoot); // false
>> >> alert(root2 === element.shadowRoot); // true
>> >>
>> >> B2) Using addShadowRoot:
>> >>
>> >> var element = document.querySelector('div#foo');
>> >> alert(element.shadowRoot); // null
>> >> var root = element.addShadowRoot();
>> >> alert(root === element.shadowRoot); // true
>> >> var root2 = element.addShadowRoot();
>> >> alert(root === element.shadowRoot); // false
>> >> alert(root2 === element.shadowRoot); // true
>> >>
>> >> :DG<
>> >>
>> >> On Thu, Nov 8, 2012 at 9:42 AM, Maciej Stachowiak 
>> >> wrote:
>> >> >
>> >> > Could you please provide equivalent code examples using both
>> >> > versions?
>> >> >
>> >> > Cheers,
>> >> > Maciej
>> >> >
>> >> > On Nov 7, 2012, at 10:36 AM, Dimitri Glazkov 
>> >> > wrote:
>> >> >
>> >> >> Folks,
>> >> >>
>> >> >> Throughout the year-long (whoa!) history of the Shadow DOM spec,
>> >> >> various people commented on how odd the constructable ShadowRoot
>> >> >> pattern was:
>> >> >>
>> >> >> var root = new ShadowRoot(host); // both creates an instance *and*
>> >> >> makes an association between this instance and host.
>> >> >>
>> >> >> People (I cc'd most of them) noted various quirks, from the
>> >> >> side-effectey constructor to relatively uncommon style of the API.
>> >> >>
>> >> >> I once was of the strong opinion that having a nice, constructable
>> >> >> object has better ergonomics and would overcome the mentioned code
>> >> >> smells.
>> >> >>
>> >> >> But... As we're discussing traversable shadows and the possibility
>> >> >> of
>> >> >> having Element.shadowRoot, the idea of changing to a factory pattern
>> >> >> now looks more appealing:
>> >> >>
>> >> >> var element = document.querySelector('div#foo');
>> >> >> alert(element.shadowRoot); // null
>> >> >> var root = element.addShadowRoot({ resetStyleInheritance: true });
>> >> >> alert(root === element.shadowRoot); // true
>> >> >> var root2 = element.addShadowRoot();
>> >> >> alert(root === element.shadowRoot); // false
>> >> >> alert(root2 === element.shadowRoot); // true
>> >> >>
>> >> >> You gotta admit this looks very consistent and natural relative to
>> >> >> how
>> >> >> DOM APIs work today.
>> >> >>
>> >> >> We could still keep constructable object syntax as alternative
>> >> >> method
>> >> >> or ditch it altogether and make calling constructor throw an
>> >> >> exception.
>> >> >>
>> >> >> What do you think, folks? In the spirit of last night's events,
>> >> >> let's
>> >> >> vote:
>> >> >>
>> >> >> 1) element.a

Re: [webcomponents]: Changing API from constructable ShadowRoot to factory-like

2012-11-08 Thread Elliott Sprehn
True, though that's actually one character longer, probably two with normal
formatting ;P

new ShadowRoot(element,{
element.addShadowRoot({

I'm more concerned about the constructor with irreversible side effects of
course.

- E


On Thu, Nov 8, 2012 at 9:57 AM, Dimitri Glazkov  wrote:

> That _is_ pretty nice, but we can add this as a second argument to the
> constructor, as well:
>
> root = new ShadowRoot(element, {
>   applyAuthorSheets: false,
>   resetStyleInheritance: true
> });
>
> At this point, the stakes are primarily in aesthetics... Which makes
> the whole question so much more difficult to address objectively.
>
> :DG<
>
> On Thu, Nov 8, 2012 at 9:54 AM, Elliott Sprehn  wrote:
> > The real sugar I think is in the dictionary version of addShadowRoot:
> >
> > root = element.addShadowRoot({
> >   applyAuthorSheets: false,
> >   resetStyleInheritance: true
> > })
> >
> >
> > On Thu, Nov 8, 2012 at 9:49 AM, Dimitri Glazkov 
> wrote:
> >>
> >> Sure. Here's a simple example without getting into traversable shadow
> >> trees (those are still being discussed in a different thread):
> >>
> >> A1) Using constructable ShadowRoot:
> >>
> >> var element = document.querySelector('div#foo');
> >> // let's add a shadow root to element
> >> var shadowRoot = new ShadowRoot(element);
> >> // do work with it..
> >> shadowRoot.applyAuthorSheets = false;
> >> shadowRoot.appendChild(myDocumentFragment);
> >>
> >> A2) Using addShadowRoot:
> >>
> >> var element = document.querySelector('div#foo');
> >> // let's add a shadow root to element
> >> var shadowRoot = element.addShadowRoot();
> >> // do work with it..
> >> shadowRoot.applyAuthorSheets = false;
> >> shadowRoot.appendChild(myDocumentFragment);
> >>
> >> Now with traversable shadow trees:
> >>
> >> B1) Using constructable ShadowRoot:
> >>
> >> var element = document.querySelector('div#foo');
> >> alert(element.shadowRoot); // null
> >> var root = new ShadowRoot(element);
> >> alert(root === element.shadowRoot); // true
> >> var root2 = new ShadowRoot(element);
> >> alert(root === element.shadowRoot); // false
> >> alert(root2 === element.shadowRoot); // true
> >>
> >> B2) Using addShadowRoot:
> >>
> >> var element = document.querySelector('div#foo');
> >> alert(element.shadowRoot); // null
> >> var root = element.addShadowRoot();
> >> alert(root === element.shadowRoot); // true
> >> var root2 = element.addShadowRoot();
> >> alert(root === element.shadowRoot); // false
> >> alert(root2 === element.shadowRoot); // true
> >>
> >> :DG<
> >>
> >> On Thu, Nov 8, 2012 at 9:42 AM, Maciej Stachowiak 
> wrote:
> >> >
> >> > Could you please provide equivalent code examples using both versions?
> >> >
> >> > Cheers,
> >> > Maciej
> >> >
> >> > On Nov 7, 2012, at 10:36 AM, Dimitri Glazkov 
> >> > wrote:
> >> >
> >> >> Folks,
> >> >>
> >> >> Throughout the year-long (whoa!) history of the Shadow DOM spec,
> >> >> various people commented on how odd the constructable ShadowRoot
> >> >> pattern was:
> >> >>
> >> >> var root = new ShadowRoot(host); // both creates an instance *and*
> >> >> makes an association between this instance and host.
> >> >>
> >> >> People (I cc'd most of them) noted various quirks, from the
> >> >> side-effectey constructor to relatively uncommon style of the API.
> >> >>
> >> >> I once was of the strong opinion that having a nice, constructable
> >> >> object has better ergonomics and would overcome the mentioned code
> >> >> smells.
> >> >>
> >> >> But... As we're discussing traversable shadows and the possibility of
> >> >> having Element.shadowRoot, the idea of changing to a factory pattern
> >> >> now looks more appealing:
> >> >>
> >> >> var element = document.querySelector('div#foo');
> >> >> alert(element.shadowRoot); // null
> >> >> var root = element.addShadowRoot({ resetStyleInheritance: true });
> >> >> alert(root === element.shadowRoot); // true
> >> >> var root2 = element.addShadowRoot();
> >> >> alert(root === element.shadowRoot); // false
> >> >> alert(root2 === element.shadowRoot); // true
> >> >>
> >> >> You gotta admit this looks very consistent and natural relative to
> how
> >> >> DOM APIs work today.
> >> >>
> >> >> We could still keep constructable object syntax as alternative method
> >> >> or ditch it altogether and make calling constructor throw an
> >> >> exception.
> >> >>
> >> >> What do you think, folks? In the spirit of last night's events, let's
> >> >> vote:
> >> >>
> >> >> 1) element.addShadowRoot rocks! Let's make it the One True Way!
> >> >> 2) Keep ShadowRoot constructable! Factories stink!
> >> >> 3) Let's have both!
> >> >> 4) element.addShadowRoot, but ONLY if we have traversable shadow
> trees
> >> >> 5) Kodos.
> >> >>
> >> >> :DG<
> >> >>
> >> >> P.S. I would like to retain the atomic quality of the operation:
> >> >> instantiate+associate in one go. There's a whole forest of problems
> >> >> awaits those who contemplate detached shadow roots.
> >> >>
> >> >
> >
> >
>


Re: [webcomponents]: Changing API from constructable ShadowRoot to factory-like

2012-11-08 Thread Elliott Sprehn
The real sugar I think is in the dictionary version of addShadowRoot:

root = element.addShadowRoot({
  applyAuthorSheets: false,
  resetStyleInheritance: true
})


On Thu, Nov 8, 2012 at 9:49 AM, Dimitri Glazkov  wrote:

> Sure. Here's a simple example without getting into traversable shadow
> trees (those are still being discussed in a different thread):
>
> A1) Using constructable ShadowRoot:
>
> var element = document.querySelector('div#foo');
> // let's add a shadow root to element
> var shadowRoot = new ShadowRoot(element);
> // do work with it..
> shadowRoot.applyAuthorSheets = false;
> shadowRoot.appendChild(myDocumentFragment);
>
> A2) Using addShadowRoot:
>
> var element = document.querySelector('div#foo');
> // let's add a shadow root to element
> var shadowRoot = element.addShadowRoot();
> // do work with it..
> shadowRoot.applyAuthorSheets = false;
> shadowRoot.appendChild(myDocumentFragment);
>
> Now with traversable shadow trees:
>
> B1) Using constructable ShadowRoot:
>
> var element = document.querySelector('div#foo');
> alert(element.shadowRoot); // null
> var root = new ShadowRoot(element);
> alert(root === element.shadowRoot); // true
> var root2 = new ShadowRoot(element);
> alert(root === element.shadowRoot); // false
> alert(root2 === element.shadowRoot); // true
>
> B2) Using addShadowRoot:
>
> var element = document.querySelector('div#foo');
> alert(element.shadowRoot); // null
> var root = element.addShadowRoot();
> alert(root === element.shadowRoot); // true
> var root2 = element.addShadowRoot();
> alert(root === element.shadowRoot); // false
> alert(root2 === element.shadowRoot); // true
>
> :DG<
>
> On Thu, Nov 8, 2012 at 9:42 AM, Maciej Stachowiak  wrote:
> >
> > Could you please provide equivalent code examples using both versions?
> >
> > Cheers,
> > Maciej
> >
> > On Nov 7, 2012, at 10:36 AM, Dimitri Glazkov 
> wrote:
> >
> >> Folks,
> >>
> >> Throughout the year-long (whoa!) history of the Shadow DOM spec,
> >> various people commented on how odd the constructable ShadowRoot
> >> pattern was:
> >>
> >> var root = new ShadowRoot(host); // both creates an instance *and*
> >> makes an association between this instance and host.
> >>
> >> People (I cc'd most of them) noted various quirks, from the
> >> side-effectey constructor to relatively uncommon style of the API.
> >>
> >> I once was of the strong opinion that having a nice, constructable
> >> object has better ergonomics and would overcome the mentioned code
> >> smells.
> >>
> >> But... As we're discussing traversable shadows and the possibility of
> >> having Element.shadowRoot, the idea of changing to a factory pattern
> >> now looks more appealing:
> >>
> >> var element = document.querySelector('div#foo');
> >> alert(element.shadowRoot); // null
> >> var root = element.addShadowRoot({ resetStyleInheritance: true });
> >> alert(root === element.shadowRoot); // true
> >> var root2 = element.addShadowRoot();
> >> alert(root === element.shadowRoot); // false
> >> alert(root2 === element.shadowRoot); // true
> >>
> >> You gotta admit this looks very consistent and natural relative to how
> >> DOM APIs work today.
> >>
> >> We could still keep constructable object syntax as alternative method
> >> or ditch it altogether and make calling constructor throw an
> >> exception.
> >>
> >> What do you think, folks? In the spirit of last night's events, let's
> vote:
> >>
> >> 1) element.addShadowRoot rocks! Let's make it the One True Way!
> >> 2) Keep ShadowRoot constructable! Factories stink!
> >> 3) Let's have both!
> >> 4) element.addShadowRoot, but ONLY if we have traversable shadow trees
> >> 5) Kodos.
> >>
> >> :DG<
> >>
> >> P.S. I would like to retain the atomic quality of the operation:
> >> instantiate+associate in one go. There's a whole forest of problems
> >> awaits those who contemplate detached shadow roots.
> >>
> >
>


Re: [webcomponents]: Changing API from constructable ShadowRoot to factory-like

2012-11-08 Thread Dimitri Glazkov
That _is_ pretty nice, but we can add this as a second argument to the
constructor, as well:

root = new ShadowRoot(element, {
  applyAuthorSheets: false,
  resetStyleInheritance: true
});

At this point, the stakes are primarily in aesthetics... Which makes
the whole question so much more difficult to address objectively.

:DG<

On Thu, Nov 8, 2012 at 9:54 AM, Elliott Sprehn  wrote:
> The real sugar I think is in the dictionary version of addShadowRoot:
>
> root = element.addShadowRoot({
>   applyAuthorSheets: false,
>   resetStyleInheritance: true
> })
>
>
> On Thu, Nov 8, 2012 at 9:49 AM, Dimitri Glazkov  wrote:
>>
>> Sure. Here's a simple example without getting into traversable shadow
>> trees (those are still being discussed in a different thread):
>>
>> A1) Using constructable ShadowRoot:
>>
>> var element = document.querySelector('div#foo');
>> // let's add a shadow root to element
>> var shadowRoot = new ShadowRoot(element);
>> // do work with it..
>> shadowRoot.applyAuthorSheets = false;
>> shadowRoot.appendChild(myDocumentFragment);
>>
>> A2) Using addShadowRoot:
>>
>> var element = document.querySelector('div#foo');
>> // let's add a shadow root to element
>> var shadowRoot = element.addShadowRoot();
>> // do work with it..
>> shadowRoot.applyAuthorSheets = false;
>> shadowRoot.appendChild(myDocumentFragment);
>>
>> Now with traversable shadow trees:
>>
>> B1) Using constructable ShadowRoot:
>>
>> var element = document.querySelector('div#foo');
>> alert(element.shadowRoot); // null
>> var root = new ShadowRoot(element);
>> alert(root === element.shadowRoot); // true
>> var root2 = new ShadowRoot(element);
>> alert(root === element.shadowRoot); // false
>> alert(root2 === element.shadowRoot); // true
>>
>> B2) Using addShadowRoot:
>>
>> var element = document.querySelector('div#foo');
>> alert(element.shadowRoot); // null
>> var root = element.addShadowRoot();
>> alert(root === element.shadowRoot); // true
>> var root2 = element.addShadowRoot();
>> alert(root === element.shadowRoot); // false
>> alert(root2 === element.shadowRoot); // true
>>
>> :DG<
>>
>> On Thu, Nov 8, 2012 at 9:42 AM, Maciej Stachowiak  wrote:
>> >
>> > Could you please provide equivalent code examples using both versions?
>> >
>> > Cheers,
>> > Maciej
>> >
>> > On Nov 7, 2012, at 10:36 AM, Dimitri Glazkov 
>> > wrote:
>> >
>> >> Folks,
>> >>
>> >> Throughout the year-long (whoa!) history of the Shadow DOM spec,
>> >> various people commented on how odd the constructable ShadowRoot
>> >> pattern was:
>> >>
>> >> var root = new ShadowRoot(host); // both creates an instance *and*
>> >> makes an association between this instance and host.
>> >>
>> >> People (I cc'd most of them) noted various quirks, from the
>> >> side-effectey constructor to relatively uncommon style of the API.
>> >>
>> >> I once was of the strong opinion that having a nice, constructable
>> >> object has better ergonomics and would overcome the mentioned code
>> >> smells.
>> >>
>> >> But... As we're discussing traversable shadows and the possibility of
>> >> having Element.shadowRoot, the idea of changing to a factory pattern
>> >> now looks more appealing:
>> >>
>> >> var element = document.querySelector('div#foo');
>> >> alert(element.shadowRoot); // null
>> >> var root = element.addShadowRoot({ resetStyleInheritance: true });
>> >> alert(root === element.shadowRoot); // true
>> >> var root2 = element.addShadowRoot();
>> >> alert(root === element.shadowRoot); // false
>> >> alert(root2 === element.shadowRoot); // true
>> >>
>> >> You gotta admit this looks very consistent and natural relative to how
>> >> DOM APIs work today.
>> >>
>> >> We could still keep constructable object syntax as alternative method
>> >> or ditch it altogether and make calling constructor throw an
>> >> exception.
>> >>
>> >> What do you think, folks? In the spirit of last night's events, let's
>> >> vote:
>> >>
>> >> 1) element.addShadowRoot rocks! Let's make it the One True Way!
>> >> 2) Keep ShadowRoot constructable! Factories stink!
>> >> 3) Let's have both!
>> >> 4) element.addShadowRoot, but ONLY if we have traversable shadow trees
>> >> 5) Kodos.
>> >>
>> >> :DG<
>> >>
>> >> P.S. I would like to retain the atomic quality of the operation:
>> >> instantiate+associate in one go. There's a whole forest of problems
>> >> awaits those who contemplate detached shadow roots.
>> >>
>> >
>
>



Re: [webcomponents]: Changing API from constructable ShadowRoot to factory-like

2012-11-08 Thread Dimitri Glazkov
Sure. Here's a simple example without getting into traversable shadow
trees (those are still being discussed in a different thread):

A1) Using constructable ShadowRoot:

var element = document.querySelector('div#foo');
// let's add a shadow root to element
var shadowRoot = new ShadowRoot(element);
// do work with it..
shadowRoot.applyAuthorSheets = false;
shadowRoot.appendChild(myDocumentFragment);

A2) Using addShadowRoot:

var element = document.querySelector('div#foo');
// let's add a shadow root to element
var shadowRoot = element.addShadowRoot();
// do work with it..
shadowRoot.applyAuthorSheets = false;
shadowRoot.appendChild(myDocumentFragment);

Now with traversable shadow trees:

B1) Using constructable ShadowRoot:

var element = document.querySelector('div#foo');
alert(element.shadowRoot); // null
var root = new ShadowRoot(element);
alert(root === element.shadowRoot); // true
var root2 = new ShadowRoot(element);
alert(root === element.shadowRoot); // false
alert(root2 === element.shadowRoot); // true

B2) Using addShadowRoot:

var element = document.querySelector('div#foo');
alert(element.shadowRoot); // null
var root = element.addShadowRoot();
alert(root === element.shadowRoot); // true
var root2 = element.addShadowRoot();
alert(root === element.shadowRoot); // false
alert(root2 === element.shadowRoot); // true

:DG<

On Thu, Nov 8, 2012 at 9:42 AM, Maciej Stachowiak  wrote:
>
> Could you please provide equivalent code examples using both versions?
>
> Cheers,
> Maciej
>
> On Nov 7, 2012, at 10:36 AM, Dimitri Glazkov  wrote:
>
>> Folks,
>>
>> Throughout the year-long (whoa!) history of the Shadow DOM spec,
>> various people commented on how odd the constructable ShadowRoot
>> pattern was:
>>
>> var root = new ShadowRoot(host); // both creates an instance *and*
>> makes an association between this instance and host.
>>
>> People (I cc'd most of them) noted various quirks, from the
>> side-effectey constructor to relatively uncommon style of the API.
>>
>> I once was of the strong opinion that having a nice, constructable
>> object has better ergonomics and would overcome the mentioned code
>> smells.
>>
>> But... As we're discussing traversable shadows and the possibility of
>> having Element.shadowRoot, the idea of changing to a factory pattern
>> now looks more appealing:
>>
>> var element = document.querySelector('div#foo');
>> alert(element.shadowRoot); // null
>> var root = element.addShadowRoot({ resetStyleInheritance: true });
>> alert(root === element.shadowRoot); // true
>> var root2 = element.addShadowRoot();
>> alert(root === element.shadowRoot); // false
>> alert(root2 === element.shadowRoot); // true
>>
>> You gotta admit this looks very consistent and natural relative to how
>> DOM APIs work today.
>>
>> We could still keep constructable object syntax as alternative method
>> or ditch it altogether and make calling constructor throw an
>> exception.
>>
>> What do you think, folks? In the spirit of last night's events, let's vote:
>>
>> 1) element.addShadowRoot rocks! Let's make it the One True Way!
>> 2) Keep ShadowRoot constructable! Factories stink!
>> 3) Let's have both!
>> 4) element.addShadowRoot, but ONLY if we have traversable shadow trees
>> 5) Kodos.
>>
>> :DG<
>>
>> P.S. I would like to retain the atomic quality of the operation:
>> instantiate+associate in one go. There's a whole forest of problems
>> awaits those who contemplate detached shadow roots.
>>
>



Re: [webcomponents]: Changing API from constructable ShadowRoot to factory-like

2012-11-08 Thread Maciej Stachowiak

Could you please provide equivalent code examples using both versions?

Cheers,
Maciej

On Nov 7, 2012, at 10:36 AM, Dimitri Glazkov  wrote:

> Folks,
> 
> Throughout the year-long (whoa!) history of the Shadow DOM spec,
> various people commented on how odd the constructable ShadowRoot
> pattern was:
> 
> var root = new ShadowRoot(host); // both creates an instance *and*
> makes an association between this instance and host.
> 
> People (I cc'd most of them) noted various quirks, from the
> side-effectey constructor to relatively uncommon style of the API.
> 
> I once was of the strong opinion that having a nice, constructable
> object has better ergonomics and would overcome the mentioned code
> smells.
> 
> But... As we're discussing traversable shadows and the possibility of
> having Element.shadowRoot, the idea of changing to a factory pattern
> now looks more appealing:
> 
> var element = document.querySelector('div#foo');
> alert(element.shadowRoot); // null
> var root = element.addShadowRoot({ resetStyleInheritance: true });
> alert(root === element.shadowRoot); // true
> var root2 = element.addShadowRoot();
> alert(root === element.shadowRoot); // false
> alert(root2 === element.shadowRoot); // true
> 
> You gotta admit this looks very consistent and natural relative to how
> DOM APIs work today.
> 
> We could still keep constructable object syntax as alternative method
> or ditch it altogether and make calling constructor throw an
> exception.
> 
> What do you think, folks? In the spirit of last night's events, let's vote:
> 
> 1) element.addShadowRoot rocks! Let's make it the One True Way!
> 2) Keep ShadowRoot constructable! Factories stink!
> 3) Let's have both!
> 4) element.addShadowRoot, but ONLY if we have traversable shadow trees
> 5) Kodos.
> 
> :DG<
> 
> P.S. I would like to retain the atomic quality of the operation:
> instantiate+associate in one go. There's a whole forest of problems
> awaits those who contemplate detached shadow roots.
> 




Re: [webcomponents]: Changing API from constructable ShadowRoot to factory-like

2012-11-07 Thread Elliott Sprehn
I'm for 1) , having a constructor with side effects is confusing and
inconsistent with the platform (and other languages).



On Wed, Nov 7, 2012 at 10:36 AM, Dimitri Glazkov wrote:

> Folks,
>
> Throughout the year-long (whoa!) history of the Shadow DOM spec,
> various people commented on how odd the constructable ShadowRoot
> pattern was:
>
> var root = new ShadowRoot(host); // both creates an instance *and*
> makes an association between this instance and host.
>
> People (I cc'd most of them) noted various quirks, from the
> side-effectey constructor to relatively uncommon style of the API.
>
> I once was of the strong opinion that having a nice, constructable
> object has better ergonomics and would overcome the mentioned code
> smells.
>
> But... As we're discussing traversable shadows and the possibility of
> having Element.shadowRoot, the idea of changing to a factory pattern
> now looks more appealing:
>
> var element = document.querySelector('div#foo');
> alert(element.shadowRoot); // null
> var root = element.addShadowRoot({ resetStyleInheritance: true });
> alert(root === element.shadowRoot); // true
> var root2 = element.addShadowRoot();
> alert(root === element.shadowRoot); // false
> alert(root2 === element.shadowRoot); // true
>
> You gotta admit this looks very consistent and natural relative to how
> DOM APIs work today.
>
> We could still keep constructable object syntax as alternative method
> or ditch it altogether and make calling constructor throw an
> exception.
>
> What do you think, folks? In the spirit of last night's events, let's vote:
>
> 1) element.addShadowRoot rocks! Let's make it the One True Way!
> 2) Keep ShadowRoot constructable! Factories stink!
> 3) Let's have both!
> 4) element.addShadowRoot, but ONLY if we have traversable shadow trees
> 5) Kodos.
>
> :DG<
>
> P.S. I would like to retain the atomic quality of the operation:
> instantiate+associate in one go. There's a whole forest of problems
> awaits those who contemplate detached shadow roots.
>
>


[webcomponents]: Changing API from constructable ShadowRoot to factory-like

2012-11-07 Thread Dimitri Glazkov
Folks,

Throughout the year-long (whoa!) history of the Shadow DOM spec,
various people commented on how odd the constructable ShadowRoot
pattern was:

var root = new ShadowRoot(host); // both creates an instance *and*
makes an association between this instance and host.

People (I cc'd most of them) noted various quirks, from the
side-effectey constructor to relatively uncommon style of the API.

I once was of the strong opinion that having a nice, constructable
object has better ergonomics and would overcome the mentioned code
smells.

But... As we're discussing traversable shadows and the possibility of
having Element.shadowRoot, the idea of changing to a factory pattern
now looks more appealing:

var element = document.querySelector('div#foo');
alert(element.shadowRoot); // null
var root = element.addShadowRoot({ resetStyleInheritance: true });
alert(root === element.shadowRoot); // true
var root2 = element.addShadowRoot();
alert(root === element.shadowRoot); // false
alert(root2 === element.shadowRoot); // true

You gotta admit this looks very consistent and natural relative to how
DOM APIs work today.

We could still keep constructable object syntax as alternative method
or ditch it altogether and make calling constructor throw an
exception.

What do you think, folks? In the spirit of last night's events, let's vote:

1) element.addShadowRoot rocks! Let's make it the One True Way!
2) Keep ShadowRoot constructable! Factories stink!
3) Let's have both!
4) element.addShadowRoot, but ONLY if we have traversable shadow trees
5) Kodos.

:DG<

P.S. I would like to retain the atomic quality of the operation:
instantiate+associate in one go. There's a whole forest of problems
awaits those who contemplate detached shadow roots.