Coverage Summary for Class: Window (kweb.html)

Class Method, % Branch, % Line, % Instruction, %
Window 50% (3/6) 50% (2/4) 66.7% (12/18) 71.9% (92/128)
Window$addEventListener$1 100% (1/1) 100% (2/2) 100% (2/2) 100% (8/8)
Window$addEventListener$eventObject$1 100% (1/1) 100% (1/1) 100% (4/4)
Total 62.5% (5/8) 66.7% (4/6) 71.4% (15/21) 74.3% (104/140)


 package kweb.html
 
 import kotlinx.serialization.json.JsonElement
 import kotlinx.serialization.json.JsonObject
 import kweb.*
 import kweb.html.events.Event
 import kweb.html.events.EventGenerator
 import kweb.html.events.OnImmediateReceiver
 import kweb.html.events.OnReceiver
 import kweb.util.json
 import kweb.util.random
 import kotlin.math.abs
 
 /**
  * Represents the in-browser Document Object Model, corresponding to the JavaScript
  * [document](https://www.w3schools.com/jsref/dom_obj_document.asp) object.
  *
  * Passed in as `window` to the `buildPage` receiver of the [Kweb] constructor.
  */
 class Window(override val browser: WebBrowser) : EventGenerator<Window> {
 
     override fun addImmediateEventCode(eventName: String, jsCode: String) {
         val wrappedJS = """
             return window.addEventListener({}, function(event) {
                 $jsCode
             });
         """.trimIndent()
         browser.callJsFunction(wrappedJS, eventName.json)
     }
 
     override fun addEventListener(eventName: String, returnEventFields: Set<String>, retrieveJs: String?, preventDefault : Boolean, callback: (JsonElement) -> Unit): Window {
         val callbackId = abs(random.nextInt())
         val retrieveJs = if (retrieveJs != null) ", \"retrieved\" : ($retrieveJs)" else ""
         val eventObject = "{" + returnEventFields.joinToString(separator = ", ") { "\"$it\" : event.$it" } + retrieveJs + "}"
         val js = """
             window.addEventListener({}, function(event) {
                 ${if (preventDefault) "event.preventDefault();" else ""}
                 callbackWs({}, $eventObject);
             });
             return true;
         """.trimIndent()
         browser.callJsFunctionWithCallback(js, callbackId, callback = { payload ->
             if (payload is JsonObject) {
                 callback.invoke(payload)
             }
         }, eventName.json, callbackId.json)
         return this
     }
 
     /**
      * See [here](https://docs.kweb.io/en/latest/dom.html#listening-for-events).
      */
     val on: OnReceiver<Window> get() = OnReceiver(this, preventDefault = false)
 
     /**
      * You can supply a javascript expression `retrieveJs` which will
      * be available via [Event.retrieved]
      */
     fun on(retrieveJs: String? = null, preventDefault: Boolean = false) = OnReceiver(this, retrieveJs, preventDefault)
 
     /**
      * See [here](https://docs.kweb.io/en/latest/dom.html#immediate-events).
      */
     val onImmediate get() = OnImmediateReceiver(this)
 }