script/dom/event/
compositionevent.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, reflect_dom_object_with_proto};
10use style::Atom;
11
12use crate::dom::bindings::codegen::Bindings::CompositionEventBinding::{
13 self, CompositionEventMethods,
14};
15use crate::dom::bindings::codegen::Bindings::UIEventBinding::UIEvent_Binding::UIEventMethods;
16use crate::dom::bindings::error::Fallible;
17use crate::dom::bindings::root::DomRoot;
18use crate::dom::bindings::str::DOMString;
19use crate::dom::uievent::UIEvent;
20use crate::dom::window::Window;
21
22#[dom_struct]
23pub(crate) struct CompositionEvent {
24 uievent: UIEvent,
25 data: TracedDOMString,
26}
27
28impl CompositionEvent {
29 pub(crate) fn new_inherited() -> CompositionEvent {
30 CompositionEvent {
31 uievent: UIEvent::new_inherited(),
32 data: DOMString::new().traced(),
33 }
34 }
35
36 pub(crate) fn new_uninitialized(
37 cx: &mut JSContext,
38 window: &Window,
39 ) -> DomRoot<CompositionEvent> {
40 reflect_dom_object(cx, Box::new(CompositionEvent::new_inherited()), window)
41 }
42
43 #[expect(clippy::too_many_arguments)]
44 pub(crate) fn new(
45 cx: &mut JSContext,
46 window: &Window,
47 event_type: Atom,
48 can_bubble: bool,
49 cancelable: bool,
50 view: Option<&Window>,
51 detail: i32,
52 data: DOMString,
53 ) -> DomRoot<CompositionEvent> {
54 Self::new_with_proto(
55 cx, window, None, event_type, can_bubble, cancelable, view, detail, data,
56 )
57 }
58
59 #[expect(clippy::too_many_arguments)]
60 fn new_with_proto(
61 cx: &mut JSContext,
62 window: &Window,
63 proto: Option<HandleObject>,
64 event_type: Atom,
65 can_bubble: bool,
66 cancelable: bool,
67 view: Option<&Window>,
68 detail: i32,
69 data: DOMString,
70 ) -> DomRoot<CompositionEvent> {
71 let ev = reflect_dom_object_with_proto(
72 cx,
73 Box::new(CompositionEvent {
74 uievent: UIEvent::new_inherited(),
75 data: data.traced(),
76 }),
77 window,
78 proto,
79 );
80 ev.uievent
81 .init_event(event_type, can_bubble, cancelable, view, detail);
82 ev
83 }
84}
85
86impl CompositionEventMethods<crate::DomTypeHolder> for CompositionEvent {
87 fn Constructor(
89 cx: &mut JSContext,
90 window: &Window,
91 proto: Option<HandleObject>,
92 event_type: DOMString,
93 init: &CompositionEventBinding::CompositionEventInit,
94 ) -> Fallible<DomRoot<CompositionEvent>> {
95 let event = CompositionEvent::new_with_proto(
96 cx,
97 window,
98 proto,
99 event_type.into(),
100 init.parent.parent.bubbles,
101 init.parent.parent.cancelable,
102 init.parent.view.as_deref(),
103 init.parent.detail,
104 init.data.clone(),
105 );
106 Ok(event)
107 }
108
109 fn Data(&self) -> DOMString {
111 self.data.clone().root()
112 }
113
114 fn IsTrusted(&self) -> bool {
116 self.uievent.IsTrusted()
117 }
118}