diff --git a/.travis.yml b/.travis.yml index 997812ea9..652bc5aa9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,23 +1,26 @@ sudo: false language: scala script: - - sbt ++$TRAVIS_SCALA_VERSION package doc + - sbt ++$TRAVIS_SCALA_VERSION package doc example/compile - sbt scalafmtTest - sbt ++2.11.11 readme/run scala: - 2.10.7 - 2.11.12 - - 2.12.4 + - 2.12.6 - 2.13.0-M3 + - 2.13.0-M4 jdk: - oraclejdk8 env: - - SCALAJS_VERSION=0.6.22 + - SCALAJS_VERSION=0.6.23 - SCALAJS_VERSION=1.0.0-M3 matrix: exclude: - scala: 2.10.7 env: SCALAJS_VERSION=1.0.0-M3 + - scala: 2.13.0-M4 + env: SCALAJS_VERSION=1.0.0-M3 cache: directories: diff --git a/build.sbt b/build.sbt index 733e2294c..4ef6c9047 100644 --- a/build.sbt +++ b/build.sbt @@ -6,8 +6,8 @@ lazy val root = project.in(file(".")). name := "Scala.js DOM" crossScalaVersions in ThisBuild := { - if (scalaJSVersion.startsWith("1.")) Seq("2.12.4", "2.11.12", "2.13.0-M3") - else Seq("2.12.4", "2.11.12", "2.10.7", "2.13.0-M3") + if (scalaJSVersion.startsWith("1.")) Seq("2.12.6", "2.11.12", "2.13.0-M3") + else Seq("2.12.6", "2.11.12", "2.10.7", "2.13.0-M3", "2.13.0-M4") } scalaVersion in ThisBuild := crossScalaVersions.value.head @@ -35,6 +35,25 @@ scalacOptions ++= { } } +def hasNewCollections(version: String): Boolean = { + !version.startsWith("2.10.") && + !version.startsWith("2.11.") && + !version.startsWith("2.12.") && + version != "2.13.0-M3" +} + +/** Returns the appropriate subdirectory of `sourceDir` depending on whether + * the `scalaV` uses the new collections (introduced in 2.13.0-M4) or not. + */ +def collectionsEraDependentDirectory(scalaV: String, sourceDir: File): File = + if (hasNewCollections(scalaV)) sourceDir / "scala-new-collections" + else sourceDir / "scala-old-collections" + +inConfig(Compile)(Def.settings( + unmanagedSourceDirectories += + collectionsEraDependentDirectory(scalaVersion.value, sourceDirectory.value) +)) + scalacOptions ++= { if (scalaJSVersion.startsWith("0.6.")) Seq("-P:scalajs:sjsDefinedByDefault") else Nil diff --git a/example/src/main/scala/example/Example.scala b/example/src/main/scala/example/Example.scala index 59afba8e6..ed0de17d6 100644 --- a/example/src/main/scala/example/Example.scala +++ b/example/src/main/scala/example/Example.scala @@ -169,7 +169,7 @@ object AjaxExtension { val url = "http://api.openweathermap.org/" + "data/2.5/weather?q=Singapore" - Ajax.get(url).onSuccess { case xhr => + Ajax.get(url).foreach { case xhr => pre.textContent = xhr.responseText } } diff --git a/project/build.sbt b/project/build.sbt index 6deea58ce..9c876b433 100644 --- a/project/build.sbt +++ b/project/build.sbt @@ -1,5 +1,5 @@ val scalaJSVersion = - Option(System.getenv("SCALAJS_VERSION")).getOrElse("0.6.22") + Option(System.getenv("SCALAJS_VERSION")).getOrElse("0.6.23") addSbtPlugin("org.scala-js" % "sbt-scalajs" % scalaJSVersion) diff --git a/src/main/scala-new-collections/org/scalajs/dom/ext/NamedNodeMapMap.scala b/src/main/scala-new-collections/org/scalajs/dom/ext/NamedNodeMapMap.scala new file mode 100644 index 000000000..0388f6fa2 --- /dev/null +++ b/src/main/scala-new-collections/org/scalajs/dom/ext/NamedNodeMapMap.scala @@ -0,0 +1,47 @@ +package org.scalajs.dom.ext + +import scala.collection.mutable + +import org.scalajs.dom._ + +class NamedNodeMapMap private[ext] (namedNodeMap: NamedNodeMap) + extends mutable.Map[String, Attr] { + self => + + override def iterator: Iterator[(String, Attr)] = { + new Iterator[(String, Attr)] { + private var index: Int = 0 + + override def next(): (String, Attr) = { + val n: Attr = namedNodeMap.item(index) + this.index = this.index + 1 + (n.name, n) + } + + override def hasNext: Boolean = index < namedNodeMap.length + } + } + + override def get(key: String): Option[Attr] = { + namedNodeMap.getNamedItem(key) match { + case null => None + case attr => Some(attr) + } + } + + def length: Int = namedNodeMap.length + + override def clear(): Unit = + keysIterator.toList.foreach(this -= _) + + override def addOne(kv: (String, Attr)): this.type = { + namedNodeMap.setNamedItem(kv._2) + this + } + + override def subtractOne(key: String): this.type = { + namedNodeMap.removeNamedItem(key) + this + } + +} diff --git a/src/main/scala-old-collections/org/scalajs/dom/ext/NamedNodeMapMap.scala b/src/main/scala-old-collections/org/scalajs/dom/ext/NamedNodeMapMap.scala new file mode 100644 index 000000000..2cb97444d --- /dev/null +++ b/src/main/scala-old-collections/org/scalajs/dom/ext/NamedNodeMapMap.scala @@ -0,0 +1,47 @@ +package org.scalajs.dom.ext + +import scala.collection.mutable + +import org.scalajs.dom._ + +class NamedNodeMapMap private[ext] (namedNodeMap: NamedNodeMap) + extends mutable.Map[String, Attr] { + self => + + override def iterator: Iterator[(String, Attr)] = { + new Iterator[(String, Attr)] { + private var index: Int = 0 + + override def next(): (String, Attr) = { + val n: Attr = namedNodeMap.item(index) + this.index = this.index + 1 + (n.name, n) + } + + override def hasNext: Boolean = index < namedNodeMap.length + } + } + + override def get(key: String): Option[Attr] = { + namedNodeMap.getNamedItem(key) match { + case null => None + case attr => Some(attr) + } + } + + def length: Int = namedNodeMap.length + + override def clear(): Unit = + keysIterator.toList.foreach(this -= _) + + override def +=(kv: (String, Attr)): this.type = { + namedNodeMap.setNamedItem(kv._2) + this + } + + override def -=(key: String): this.type = { + namedNodeMap.removeNamedItem(key) + this + } + +} diff --git a/src/main/scala/org/scalajs/dom/ext/Extensions.scala b/src/main/scala/org/scalajs/dom/ext/Extensions.scala index f3f514658..e5d0956e3 100644 --- a/src/main/scala/org/scalajs/dom/ext/Extensions.scala +++ b/src/main/scala/org/scalajs/dom/ext/Extensions.scala @@ -17,7 +17,9 @@ import org.scalajs.dom.raw.{Blob, KeyboardEvent} * Used to extend out javascript *Collections to make them usable as normal * Scala Seq[*]s */ -class EasySeq[T](jsLength: Int, jsApply: Int => T) extends Seq[T] { +class EasySeq[T](jsLength: Int, jsApply: Int => T) + extends scala.collection.Seq[T] { + def length = jsLength def apply(x: Int) = jsApply(x) diff --git a/src/main/scala/org/scalajs/dom/ext/package.scala b/src/main/scala/org/scalajs/dom/ext/package.scala index 49065373c..357d4e18c 100644 --- a/src/main/scala/org/scalajs/dom/ext/package.scala +++ b/src/main/scala/org/scalajs/dom/ext/package.scala @@ -73,44 +73,18 @@ package object ext { } } + implicit def pimpNamedNodeMap(namedNodeMap: NamedNodeMap): NamedNodeMapMap = + new NamedNodeMapMap(namedNodeMap) + /** * Implicit class to deal with attributes as with normal mutable Map * @param attributes */ - implicit class Attributes(attributes: NamedNodeMap) - extends mutable.Map[String, Attr] { self => - - override def iterator: Iterator[(String, Attr)] = { - new Iterator[(String, Attr)] { - var index = 0 - - override def next(): (String, Attr) = { - val n: Attr = attributes.item(index) - this.index = this.index + 1 - (n.name, n) - } - - override def hasNext: Boolean = index < self.length - } - } - - override def get(key: String): Option[Attr] = { - attributes.getNamedItem(key) match { - case null => None - case attr => Some(attr) - } - } + @deprecated("Use NamedNodeMapMap instead.", "0.9.6") + class Attributes(attributes: NamedNodeMap) + extends NamedNodeMapMap(attributes) - def length: Int = attributes.length.toInt - - override def -=(key: String) = { - attributes.removeNamedItem(key) - this - } - - override def +=(kv: (String, Attr)) = { - attributes.setNamedItem(kv._2) - this - } - } + @deprecated("Use pimpNamedNodeMap instead.", "0.9.6") + def Attributes(attributes: NamedNodeMap): Attributes = + new Attributes(attributes) }