Skip to content
This repository was archived by the owner on Aug 10, 2024. It is now read-only.

Commit 6cb20ea

Browse files
committed
more receivers + caching
1 parent 6e5e01d commit 6cb20ea

File tree

1 file changed

+127
-4
lines changed
  • src/main/kotlin/com/github/sanity/kweb/dom/element/events

1 file changed

+127
-4
lines changed

src/main/kotlin/com/github/sanity/kweb/dom/element/events/ONReceiver.kt

+127-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.github.sanity.kweb.dom.element.Element
55
import com.github.sanity.kweb.dom.element.KWebDSL
66
import com.github.sanity.kweb.dom.element.modification.addEventListener
77
import com.github.sanity.kweb.gson
8+
import java.util.concurrent.ConcurrentHashMap
89
import kotlin.reflect.KClass
910
import kotlin.reflect.full.memberProperties
1011

@@ -28,34 +29,156 @@ open class ONReceiver(private val parent: Element) : Element(parent) {
2829
val shiftKey : Boolean, val locale : String,
2930
val isComposing : Boolean)
3031

32+
data class AnimationEvent(val type : String, val detail : Long,
33+
val animationName : String, val elapsedTime : Int)
34+
3135
fun event(eventName: String, returnEventFields: Set<String> = emptySet(), callback: (String) -> Unit): Element {
3236
parent.addEventListener(eventName, returnEventFields = returnEventFields, callback = callback)
3337
return parent
3438
}
3539

3640
inline fun <reified T : Any> event(eventName : String, eventType : KClass<T>, crossinline callback : (T)-> Unit) : Element {
3741
// TODO: Should probably cache this rather than do the reflection every time
38-
val eventPropertyNames = T::class.memberProperties.map {it.name}.toSet()
42+
val eventPropertyNames = Companion.memberProperties(eventType)
3943
return event(eventName, eventPropertyNames, {propertiesAsString ->
4044
val props : T = gson.fromJson(propertiesAsString)
4145
callback(props)
4246
})
4347
}
4448

49+
// Mouse Events
4550
fun click(callback: (MouseEvent) -> Unit) = event("click", eventType = MouseEvent::class, callback = callback)
46-
fun change(callback: (MouseEvent) -> Unit) = event("change", eventType = MouseEvent::class, callback = callback)
51+
fun contextmenu(callback: (MouseEvent) -> Unit) = event("contextmenu", eventType = MouseEvent::class, callback = callback)
52+
fun dblclick(callback: (MouseEvent) -> Unit) = event("dblclick", eventType = MouseEvent::class, callback = callback)
53+
fun mousedown(callback: (MouseEvent) -> Unit) = event("mousedown", eventType = MouseEvent::class, callback = callback)
54+
fun mouseenter(callback: (MouseEvent) -> Unit) = event("mouseenter", eventType = MouseEvent::class, callback = callback)
55+
fun mouseleave(callback: (MouseEvent) -> Unit) = event("mouseleave", eventType = MouseEvent::class, callback = callback)
56+
fun mousemove(callback: (MouseEvent) -> Unit) = event("mousemove", eventType = MouseEvent::class, callback = callback)
4757
fun mouseover(callback: (MouseEvent) -> Unit) = event("mouseover", eventType = MouseEvent::class, callback = callback)
4858
fun mouseout(callback: (MouseEvent) -> Unit) = event("mouseout", eventType = MouseEvent::class, callback = callback)
59+
fun mouseup(callback: (MouseEvent) -> Unit) = event("mouseup", eventType = MouseEvent::class, callback = callback)
4960

61+
// Keyboard Events
5062
fun keydown(callback: (KeyboardEvent) -> Unit) = event("keydown", eventType = KeyboardEvent::class, callback = callback)
5163
fun keypress(callback: (KeyboardEvent) -> Unit) = event("keypress", eventType = KeyboardEvent::class, callback = callback)
5264
fun keyup(callback: (KeyboardEvent) -> Unit) = event("keyup", eventType = KeyboardEvent::class, callback = callback)
5365

