WPT
wpt / custom-elements / CustomElementRegistry.html
Spec: https://html.spec.whatwg.org/multipage/custom-elements.html ↗
Runs: Chrome 155.0.8039.0 (wpt@a4fcd77aa, 2026-09-03) | Firefox 157.0a1 (wpt@cc4d45aa0, 2026-09-03) | Safari 251 preview (wpt@5ce815a83, 2026-08-27) | Ladybird 1.0-a9df8 (wpt@9b4cabf6d, 2026-09-03) | Servo Servo 0.6 (wpt@7e3d005d7, 2026-09-03) | Blitz 188486089 (wpt@a95401e4e, 2026-09-02)
View on the Blitz WPT dashboard | Open test on wpt.live | wpt.fyi
| Chrome | Firefox | Safari | Ladybird | Servo | Blitz | |
|---|---|---|---|---|---|---|
| Total | 45/46 | 46/46 | 45/46 | 46/46 | 46/46 | NOT RUN |
| Subtest | Chrome | Firefox | Safari | Ladybird | Servo | Blitz |
|---|---|---|---|---|---|---|
| CustomElementRegistry interface must have define as a method | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must throw when the element interface is not a constructor | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must not throw the constructor is HTMLElement | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must throw with an invalid name | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must throw when there is already a custom element of the same name | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must throw a NotSupportedError when there is already a custom element with the same class | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must throw a NotSupportedError when element definition is running flag is set | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must check IsConstructor on the constructor before checking the element definition is running flag | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must validate the custom element name before checking the element definition is running flag | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define unset the element definition is running flag before upgrading custom elements | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must not throw when defining another custom element in a different global object during Get(constructor, "prototype") | PASS | PASS | PASS | PASS | PASS | — |
| Custom Elements: CustomElementRegistry interface | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must get "prototype", "disabledFeatures", and "formAssociated" property of the constructor | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must rethrow an exception thrown while getting "prototype" property of the constructor | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must throw when "prototype" property of the constructor is not an object | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must get callbacks of the constructor prototype | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must rethrow an exception thrown while getting callbacks on the constructor prototype | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must rethrow an exception thrown while converting a callback value to Function callback type | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must get "observedAttributes" property on the constructor prototype when "attributeChangedCallback" is present | PASS | PASS | FAIL | PASS | PASS | — |
| customElements.define must rethrow an exception thrown while getting observedAttributes on the constructor prototype | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must rethrow an exception thrown while converting the value of observedAttributes to sequence<DOMString> | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must rethrow an exception thrown while iterating over observedAttributes to sequence<DOMString> | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must rethrow an exception thrown while retrieving Symbol.iterator on observedAttributes | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must not throw even if "observedAttributes" fails to convert if "attributeChangedCallback" is not defined | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must rethrow an exception thrown while getting disabledFeatures on the constructor prototype | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must rethrow an exception thrown while converting the value of disabledFeatures to sequence<DOMString> | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must rethrow an exception thrown while iterating over disabledFeatures to sequence<DOMString> | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must rethrow an exception thrown while retrieving Symbol.iterator on disabledFeatures | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must rethrow an exception thrown while getting formAssociated on the constructor prototype | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must get four additional callbacks on the prototype if formAssociated is converted to true | FAIL | PASS | PASS | PASS | PASS | — |
| customElements.define must rethrow an exception thrown while getting additional formAssociated callbacks on the constructor prototype | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must define an instantiatable custom element | PASS | PASS | PASS | PASS | PASS | — |
| customElements.define must upgrade elements in the shadow-including tree order | PASS | PASS | PASS | PASS | PASS | — |
| CustomElementRegistry interface must have get as a method | PASS | PASS | PASS | PASS | PASS | — |
| customElements.get must return undefined when the registry does not contain an entry with the given name | PASS | PASS | PASS | PASS | PASS | — |
| customElements.get must return undefined when the registry does not contain an entry with the given name even if the name was not a valid custom element name | PASS | PASS | PASS | PASS | PASS | — |
| customElements.get return the constructor of the entry with the given name when there is a matching entry. | PASS | PASS | PASS | PASS | PASS | — |
| customElements.whenDefined must return a promise for a valid custom element name | PASS | PASS | PASS | PASS | PASS | — |
| customElements.whenDefined must return the same promise each time invoked for a valid custom element name which has not been defined | PASS | PASS | PASS | PASS | PASS | — |
| customElements.whenDefined must return an unresolved promise when the registry does not contain the entry with the given name | PASS | PASS | PASS | PASS | PASS | — |
| customElements.whenDefined must return a rejected promise when the given name is not a valid custom element name | PASS | PASS | PASS | PASS | PASS | — |
| customElements.whenDefined must return a resolved promise when the registry contains the entry with the given name | PASS | PASS | PASS | PASS | PASS | — |
| customElements.whenDefined must return a new resolved promise each time invoked when the registry contains the entry with the given name | PASS | PASS | PASS | PASS | PASS | — |
| A promise returned by customElements.whenDefined must be resolved by "define" | PASS | PASS | PASS | PASS | PASS | — |
| A promise returned by customElements.whenDefined must be resolved with the defined class | PASS | PASS | PASS | PASS | PASS | — |
| A promise returned by customElements.whenDefined must be resolved with the defined class once such class is defined | PASS | PASS | PASS | PASS | PASS | — |