Skip to main content

script/dom/event/
promiserejectionevent.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use 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    /// <https://html.spec.whatwg.org/multipage/#promiserejectionevent>
97    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    /// <https://html.spec.whatwg.org/multipage/#dom-promiserejectionevent-promise>
122    fn Promise(&self, mut return_value: MutableHandleObject) {
123        return_value.set(self.promise.get());
124    }
125
126    /// <https://html.spec.whatwg.org/multipage/#dom-promiserejectionevent-reason>
127    fn Reason(&self, mut retval: MutableHandleValue) {
128        retval.set(self.reason.get())
129    }
130
131    /// <https://dom.spec.whatwg.org/#dom-event-istrusted>
132    fn IsTrusted(&self) -> bool {
133        self.event.IsTrusted()
134    }
135}