diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 539635056d8..8c89653e336 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -19,11 +19,7 @@
-
-
-
-
-
+
diff --git a/js/js.libraries/src/core/dom.kt b/js/js.libraries/src/core/dom.kt
index 6516c9886c2..c2c4b53bee6 100644
--- a/js/js.libraries/src/core/dom.kt
+++ b/js/js.libraries/src/core/dom.kt
@@ -1,6 +1,8 @@
package org.w3c.dom
+
+
//
// NOTE THIS FILE IS AUTO-GENERATED by the GeneratedJavaScriptStubs.kt
// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib
diff --git a/js/js.libraries/src/core/domEvents.kt b/js/js.libraries/src/core/domEvents.kt
new file mode 100644
index 00000000000..9be0e3c1725
--- /dev/null
+++ b/js/js.libraries/src/core/domEvents.kt
@@ -0,0 +1,85 @@
+
+package org.w3c.dom.events
+
+import org.w3c.dom.*
+import org.w3c.dom.views.*
+
+
+//
+// NOTE THIS FILE IS AUTO-GENERATED by the GeneratedJavaScriptStubs.kt
+// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib
+//
+
+import js.noImpl
+
+// Contains stub APIs for the W3C DOM API so we can delegate to the platform DOM instead
+
+
+native public trait DocumentEvent {
+ public fun createEvent(arg1: String?): Event = js.noImpl
+}
+
+native public trait Event {
+ public val `type`: String
+ public val bubbles: Boolean
+ public val cancelable: Boolean
+ public val currentTarget: EventTarget
+ public val eventPhase: Short
+ public val target: EventTarget
+ public val timeStamp: Long
+ public fun stopPropagation(): Unit = js.noImpl
+ public fun preventDefault(): Unit = js.noImpl
+ public fun initEvent(arg1: String?, arg2: Boolean, arg3: Boolean): Unit = js.noImpl
+
+ public class object {
+ public val CAPTURING_PHASE: Short = 1
+ public val AT_TARGET: Short = 2
+ public val BUBBLING_PHASE: Short = 3
+ }
+}
+
+native public trait EventListener {
+ public fun handleEvent(arg1: Event): Unit = js.noImpl
+}
+
+native public trait EventTarget {
+ public fun dispatchEvent(arg1: Event): Boolean = js.noImpl
+ public fun addEventListener(arg1: String?, arg2: EventListener, arg3: Boolean): Unit = js.noImpl
+ public fun removeEventListener(arg1: String?, arg2: EventListener, arg3: Boolean): Unit = js.noImpl
+}
+
+native public trait MouseEvent: UIEvent {
+ public val altKey: Boolean
+ public val button: Short
+ public val clientX: Int
+ public val clientY: Int
+ public val ctrlKey: Boolean
+ public val metaKey: Boolean
+ public val relatedTarget: EventTarget
+ public val screenX: Int
+ public val screenY: Int
+ public val shiftKey: Boolean
+ public fun initMouseEvent(arg1: String?, arg2: Boolean, arg3: Boolean, arg4: AbstractView, arg5: Int, arg6: Int, arg7: Int, arg8: Int, arg9: Int, arg10: Boolean, arg11: Boolean, arg12: Boolean, arg13: Boolean, arg14: Short, arg15: EventTarget): Unit = js.noImpl
+}
+
+native public trait MutationEvent: Event {
+ public val attrChange: Short
+ public val attrName: String
+ public val newValue: String
+ public val prevValue: String
+ public val relatedNode: Node
+ public fun initMutationEvent(arg1: String?, arg2: Boolean, arg3: Boolean, arg4: Node, arg5: String?, arg6: String?, arg7: String?, arg8: Short): Unit = js.noImpl
+
+ public class object {
+ public val MODIFICATION: Short = 1
+ public val ADDITION: Short = 2
+ public val REMOVAL: Short = 3
+ }
+}
+
+native public trait UIEvent: Event {
+ public val detail: Int
+ public val view: AbstractView
+ public fun initUIEvent(arg1: String?, arg2: Boolean, arg3: Boolean, arg4: AbstractView, arg5: Int): Unit = js.noImpl
+}
+
diff --git a/js/js.libraries/src/core/domViews.kt b/js/js.libraries/src/core/domViews.kt
new file mode 100644
index 00000000000..3c719c56b78
--- /dev/null
+++ b/js/js.libraries/src/core/domViews.kt
@@ -0,0 +1,7 @@
+package org.w3c.dom.views
+
+import js.noImpl
+
+native public trait AbstractView {
+}
+
diff --git a/libraries/stdlib/src/kotlin/dom/DomEvents.kt b/libraries/stdlib/src/kotlin/dom/DomEvents.kt
new file mode 100644
index 00000000000..90f977999f5
--- /dev/null
+++ b/libraries/stdlib/src/kotlin/dom/DomEvents.kt
@@ -0,0 +1,50 @@
+package kotlin.dom
+
+import org.w3c.dom.Document
+import org.w3c.dom.Node
+import org.w3c.dom.events.*
+import java.io.Closeable
+
+
+fun eventHandler(eventType: Class, handler: (T) -> Unit): EventListener {
+ return object : EventListener {
+ public override fun handleEvent(e: Event?) {
+ if (e != null && eventType.isInstance(e)) {
+ handler(e as T)
+ }
+ }
+ }
+}
+
+/**
+ * Registers a handler on the named event
+ */
+public fun Node?.on(name: String, capture: Boolean, handler: (Event) -> Unit): Closeable? {
+ return on(name, capture, javaClass(), handler)
+}
+
+public fun Node?.on(name: String, capture: Boolean, eventType: Class, handler: (T) -> Unit): Closeable? {
+ return if (this is EventTarget) {
+ val target: EventTarget = this
+ val listener = eventHandler(eventType, handler)
+ target.addEventListener(name, listener, capture)
+ object: Closeable {
+ public override fun close() {
+ target.removeEventListener(name, listener, capture)
+ }
+
+ public override fun toString(): String? = "CloseableEventListener($target, $name)"
+ }
+ } else {
+ null
+ }
+}
+
+
+public fun Node?.onClick(capture: Boolean = false, handler: (MouseEvent) -> Unit): Closeable? {
+ return on("click", capture, javaClass(), handler)
+}
+
+public fun Node?.onDoubleClick(capture: Boolean = false, handler: (MouseEvent) -> Unit): Closeable? {
+ return on("dblclick", capture, javaClass(), handler)
+}
\ No newline at end of file
diff --git a/libraries/stdlib/src/kotlin/dom/DomEventsJVM.kt b/libraries/stdlib/src/kotlin/dom/DomEventsJVM.kt
new file mode 100644
index 00000000000..b978f47c77f
--- /dev/null
+++ b/libraries/stdlib/src/kotlin/dom/DomEventsJVM.kt
@@ -0,0 +1,58 @@
+package kotlin.dom
+
+import org.w3c.dom.Node
+import org.w3c.dom.events.*
+
+// JavaScript style properties for JVM : TODO could auto-generate these
+val Event.bubbles: Boolean
+ get() = getBubbles()
+
+val Event.cancelable: Boolean
+ get() = getCancelable()
+
+val Event.getCurrentTarget: EventTarget?
+ get() = getCurrentTarget()
+
+val Event.eventPhase: Short
+ get() = getEventPhase()
+
+val Event.target: EventTarget?
+ get() = getTarget()
+
+val Event.timeStamp: Long
+ get() = getTimeStamp()
+
+// TODO we can't use 'type' as the property name in Kotlin so we should fix it in JS
+val Event.eventType: String
+ get() = getType()!!
+
+
+val MouseEvent.altKey: Boolean
+ get() = getAltKey()
+
+val MouseEvent.button: Short
+ get() = getButton()
+
+val MouseEvent.clientX: Int
+ get() = getClientX()
+
+val MouseEvent.clientY: Int
+ get() = getClientY()
+
+val MouseEvent.ctrlKey: Boolean
+ get() = getCtrlKey()
+
+val MouseEvent.metaKey: Boolean
+ get() = getMetaKey()
+
+val MouseEvent.relatedTarget: EventTarget?
+ get() = getRelatedTarget()
+
+val MouseEvent.screenX: Int
+ get() = getScreenX()
+
+val MouseEvent.screenY: Int
+ get() = getScreenY()
+
+val MouseEvent.shiftKey: Boolean
+ get() = getShiftKey()
diff --git a/libraries/stdlib/src/kotlin/dom/DomJVM.kt b/libraries/stdlib/src/kotlin/dom/DomJVM.kt
index 42d402dad8c..b4b3a633749 100644
--- a/libraries/stdlib/src/kotlin/dom/DomJVM.kt
+++ b/libraries/stdlib/src/kotlin/dom/DomJVM.kt
@@ -1,5 +1,5 @@
/**
- * JVM specific API implementations using JAXB and so forth which would not be used when compiling to JS
+ * JVM specific API implementations using JAXP and so forth which would not be used when compiling to JS
*/
package kotlin.dom
@@ -19,6 +19,7 @@ import javax.xml.transform.stream.StreamResult
import org.w3c.dom.*
import org.xml.sax.InputSource
+// JavaScript style properties - TODO could auto-generate these
val Node.nodeName: String
get() = getNodeName() ?: ""
diff --git a/libraries/stdlib/test/org/jetbrains/kotlin/tools/GenerateJavaScriptStubs.kt b/libraries/stdlib/test/org/jetbrains/kotlin/tools/GenerateJavaScriptStubs.kt
index e0681dace5d..12dd837d0b6 100644
--- a/libraries/stdlib/test/org/jetbrains/kotlin/tools/GenerateJavaScriptStubs.kt
+++ b/libraries/stdlib/test/org/jetbrains/kotlin/tools/GenerateJavaScriptStubs.kt
@@ -8,16 +8,55 @@ import java.lang.reflect.Modifier
import java.util.ArrayList
import java.util.TreeMap
import org.w3c.dom.*
+import org.w3c.dom.events.*
+import java.util.List
/**
* This tool generates JavaScript stubs for classes available in the JDK which are already available in the browser environment
* such as the W3C DOM
*/
fun generateDomAPI(file: File): Unit {
+ val packageName = "org.w3c.dom"
+ val imports = ""
+
+ val classes: List> = arrayList(javaClass(), javaClass(),
+ javaClass(), javaClass(),
+ javaClass(), javaClass(), javaClass(),
+ javaClass(),
+ javaClass(), javaClass(),
+ javaClass(), javaClass(),
+ javaClass(),
+ javaClass(),
+ javaClass(),
+ javaClass(), javaClass(),
+ javaClass(), javaClass(), javaClass(), javaClass(),
+ javaClass(), javaClass(),
+ javaClass(), javaClass(),
+ javaClass())
+
+ writeClassesFile(file, packageName, imports, classes)
+}
+
+fun generateDomEventsAPI(file: File): Unit {
+ val packageName = "org.w3c.dom.events"
+ val imports = "import org.w3c.dom.*\nimport org.w3c.dom.views.*\n"
+
+
+ val classes: List> = arrayList(javaClass(), javaClass(),
+ javaClass(), javaClass(),
+ javaClass(), javaClass(),
+ javaClass())
+
+ writeClassesFile(file, packageName, imports, classes)
+}
+
+private fun writeClassesFile(file: File, packageName: String, imports: String, classes: List>): Unit {
write(file) {
println("""
-package org.w3c.dom
+package $packageName
+
+$imports
//
// NOTE THIS FILE IS AUTO-GENERATED by the GeneratedJavaScriptStubs.kt
@@ -30,20 +69,6 @@ import js.noImpl
""")
- val classes = arrayList(javaClass(), javaClass(),
- javaClass(), javaClass(),
- javaClass(), javaClass(), javaClass(),
- javaClass(),
- javaClass(), javaClass(),
- javaClass(), javaClass(),
- javaClass(),
- javaClass(),
- javaClass(),
- javaClass(), javaClass(),
- javaClass(), javaClass(), javaClass(), javaClass(),
- javaClass(), javaClass(),
- javaClass(), javaClass(),
- javaClass())
fun simpleTypeName(klass: Class?): String {
val answer = klass?.getSimpleName()?.capitalize() ?: "Unit"
diff --git a/libraries/stdlib/test/org/jetbrains/kotlin/tools/GenerateStandardLib.kt b/libraries/stdlib/test/org/jetbrains/kotlin/tools/GenerateStandardLib.kt
index 5ba4c53a9dd..e24f50ffff9 100644
--- a/libraries/stdlib/test/org/jetbrains/kotlin/tools/GenerateStandardLib.kt
+++ b/libraries/stdlib/test/org/jetbrains/kotlin/tools/GenerateStandardLib.kt
@@ -69,6 +69,7 @@ fun main(args: Array) {
val jsCoreDir = File(srcDir, "../../../../js/js.libraries/src/core")
require(jsCoreDir.exists())
generateDomAPI(File(jsCoreDir, "dom.kt"))
+ generateDomEventsAPI(File(jsCoreDir, "domEvents.kt"))
val otherArrayNames = arrayList("Boolean", "Byte", "Char", "Short", "Int", "Long", "Float", "Double")
diff --git a/libraries/tools/kotlin-js-library/pom.xml b/libraries/tools/kotlin-js-library/pom.xml
index 1fd4600c6d7..3356d82fbba 100644
--- a/libraries/tools/kotlin-js-library/pom.xml
+++ b/libraries/tools/kotlin-js-library/pom.xml
@@ -44,6 +44,9 @@
+
+
+