diff options
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 14 | ||||
-rw-r--r-- | components/script/dom/bindings/utils.rs | 30 | ||||
-rw-r--r-- | components/script/dom/promiserejectionevent.rs | 35 | ||||
-rw-r--r-- | components/script/dom/webidls/PromiseRejectionEvent.webidl | 4 | ||||
-rw-r--r-- | tests/wpt/meta/FileAPI/idlharness.any.js.ini | 4 | ||||
-rw-r--r-- | tests/wpt/meta/FileAPI/idlharness.html.ini | 2 | ||||
-rw-r--r-- | tests/wpt/meta/FileAPI/idlharness.worker.js.ini | 2 | ||||
-rw-r--r-- | tests/wpt/meta/dom/idlharness.window.js.ini | 2 | ||||
-rw-r--r-- | tests/wpt/meta/fetch/api/idlharness.any.js.ini | 22 | ||||
-rw-r--r-- | tests/wpt/meta/fullscreen/idlharness.window.js.ini | 2 | ||||
-rw-r--r-- | tests/wpt/meta/gamepad/idlharness.window.js.ini | 2 | ||||
-rw-r--r-- | tests/wpt/meta/html/dom/idlharness.https.html.ini | 3 | ||||
-rw-r--r-- | tests/wpt/meta/webxr/hit-test/idlharness.https.html.ini | 1 | ||||
-rw-r--r-- | tests/wpt/meta/webxr/idlharness.https.window.js.ini | 5 | ||||
-rw-r--r-- | tests/wpt/mozilla/meta/MANIFEST.json | 2 | ||||
-rw-r--r-- | tests/wpt/mozilla/tests/mozilla/exceptionToRejection.any.js | 6 |
16 files changed, 61 insertions, 75 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index fa77c516abb..154ec01c7ae 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -1870,13 +1870,17 @@ class MethodDefiner(PropertyDefiner): else: selfHostedName = "0 as *const libc::c_char" if m.get("methodInfo", True): + if m.get("returnsPromise", False): + exceptionToRejection = "true" + else: + exceptionToRejection = "false" identifier = m.get("nativeName", m["name"]) # Go through an intermediate type here, because it's not # easy to tell whether the methodinfo is a JSJitInfo or # a JSTypedMethodJitInfo here. The compiler knows, though, # so let it do the work. jitinfo = "&%s_methodinfo as *const _ as *const JSJitInfo" % identifier - accessor = "Some(generic_method)" + accessor = f"Some(generic_method::<{exceptionToRejection}>)" else: if m.get("returnsPromise", False): jitinfo = "&%s_methodinfo" % m.get("nativeName", m["name"]) @@ -1977,10 +1981,14 @@ class AttrDefiner(PropertyDefiner): accessor = 'get_' + self.descriptor.internalNameFor(attr.identifier.name) jitinfo = "0 as *const JSJitInfo" else: + if attr.type.isPromise(): + exceptionToRejection = "true" + else: + exceptionToRejection = "false" if attr.hasLegacyLenientThis(): - accessor = "generic_lenient_getter" + accessor = f"generic_lenient_getter::<{exceptionToRejection}>" else: - accessor = "generic_getter" + accessor = f"generic_getter::<{exceptionToRejection}>" jitinfo = "&%s_getterinfo" % self.descriptor.internalNameFor(attr.identifier.name) return ("JSNativeWrapper { op: Some(%(native)s), info: %(info)s }" diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index 764e604620c..07424ff6d3f 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -466,7 +466,7 @@ pub unsafe fn delete_property_by_id( JS_DeletePropertyById(cx, object, id, bp) } -unsafe fn generic_call( +unsafe fn generic_call<const EXCEPTION_TO_REJECTION: bool>( cx: *mut JSContext, argc: libc::c_uint, vp: *mut JSVal, @@ -488,7 +488,11 @@ unsafe fn generic_call( let thisobj = args.thisv(); if !thisobj.get().is_null_or_undefined() && !thisobj.get().is_object() { throw_invalid_this(cx, proto_id); - return false; + return if EXCEPTION_TO_REJECTION { + exception_to_promise(cx, args.rval()) + } else { + false + }; } rooted!(in(cx) let obj = if thisobj.get().is_object() { @@ -507,7 +511,11 @@ unsafe fn generic_call( return true; } else { throw_invalid_this(cx, proto_id); - return false; + return if EXCEPTION_TO_REJECTION { + exception_to_promise(cx, args.rval()) + } else { + false + }; } }, }; @@ -522,30 +530,30 @@ unsafe fn generic_call( } /// Generic method of IDL interface. -pub unsafe extern "C" fn generic_method( +pub unsafe extern "C" fn generic_method<const EXCEPTION_TO_REJECTION: bool>( cx: *mut JSContext, argc: libc::c_uint, vp: *mut JSVal, ) -> bool { - generic_call(cx, argc, vp, false, CallJitMethodOp) + generic_call::<EXCEPTION_TO_REJECTION>(cx, argc, vp, false, CallJitMethodOp) } /// Generic getter of IDL interface. -pub unsafe extern "C" fn generic_getter( +pub unsafe extern "C" fn generic_getter<const EXCEPTION_TO_REJECTION: bool>( cx: *mut JSContext, argc: libc::c_uint, vp: *mut JSVal, ) -> bool { - generic_call(cx, argc, vp, false, CallJitGetterOp) + generic_call::<EXCEPTION_TO_REJECTION>(cx, argc, vp, false, CallJitGetterOp) } /// Generic lenient getter of IDL interface. -pub unsafe extern "C" fn generic_lenient_getter( +pub unsafe extern "C" fn generic_lenient_getter<const EXCEPTION_TO_REJECTION: bool>( cx: *mut JSContext, argc: libc::c_uint, vp: *mut JSVal, ) -> bool { - generic_call(cx, argc, vp, true, CallJitGetterOp) + generic_call::<EXCEPTION_TO_REJECTION>(cx, argc, vp, true, CallJitGetterOp) } unsafe extern "C" fn call_setter( @@ -569,7 +577,7 @@ pub unsafe extern "C" fn generic_setter( argc: libc::c_uint, vp: *mut JSVal, ) -> bool { - generic_call(cx, argc, vp, false, call_setter) + generic_call::<false>(cx, argc, vp, false, call_setter) } /// Generic lenient setter of IDL interface. @@ -578,7 +586,7 @@ pub unsafe extern "C" fn generic_lenient_setter( argc: libc::c_uint, vp: *mut JSVal, ) -> bool { - generic_call(cx, argc, vp, true, call_setter) + generic_call::<false>(cx, argc, vp, true, call_setter) } unsafe extern "C" fn instance_class_has_proto_at_depth( diff --git a/components/script/dom/promiserejectionevent.rs b/components/script/dom/promiserejectionevent.rs index 64e548493f2..fe907b010b4 100644 --- a/components/script/dom/promiserejectionevent.rs +++ b/components/script/dom/promiserejectionevent.rs @@ -2,10 +2,11 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +use std::ptr::NonNull; use std::rc::Rc; use dom_struct::dom_struct; -use js::jsapi::Heap; +use js::jsapi::{Heap, JSObject}; use js::jsval::JSVal; use js::rust::{HandleObject, HandleValue}; use servo_atoms::Atom; @@ -27,18 +28,18 @@ use crate::script_runtime::JSContext; #[dom_struct] pub struct PromiseRejectionEvent { event: Event, - #[ignore_malloc_size_of = "Rc"] - promise: Rc<Promise>, - #[ignore_malloc_size_of = "Defined in rust-mozjs"] + #[ignore_malloc_size_of = "Defined in mozjs"] + promise: Heap<*mut JSObject>, + #[ignore_malloc_size_of = "Defined in mozjs"] reason: Heap<JSVal>, } impl PromiseRejectionEvent { #[allow(crown::unrooted_must_root)] - fn new_inherited(promise: Rc<Promise>) -> Self { + fn new_inherited() -> Self { PromiseRejectionEvent { event: Event::new_inherited(), - promise, + promise: Heap::default(), reason: Heap::default(), } } @@ -51,7 +52,15 @@ impl PromiseRejectionEvent { promise: Rc<Promise>, reason: HandleValue, ) -> DomRoot<Self> { - Self::new_with_proto(global, None, type_, bubbles, cancelable, promise, reason) + Self::new_with_proto( + global, + None, + type_, + bubbles, + cancelable, + promise.promise_obj(), + reason, + ) } #[allow(crown::unrooted_must_root)] @@ -61,14 +70,15 @@ impl PromiseRejectionEvent { type_: Atom, bubbles: EventBubbles, cancelable: EventCancelable, - promise: Rc<Promise>, + promise: HandleObject, reason: HandleValue, ) -> DomRoot<Self> { let ev = reflect_dom_object_with_proto( - Box::new(PromiseRejectionEvent::new_inherited(promise)), + Box::new(PromiseRejectionEvent::new_inherited()), global, proto, ); + ev.promise.set(promise.get()); { let event = ev.upcast::<Event>(); @@ -87,7 +97,6 @@ impl PromiseRejectionEvent { init: RootedTraceableBox<PromiseRejectionEventBinding::PromiseRejectionEventInit>, ) -> Fallible<DomRoot<Self>> { let reason = init.reason.handle(); - let promise = init.promise.clone(); let bubbles = EventBubbles::from(init.parent.bubbles); let cancelable = EventCancelable::from(init.parent.cancelable); @@ -97,7 +106,7 @@ impl PromiseRejectionEvent { Atom::from(type_), bubbles, cancelable, - promise, + init.promise.handle(), reason, ); Ok(event) @@ -106,8 +115,8 @@ impl PromiseRejectionEvent { impl PromiseRejectionEventMethods for PromiseRejectionEvent { // https://html.spec.whatwg.org/multipage/#dom-promiserejectionevent-promise - fn Promise(&self) -> Rc<Promise> { - self.promise.clone() + fn Promise(&self, _cx: JSContext) -> NonNull<JSObject> { + NonNull::new(self.promise.get()).unwrap() } // https://html.spec.whatwg.org/multipage/#dom-promiserejectionevent-reason diff --git a/components/script/dom/webidls/PromiseRejectionEvent.webidl b/components/script/dom/webidls/PromiseRejectionEvent.webidl index 70d11b1ff33..46ecbc21718 100644 --- a/components/script/dom/webidls/PromiseRejectionEvent.webidl +++ b/components/script/dom/webidls/PromiseRejectionEvent.webidl @@ -7,11 +7,11 @@ [Exposed=(Window,Worker)] interface PromiseRejectionEvent : Event { [Throws] constructor(DOMString type, PromiseRejectionEventInit eventInitDict); - readonly attribute Promise<any> promise; + readonly attribute object promise; readonly attribute any reason; }; dictionary PromiseRejectionEventInit : EventInit { - required Promise<any> promise; + required object promise; any reason; }; diff --git a/tests/wpt/meta/FileAPI/idlharness.any.js.ini b/tests/wpt/meta/FileAPI/idlharness.any.js.ini index b82efb20e2f..7458c529274 100644 --- a/tests/wpt/meta/FileAPI/idlharness.any.js.ini +++ b/tests/wpt/meta/FileAPI/idlharness.any.js.ini @@ -1,9 +1,7 @@ [idlharness.any.html] [Blob interface: operation text()] - expected: FAIL [Blob interface: operation arrayBuffer()] - expected: FAIL [FileReader interface: operation readAsBinaryString(Blob)] expected: FAIL @@ -26,10 +24,8 @@ [idlharness.any.worker.html] [Blob interface: operation text()] - expected: FAIL [Blob interface: operation arrayBuffer()] - expected: FAIL [FileReader interface: operation readAsBinaryString(Blob)] expected: FAIL diff --git a/tests/wpt/meta/FileAPI/idlharness.html.ini b/tests/wpt/meta/FileAPI/idlharness.html.ini index 6af25e52568..200d08be20f 100644 --- a/tests/wpt/meta/FileAPI/idlharness.html.ini +++ b/tests/wpt/meta/FileAPI/idlharness.html.ini @@ -1,9 +1,7 @@ [idlharness.html] [Blob interface: operation text()] - expected: FAIL [Blob interface: operation arrayBuffer()] - expected: FAIL [FileReader interface: operation readAsBinaryString(Blob)] expected: FAIL diff --git a/tests/wpt/meta/FileAPI/idlharness.worker.js.ini b/tests/wpt/meta/FileAPI/idlharness.worker.js.ini index 16b61ac30c2..efc1d7c665a 100644 --- a/tests/wpt/meta/FileAPI/idlharness.worker.js.ini +++ b/tests/wpt/meta/FileAPI/idlharness.worker.js.ini @@ -1,9 +1,7 @@ [idlharness.worker.html] [Blob interface: operation text()] - expected: FAIL [Blob interface: operation arrayBuffer()] - expected: FAIL [FileReader interface: operation readAsBinaryString(Blob)] expected: FAIL diff --git a/tests/wpt/meta/dom/idlharness.window.js.ini b/tests/wpt/meta/dom/idlharness.window.js.ini index 3f173557cc7..6646a4b08c6 100644 --- a/tests/wpt/meta/dom/idlharness.window.js.ini +++ b/tests/wpt/meta/dom/idlharness.window.js.ini @@ -686,7 +686,6 @@ expected: FAIL [Document interface: operation exitFullscreen()] - expected: FAIL [Document interface: attribute fullscreenElement] expected: FAIL @@ -695,7 +694,6 @@ expected: FAIL [Element interface: operation requestFullscreen(optional FullscreenOptions)] - expected: FAIL [Element interface: attribute onfullscreenchange] expected: FAIL diff --git a/tests/wpt/meta/fetch/api/idlharness.any.js.ini b/tests/wpt/meta/fetch/api/idlharness.any.js.ini index ccd8fcfb044..04efb077b80 100644 --- a/tests/wpt/meta/fetch/api/idlharness.any.js.ini +++ b/tests/wpt/meta/fetch/api/idlharness.any.js.ini @@ -15,19 +15,14 @@ expected: FAIL [Request interface: operation arrayBuffer()] - expected: FAIL [Request interface: operation blob()] - expected: FAIL [Request interface: operation formData()] - expected: FAIL [Request interface: operation json()] - expected: FAIL [Request interface: operation text()] - expected: FAIL [Request interface: new Request('about:blank') must inherit property "keepalive" with the proper type] expected: FAIL @@ -48,25 +43,19 @@ expected: FAIL [Response interface: operation arrayBuffer()] - expected: FAIL [Response interface: operation blob()] - expected: FAIL [Response interface: operation formData()] - expected: FAIL [Response interface: operation json()] - expected: FAIL [Response interface: operation text()] - expected: FAIL [Response interface: calling json(any, optional ResponseInit) on new Response() with too few arguments must throw TypeError] expected: FAIL [WorkerGlobalScope interface: operation fetch(RequestInfo, optional RequestInit)] - expected: FAIL [WorkerGlobalScope interface: calling fetch(RequestInfo, optional RequestInit) on self with too few arguments must throw TypeError] @@ -103,19 +92,14 @@ expected: FAIL [Request interface: operation arrayBuffer()] - expected: FAIL [Request interface: operation blob()] - expected: FAIL [Request interface: operation formData()] - expected: FAIL [Request interface: operation json()] - expected: FAIL [Request interface: operation text()] - expected: FAIL [Request interface: new Request('about:blank') must inherit property "keepalive" with the proper type] expected: FAIL @@ -136,25 +120,19 @@ expected: FAIL [Response interface: operation arrayBuffer()] - expected: FAIL [Response interface: operation blob()] - expected: FAIL [Response interface: operation formData()] - expected: FAIL [Response interface: operation json()] - expected: FAIL [Response interface: operation text()] - expected: FAIL [Response interface: calling json(any, optional ResponseInit) on new Response() with too few arguments must throw TypeError] expected: FAIL [Window interface: operation fetch(RequestInfo, optional RequestInit)] - expected: FAIL [Window interface: calling fetch(RequestInfo, optional RequestInit) on window with too few arguments must throw TypeError] diff --git a/tests/wpt/meta/fullscreen/idlharness.window.js.ini b/tests/wpt/meta/fullscreen/idlharness.window.js.ini index ad41bb8d8b3..3722c848be9 100644 --- a/tests/wpt/meta/fullscreen/idlharness.window.js.ini +++ b/tests/wpt/meta/fullscreen/idlharness.window.js.ini @@ -6,7 +6,6 @@ expected: FAIL [Document interface: operation exitFullscreen()] - expected: FAIL [Document interface: attribute fullscreenElement] expected: FAIL @@ -15,7 +14,6 @@ expected: FAIL [Element interface: operation requestFullscreen(optional FullscreenOptions)] - expected: FAIL [Element interface: attribute onfullscreenchange] expected: FAIL diff --git a/tests/wpt/meta/gamepad/idlharness.window.js.ini b/tests/wpt/meta/gamepad/idlharness.window.js.ini index 577d82d9237..b81ea37d6f9 100644 --- a/tests/wpt/meta/gamepad/idlharness.window.js.ini +++ b/tests/wpt/meta/gamepad/idlharness.window.js.ini @@ -1,9 +1,7 @@ [idlharness.window.html] [GamepadHapticActuator interface: operation playEffect(GamepadHapticEffectType, optional GamepadEffectParameters)] - expected: FAIL [GamepadHapticActuator interface: operation reset()] - expected: FAIL [GamepadEvent must be primary interface of new GamepadEvent("gamepad")] expected: FAIL diff --git a/tests/wpt/meta/html/dom/idlharness.https.html.ini b/tests/wpt/meta/html/dom/idlharness.https.html.ini index b420542d544..5a661362c01 100644 --- a/tests/wpt/meta/html/dom/idlharness.https.html.ini +++ b/tests/wpt/meta/html/dom/idlharness.https.html.ini @@ -780,7 +780,6 @@ expected: FAIL [CustomElementRegistry interface: operation whenDefined(DOMString)] - expected: FAIL [DragEvent interface: existence and properties of interface object] expected: FAIL @@ -2950,7 +2949,6 @@ expected: FAIL [HTMLMediaElement interface: operation play()] - expected: FAIL [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "hspace" with the proper type] expected: FAIL @@ -3196,7 +3194,6 @@ expected: FAIL [HTMLImageElement interface: operation decode()] - expected: FAIL [HTMLTableRowElement interface: document.createElement("tr") must inherit property "vAlign" with the proper type] expected: FAIL diff --git a/tests/wpt/meta/webxr/hit-test/idlharness.https.html.ini b/tests/wpt/meta/webxr/hit-test/idlharness.https.html.ini index 83d6e65a501..fbf9094442c 100644 --- a/tests/wpt/meta/webxr/hit-test/idlharness.https.html.ini +++ b/tests/wpt/meta/webxr/hit-test/idlharness.https.html.ini @@ -6,7 +6,6 @@ expected: FAIL [XRSession interface: operation requestHitTestSource(XRHitTestOptionsInit)] - expected: FAIL [XRTransientInputHitTestResult interface: existence and properties of interface prototype object] expected: FAIL diff --git a/tests/wpt/meta/webxr/idlharness.https.window.js.ini b/tests/wpt/meta/webxr/idlharness.https.window.js.ini index 6ddabb68fd2..b4068207326 100644 --- a/tests/wpt/meta/webxr/idlharness.https.window.js.ini +++ b/tests/wpt/meta/webxr/idlharness.https.window.js.ini @@ -6,7 +6,6 @@ expected: FAIL [XRSystem interface: operation isSessionSupported(XRSessionMode)] - expected: FAIL [XRReferenceSpaceEvent interface: existence and properties of interface prototype object's @@unscopables property] expected: FAIL @@ -75,7 +74,6 @@ expected: FAIL [XRSystem interface: operation requestSession(XRSessionMode, optional XRSessionInit)] - expected: FAIL [XRReferenceSpaceEvent interface object name] expected: FAIL @@ -213,7 +211,6 @@ expected: FAIL [XRSession interface: operation requestReferenceSpace(XRReferenceSpaceType)] - expected: FAIL [XRWebGLLayer interface: xrWebGLLayer must inherit property "framebufferWidth" with the proper type] expected: FAIL @@ -264,7 +261,6 @@ expected: FAIL [XRSession interface: operation end()] - expected: FAIL [XRSession interface: xrSession must inherit property "cancelAnimationFrame(unsigned long)" with the proper type] expected: FAIL @@ -321,7 +317,6 @@ expected: FAIL [WebGLRenderingContext interface: operation makeXRCompatible()] - expected: FAIL [XRSession interface: attribute enabledFeatures] expected: FAIL diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 1192101b30f..449b8144545 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -13131,7 +13131,7 @@ ] ], "exceptionToRejection.any.js": [ - "738a8bedbcfe83a6f110bc6e6d133e31f80ea9ad", + "5d892832c29a4075751b313b3ba5c57d51cc19f3", [ "mozilla/exceptionToRejection.any.html", { diff --git a/tests/wpt/mozilla/tests/mozilla/exceptionToRejection.any.js b/tests/wpt/mozilla/tests/mozilla/exceptionToRejection.any.js index 738a8bedbcf..5d892832c29 100644 --- a/tests/wpt/mozilla/tests/mozilla/exceptionToRejection.any.js +++ b/tests/wpt/mozilla/tests/mozilla/exceptionToRejection.any.js @@ -30,3 +30,9 @@ promise_test((t) => { promise_test((t) => { return promise_rejects_js(t, TypeError, binding.methodInternalThrowToRejectPromise(Number.MAX_SAFE_INTEGER + 1)); }, "methodInternalThrowToRejectPromise"); + +promise_test((t) => { + return promise_rejects_js(t, TypeError, new Promise(() => { + throw new TypeError(); + })); +}, "exception in JS Promise"); |