aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorbors-servo <servo-ops@mozilla.com>2020-09-22 20:25:49 -0400
committerGitHub <noreply@github.com>2020-09-22 20:25:49 -0400
commit3d057c8eeca3ef9337d042e79a408c145a52859d (patch)
treec3102dc59269b236e85caac0d9636d58a2034c0b /components/script/dom
parent0d5e4b9037e4a167fd97741941023cb336c817d7 (diff)
parent312479f81654aba1c08d67ce543100de35f500d2 (diff)
downloadservo-3d057c8eeca3ef9337d042e79a408c145a52859d.tar.gz
servo-3d057c8eeca3ef9337d042e79a408c145a52859d.zip
Auto merge of #27629 - CYBAI:whendefined-constructor, r=jdm
Resolve `whenDefined` with the class constructor I still don't have time to find the root cause of why nightly sync failed :( so we don't have the tests in our tree now. But I tried to verify it with `wpt.live` that this is correct <img width="1136" alt="image" src="https://user-images.githubusercontent.com/6782666/92739547-f7ca0c80-f3b7-11ea-966e-fd7ecd2638cf.png"> --- - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix #27626 - [x] There are tests for these changes <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/customelementregistry.rs24
-rw-r--r--components/script/dom/webidls/CustomElementRegistry.webidl2
2 files changed, 20 insertions, 6 deletions
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 {
}
/// <https://html.spec.whatwg.org/multipage/#dom-customelementregistry-whendefined>
+ #[allow(unsafe_code)]
fn WhenDefined(&self, name: DOMString, comp: InRealm) -> Rc<Promise> {
let global_scope = self.window.upcast::<GlobalScope>();
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<void> whenDefined(DOMString name);
+ Promise<CustomElementConstructor> whenDefined(DOMString name);
[CEReactions] void upgrade(Node root);
};