[WICG/webcomponents] [scoped-registries] Interaction with HTML element's overridden constructor steps (Issue #969)

This is a blocking issue of #716

Note: This issue is **not** about calling a custom element constructor directly

---

HTML element's [overridden constructor steps](https://html.spec.whatwg.org/#html-element-constructors) is called whenever we create a custom element. For example:

```javascript
class MyCustomElement extends HTMLElement {
  constructor() {
    super(); // Runs the overridden constructor steps
    this.attachShadow(...);
    ...
  }
}
customElements.define('my-custom', MyCustomElement);
```

The line `super()` is reached whenever we create a `my-custom` element, regardless of calling `createElement()`, setting `innerHTML` or calling the constructor directly.

The overridden constructor steps check the (unique) global `CustomElementRegistry` to find out if there's a custom element definition matching the currently called constructor, and throw an exception if there's none.

This gets trickier when there are multiple registries. For example, when we call `ShadowRoot.createElement()` and enter the `super()` call, we still need to know which registry we are using, but currently such information seems unavailable.

One very hacky idea:
- Whenever we are about to create a custom element with a given registry and definition, temporarily tag the constructor with the registry as an internal field `[[Registry]]`
- Then when we are inside `super()`, we can get the correct registry from `NewTarget`'s `[[Registry]]` field
- When the overridden constructor steps finish, clear the `[[Registry]]` field from `NewTarget`

@mfreed7 @justinfagnani @rniwa 

-- 
Reply to this email directly or view it on GitHub:
https://github.com/WICG/webcomponents/issues/969
You are receiving this because you are subscribed to this thread.

Message ID: <WICG/webcomponents/issues/969@github.com>

Received on Wednesday, 7 September 2022 00:50:10 UTC