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 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    /// <https://html.spec.whatwg.org/multipage/#promiserejectionevent>
95    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    /// <https://html.spec.whatwg.org/multipage/#dom-promiserejectionevent-promise>
120    fn Promise(&self, mut return_value: MutableHandleObject) {
121        return_value.set(self.promise.get());
122    }
123
124    /// <https://html.spec.whatwg.org/multipage/#dom-promiserejectionevent-reason>
125    fn Reason(&self, mut retval: MutableHandleValue) {
126        retval.set(self.reason.get())
127    }
128
129    /// <https://dom.spec.whatwg.org/#dom-event-istrusted>
130    fn IsTrusted(&self) -> bool {
131        self.event.IsTrusted()
132    }
133}