mirror of
https://github.com/servo/servo.git
synced 2025-07-23 07:13:52 +01:00
script: Support converting JS values to Rc<Promise> with FromJSValConvertible. (#36097)
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
This commit is contained in:
parent
f65b697a5a
commit
f717f6b848
5 changed files with 27 additions and 4 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
@ -4702,7 +4702,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mozjs"
|
name = "mozjs"
|
||||||
version = "0.14.1"
|
version = "0.14.1"
|
||||||
source = "git+https://github.com/servo/mozjs#26c35182c1b2b7fb2fbfa93b82669533d92c3a60"
|
source = "git+https://github.com/servo/mozjs#39db84352d79ffa3e4fe756c8034af9def788f22"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bindgen 0.71.1",
|
"bindgen 0.71.1",
|
||||||
"cc",
|
"cc",
|
||||||
|
@ -4714,7 +4714,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mozjs_sys"
|
name = "mozjs_sys"
|
||||||
version = "0.128.9-0"
|
version = "0.128.9-0"
|
||||||
source = "git+https://github.com/servo/mozjs#26c35182c1b2b7fb2fbfa93b82669533d92c3a60"
|
source = "git+https://github.com/servo/mozjs#39db84352d79ffa3e4fe756c8034af9def788f22"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bindgen 0.71.1",
|
"bindgen 0.71.1",
|
||||||
"cc",
|
"cc",
|
||||||
|
|
|
@ -15,7 +15,7 @@ use std::ptr;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use js::conversions::ToJSValConvertible;
|
use js::conversions::{ConversionResult, FromJSValConvertibleRc, ToJSValConvertible};
|
||||||
use js::jsapi::{
|
use js::jsapi::{
|
||||||
AddRawValueRoot, CallArgs, GetFunctionNativeReserved, Heap, JS_ClearPendingException,
|
AddRawValueRoot, CallArgs, GetFunctionNativeReserved, Heap, JS_ClearPendingException,
|
||||||
JS_GetFunctionObject, JS_NewFunction, JSAutoRealm, JSContext, JSObject,
|
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())
|
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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -910,6 +910,7 @@ impl TestBindingMethods<crate::DomTypeHolder> for TestBinding {
|
||||||
fn FuncControlledMethodDisabled(&self) {}
|
fn FuncControlledMethodDisabled(&self) {}
|
||||||
fn FuncControlledMethodEnabled(&self) {}
|
fn FuncControlledMethodEnabled(&self) {}
|
||||||
|
|
||||||
|
fn PassRecordPromise(&self, _: Record<DOMString, Rc<Promise>>) {}
|
||||||
fn PassRecord(&self, _: Record<DOMString, i32>) {}
|
fn PassRecord(&self, _: Record<DOMString, i32>) {}
|
||||||
fn PassRecordWithUSVStringKey(&self, _: Record<USVString, i32>) {}
|
fn PassRecordWithUSVStringKey(&self, _: Record<USVString, i32>) {}
|
||||||
fn PassRecordWithByteStringKey(&self, _: Record<ByteString, i32>) {}
|
fn PassRecordWithByteStringKey(&self, _: Record<ByteString, i32>) {}
|
||||||
|
|
|
@ -490,7 +490,7 @@ DOMInterfaces = {
|
||||||
|
|
||||||
'Promise': {
|
'Promise': {
|
||||||
'spiderMonkeyInterface': True,
|
'spiderMonkeyInterface': True,
|
||||||
'additionalTraits': ["crate::dom::promise::PromiseHelpers<Self>"]
|
'additionalTraits': ["crate::dom::promise::PromiseHelpers<Self>", "js::conversions::FromJSValConvertibleRc"]
|
||||||
},
|
},
|
||||||
|
|
||||||
'Range': {
|
'Range': {
|
||||||
|
|
|
@ -479,6 +479,7 @@ interface TestBinding {
|
||||||
sequence<sequence<long>> returnSequenceSequence();
|
sequence<sequence<long>> returnSequenceSequence();
|
||||||
undefined passUnionSequenceSequence((long or sequence<sequence<long>>) seq);
|
undefined passUnionSequenceSequence((long or sequence<sequence<long>>) seq);
|
||||||
|
|
||||||
|
undefined passRecordPromise(record<DOMString, Promise<undefined>> arg);
|
||||||
undefined passRecord(record<DOMString, long> arg);
|
undefined passRecord(record<DOMString, long> arg);
|
||||||
undefined passRecordWithUSVStringKey(record<USVString, long> arg);
|
undefined passRecordWithUSVStringKey(record<USVString, long> arg);
|
||||||
undefined passRecordWithByteStringKey(record<ByteString, long> arg);
|
undefined passRecordWithByteStringKey(record<ByteString, long> arg);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue