1 use webcore::value::Reference; 2 use webcore::try_from::TryInto; 3 use webapi::event::{IEvent, IUiEvent, UiEvent, Event}; 4 use webapi::touch::Touch; 5 6 /// The `ITouchEvent` interface represents events that occur due to the user 7 /// interacting with a touch device (such as a phone). 8 /// 9 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent) 10 // https://w3c.github.io/touch-events/#idl-def-touchevent 11 pub trait ITouchEvent: IUiEvent { 12 /// Returns whether the Alt key was down when this event was fired. 13 /// 14 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/altKey) 15 // https://w3c.github.io/touch-events/#touchevent-interface 16 #[inline] alt_key( &self ) -> bool17 fn alt_key( &self ) -> bool { 18 js!( 19 return @{self.as_ref()}.altKey; 20 ).try_into().unwrap() 21 } 22 23 /// Indicates whether the Ctrl key was down when this event fired. 24 /// 25 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/ctrlKey) 26 // https://w3c.github.io/touch-events/#touchevent-interface 27 #[inline] ctrl_key( &self ) -> bool28 fn ctrl_key( &self ) -> bool { 29 js!( 30 return @{self.as_ref()}.ctrlKey; 31 ).try_into().unwrap() 32 } 33 34 /// Indicates whether the Meta key was down when this event fired. 35 /// 36 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/metaKey) 37 // https://w3c.github.io/touch-events/#touchevent-interface 38 #[inline] meta_key( &self ) -> bool39 fn meta_key( &self ) -> bool { 40 js!( 41 return @{self.as_ref()}.metaKey; 42 ).try_into().unwrap() 43 } 44 45 /// Indicates whether the Shift key was down when this event was fired. 46 /// 47 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/shiftKey) 48 // https://w3c.github.io/touch-events/#touchevent-interface 49 #[inline] shift_key( &self ) -> bool50 fn shift_key( &self ) -> bool { 51 js!( 52 return @{self.as_ref()}.shiftKey; 53 ).try_into().unwrap() 54 } 55 56 /// A list of Touches for every point of contact currently touching the surface. 57 /// 58 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/touches) 59 // https://w3c.github.io/touch-events/#touchevent-interface 60 #[inline] touches( &self ) -> Vec<Touch>61 fn touches( &self ) -> Vec<Touch> { 62 js!( 63 return Array.from( @{self.as_ref()}.touches ); 64 ).try_into().unwrap() 65 } 66 67 /// A list of Touches for every point of contact that is touching the surface and started 68 /// on the element that is the target of the current event. 69 /// 70 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/targetTouches) 71 // https://w3c.github.io/touch-events/#touchevent-interface 72 #[inline] target_touches( &self ) -> Vec<Touch>73 fn target_touches( &self ) -> Vec<Touch> { 74 js!( 75 return Array.from( @{self.as_ref()}.targetTouches ); 76 ).try_into().unwrap() 77 } 78 79 /// A list of Touches, one for each touch touch point that just became active with the current event. 80 /// 81 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/changedTouches) 82 // https://w3c.github.io/touch-events/#touchevent-interface 83 #[inline] changed_touches( &self ) -> Vec<Touch>84 fn changed_touches( &self ) -> Vec<Touch> { 85 js!( 86 return Array.from( @{self.as_ref()}.changedTouches ); 87 ).try_into().unwrap() 88 } 89 } 90 91 92 /// A reference to a JavaScript object which implements the [ITouchEvent](trait.ITouchEvent.html) 93 /// interface. 94 /// 95 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent) 96 // https://w3c.github.io/touch-events/#idl-def-touchevent 97 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 98 #[reference(instance_of = "TouchEvent")] 99 #[reference(subclass_of(Event, UiEvent))] 100 pub struct TouchEvent( Reference ); 101 102 impl IEvent for TouchEvent {} 103 impl IUiEvent for TouchEvent {} 104 impl ITouchEvent for TouchEvent {} 105 106 /// The `TouchMove` is fired when one or more touch points are moved along the 107 /// touch surface. 108 /// 109 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/touchmove) 110 // https://w3c.github.io/touch-events/#event-touchmove 111 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 112 #[reference(instance_of = "TouchEvent")] 113 #[reference(event = "touchmove")] 114 #[reference(subclass_of(Event, UiEvent, TouchEvent))] 115 pub struct TouchMove( Reference ); 116 117 impl IEvent for TouchMove {} 118 impl IUiEvent for TouchMove {} 119 impl ITouchEvent for TouchMove {} 120 121 /// The `TouchLeave` event is fired when a touch point is moved off the 122 /// interactive area of an element. 123 /// 124 /// Warning: This event was a proposal in an early version of the specification 125 /// and has not been implemented. Do not rely on it. 126 /// 127 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/touchleave) 128 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 129 #[reference(instance_of = "TouchEvent")] 130 #[reference(event = "touchleave")] 131 #[reference(subclass_of(Event, UiEvent, TouchEvent))] 132 pub struct TouchLeave( Reference ); 133 134 impl IEvent for TouchLeave {} 135 impl IUiEvent for TouchLeave {} 136 impl ITouchEvent for TouchLeave {} 137 138 /// The `TouchEnter` event is fired when a touch point is moved onto the 139 /// interactive area of an element. 140 /// 141 /// Warning: This event was a proposal in an early version of the specification 142 /// and has not been implemented. Do not rely on it. 143 /// 144 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/touchenter) 145 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 146 #[reference(instance_of = "TouchEvent")] 147 #[reference(event = "touchenter")] 148 #[reference(subclass_of(Event, UiEvent, TouchEvent))] 149 pub struct TouchEnter( Reference ); 150 151 impl IEvent for TouchEnter {} 152 impl IUiEvent for TouchEnter {} 153 impl ITouchEvent for TouchEnter {} 154 155 /// The `TouchEnd` event is fired when one or more touch points are removed 156 /// from the touch surface. 157 /// 158 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/touchend) 159 // https://w3c.github.io/touch-events/#event-touchend 160 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 161 #[reference(instance_of = "TouchEvent")] 162 #[reference(event = "touchend")] 163 #[reference(subclass_of(Event, UiEvent, TouchEvent))] 164 pub struct TouchEnd( Reference ); 165 166 impl IEvent for TouchEnd {} 167 impl IUiEvent for TouchEnd {} 168 impl ITouchEvent for TouchEnd {} 169 170 /// The `TouchCancel` event is fired when one or more touch points have been 171 /// disrupted in an implementation-specific manner (for example, too many touch 172 /// points are created). 173 /// 174 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/touchcancel) 175 // https://w3c.github.io/touch-events/#event-touchcancel 176 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 177 #[reference(instance_of = "TouchEvent")] 178 #[reference(event = "touchcancel")] 179 #[reference(subclass_of(Event, UiEvent, TouchEvent))] 180 pub struct TouchCancel( Reference ); 181 182 impl IEvent for TouchCancel {} 183 impl IUiEvent for TouchCancel {} 184 impl ITouchEvent for TouchCancel {} 185 186 /// The `TouchStart` event is fired when one or more touch points are placed 187 /// on the touch surface. 188 /// 189 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/touchstart) 190 // https://w3c.github.io/touch-events/#event-touchstart 191 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 192 #[reference(instance_of = "TouchEvent")] 193 #[reference(event = "touchstart")] 194 #[reference(subclass_of(Event, UiEvent, TouchEvent))] 195 pub struct TouchStart( Reference ); 196 197 impl IEvent for TouchStart {} 198 impl IUiEvent for TouchStart {} 199 impl ITouchEvent for TouchStart {} 200 201 202 #[cfg(all(test, feature = "web_test"))] 203 mod tests { 204 use super::*; 205 use webapi::event::ConcreteEvent; 206 207 #[test] test_touch_event()208 fn test_touch_event() { 209 let event: TouchEvent = js!( 210 return new TouchEvent( 211 @{TouchMove::EVENT_TYPE}, 212 { 213 touches: [], 214 targetTouches: [], 215 changedTouches: [], 216 ctrlKey: true, 217 shiftKey: true, 218 altKey: true, 219 metaKey: true 220 } 221 ); 222 ).try_into().unwrap(); 223 assert_eq!( event.event_type(), TouchMove::EVENT_TYPE ); 224 assert!( event.ctrl_key() ); 225 assert!( event.alt_key() ); 226 assert!( event.shift_key() ); 227 assert!( event.meta_key() ); 228 assert_eq!( event.touches(), vec![] ); 229 assert_eq!( event.target_touches(), vec![] ); 230 assert_eq!( event.changed_touches(), vec![] ); 231 } 232 233 #[test] test_touch_move_event()234 fn test_touch_move_event() { 235 let event: TouchMove = js!( 236 return new TouchEvent( @{TouchMove::EVENT_TYPE} ); 237 ).try_into().unwrap(); 238 assert_eq!( event.event_type(), TouchMove::EVENT_TYPE ); 239 } 240 241 #[test] test_touch_leave_event()242 fn test_touch_leave_event() { 243 let event: TouchLeave = js!( 244 return new TouchEvent( @{TouchLeave::EVENT_TYPE} ); 245 ).try_into().unwrap(); 246 assert_eq!( event.event_type(), TouchLeave::EVENT_TYPE ); 247 } 248 249 250 #[test] test_touch_enter_event()251 fn test_touch_enter_event() { 252 let event: TouchEnter = js!( 253 return new TouchEvent( @{TouchEnter::EVENT_TYPE} ); 254 ).try_into().unwrap(); 255 assert_eq!( event.event_type(), TouchEnter::EVENT_TYPE ); 256 } 257 258 #[test] test_touch_end_event()259 fn test_touch_end_event() { 260 let event: TouchEnd = js!( 261 return new TouchEvent( @{TouchEnd::EVENT_TYPE} ); 262 ).try_into().unwrap(); 263 assert_eq!( event.event_type(), TouchEnd::EVENT_TYPE ); 264 } 265 266 #[test] test_touch_cancel_event()267 fn test_touch_cancel_event() { 268 let event: TouchCancel = js!( 269 return new TouchEvent( @{TouchCancel::EVENT_TYPE} ); 270 ).try_into().unwrap(); 271 assert_eq!( event.event_type(), TouchCancel::EVENT_TYPE ); 272 } 273 274 #[test] test_touch_start_event()275 fn test_touch_start_event() { 276 let event: TouchStart = js!( 277 return new TouchEvent( @{TouchStart::EVENT_TYPE} ); 278 ).try_into().unwrap(); 279 assert_eq!( event.event_type(), TouchStart::EVENT_TYPE ); 280 } 281 } 282