1 use webcore::value::Reference; 2 use webcore::try_from::TryInto; 3 use webapi::event_target::EventTarget; 4 use webapi::event::{IEvent, IUiEvent, UiEvent, Event}; 5 use webapi::events::keyboard::{ModifierKey, get_event_modifier_state}; 6 7 /// The `IMouseEvent` interface represents events that occur due to the user 8 /// interacting with a pointing device (such as a mouse). 9 /// 10 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent) 11 // https://w3c.github.io/uievents/#mouseevent 12 pub trait IMouseEvent: IUiEvent { 13 /// Returns whether the Alt key was down when this event was fired. 14 /// 15 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/altKey) 16 // https://w3c.github.io/uievents/#ref-for-dom-mouseevent-altkey-1 17 #[inline] alt_key( &self ) -> bool18 fn alt_key( &self ) -> bool { 19 js!( 20 return @{self.as_ref()}.altKey; 21 ).try_into().unwrap() 22 } 23 24 /// Indicates the mouse button that fired this event. 25 /// 26 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button) 27 // https://w3c.github.io/uievents/#ref-for-dom-mouseevent-button-1 button( &self ) -> MouseButton28 fn button( &self ) -> MouseButton { 29 match js!( 30 return @{self.as_ref()}.button; 31 ).try_into().unwrap() { 32 0 => MouseButton::Left, 33 1 => MouseButton::Wheel, 34 2 => MouseButton::Right, 35 3 => MouseButton::Button4, 36 4 => MouseButton::Button5, 37 _ => unreachable!("Unexpected MouseEvent.button value"), 38 } 39 } 40 41 /// Indicates which mouse buttons were down when this event was fired. 42 /// 43 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons) 44 // https://w3c.github.io/uievents/#ref-for-dom-mouseevent-buttons-1 buttons( &self ) -> MouseButtonsState45 fn buttons( &self ) -> MouseButtonsState { 46 MouseButtonsState( 47 js!( 48 return @{self.as_ref()}.buttons; 49 ).try_into().unwrap() 50 ) 51 } 52 53 /// Returns the X position in the application's client area where this event occured. 54 /// 55 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/clientX) 56 // https://w3c.github.io/uievents/#ref-for-dom-mouseevent-clientx-2 57 #[inline] client_x( &self ) -> i3258 fn client_x( &self ) -> i32 { 59 js!( 60 return @{self.as_ref()}.clientX; 61 ).try_into().unwrap() 62 } 63 64 /// Returns the Y position in the application's client area where this event occured. 65 /// 66 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/clientY) 67 // https://w3c.github.io/uievents/#ref-for-dom-mouseevent-clienty-2 68 #[inline] client_y( &self ) -> i3269 fn client_y( &self ) -> i32 { 70 js!( 71 return @{self.as_ref()}.clientY; 72 ).try_into().unwrap() 73 } 74 75 /// Returns the X position on the target element where this event occured. 76 /// 77 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/offsetX) 78 // https://drafts.csswg.org/cssom-view/#ref-for-dom-mouseevent-offsetx 79 #[inline] offset_x( &self ) -> f6480 fn offset_x( &self ) -> f64 { 81 js!( 82 return @{self.as_ref()}.offsetX; 83 ).try_into().unwrap() 84 } 85 86 /// Returns the Y position on the target element where this event occured. 87 /// 88 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/offsetY) 89 // https://drafts.csswg.org/cssom-view/#ref-for-dom-mouseevent-offsety 90 #[inline] offset_y( &self ) -> f6491 fn offset_y( &self ) -> f64 { 92 js!( 93 return @{self.as_ref()}.offsetY; 94 ).try_into().unwrap() 95 } 96 97 /// Indicates whether the Ctrl key was down when this event fired. 98 /// 99 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/ctrlKey) 100 // https://w3c.github.io/uievents/#ref-for-dom-mouseevent-ctrlkey-1 101 #[inline] ctrl_key( &self ) -> bool102 fn ctrl_key( &self ) -> bool { 103 js!( 104 return @{self.as_ref()}.ctrlKey; 105 ).try_into().unwrap() 106 } 107 108 /// Returns the current state of the specified modifier key. 109 /// 110 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/getModifierState) 111 // https://w3c.github.io/uievents/#ref-for-dom-mouseevent-getmodifierstate-2 112 #[inline] get_modifier_state( &self, key: ModifierKey ) -> bool113 fn get_modifier_state( &self, key: ModifierKey ) -> bool { 114 get_event_modifier_state( self, key ) 115 } 116 117 /// Indicates whether the Meta key was down when this event fired. 118 /// 119 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/metaKey) 120 // https://w3c.github.io/uievents/#ref-for-dom-mouseevent-metakey-1 121 #[inline] meta_key( &self ) -> bool122 fn meta_key( &self ) -> bool { 123 js!( 124 return @{self.as_ref()}.metaKey; 125 ).try_into().unwrap() 126 } 127 128 /// Returns the change in X coordinate of the pointer between this event and the previous 129 /// MouseMove event. 130 /// 131 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/movementX) 132 // https://w3c.github.io/pointerlock/#extensions-to-the-mouseevent-interface 133 #[inline] movement_x( &self ) -> i32134 fn movement_x( &self ) -> i32 { 135 js!( 136 return @{self.as_ref()}.movementX; 137 ).try_into().unwrap() 138 } 139 140 /// Returns the change in Y coordinate of the pointer between this event and the previous 141 /// MouseMove event. 142 /// 143 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/movementX) 144 // https://w3c.github.io/pointerlock/#extensions-to-the-mouseevent-interface 145 #[inline] movement_y( &self ) -> i32146 fn movement_y( &self ) -> i32 { 147 js!( 148 return @{self.as_ref()}.movementY; 149 ).try_into().unwrap() 150 } 151 152 /// Returns the ID of the hit region affected by the event. 153 /// 154 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/region) 155 #[inline] region( &self ) -> Option< String >156 fn region( &self ) -> Option< String > { 157 js!( 158 return @{self.as_ref()}.region; 159 ).try_into().ok() 160 } 161 162 /// Returns the secondary target of this event, if any. 163 /// 164 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/relatedTarget) 165 // https://w3c.github.io/uievents/#ref-for-dom-mouseevent-relatedtarget-1 166 #[inline] related_target( &self ) -> Option< EventTarget >167 fn related_target( &self ) -> Option< EventTarget > { 168 js!( 169 return @{self.as_ref()}.relatedTarget; 170 ).try_into().ok() 171 } 172 173 /// Returns the X position of the pointer in screen coordinates. 174 /// 175 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/screenX) 176 // https://w3c.github.io/uievents/#ref-for-dom-mouseevent-screenx-1 177 #[inline] screen_x( &self ) -> i32178 fn screen_x( &self ) -> i32 { 179 js!( 180 return @{self.as_ref()}.screenX; 181 ).try_into().unwrap() 182 } 183 184 /// Returns the Y position of the pointer in screen coordinates. 185 /// 186 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/screenY) 187 // https://w3c.github.io/uievents/#ref-for-dom-mouseevent-screeny-1 188 #[inline] screen_y( &self ) -> i32189 fn screen_y( &self ) -> i32 { 190 js!( 191 return @{self.as_ref()}.screenY; 192 ).try_into().unwrap() 193 } 194 195 /// Indicates whether the Shift key was down when this event was fired. 196 /// 197 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/shiftKey) 198 // https://w3c.github.io/uievents/#ref-for-dom-mouseevent-shiftkey-1 199 #[inline] shift_key( &self ) -> bool200 fn shift_key( &self ) -> bool { 201 js!( 202 return @{self.as_ref()}.shiftKey; 203 ).try_into().unwrap() 204 } 205 } 206 207 /// Represents buttons on a mouse during mouse events. 208 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 209 pub enum MouseButton { 210 /// The left mouse button. 211 Left, 212 /// The mouse wheel/middle mouse button. 213 Wheel, 214 /// The right mouse button. 215 Right, 216 /// The fourth mouse button (browser back). 217 Button4, 218 /// The fifth mouse button (browser forward). 219 Button5, 220 // /// The sixth mouse button, or the Pen Eraser button 221 //TODO: Eraser, 222 } 223 224 /// Represents the state of mouse buttons in a `MouseEvent`. 225 #[derive(Copy, Clone, Debug, PartialEq, Eq)] 226 pub struct MouseButtonsState(u8); 227 228 impl MouseButtonsState { 229 /// Check if a [MouseButton](enum.MouseButton.html) is currently pressed is_down(&self, button: MouseButton) -> bool230 pub fn is_down(&self, button: MouseButton) -> bool { 231 match button { 232 MouseButton::Left => self.0 & 0b1 != 0, 233 MouseButton::Right => self.0 & 0b10 != 0, 234 MouseButton::Wheel => self.0 & 0b100 != 0, 235 MouseButton::Button4 => self.0 & 0b1000 != 0, 236 MouseButton::Button5 => self.0 & 0b1_0000 != 0, 237 } 238 } 239 } 240 241 /// A reference to a JavaScript object which implements the [IMouseEvent](trait.IMouseEvent.html) 242 /// interface. 243 /// 244 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent) 245 // https://w3c.github.io/uievents/#mouseevent 246 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 247 #[reference(instance_of = "MouseEvent")] 248 #[reference(subclass_of(Event, UiEvent))] 249 pub struct MouseEvent( Reference ); 250 251 impl IEvent for MouseEvent {} 252 impl IUiEvent for MouseEvent {} 253 impl IMouseEvent for MouseEvent {} 254 255 /// The `ClickEvent` is fired when a pointing device button (usually a 256 /// mouse's primary button) is pressed and released on a single element. 257 /// 258 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/click) 259 // https://w3c.github.io/uievents/#event-type-click 260 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 261 #[reference(instance_of = "MouseEvent")] 262 #[reference(event = "click")] 263 #[reference(subclass_of(Event, UiEvent, MouseEvent))] 264 pub struct ClickEvent( Reference ); 265 266 impl IEvent for ClickEvent {} 267 impl IUiEvent for ClickEvent {} 268 impl IMouseEvent for ClickEvent {} 269 270 /// The `AuxClickEvent` event is fired when a non-primary pointing device button 271 /// (e.g. any non-left mouse button) has been pressed and released on an element. 272 /// 273 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/auxclick) 274 // https://w3c.github.io/uievents/#event-type-auxclick 275 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 276 #[reference(instance_of = "MouseEvent")] 277 #[reference(event = "auxclick")] 278 #[reference(subclass_of(Event, UiEvent, MouseEvent))] 279 pub struct AuxClickEvent( Reference ); 280 281 impl IEvent for AuxClickEvent {} 282 impl IUiEvent for AuxClickEvent {} 283 impl IMouseEvent for AuxClickEvent {} 284 285 /// The `ContextMenuEvent` event is fired when the right button of the mouse is clicked 286 /// (before the context menu is displayed), or when the context menu key is pressed. 287 /// 288 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/contextmenu) 289 // https://html.spec.whatwg.org/#event-contextmenu 290 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 291 #[reference(instance_of = "MouseEvent")] 292 #[reference(event = "contextmenu")] 293 #[reference(subclass_of(Event, UiEvent, MouseEvent))] 294 pub struct ContextMenuEvent( Reference ); 295 296 impl IEvent for ContextMenuEvent {} 297 impl IUiEvent for ContextMenuEvent {} 298 impl IMouseEvent for ContextMenuEvent {} 299 300 /// The `DoubleClickEvent` is fired when a pointing device button 301 /// (usually a mouse's primary button) is clicked twice on a single 302 /// element. 303 /// 304 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/dblclick) 305 // https://w3c.github.io/uievents/#event-type-dblclick 306 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 307 #[reference(instance_of = "MouseEvent")] 308 #[reference(event = "dblclick")] 309 #[reference(subclass_of(Event, UiEvent, MouseEvent))] 310 pub struct DoubleClickEvent( Reference ); 311 312 impl IEvent for DoubleClickEvent {} 313 impl IUiEvent for DoubleClickEvent {} 314 impl IMouseEvent for DoubleClickEvent {} 315 316 /// The `MouseDownEvent` is fired when a pointing device button is pressed on 317 /// an element. 318 /// 319 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/mousedown) 320 // https://w3c.github.io/uievents/#event-type-mousedown 321 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 322 #[reference(instance_of = "MouseEvent")] 323 #[reference(event = "mousedown")] 324 #[reference(subclass_of(Event, UiEvent, MouseEvent))] 325 pub struct MouseDownEvent( Reference ); 326 327 impl IEvent for MouseDownEvent {} 328 impl IUiEvent for MouseDownEvent {} 329 impl IMouseEvent for MouseDownEvent {} 330 331 /// The `MouseUpEvent` is fired when a pointing device button is released 332 /// over an element. 333 /// 334 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/mouseup) 335 // https://w3c.github.io/uievents/#event-type-mouseup 336 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 337 #[reference(instance_of = "MouseEvent")] 338 #[reference(event = "mouseup")] 339 #[reference(subclass_of(Event, UiEvent, MouseEvent))] 340 pub struct MouseUpEvent( Reference ); 341 342 impl IEvent for MouseUpEvent {} 343 impl IUiEvent for MouseUpEvent {} 344 impl IMouseEvent for MouseUpEvent {} 345 346 /// The `MouseMoveEvent` is fired when a pointing device (usually a mouse) 347 /// is moved while over an element. 348 /// 349 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/mousemove) 350 // https://w3c.github.io/uievents/#event-type-mousemove 351 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 352 #[reference(instance_of = "MouseEvent")] 353 #[reference(event = "mousemove")] 354 #[reference(subclass_of(Event, UiEvent, MouseEvent))] 355 pub struct MouseMoveEvent( Reference ); 356 357 impl IEvent for MouseMoveEvent {} 358 impl IUiEvent for MouseMoveEvent {} 359 impl IMouseEvent for MouseMoveEvent {} 360 361 /// The `MouseOverEvent` is fired when a pointing device (usually a mouse) 362 /// is moved onto the element that has the listener attached or onto one of its children. 363 /// 364 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/mouseover) 365 // https://w3c.github.io/uievents/#event-type-mouseover 366 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 367 #[reference(instance_of = "MouseEvent")] 368 #[reference(event = "mouseover")] 369 #[reference(subclass_of(Event, UiEvent, MouseEvent))] 370 pub struct MouseOverEvent( Reference ); 371 372 impl IEvent for MouseOverEvent {} 373 impl IUiEvent for MouseOverEvent {} 374 impl IMouseEvent for MouseOverEvent {} 375 376 /// The `MouseOutEvent` is fired when a pointing device (usually a mouse) 377 /// is moved off the element that has the listener attached or off one of its children. 378 /// 379 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/mouseout) 380 // https://w3c.github.io/uievents/#event-type-mouseout 381 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 382 #[reference(instance_of = "MouseEvent")] 383 #[reference(event = "mouseout")] 384 #[reference(subclass_of(Event, UiEvent, MouseEvent))] 385 pub struct MouseOutEvent( Reference ); 386 387 impl IEvent for MouseOutEvent {} 388 impl IUiEvent for MouseOutEvent {} 389 impl IMouseEvent for MouseOutEvent {} 390 391 /// The `MouseEnterEvent` is fired when a pointing device (usually a mouse) 392 /// is moved over the element that has the listener attached. 393 /// 394 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/mouseenter) 395 // https://w3c.github.io/uievents/#event-type-mouseenter 396 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 397 #[reference(instance_of = "MouseEvent")] 398 #[reference(event = "mouseenter")] 399 #[reference(subclass_of(Event, UiEvent, MouseEvent))] 400 pub struct MouseEnterEvent( Reference ); 401 402 impl IEvent for MouseEnterEvent {} 403 impl IUiEvent for MouseEnterEvent {} 404 impl IMouseEvent for MouseEnterEvent {} 405 406 /// The `MouseLeaveEvent` is fired when a pointing device (usually a mouse) 407 /// is moved out of an element that has the listener attached to it. 408 /// 409 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/mouseleave) 410 // https://w3c.github.io/uievents/#event-type-mouseleave 411 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 412 #[reference(instance_of = "MouseEvent")] 413 #[reference(event = "mouseleave")] 414 #[reference(subclass_of(Event, UiEvent, MouseEvent))] 415 pub struct MouseLeaveEvent( Reference ); 416 417 impl IEvent for MouseLeaveEvent {} 418 impl IUiEvent for MouseLeaveEvent {} 419 impl IMouseEvent for MouseLeaveEvent {} 420 421 /// The `MouseWheelEvent` is fired when a pointing device's wheel button (usually a mousewheel) 422 /// is rotated over the element that has the listener attached. 423 /// 424 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/wheel) 425 // https://w3c.github.io/uievents/#event-type-wheel 426 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] 427 #[reference(instance_of = "MouseEvent")] 428 #[reference(event = "wheel")] 429 #[reference(subclass_of(Event, UiEvent, MouseEvent))] 430 pub struct MouseWheelEvent( Reference ); 431 432 impl IEvent for MouseWheelEvent {} 433 impl IUiEvent for MouseWheelEvent {} 434 impl IMouseEvent for MouseWheelEvent {} 435 436 impl MouseWheelEvent { 437 /// The change in X of the wheel 438 /// 439 /// [(Javascript docs)](https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent/deltaX) 440 // https://w3c.github.io/uievents/#dom-wheelevent-deltax delta_x(&self) -> f64441 pub fn delta_x(&self) -> f64 { 442 js! ( 443 return @{self}.deltaX; 444 ).try_into().unwrap() 445 } 446 447 /// The change in Y of the wheel 448 /// 449 /// [(Javascript docs)](https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent/deltaY) 450 // https://w3c.github.io/uievents/#dom-wheelevent-deltay delta_y(&self) -> f64451 pub fn delta_y(&self) -> f64 { 452 js! ( 453 return @{self}.deltaY; 454 ).try_into().unwrap() 455 } 456 457 /// The change in Z of the wheel 458 /// 459 /// [(Javascript docs)](https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent/deltaZ) 460 // https://w3c.github.io/uievents/#dom-wheelevent-deltaz delta_z(&self) -> f64461 pub fn delta_z(&self) -> f64 { 462 js! ( 463 return @{self}.deltaZ; 464 ).try_into().unwrap() 465 } 466 467 /// The unit of measure of change 468 /// 469 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent/deltaMode) 470 // https://w3c.github.io/uievents/#dom-wheelevent-deltamode delta_mode(&self) -> MouseWheelDeltaMode471 pub fn delta_mode(&self) -> MouseWheelDeltaMode { 472 let mode: u32 = js! ( 473 return @{self}.deltaMode; 474 ).try_into().unwrap(); 475 match mode { 476 0 => MouseWheelDeltaMode::Pixel, 477 1 => MouseWheelDeltaMode::Line, 478 2 => MouseWheelDeltaMode::Page, 479 _ => unreachable!() 480 } 481 } 482 } 483 484 /// What unit of measure the mouse wheel delta is in 485 /// 486 /// [(JavaScipt docs)](https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent/deltaMode) 487 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 488 pub enum MouseWheelDeltaMode { 489 /// The unit of measurement for the delta is pixels 490 // https://w3c.github.io/uievents/#dom-wheelevent-dom_delta_pixel 491 Pixel, 492 /// The unit of measurement for the delta is lines 493 // https://w3c.github.io/uievents/#dom-wheelevent-dom_delta_line 494 Line, 495 /// The unit of measurement for the delta is pages 496 // https://w3c.github.io/uievents/#dom-wheelevent-dom_delta_page 497 Page 498 } 499 500 #[cfg(all(test, feature = "web_test"))] 501 mod tests { 502 use super::*; 503 use webapi::event::ConcreteEvent; 504 505 #[test] test_mouse_event()506 fn test_mouse_event() { 507 let event: MouseEvent = js!( 508 return new MouseEvent( 509 @{ClickEvent::EVENT_TYPE}, 510 { 511 altKey: false, 512 button: 2, 513 buttons: 6, 514 clientX: 3, 515 clientY: 4, 516 ctrlKey: true, 517 metaKey: false, 518 screenX: 1, 519 screenY: 2, 520 shiftKey: true 521 } 522 ); 523 ).try_into().unwrap(); 524 assert_eq!( event.event_type(), ClickEvent::EVENT_TYPE ); 525 assert_eq!( event.alt_key(), false ); 526 assert_eq!( event.button(), MouseButton::Right ); 527 assert!( !event.buttons().is_down( MouseButton::Left ) ); 528 assert!( event.buttons().is_down( MouseButton::Right ) ); 529 assert!( event.buttons().is_down( MouseButton::Wheel ) ); 530 assert_eq!( event.client_x(), 3 ); 531 assert_eq!( event.client_y(), 4 ); 532 assert!( event.ctrl_key() ); 533 assert!( !event.get_modifier_state( ModifierKey::Alt ) ); 534 assert!( event.get_modifier_state( ModifierKey::Ctrl ) ); 535 assert!( event.get_modifier_state( ModifierKey::Shift ) ); 536 assert!( !event.meta_key() ); 537 assert_eq!( event.movement_x(), 0 ); 538 assert_eq!( event.movement_y(), 0 ); 539 assert!( event.region().is_none() ); 540 assert!( event.related_target().is_none() ); 541 assert_eq!( event.screen_x(), 1 ); 542 assert_eq!( event.screen_y(), 2 ); 543 assert!( event.shift_key() ); 544 } 545 546 #[test] test_click_event()547 fn test_click_event() { 548 let event: ClickEvent = js!( 549 return new MouseEvent( @{ClickEvent::EVENT_TYPE} ); 550 ).try_into().unwrap(); 551 assert_eq!( event.event_type(), ClickEvent::EVENT_TYPE ); 552 } 553 554 #[test] test_aux_click_event()555 fn test_aux_click_event() { 556 let event: AuxClickEvent = js!( 557 return new MouseEvent( @{AuxClickEvent::EVENT_TYPE} ); 558 ).try_into() 559 .unwrap(); 560 assert_eq!( event.event_type(), AuxClickEvent::EVENT_TYPE ); 561 } 562 563 #[test] test_context_menu_event()564 fn test_context_menu_event() { 565 let event: ContextMenuEvent = js!( 566 return new MouseEvent( @{ContextMenuEvent::EVENT_TYPE} ); 567 ).try_into().unwrap(); 568 assert_eq!( event.event_type(), ContextMenuEvent::EVENT_TYPE ); 569 } 570 571 #[test] test_double_click_event()572 fn test_double_click_event() { 573 let event: DoubleClickEvent = js!( 574 return new MouseEvent( @{DoubleClickEvent::EVENT_TYPE} ); 575 ).try_into().unwrap(); 576 assert_eq!( event.event_type(), DoubleClickEvent::EVENT_TYPE ); 577 } 578 579 #[test] test_mouse_down_event()580 fn test_mouse_down_event() { 581 let event: MouseDownEvent = js!( 582 return new MouseEvent( @{MouseDownEvent::EVENT_TYPE} ); 583 ).try_into().unwrap(); 584 assert_eq!( event.event_type(), MouseDownEvent::EVENT_TYPE ); 585 } 586 587 #[test] test_mouse_up_event()588 fn test_mouse_up_event() { 589 let event: MouseUpEvent = js!( 590 return new MouseEvent( @{MouseUpEvent::EVENT_TYPE} ); 591 ).try_into().unwrap(); 592 assert_eq!( event.event_type(), MouseUpEvent::EVENT_TYPE ); 593 } 594 595 #[test] test_mouse_move_event()596 fn test_mouse_move_event() { 597 let event: MouseMoveEvent = js!( 598 return new MouseEvent( @{MouseMoveEvent::EVENT_TYPE} ); 599 ).try_into().unwrap(); 600 assert_eq!( event.event_type(), MouseMoveEvent::EVENT_TYPE ); 601 } 602 603 #[test] test_mouse_over_event()604 fn test_mouse_over_event() { 605 let event: MouseOverEvent = js!( 606 return new MouseEvent( @{MouseOverEvent::EVENT_TYPE} ); 607 ).try_into().unwrap(); 608 assert_eq!( event.event_type(), MouseOverEvent::EVENT_TYPE ); 609 } 610 611 #[test] test_mouse_out_event()612 fn test_mouse_out_event() { 613 let event: MouseOutEvent = js!( 614 return new MouseEvent( @{MouseOutEvent::EVENT_TYPE} ); 615 ).try_into().unwrap(); 616 assert_eq!( event.event_type(), MouseOutEvent::EVENT_TYPE ); 617 } 618 619 #[test] test_mouse_enter_event()620 fn test_mouse_enter_event() { 621 let event: MouseEnterEvent = js!( 622 return new MouseEvent( @{MouseEnterEvent::EVENT_TYPE} ); 623 ).try_into() 624 .unwrap(); 625 assert_eq!( event.event_type(), MouseEnterEvent::EVENT_TYPE ); 626 } 627 628 #[test] test_mouse_leave_event()629 fn test_mouse_leave_event() { 630 let event: MouseLeaveEvent = js!( 631 return new MouseEvent( @{MouseLeaveEvent::EVENT_TYPE} ); 632 ).try_into() 633 .unwrap(); 634 assert_eq!( event.event_type(), MouseLeaveEvent::EVENT_TYPE ); 635 } 636 637 #[test] test_mouse_wheel_event()638 fn test_mouse_wheel_event() { 639 let event: MouseWheelEvent = js!( 640 return new MouseEvent( @{MouseWheelEvent::EVENT_TYPE} ); 641 ).try_into() 642 .unwrap(); 643 assert_eq!( event.event_type(), MouseWheelEvent::EVENT_TYPE ); 644 } 645 } 646