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;
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::{
14 GamepadEventInit, GamepadEventMethods,
15};
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: Option<Dom<Gamepad>>,
26}
27
28pub(crate) enum GamepadEventType {
29 Connected,
30 Disconnected,
31}
32
33impl GamepadEvent {
34 fn new_inherited(gamepad: Option<&Gamepad>) -> GamepadEvent {
35 GamepadEvent {
36 event: Event::new_inherited(),
37 gamepad: gamepad.map(Dom::from_ref),
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: Option<&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: Option<&Gamepad>,
60 ) -> DomRoot<GamepadEvent> {
61 let ev = reflect_dom_object_with_proto(
62 cx,
63 Box::new(GamepadEvent::new_inherited(gamepad)),
64 window,
65 proto,
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, Some(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: &GamepadEventInit,
97 ) -> DomRoot<GamepadEvent> {
98 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.as_deref(),
106 )
107 }
108
109 fn GetGamepad(&self) -> Option<DomRoot<Gamepad>> {
111 self.gamepad.as_deref().map(DomRoot::from_ref)
112 }
113
114 fn IsTrusted(&self) -> bool {
116 self.event.IsTrusted()
117 }
118}