- From: Andrea Giammarchi <notifications@github.com>
- Date: Wed, 08 Nov 2017 12:08:48 +0000 (UTC)
- To: w3c/webcomponents <webcomponents@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/webcomponents/issues/488/342798931@github.com>
OK @Jamesernator I think you have my attention and I like your idea. There is already a `CustomElementRegistry` class exposed so I guess having multiple instances provided by the platform shouldn't be too difficult. Each instance should be aware of its parent registry 'cause shadows can be in shadows so a bottom up lookup can be performed. We've got the scoped issue "solved", we need to fix the creation ambiguity. Since we're moving from global to localized, and since the `document.createElement` has been already hijacked in various way, I wonder how difficult would it be to confine the element creation through the `customElements` instance itself. That is: `customElements.create('my-element')` with room for an optional second argument as `object` to learn from the past and not repeat same awkward situation we have with `document.createElement`. So now we have localized ability and zero creation ambiguity, yet we miss one major issue I've previously raised: what happens to a node created and upgraded in a precise shadow, once it lands in another part of the document? ```js class SubEl extends HTMLElement { connectedCallback() { this.textContent = `${this.parentNode.nodeName} > ${this.nodeName}`; } } // for demo sake, we define it globally customElements.define('s-el', SubEl); const ParentEl = (() => { const shadows = new WeakMap; return class ParentEl extends HTMLElement { constructor() { const sd = super().attachShadow({mode: 'closed'}); shadows.set(this, sd); sd.appendChild(new SubEl); this.addEventListener('click', this, {once: true}); } onclick(e) { e.preventDefault(); const sd = shadows.get(this); this.ownerDocument.body.appendChild(sd.firstChild); console.log(sd.childNodes); } handleEvent(e) { this['on' + e.type](e); } }; })(); // for demo sake, we define it globally customElements.define('p-el', ParentEl); document.body.innerHTML = '<p-el></p-el>'; ``` Now, [if you click](https://codepen.io/WebReflection/pen/mqOMvm?editors=0010) on that node you'll see a `BODY > S-EL` instead of `#document-fragment > S-EL`. In a situation where `ParentEl` instance `shadowRoot` registers its own `S-EL` and that node is passed to the document body where there was another `S-EL`, what is expected/desired behavior? IMO that should throw an _Illegal DOM operation_ or something similar but it's a concern we eventually need to address and/or explain to developers. -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/w3c/webcomponents/issues/488#issuecomment-342798931
Received on Wednesday, 8 November 2017 12:09:14 UTC