66+
// Frame / Object Events TODO: define eventtype
67+
fun abort(callback: (String) -> Unit) = event("abort", callback = callback)
68+
fun beforeunload(callback: (String) -> Unit) = event("beforeunload", callback = callback)
69+
fun error(callback: (String) -> Unit) = event("error", callback = callback)
70+
fun hashchange(callback: (String) -> Unit) = event("hashchange", callback = callback)
5471
fun load(callback: (String) -> Unit) = event("load", callback = callback)
72+
fun pageshow(callback: (String) -> Unit) = event("pageshow", callback = callback)
73+
fun pagehide(callback: (String) -> Unit) = event("pagehide", callback = callback)
74+
fun resize(callback: (String) -> Unit) = event("resize", callback = callback)
75+
fun scroll(callback: (String) -> Unit) = event("scroll", callback = callback)
76+
fun unload(callback: (String) -> Unit) = event("unload", callback = callback)
5577

78+
// Form Events TODO: define eventtype
79+
fun blur(callback: (String) -> Unit) = event("blur", callback = callback)
80+
fun change(callback: (String) -> Unit) = event("change", callback = callback)
5681
fun focus(callback: (String) -> Unit) = event("focus", callback = callback)
5782
fun focusin(callback: (String) -> Unit) = event("focusin", callback = callback)
5883
fun focusout(callback: (String) -> Unit) = event("focusout", callback = callback)
59-
fun blur(callback: (String) -> Unit) = event("blur", callback = callback)
60-
// TODO: Add the rest http://www.w3schools.com/jsref/dom_obj_event.asp
84+
fun input(callback: (String) -> Unit) = event("input", callback = callback)
85+
fun invalid(callback: (String) -> Unit) = event("invalid", callback = callback)
86+
fun reset(callback: (String) -> Unit) = event("reset", callback = callback)
87+
fun search(callback: (String) -> Unit) = event("search", callback = callback)
88+
fun select(callback: (String) -> Unit) = event("select", callback = callback)
89+
fun submit(callback: (String) -> Unit) = event("submit", callback = callback)
90+
91+
// Drag Events TODO: define eventtype
92+
fun drag(callback: (String) -> Unit) = event("drag", callback = callback)
93+
fun dragend(callback: (String) -> Unit) = event("dragend", callback = callback)
94+
fun dragenter(callback: (String) -> Unit) = event("dragenter", callback = callback)
95+
fun dragleave(callback: (String) -> Unit) = event("dragleave", callback = callback)
96+
fun dragover(callback: (String) -> Unit) = event("dragover", callback = callback)
97+
fun dragstart(callback: (String) -> Unit) = event("dragstart", callback = callback)
98+
fun drop(callback: (String) -> Unit) = event("drop", callback = callback)
99+
100+
// Clipboard Events TODO: define eventtype
101+
fun copy(callback: (String) -> Unit) = event("copy", callback = callback)
102+
fun cut(callback: (String) -> Unit) = event("cut", callback = callback)
103+
fun paste(callback: (String) -> Unit) = event("paste", callback = callback)
104+
105+
// Print Events TODO: define eventtype
106+
fun afterprint(callback: (String) -> Unit) = event("afterprint", callback = callback)
107+
fun beforeprint(callback: (String) -> Unit) = event("beforeprint", callback = callback)
108+
109+
// Media Events TODO: define eventtype
110+
/*
111+
/** The event occurs when the loading of a media is aborted **/
112+
fun abort(callback: (String) -> Unit) = event("abort", callback = callback)
113+
/** The event occurs when the browser can start playing the media (when it has buffered enough to begin) **/
114+
fun canplay(callback: (String) -> Unit) = event("canplay", callback = callback)
115+
/** The event occurs when the browser can play through the media without stopping for buffering **/
116+
fun canplaythrough(callback: (String) -> Unit) = event("canplaythrough", callback = callback)
117+
/** The event occurs when the duration of the media is changed **/
118+
fun durationchange(callback: (String) -> Unit) = event("durationchange", callback = callback)
119+
/** The event occurs when something bad happens and the media file is suddenly unavailable (like unexpectedly disconnects) **/
120+
fun emptied(callback: (String) -> Unit) = event("emptied", callback = callback)
121+
/** The event occurs when the media has reach the end (useful for messages like "thanks for listening") **/
122+
fun ended(callback: (String) -> Unit) = event("ended", callback = callback)
123+
/** The event occurs when an error occurred during the loading of a media file **/
124+
fun error(callback: (String) -> Unit) = event("error", callback = callback)
125+
/** The event occurs when media data is loaded **/
126+
fun loadeddata(callback: (String) -> Unit) = event("loadeddata", callback = callback)
127+
/** The event occurs when meta data (like dimensions and duration) are loaded **/
128+
fun loadedmetadata(callback: (String) -> Unit) = event("loadedmetadata", callback = callback)
129+
/** The event occurs when the browser starts looking for the specified media **/
130+
fun loadstart(callback: (String) -> Unit) = event("loadstart", callback = callback)
131+
/** The event occurs when the media is paused either by the user or programmatically **/
132+
fun pause(callback: (String) -> Unit) = event("pause", callback = callback)
133+
/** The event occurs when the media has been started or is no longer paused **/
134+
fun play(callback: (String) -> Unit) = event("play", callback = callback)
135+
/** The event occurs when the media is playing after having been paused or stopped for buffering **/
136+
fun playing(callback: (String) -> Unit) = event("playing", callback = callback)
137+
/** The event occurs when the browser is in the process of getting the media data (downloading the media) **/
138+
fun progress(callback: (String) -> Unit) = event("progress", callback = callback)
139+
/** The event occurs when the playing speed of the media is changed **/
140+
fun ratechange(callback: (String) -> Unit) = event("ratechange", callback = callback)
141+
/** The event occurs when the user is finished moving/skipping to a new position in the media **/
142+
fun seeked(callback: (String) -> Unit) = event("seeked", callback = callback)
143+
/** The event occurs when the user starts moving/skipping to a new position in the media **/
144+
fun seeking(callback: (String) -> Unit) = event("seeking", callback = callback)
145+
/** The event occurs when the browser is trying to get media data, but data is not available **/
146+
fun stalled(callback: (String) -> Unit) = event("stalled", callback = callback)
147+
/** The event occurs when the browser is intentionally not getting media data **/
148+
fun suspend(callback: (String) -> Unit) = event("suspend", callback = callback)
149+
/** The event occurs when the playing position has changed (like when the user fast forwards to a different point in the media) **/
150+
fun timeupdate(callback: (String) -> Unit) = event("timeupdate", callback = callback)
151+
/** The event occurs when the volume of the media has changed (includes setting the volume to "mute") **/
152+
fun volumechange(callback: (String) -> Unit) = event("volumechange", callback = callback)
153+
/** The event occurs when the media has paused but is expected to resume (like when the media pauses to buffer more data) **/
154+
fun waiting(callback: (String) -> Unit) = event("waiting", callback = callback)
155+
*/
156+
157+
// Animation Events
158+
/** The event occurs when a CSS animation has completed **/
159+
fun animationend(callback: (AnimationEvent) -> Unit) = event("animationend", callback = callback)
160+
/** The event occurs when a CSS animation is repeated **/
161+
fun animationiteration(callback: (AnimationEvent) -> Unit) = event("animationiteration", callback = callback)
162+
/** The event occurs when a CSS animation has started **/
163+
fun animationstart(callback: (AnimationEvent) -> Unit) = event("animationstart", callback = callback)
164+
165+
// Transition Events
166+
/** The event occurs when a CSS transition has completed **/
167+
fun transitionend(callback: (String) -> Unit) = event("transitionend", callback = callback)
168+
169+
/** TODO: Add more from https://www.w3schools.com/jsref/dom_obj_event.asp
170+
* Missing:
171+
* * Servert-Sent Events
172+
* * Misc Events
173+
* * Touch Events
174+
* *
175+
*/
176+
177+
178+
companion object {
179+
val memberPropertiesCache : ConcurrentHashMap<KClass<*>, Set<String>> = ConcurrentHashMap()
180+
inline fun <reified T:Any> memberProperties(clazz : KClass<T>) =
181+
memberPropertiesCache.get(clazz) ?:
182+
T::class.memberProperties.map {it.name}.toSet().also{ memberPropertiesCache.put(clazz,it) }
183+
}
61184
}

0 commit comments

Comments
 (0)