Skip to main content

script/dom/event/
compositionevent.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, 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    /// <https://w3c.github.io/uievents/#dom-compositionevent-compositionevent>
88    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    /// <https://w3c.github.io/uievents/#dom-compositionevent-data>
110    fn Data(&self) -> DOMString {
111        self.data.clone().root()
112    }
113
114    /// <https://dom.spec.whatwg.org/#dom-event-istrusted>
115    fn IsTrusted(&self) -> bool {
116        self.uievent.IsTrusted()
117    }
118}