Skip to main content

script/dom/event/
closeevent.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::rust::HandleObject;
8use script_bindings::domstring::TracedDOMString;
9use script_bindings::reflector::reflect_dom_object_with_proto;
10use stylo_atoms::Atom;
11
12use crate::dom::bindings::codegen::Bindings::CloseEventBinding;
13use crate::dom::bindings::codegen::Bindings::CloseEventBinding::CloseEventMethods;
14use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods;
15use crate::dom::bindings::error::Fallible;
16use crate::dom::bindings::inheritance::Castable;
17use crate::dom::bindings::root::DomRoot;
18use crate::dom::bindings::str::DOMString;
19use crate::dom::event::{Event, EventBubbles, EventCancelable};
20use crate::dom::globalscope::GlobalScope;
21
22#[dom_struct]
23pub(crate) struct CloseEvent {
24    event: Event,
25    was_clean: bool,
26    code: u16,
27    reason: TracedDOMString,
28}
29
30#[expect(non_snake_case)]
31impl CloseEvent {
32    pub(crate) fn new_inherited(was_clean: bool, code: u16, reason: DOMString) -> CloseEvent {
33        CloseEvent {
34            event: Event::new_inherited(),
35            was_clean,
36            code,
37            reason: reason.traced(),
38        }
39    }
40
41    #[expect(clippy::too_many_arguments)]
42    pub(crate) fn new(
43        cx: &mut JSContext,
44        global: &GlobalScope,
45        type_: Atom,
46        bubbles: EventBubbles,
47        cancelable: EventCancelable,
48        wasClean: bool,
49        code: u16,
50        reason: DOMString,
51    ) -> DomRoot<CloseEvent> {
52        Self::new_with_proto(
53            cx, global, None, type_, bubbles, cancelable, wasClean, code, reason,
54        )
55    }
56
57    #[expect(clippy::too_many_arguments)]
58    fn new_with_proto(
59        cx: &mut JSContext,
60        global: &GlobalScope,
61        proto: Option<HandleObject>,
62        type_: Atom,
63        bubbles: EventBubbles,
64        cancelable: EventCancelable,
65        wasClean: bool,
66        code: u16,
67        reason: DOMString,
68    ) -> DomRoot<CloseEvent> {
69        let event = Box::new(CloseEvent::new_inherited(wasClean, code, reason));
70        let ev = reflect_dom_object_with_proto(cx, event, global, proto);
71        {
72            let event = ev.upcast::<Event>();
73            event.init_event(type_, bool::from(bubbles), bool::from(cancelable));
74        }
75        ev
76    }
77}
78
79impl CloseEventMethods<crate::DomTypeHolder> for CloseEvent {
80    /// <https://websockets.spec.whatwg.org/#the-closeevent-interface>
81    fn Constructor(
82        cx: &mut JSContext,
83        global: &GlobalScope,
84        proto: Option<HandleObject>,
85        type_: DOMString,
86        init: &CloseEventBinding::CloseEventInit,
87    ) -> Fallible<DomRoot<CloseEvent>> {
88        let bubbles = EventBubbles::from(init.parent.bubbles);
89        let cancelable = EventCancelable::from(init.parent.cancelable);
90        Ok(CloseEvent::new_with_proto(
91            cx,
92            global,
93            proto,
94            Atom::from(type_),
95            bubbles,
96            cancelable,
97            init.wasClean,
98            init.code,
99            init.reason.clone(),
100        ))
101    }
102
103    /// <https://websockets.spec.whatwg.org/#dom-closeevent-wasclean>
104    fn WasClean(&self) -> bool {
105        self.was_clean
106    }
107
108    /// <https://websockets.spec.whatwg.org/#dom-closeevent-code>
109    fn Code(&self) -> u16 {
110        self.code
111    }
112
113    /// <https://websockets.spec.whatwg.org/#dom-closeevent-reason>
114    fn Reason(&self) -> DOMString {
115        self.reason.clone().root()
116    }
117
118    /// <https://dom.spec.whatwg.org/#dom-event-istrusted>
119    fn IsTrusted(&self) -> bool {
120        self.event.IsTrusted()
121    }
122}