diff --git a/components/script/dom/customelementregistry.rs b/components/script/dom/customelementregistry.rs index b1b8a241b63..dfba75a2028 100644 --- a/components/script/dom/customelementregistry.rs +++ b/components/script/dom/customelementregistry.rs @@ -395,7 +395,13 @@ impl CustomElementRegistryMethods for CustomElementRegistry { // Step 16, 16.3 if let Some(promise) = self.when_defined.borrow_mut().remove(&name) { - promise.resolve_native(&UndefinedValue()); + unsafe { + rooted!(in(*cx) let mut constructor = UndefinedValue()); + definition + .constructor + .to_jsval(*cx, constructor.handle_mut()); + promise.resolve_native(&constructor.get()); + } } Ok(()) } @@ -416,6 +422,7 @@ impl CustomElementRegistryMethods for CustomElementRegistry { } /// + #[allow(unsafe_code)] fn WhenDefined(&self, name: DOMString, comp: InRealm) -> Rc { let global_scope = self.window.upcast::(); let name = LocalName::from(&*name); @@ -428,10 +435,17 @@ impl CustomElementRegistryMethods for CustomElementRegistry { } // Step 2 - if self.definitions.borrow().contains_key(&name) { - let promise = Promise::new_in_current_realm(&global_scope, comp); - promise.resolve_native(&UndefinedValue()); - return promise; + if let Some(definition) = self.definitions.borrow().get(&LocalName::from(&*name)) { + unsafe { + let cx = global_scope.get_cx(); + rooted!(in(*cx) let mut constructor = UndefinedValue()); + definition + .constructor + .to_jsval(*cx, constructor.handle_mut()); + let promise = Promise::new_in_current_realm(&global_scope, comp); + promise.resolve_native(&constructor.get()); + return promise; + } } // Step 3 diff --git a/components/script/dom/webidls/CustomElementRegistry.webidl b/components/script/dom/webidls/CustomElementRegistry.webidl index be47962c067..1d6f638d67e 100644 --- a/components/script/dom/webidls/CustomElementRegistry.webidl +++ b/components/script/dom/webidls/CustomElementRegistry.webidl @@ -10,7 +10,7 @@ interface CustomElementRegistry { any get(DOMString name); - Promise whenDefined(DOMString name); + Promise whenDefined(DOMString name); [CEReactions] void upgrade(Node root); }; diff --git a/tests/wpt/metadata/custom-elements/CustomElementRegistry.html.ini b/tests/wpt/metadata/custom-elements/CustomElementRegistry.html.ini index 080959f0922..c6783d08d80 100644 --- a/tests/wpt/metadata/custom-elements/CustomElementRegistry.html.ini +++ b/tests/wpt/metadata/custom-elements/CustomElementRegistry.html.ini @@ -32,19 +32,3 @@ [customElements.define must not throw when defining another custom element in a different global object during Get(constructor, "prototype")] expected: FAIL - - [A promise returned by customElements.whenDefined must be resolved by "define"] - expected: FAIL - - [customElements.whenDefined must return a new resolved promise each time invoked when the registry contains the entry with the given name] - expected: FAIL - - [A promise returned by customElements.whenDefined must be resolved with the defined class once such class is defined] - expected: FAIL - - [customElements.whenDefined must return a resolved promise when the registry contains the entry with the given name] - expected: FAIL - - [A promise returned by customElements.whenDefined must be resolved with the defined class] - expected: FAIL -