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