script/dom/event/
promiserejectionevent.rs1use dom_struct::dom_struct;
6use js::context::JSContext;
7use js::jsapi::{Heap, JSObject};
8use js::jsval::JSVal;
9use js::rust::{HandleObject, HandleValue, MutableHandleObject, MutableHandleValue};
10use script_bindings::reflector::reflect_dom_object_with_proto;
11use stylo_atoms::Atom;
12
13use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods;
14use crate::dom::bindings::codegen::Bindings::PromiseRejectionEventBinding;
15use crate::dom::bindings::codegen::Bindings::PromiseRejectionEventBinding::PromiseRejectionEventMethods;
16use crate::dom::bindings::error::Fallible;
17use crate::dom::bindings::inheritance::Castable;
18use crate::dom::bindings::root::DomRoot;
19use crate::dom::bindings::str::DOMString;
20use crate::dom::bindings::trace::RootedTraceableBox;
21use crate::dom::event::{Event, EventBubbles, EventCancelable};
22use crate::dom::globalscope::GlobalScope;
23use crate::dom::promise::Promise;
24
25#[dom_struct]
26pub(crate) struct PromiseRejectionEvent {
27 event: Event,
28 #[ignore_malloc_size_of = "Defined in mozjs"]
29 promise: Heap<*mut JSObject>,
30 #[ignore_malloc_size_of = "Defined in mozjs"]
31 reason: Heap<JSVal>,
32}
33
34impl PromiseRejectionEvent {
35 fn new_inherited() -> Self {
36 PromiseRejectionEvent {
37 event: Event::new_inherited(),
38 promise: Heap::default(),
39 reason: Heap::default(),
40 }
41 }
42
43 pub(crate) fn new(
44 cx: &mut JSContext,
45 global: &GlobalScope,
46 type_: Atom,
47 bubbles: EventBubbles,
48 cancelable: EventCancelable,
49 promise: &Promise,
50 reason: HandleValue,
51 ) -> DomRoot<Self> {
52 Self::new_with_proto(
53 cx,
54 global,
55 None,
56 type_,
57 bubbles,
58 cancelable,
59 promise.promise_obj(),
60 reason,
61 )
62 }
63
64 #[allow(clippy::too_many_arguments)]
65 fn new_with_proto(
66 cx: &mut JSContext,
67 global: &GlobalScope,
68 proto: Option<HandleObject>,
69 type_: Atom,
70 bubbles: EventBubbles,
71 cancelable: EventCancelable,
72 promise: HandleObject,
73 reason: HandleValue,
74 ) -> DomRoot<Self> {
75 let ev = reflect_dom_object_with_proto(
76 cx,
77 Box::new(PromiseRejectionEvent::new_inherited()),
78 global,
79 proto,
80 );
81 ev.promise.set(promise.get());
82
83 {
84 let event = ev.upcast::<Event>();
85 event.init_event(type_, bool::from(bubbles), bool::from(cancelable));
86
87 ev.reason.set(reason.get());
88 }
89 ev
90 }
91}
92
93impl PromiseRejectionEventMethods<crate::DomTypeHolder> for PromiseRejectionEvent {
94 fn Constructor(
96 cx: &mut JSContext,
97 global: &GlobalScope,
98 proto: Option<HandleObject>,
99 type_: DOMString,
100 init: RootedTraceableBox<PromiseRejectionEventBinding::PromiseRejectionEventInit>,
101 ) -> Fallible<DomRoot<Self>> {
102 let reason = init.reason.handle();
103 let bubbles = EventBubbles::from(init.parent.bubbles);
104 let cancelable = EventCancelable::from(init.parent.cancelable);
105
106 let event = PromiseRejectionEvent::new_with_proto(
107 cx,
108 global,
109 proto,
110 Atom::from(type_),
111 bubbles,
112 cancelable,
113 init.promise.handle(),
114 reason,
115 );
116 Ok(event)
117 }
118
119 fn Promise(&self, mut return_value: MutableHandleObject) {
121 return_value.set(self.promise.get());
122 }
123
124 fn Reason(&self, mut retval: MutableHandleValue) {
126 retval.set(self.reason.get())
127 }
128
129 fn IsTrusted(&self) -> bool {
131 self.event.IsTrusted()
132 }
133}