use crate::Node;
#[cfg(feature = "webdom")]
use {
crate::webdom,
wasm_bindgen::{prelude::*, JsCast},
web_sys as sys,
};
#[cfg(feature = "webdom")]
pub trait Event: AsRef<web_sys::Event> + JsCast {
const NAME: &'static str;
}
#[cfg(not(feature = "webdom"))]
pub trait Event {
const NAME: &'static str;
}
#[cfg(feature = "webdom")]
#[must_use]
pub struct EventHandle {
target: Option<web_sys::EventTarget>,
callback: webdom::Callback,
name: &'static str,
}
#[cfg(not(feature = "webdom"))]
#[doc(hidden)]
pub(crate) struct EventHandle;
impl EventHandle {
pub fn new<Ev>(_target: &Node, _callback: impl FnMut(Ev) + 'static) -> Self
where
Ev: Event,
{
#[cfg(not(feature = "webdom"))]
{
Self
}
#[cfg(feature = "webdom")]
{
let name = Ev::NAME;
let callback = webdom::Callback::new(_callback);
let target = match _target {
Node::Concrete(n) => {
let target: &web_sys::EventTarget = n.as_ref();
target
.add_event_listener_with_callback(name, callback.as_fn())
.unwrap();
Some(target.to_owned())
}
#[cfg(feature = "rsdom")]
_ => None,
};
Self {
target,
callback,
name,
}
}
}
}
#[cfg(feature = "webdom")]
impl Drop for EventHandle {
fn drop(&mut self) {
if let Some(target) = self.target.take() {
target
.remove_event_listener_with_callback(self.name, self.callback.as_fn())
.unwrap();
}
}
}
#[cfg(not(feature = "webdom"))]
macro_rules! event_ty {
($(#[$attr:meta])* $name:ident, $ty_str:expr, $parent_ty:ty) => {
$(#[$attr])*
pub struct $name;
impl Event for $name {
const NAME: &'static str = $ty_str;
}
};
}
#[cfg(feature = "webdom")]
macro_rules! event_ty {
($(#[$attr:meta])* $name:ident, $ty_str:expr, $parent_ty:ty) => {
$(#[$attr])*
#[wasm_bindgen]
pub struct $name($parent_ty);
impl AsRef<web_sys::Event> for $name {
fn as_ref(&self) -> &web_sys::Event {
self.0.as_ref()
}
}
impl AsRef<JsValue> for $name {
fn as_ref(&self) -> &JsValue {
self.0.as_ref()
}
}
impl std::ops::Deref for $name {
type Target = $parent_ty;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl JsCast for $name {
fn instanceof(val: &JsValue) -> bool {
<$parent_ty as JsCast>::instanceof(val)
}
fn unchecked_from_js(val: JsValue) -> Self {
$name(<$parent_ty as JsCast>::unchecked_from_js(val))
}
fn unchecked_from_js_ref(_val: &JsValue) -> &Self {
unimplemented!()
}
}
impl Event for $name {
const NAME: &'static str = $ty_str;
}
};
}
event_ty! {
Abort,
"abort",
sys::UiEvent
}
event_ty! {
AbortProgress,
"abort",
sys::ProgressEvent
}
event_ty! {
AbortTransaction,
"abort",
sys::Event
}
event_ty! {
AfterPrint,
"afterprint",
sys::Event
}
event_ty! {
AnimationCancel,
"animationcancel",
sys::AnimationEvent
}
event_ty! {
AnimationEnd,
"animationend",
sys::AnimationEvent
}
event_ty! {
AnimationIteration,
"animationiteration",
sys::AnimationEvent
}
event_ty! {
AnimationStart,
"animationstart",
sys::AnimationEvent
}
event_ty! {
AppInstalled,
"appinstalled",
sys::Event
}
event_ty! {
AudioProcess,
"audioprocess",
sys::AudioProcessingEvent
}
event_ty! {
AudioEnd,
"audioend",
sys::Event
}
event_ty! {
AudioStart,
"audiostart",
sys::Event
}
event_ty! {
BeforePrint,
"beforeprint",
sys::Event
}
event_ty! {
BeforeUnload,
"beforeunload",
sys::BeforeUnloadEvent
}
event_ty! {
SvgAnimationBegin,
"beginEvent",
sys::TimeEvent
}
event_ty! {
ConnectionBlocked,
"blocked",
sys::Event
}
event_ty! {
Blur,
"blur",
sys::FocusEvent
}
event_ty! {
SpeechBoundary,
"boundary",
sys::SpeechSynthesisEvent
}
event_ty! {
CanPlay,
"canplay",
sys::Event
}
event_ty! {
CanPlayThrough,
"canplaythrough",
sys::Event
}
event_ty! {
Change,
"change",
sys::Event
}
event_ty! {
ChargingChange,
"chargingchange",
sys::Event
}
event_ty! {
ChargingTime,
"chargingtimechange",
sys::Event
}
event_ty! {
Click,
"click",
sys::MouseEvent
}
event_ty! {
CloseWebsocket,
"close",
sys::Event
}
event_ty! {
AudioComplete,
"complete",
sys::OfflineAudioCompletionEvent
}
event_ty! {
CompositionEnd,
"compositionend",
sys::CompositionEvent
}
event_ty! {
CompositionStart,
"compositionstart",
sys::CompositionEvent
}
event_ty! {
CompositionUpdate,
"compositionupdate",
sys::CompositionEvent
}
event_ty! {
ContextMenu,
"contextmenu",
sys::MouseEvent
}
event_ty! {
Cp,
"copy",
sys::ClipboardEvent
}
event_ty! {
Cut,
"cut",
sys::ClipboardEvent
}
event_ty! {
DoubleClick,
"dblclick",
sys::MouseEvent
}
event_ty! {
DeviceChange,
"devicechange",
sys::Event
}
event_ty! {
DeviceMotion,
"devicemotion",
sys::DeviceMotionEvent
}
event_ty! {
DeviceOrientation,
"deviceorientation",
sys::DeviceOrientationEvent
}
event_ty! {
DischargingTime,
"dischargingtimechange",
sys::Event
}
event_ty! {
DomContentLoaded,
"DOMContentLoaded",
sys::Event
}
event_ty! {
Drag,
"drag",
sys::DragEvent
}
event_ty! {
DragEnd,
"dragend",
sys::DragEvent
}
event_ty! {
DragEnter,
"dragenter",
sys::DragEvent
}
event_ty! {
DragLeave,
"dragleave",
sys::DragEvent
}
event_ty! {
DragOver,
"dragover",
sys::DragEvent
}
event_ty! {
DragStart,
"dragstart",
sys::DragEvent
}
event_ty! {
Dropped,
"drop",
sys::DragEvent
}
event_ty! {
DurationChange,
"durationchange",
sys::Event
}
event_ty! {
Emptied,
"emptied",
sys::Event
}
event_ty! {
SpeechRecognitionEnd,
"end",
sys::Event
}
event_ty! {
SpeechSynthesisEnd,
"end",
sys::SpeechSynthesisEvent
}
event_ty! {
PlaybackEnded,
"ended",
sys::Event
}
event_ty! {
AudioEnded,
"ended",
sys::Event
}
event_ty! {
SvgAnimationEnd,
"endEvent",
sys::TimeEvent
}
event_ty! {
ResourceError,
"error",
sys::UiEvent
}
event_ty! {
ProgressError,
"error",
sys::ProgressEvent
}
event_ty! {
WebsocketError,
"error",
sys::Event
}
event_ty! {
EventSourceError,
"error",
sys::Event
}
event_ty! {
RequestError,
"error",
sys::Event
}
event_ty! {
SpeechRecognitionError,
"error",
sys::Event
}
event_ty! {
SpeechError,
"error",
sys::SpeechSynthesisErrorEvent
}
event_ty! {
Focus,
"focus",
sys::FocusEvent
}
event_ty! {
FocusIn,
"focusin",
sys::FocusEvent
}
event_ty! {
FocusOut,
"focusout",
sys::FocusEvent
}
event_ty! {
FullscreenChange,
"fullscreenchange",
sys::Event
}
event_ty! {
FullscreenError,
"fullscreenerror",
sys::Event
}
event_ty! {
GamepadConnected,
"gamepadconnected",
sys::GamepadEvent
}
event_ty! {
GamepadDisconnected,
"gamepaddisconnected",
sys::GamepadEvent
}
event_ty! {
GotPointerCapture,
"gotpointercapture",
sys::PointerEvent
}
event_ty! {
HashChange,
"hashchange",
sys::HashChangeEvent
}
event_ty! {
LostPointerCapture,
"lostpointercapture",
sys::PointerEvent
}
event_ty! {
Input,
"input",
sys::Event
}
event_ty! {
Invalid,
"invalid",
sys::Event
}
event_ty! {
KeyDown,
"keydown",
sys::KeyboardEvent
}
event_ty! {
KeyUp,
"keyup",
sys::KeyboardEvent
}
event_ty! {
LanguageChange,
"languagechange",
sys::Event
}
event_ty! {
LevelChange,
"levelchange",
sys::Event
}
event_ty! {
ResourceLoad,
"load",
sys::UiEvent
}
event_ty! {
ProgressLoad,
"load",
sys::ProgressEvent
}
event_ty! {
DataLoaded,
"loadeddata",
sys::Event
}
event_ty! {
MetadataLoaded,
"loadedmetadata",
sys::Event
}
event_ty! {
LoadEnd,
"loadend",
sys::ProgressEvent
}
event_ty! {
LoadStart,
"loadstart",
sys::ProgressEvent
}
event_ty! {
SpeechMark,
"mark",
sys::SpeechSynthesisEvent
}
event_ty! {
WebsocketMessage,
"message",
sys::MessageEvent
}
event_ty! {
WorkerMessage,
"message",
sys::MessageEvent
}
event_ty! {
ChildMessage,
"message",
sys::MessageEvent
}
event_ty! {
EventSourceMessage,
"message",
sys::MessageEvent
}
event_ty! {
MessageError,
"messageerror",
sys::MessageEvent
}
event_ty! {
ServiceWorkerMessage,
"message",
sys::MessageEvent
}
event_ty! {
MouseDown,
"mousedown",
sys::MouseEvent
}
event_ty! {
MouseEnter,
"mouseenter",
sys::MouseEvent
}
event_ty! {
MouseLeave,
"mouseleave",
sys::MouseEvent
}
event_ty! {
MouseMove,
"mousemove",
sys::MouseEvent
}
event_ty! {
MouseOut,
"mouseout",
sys::MouseEvent
}
event_ty! {
MouseOver,
"mouseover",
sys::MouseEvent
}
event_ty! {
MouseUp,
"mouseup",
sys::MouseEvent
}
event_ty! {
SpeechRecognitionNoMatch,
"nomatch",
sys::SpeechRecognitionEvent
}
event_ty! {
NotificationClick,
"notificationclick",
sys::NotificationEvent
}
event_ty! {
Offline,
"offline",
sys::Event
}
event_ty! {
Online,
"online",
sys::Event
}
event_ty! {
WebsocketOpen,
"open",
sys::Event
}
event_ty! {
EventSourceOpen,
"open",
sys::Event
}
event_ty! {
OrientationChange,
"orientationchange",
sys::Event
}
event_ty! {
PageHide,
"pagehide",
sys::PageTransitionEvent
}
event_ty! {
PageShow,
"pageshow",
sys::PageTransitionEvent
}
event_ty! {
Paste,
"paste",
sys::ClipboardEvent
}
event_ty! {
Pause,
"pause",
sys::Event
}
event_ty! {
SpeechPause,
"pause",
sys::SpeechSynthesisEvent
}
event_ty! {
PointerCancel,
"pointercancel",
sys::PointerEvent
}
event_ty! {
PointerDown,
"pointerdown",
sys::PointerEvent
}
event_ty! {
PointerEnter,
"pointerenter",
sys::PointerEvent
}
event_ty! {
PointerLeave,
"pointerleave",
sys::PointerEvent
}
event_ty! {
PointerLockChange,
"pointerlockchange",
sys::Event
}
event_ty! {
PointerLockError,
"pointerlockerror",
sys::Event
}
event_ty! {
PointerMove,
"pointermove",
sys::PointerEvent
}
event_ty! {
PointerOut,
"pointerout",
sys::PointerEvent
}
event_ty! {
PointerOver,
"pointerover",
sys::PointerEvent
}
event_ty! {
PointerUp,
"pointerup",
sys::PointerEvent
}
event_ty! {
Play,
"play",
sys::Event
}
event_ty! {
Playing,
"playing",
sys::Event
}
event_ty! {
PopState,
"popstate",
sys::PopStateEvent
}
event_ty! {
Progress,
"progress",
sys::ProgressEvent
}
event_ty! {
Push,
"push",
sys::PushEvent
}
event_ty! {
PushSubscriptionChange,
"pushsubscriptionchange",
sys::PushEvent
}
event_ty! {
PlaybackRateChange,
"ratechange",
sys::Event
}
event_ty! {
ReadyStateChange,
"readystatechange",
sys::Event
}
event_ty! {
AnimationRepeat,
"repeatEvent",
sys::TimeEvent
}
event_ty! {
FormReset,
"reset",
sys::Event
}
event_ty! {
ViewResize,
"resize",
sys::UiEvent
}
event_ty! {
TimingBufferFull,
"resourcetimingbufferfull",
sys::Event
}
event_ty! {
SpeechRecognitionResult,
"result",
sys::SpeechRecognitionEvent
}
event_ty! {
SpeechResume,
"resume",
sys::SpeechSynthesisEvent
}
event_ty! {
Scroll,
"scroll",
sys::UiEvent
}
event_ty! {
Seeked,
"seeked",
sys::Event
}
event_ty! {
Seeking,
"seeking",
sys::Event
}
event_ty! {
Select,
"select",
sys::UiEvent
}
event_ty! {
SelectionStart,
"selectstart",
sys::Event
}
event_ty! {
SelectionChange,
"selectionchange",
sys::Event
}
event_ty! {
ContextMenuShow,
"show",
sys::MouseEvent
}
event_ty! {
SlotChange,
"slotchange",
sys::Event
}
event_ty! {
SoundEnd,
"sounded",
sys::Event
}
event_ty! {
SoundStart,
"soundstart",
sys::Event
}
event_ty! {
SpeechEnd,
"speechend",
sys::Event
}
event_ty! {
Stalled,
"stalled",
sys::Event
}
event_ty! {
SpeechRecognitionStart,
"start",
sys::Event
}
event_ty! {
SpeechRecognized,
"speechstart",
sys::Event
}
event_ty! {
Storage,
"storage",
sys::StorageEvent
}
event_ty! {
Submit,
"submit",
sys::Event
}
event_ty! {
Success,
"success",
sys::Event
}
event_ty! {
Suspend,
"suspend",
sys::Event
}
event_ty! {
SvgAbort,
"SVGAbort",
sys::Event
}
event_ty! {
SvgError,
"SVGError",
sys::Event
}
event_ty! {
SvgLoad,
"SVGLoad",
sys::Event
}
event_ty! {
SvgResize,
"SVGResize",
sys::Event
}
event_ty! {
SvgScroll,
"SVGScroll",
sys::Event
}
event_ty! {
SvgUnload,
"SVGUnload",
sys::Event
}
event_ty! {
SvgZoom,
"SVGZoom",
sys::Event
}
event_ty! {
Timeout,
"timeout",
sys::ProgressEvent
}
event_ty! {
TimeUpdate,
"timeupdate",
sys::Event
}
event_ty! {
TouchCancel,
"touchcancel",
sys::TouchEvent
}
event_ty! {
TouchEnd,
"touchend",
sys::TouchEvent
}
event_ty! {
TouchMove,
"touchmove",
sys::TouchEvent
}
event_ty! {
TouchStart,
"touchstart",
sys::TouchEvent
}
event_ty! {
Unload,
"unload",
sys::UiEvent
}
event_ty! {
VisibilityChange,
"visibilitychange",
sys::Event
}
event_ty! {
VolumeChange,
"volumechange",
sys::Event
}
event_ty! {
Waiting,
"waiting",
sys::Event
}
event_ty! {
Wheel,
"wheel",
sys::WheelEvent
}
event_ty! {
TransitionEnd,
"transitionend",
sys::TransitionEvent
}
event_ty! {
UpgradeNeeded,
"upgradeneeded",
sys::Event
}
event_ty! {
UserProximity,
"userproximity",
sys::UserProximityEvent
}
event_ty! {
VoicesChanged,
"voiceschanged",
sys::Event
}
event_ty! {
TransactionVersionChange,
"versionchange",
sys::Event
}
event_ty! {
TransactionComplete,
"complete",
sys::Event
}
event_ty! {
SpeechStart,
"start",
sys::SpeechSynthesisEvent
}