script/dom/gamepad/
gamepadevent.rs1use dom_struct::dom_struct;
6use js::context::JSContext;
7use js::rust::HandleObject;
8use script_bindings::reflector::reflect_dom_object_with_proto_and_cx;
9use stylo_atoms::Atom;
10
11use super::gamepad::Gamepad;
12use crate::dom::bindings::codegen::Bindings::EventBinding::Event_Binding::EventMethods;
13use crate::dom::bindings::codegen::Bindings::GamepadEventBinding;
14use crate::dom::bindings::codegen::Bindings::GamepadEventBinding::GamepadEventMethods;
15use crate::dom::bindings::error::Fallible;
16use crate::dom::bindings::inheritance::Castable;
17use crate::dom::bindings::root::{Dom, DomRoot};
18use crate::dom::bindings::str::DOMString;
19use crate::dom::event::Event;
20use crate::dom::window::Window;
21
22#[dom_struct]
23pub(crate) struct GamepadEvent {
24 event: Event,
25 gamepad: Dom<Gamepad>,
26}
27
28pub(crate) enum GamepadEventType {
29 Connected,
30 Disconnected,
31}
32
33impl GamepadEvent {
34 fn new_inherited(gamepad: &Gamepad) -> GamepadEvent {
35 GamepadEvent {
36 event: Event::new_inherited(),
37 gamepad: Dom::from_ref(gamepad),
38 }
39 }
40
41 pub(crate) fn new(
42 cx: &mut JSContext,
43 window: &Window,
44 type_: Atom,
45 bubbles: bool,
46 cancelable: bool,
47 gamepad: &Gamepad,
48 ) -> DomRoot<GamepadEvent> {
49 Self::new_with_proto(cx, window, None, type_, bubbles, cancelable, gamepad)
50 }
51
52 fn new_with_proto(
53 cx: &mut JSContext,
54 window: &Window,
55 proto: Option<HandleObject>,
56 type_: Atom,
57 bubbles: bool,
58 cancelable: bool,
59 gamepad: &Gamepad,
60 ) -> DomRoot<GamepadEvent> {
61 let ev = reflect_dom_object_with_proto_and_cx(
62 Box::new(GamepadEvent::new_inherited(gamepad)),
63 window,
64 proto,
65 cx,
66 );
67 {
68 let event = ev.upcast::<Event>();
69 event.init_event(type_, bubbles, cancelable);
70 }
71 ev
72 }
73
74 pub(crate) fn new_with_type(
75 cx: &mut JSContext,
76 window: &Window,
77 event_type: GamepadEventType,
78 gamepad: &Gamepad,
79 ) -> DomRoot<GamepadEvent> {
80 let name = match event_type {
81 GamepadEventType::Connected => "gamepadconnected",
82 GamepadEventType::Disconnected => "gamepaddisconnected",
83 };
84
85 GamepadEvent::new(cx, window, name.into(), false, false, gamepad)
86 }
87}
88
89impl GamepadEventMethods<crate::DomTypeHolder> for GamepadEvent {
90 fn Constructor(
92 cx: &mut JSContext,
93 window: &Window,
94 proto: Option<HandleObject>,
95 type_: DOMString,
96 init: &GamepadEventBinding::GamepadEventInit,
97 ) -> Fallible<DomRoot<GamepadEvent>> {
98 Ok(GamepadEvent::new_with_proto(
99 cx,
100 window,
101 proto,
102 Atom::from(type_),
103 init.parent.bubbles,
104 init.parent.cancelable,
105 &init.gamepad,
106 ))
107 }
108
109 fn Gamepad(&self) -> DomRoot<Gamepad> {
111 DomRoot::from_ref(&*self.gamepad)
112 }
113
114 fn IsTrusted(&self) -> bool {
116 self.event.IsTrusted()
117 }
118}