script/dom/event/
closeevent.rs1use 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 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 fn WasClean(&self) -> bool {
105 self.was_clean
106 }
107
108 fn Code(&self) -> u16 {
110 self.code
111 }
112
113 fn Reason(&self) -> DOMString {
115 self.reason.clone().root()
116 }
117
118 fn IsTrusted(&self) -> bool {
120 self.event.IsTrusted()
121 }
122}