aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/promise.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/promise.rs')
-rw-r--r--components/script/dom/promise.rs23
1 files changed, 22 insertions, 1 deletions
diff --git a/components/script/dom/promise.rs b/components/script/dom/promise.rs
index d7c309a7ded..dd09b1df3a1 100644
--- a/components/script/dom/promise.rs
+++ b/components/script/dom/promise.rs
@@ -15,7 +15,7 @@ use std::ptr;
use std::rc::Rc;
use dom_struct::dom_struct;
-use js::conversions::ToJSValConvertible;
+use js::conversions::{ConversionResult, FromJSValConvertibleRc, ToJSValConvertible};
use js::jsapi::{
AddRawValueRoot, CallArgs, GetFunctionNativeReserved, Heap, JS_ClearPendingException,
JS_GetFunctionObject, JS_NewFunction, JSAutoRealm, JSContext, JSObject,
@@ -405,3 +405,24 @@ impl PromiseHelpers<crate::DomTypeHolder> for Promise {
Promise::new_resolved(global, cx, value, CanGc::note())
}
}
+
+impl FromJSValConvertibleRc for Promise {
+ #[allow(unsafe_code)]
+ unsafe fn from_jsval(
+ cx: *mut JSContext,
+ value: HandleValue,
+ ) -> Result<ConversionResult<Rc<Promise>>, ()> {
+ if value.get().is_null() {
+ return Ok(ConversionResult::Failure("null not allowed".into()));
+ }
+ if !value.get().is_object() {
+ return Ok(ConversionResult::Failure("not an object".into()));
+ }
+ rooted!(in(cx) let obj = value.get().to_object());
+ if !IsPromiseObject(obj.handle()) {
+ return Ok(ConversionResult::Failure("not a promise".into()));
+ }
+ let promise = Promise::new_with_js_promise(obj.handle(), SafeJSContext::from_ptr(cx));
+ Ok(ConversionResult::Success(promise))
+ }
+}