script/dom/gamepad/
gamepadevent.rs1use dom_struct::dom_struct;
6use js::rust::HandleObject;
7use stylo_atoms::Atom;
8
9use super::gamepad::Gamepad;
10use crate::dom::bindings::codegen::Bindings::EventBinding::Event_Binding::EventMethods;
11use crate::dom::bindings::codegen::Bindings::GamepadEventBinding;
12use crate::dom::bindings::codegen::Bindings::GamepadEventBinding::GamepadEventMethods;
13use crate::dom::bindings::error::Fallible;
14use crate::dom::bindings::inheritance::Castable;
15use crate::dom::bindings::reflector::reflect_dom_object_with_proto;
16use crate::dom::bindings::root::{Dom, DomRoot};
17use crate::dom::bindings::str::DOMString;
18use crate::dom::event::Event;
19use crate::dom::window::Window;
20use crate::script_runtime::CanGc;
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 window: &Window,
43 type_: Atom,
44 bubbles: bool,
45 cancelable: bool,
46 gamepad: &Gamepad,
47 can_gc: CanGc,
48 ) -> DomRoot<GamepadEvent> {
49 Self::new_with_proto(window, None, type_, bubbles, cancelable, gamepad, can_gc)
50 }
51
52 fn new_with_proto(
53 window: &Window,
54 proto: Option<HandleObject>,
55 type_: Atom,
56 bubbles: bool,
57 cancelable: bool,
58 gamepad: &Gamepad,
59 can_gc: CanGc,
60 ) -> DomRoot<GamepadEvent> {
61 let ev = reflect_dom_object_with_proto(
62 Box::new(GamepadEvent::new_inherited(gamepad)),
63 window,
64 proto,
65 can_gc,
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 window: &Window,
76 event_type: GamepadEventType,
77 gamepad: &Gamepad,
78 can_gc: CanGc,
79 ) -> DomRoot<GamepadEvent> {
80 let name = match event_type {
81 GamepadEventType::Connected => "gamepadconnected",
82 GamepadEventType::Disconnected => "gamepaddisconnected",
83 };
84
85 GamepadEvent::new(window, name.into(), false, false, gamepad, can_gc)
86 }
87}
88
89impl GamepadEventMethods<crate::DomTypeHolder> for GamepadEvent {
90 fn Constructor(
92 window: &Window,
93 proto: Option<HandleObject>,
94 can_gc: CanGc,
95 type_: DOMString,
96 init: &GamepadEventBinding::GamepadEventInit,
97 ) -> Fallible<DomRoot<GamepadEvent>> {
98 Ok(GamepadEvent::new_with_proto(
99 window,
100 proto,
101 Atom::from(type_),
102 init.parent.bubbles,
103 init.parent.cancelable,
104 &init.gamepad,
105 can_gc,
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}