Skip to content

Commit 8208d79

Browse files
author
Li Haoyi
committed
Reorganize the org.scalajs.dom namespace into something saner
- The raw "everything goes" namespace is now org.scalajs.dom.raw - org.scalajs.dom.{css, html, idb, svg, webgl} namespaces contain un-prefixed versions of the things that start with their prefix. The `Element` suffix has also been dropped where possible - org.scalajs.dom.extensions has been renamed to org.scalajs.dom.ext - org.scalajs.dom itself contains all things in org.scalajs.dom.raw that aren't in any of the un-prefixed namespaces Overall, this should accomplish a few things: - Massively clean up org.scalajs.dom.*, since we've moved ~270 names into proper namespaces - Make dealing with these names much easier, e.g. now `dom.HTMLTableCellElement` is just `html.TableCell` - Make a clear separation between "all un-modified dom facades" and "re-organized nice-to-use dom facades", so hopefully there won't be any confusion over things missing or where things should go - Reasonable backwards compat just by changing imports: org.scalajs.dom -> org.scalajs.dom.raw and things should keep working Some Caveats: - The mapping isn't *quite* perfect: we still have `svg.RectElement` instead of just `svg.Rect`, sinct `svg.Rect` is taken by something else - You don't get doc-dropdown in IntelliJ because of the aliases. I assume this is something we can bug the IntelliJ people to fix since it affects lots of other things (e.g. the std lib) and not just Scala.js
1 parent 0a95af5 commit 8208d79

File tree

16 files changed

+539
-48
lines changed

16 files changed

+539
-48
lines changed

Diff for: example/src/main/scala/example/Example.scala

+13-16
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package example
22

3-
import scala.scalajs.js.JSApp
4-
53
import org.scalajs.dom
6-
4+
import dom.html
75
import scala.scalajs.js.annotation.JSExport
86

97
@JSExport
@@ -18,7 +16,7 @@ object Alert {
1816
@JSExport
1917
object NodeAppendChild {
2018
@JSExport
21-
def main(div: dom.HTMLDivElement) = {
19+
def main(div: html.Div) = {
2220
val child = dom.document
2321
.createElement("div")
2422

@@ -32,7 +30,7 @@ object NodeAppendChild {
3230
@JSExport
3331
object ElementStyle {
3432
@JSExport
35-
def main(div: dom.HTMLDivElement) = {
33+
def main(div: html.Div) = {
3634
val colors = Seq(
3735
"red", "green", "blue"
3836
)
@@ -47,8 +45,7 @@ object ElementStyle {
4745
@JSExport
4846
object LocalStorage {
4947
@JSExport
50-
def main(in: dom.HTMLInputElement,
51-
box: dom.HTMLDivElement) = {
48+
def main(in: html.Input, box: html.Div) = {
5249
val key = "my-key"
5350

5451
in.value =
@@ -67,7 +64,7 @@ object LocalStorage {
6764
@JSExport
6865
object Canvas {
6966
@JSExport
70-
def main(c: dom.HTMLCanvasElement) = {
67+
def main(c: html.Canvas) = {
7168
type Ctx2D =
7269
dom.CanvasRenderingContext2D
7370
val ctx = c.getContext("2d")
@@ -93,8 +90,8 @@ object Canvas {
9390
@JSExport
9491
object Base64 {
9592
@JSExport
96-
def main(in: dom.HTMLInputElement,
97-
out: dom.HTMLDivElement) = {
93+
def main(in: html.Input,
94+
out: html.Div) = {
9895
in.onkeyup = { (e: dom.Event) =>
9996
out.textContent =
10097
dom.btoa(in.value)
@@ -105,7 +102,7 @@ object Base64 {
105102
@JSExport
106103
object EventHandler{
107104
@JSExport
108-
def main(pre: dom.HTMLPreElement) = {
105+
def main(pre: html.Pre) = {
109106
pre.onmousemove = {
110107
(e: dom.MouseEvent) =>
111108
pre.textContent =
@@ -123,7 +120,7 @@ object EventHandler{
123120
@JSExport
124121
object XMLHttpRequest{
125122
@JSExport
126-
def main(pre: dom.HTMLPreElement) = {
123+
def main(pre: html.Pre) = {
127124
val xhr = new dom.XMLHttpRequest()
128125
xhr.open("GET",
129126
"http://api.openweathermap.org/" +
@@ -142,8 +139,8 @@ object XMLHttpRequest{
142139
@JSExport
143140
object Websocket {
144141
@JSExport
145-
def main(in: dom.HTMLInputElement,
146-
pre: dom.HTMLPreElement) = {
142+
def main(in: html.Input,
143+
pre: html.Pre) = {
147144
val echo = "ws://echo.websocket.org"
148145
val socket = new dom.WebSocket(echo)
149146
socket.onmessage = {
@@ -162,8 +159,8 @@ object Websocket {
162159
@JSExport
163160
object AjaxExtension {
164161
@JSExport
165-
def main(pre: dom.HTMLPreElement) = {
166-
import dom.extensions.Ajax
162+
def main(pre: html.Pre) = {
163+
import dom.ext.Ajax
167164
import scalajs.concurrent
168165
.JSExecutionContext
169166
.Implicits

Diff for: src/main/scala/org/scalajs/dom/css.scala

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.scalajs.dom
2+
3+
/**
4+
* Short aliasas of all the dom.CSSThing classes
5+
*/
6+
object css {
7+
type FontFaceRule = raw.CSSFontFaceRule
8+
type ImportRule = raw.CSSImportRule
9+
type KeyframeRule = raw.CSSKeyframeRule
10+
type MediaRule = raw.CSSMediaRule
11+
type NamespaceRule = raw.CSSNamespaceRule
12+
type PageRule = raw.CSSPageRule
13+
type Rule = raw.CSSRule
14+
@inline def Rule = raw.CSSRule
15+
type RuleList = raw.CSSRuleList
16+
type StyleDeclaration = raw.CSSStyleDeclaration
17+
type StyleSheet = raw.CSSStyleSheet
18+
type StyleRule = raw.CSSStyleRule
19+
}

Diff for: src/main/scala/org/scalajs/dom/extensions/Extensions.scala renamed to src/main/scala/org/scalajs/dom/ext/Extensions.scala

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
package org.scalajs.dom.extensions
1+
package org.scalajs.dom.ext
2+
3+
import org.scalajs.dom.html
24

35
import scala.scalajs.js
46
import org.scalajs.dom
@@ -80,7 +82,7 @@ object Image {
8082
val img =
8183
dom.document
8284
.createElement("img")
83-
.asInstanceOf[dom.HTMLImageElement]
85+
.asInstanceOf[html.Image]
8486

8587
img.src = "data:image/svg+xml;base64," + s
8688
img
@@ -199,7 +201,7 @@ object Ajax{
199201
withCredentials: Boolean,
200202
responseType: String): Future[dom.XMLHttpRequest] = {
201203
val req = new dom.XMLHttpRequest()
202-
val promise = Promise[dom.XMLHttpRequest]
204+
val promise = Promise[dom.XMLHttpRequest]()
203205

204206
req.onreadystatechange = {(e: dom.Event) =>
205207
if (req.readyState.toInt == 4){

Diff for: src/main/scala/org/scalajs/dom/extensions/KeyValue.scala renamed to src/main/scala/org/scalajs/dom/ext/KeyValue.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.scalajs.dom.extensions
1+
package org.scalajs.dom.ext
22

33
/**
44
* The KeyboardEvent.key attribute of an event must always contain one of these control key or character values (even if

Diff for: src/main/scala/org/scalajs/dom/extensions/package.scala renamed to src/main/scala/org/scalajs/dom/ext/package.scala

+9-17
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,29 @@ package org.scalajs.dom
22

33
import scala.language.implicitConversions
44

5-
import scala.scalajs.js
6-
import org.scalajs.dom
75
import scala.collection.mutable
86

9-
package object extensions {
7+
package object ext {
108

11-
implicit class PimpedNodeList(nodes: dom.NodeList) extends EasySeq[dom.Node](nodes.length, nodes.apply)
9+
implicit class PimpedNodeList(nodes: NodeList) extends EasySeq[Node](nodes.length, nodes.apply)
1210

13-
implicit class PimpedTouchList(nodes: dom.TouchList) extends EasySeq[dom.Touch](nodes.length, nodes.apply)
11+
implicit class PimpedTouchList(nodes: TouchList) extends EasySeq[Touch](nodes.length, nodes.apply)
1412

15-
implicit class PimpedHtmlCollection(coll: dom.HTMLCollection) extends EasySeq[dom.Element](coll.length, coll.apply)
13+
implicit class PimpedHtmlCollection(coll: html.Collection) extends EasySeq[Element](coll.length, coll.apply)
1614

17-
implicit class PimpedSVGTransformList(coll: dom.SVGTransformList) extends EasySeq[dom.SVGTransform](coll.numberOfItems, coll.getItem)
15+
implicit class PimpedSVGTransformList(coll: svg.TransformList) extends EasySeq[svg.Transform](coll.numberOfItems, coll.getItem)
1816

1917
implicit class Castable(x: Any) {
2018
def cast[T] = x.asInstanceOf[T]
2119
}
2220

23-
implicit def pimpAnimatedNumber(x: dom.SVGAnimatedNumber) = x.baseVal
21+
implicit def pimpAnimatedNumber(x: svg.AnimatedNumber) = x.baseVal
2422

25-
implicit def pimpRichAnimatedNumber(x: dom.SVGAnimatedNumber) = x.baseVal: runtime.RichDouble
23+
implicit def pimpRichAnimatedNumber(x: svg.AnimatedNumber) = x.baseVal: runtime.RichDouble
2624

27-
implicit def pimpAnimatedLength(x: dom.SVGAnimatedLength) = x.baseVal.value
25+
implicit def pimpAnimatedLength(x: svg.AnimatedLength) = x.baseVal.value
2826

29-
implicit def pimpRichAnimatedLength(x: dom.SVGAnimatedLength) = x.baseVal.value: runtime.RichDouble
27+
implicit def pimpRichAnimatedLength(x: svg.AnimatedLength) = x.baseVal.value: runtime.RichDouble
3028

3129
implicit def color2String(c: Color) = c.toString
3230
implicit class pimpedContext(val ctx: CanvasRenderingContext2D) {
@@ -69,7 +67,6 @@ package object extensions {
6967
}
7068
}
7169

72-
7370
/**
7471
* Implicit class to deal with attributes as with normal mutable Map
7572
* @param attributes
@@ -80,7 +77,6 @@ package object extensions {
8077
override def iterator: Iterator[(String, Attr)] = new Iterator[(String, Attr)] {
8178
var index = 0
8279

83-
8480
override def next(): (String, Attr) = {
8581
val n: Attr = attributes.item(index)
8682
this.index = this.index + 1
@@ -90,15 +86,13 @@ package object extensions {
9086
override def hasNext: Boolean = index < self.length
9187
}
9288

93-
9489
override def get(key: String): Option[Attr] = attributes.getNamedItem(key) match {
9590
case null => None
9691
case attr => Some(attr)
9792
}
9893

9994
def length: Int = attributes.length.toInt
10095

101-
10296
override def -=(key: String) = {
10397
attributes.removeNamedItem(key)
10498
this
@@ -108,6 +102,4 @@ package object extensions {
108102
attributes.setNamedItem(kv._2)
109103
this}
110104
}
111-
112-
113105
}

Diff for: src/main/scala/org/scalajs/dom/html.scala

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package org.scalajs.dom
2+
3+
/**
4+
* Short aliasas of all the dom.HTMLThing classes
5+
*/
6+
object html {
7+
type Anchor = raw.HTMLAnchorElement
8+
type Applet = raw.HTMLAppletElement
9+
type Audio = raw.HTMLAudioElement
10+
type Area = raw.HTMLAreaElement
11+
type AreasCollection = raw.HTMLAreasCollection
12+
type Base = raw.HTMLBaseElement
13+
type BaseFont = raw.HTMLBaseFontElement
14+
type BGSound = raw.HTMLBGSoundElement
15+
type BlockElement = raw.HTMLBlockElement
16+
type Body = raw.HTMLBodyElement
17+
type Button = raw.HTMLButtonElement
18+
type BR = raw.HTMLBRElement
19+
type Canvas = raw.HTMLCanvasElement
20+
type Collection = raw.HTMLCollection
21+
type DataList = raw.HTMLDataListElement
22+
type DD = raw.HTMLDDElement
23+
type Directory = raw.HTMLDirectoryElement
24+
type Div = raw.HTMLDivElement
25+
type DList = raw.HTMLDListElement
26+
type DT = raw.HTMLDTElement
27+
type Document = raw.HTMLDocument
28+
type Element = raw.HTMLElement
29+
type Embed = raw.HTMLEmbedElement
30+
type FieldSet = raw.HTMLFieldSetElement
31+
type Font = raw.HTMLFontElement
32+
type Form = raw.HTMLFormElement
33+
type Frame = raw.HTMLFrameElement
34+
type FrameSet = raw.HTMLFrameSetElement
35+
type Head = raw.HTMLHeadElement
36+
type Heading = raw.HTMLHeadingElement
37+
type Html = raw.HTMLHtmlElement
38+
type HR = raw.HTMLHRElement
39+
type IFrame = raw.HTMLIFrameElement
40+
type Image = raw.HTMLImageElement
41+
type Input = raw.HTMLInputElement
42+
type IsIndex = raw.HTMLIsIndexElement
43+
type Label = raw.HTMLLabelElement
44+
type Legend = raw.HTMLLegendElement
45+
type LI = raw.HTMLLIElement
46+
type Link = raw.HTMLLinkElement
47+
type Map = raw.HTMLMapElement
48+
type Marquee = raw.HTMLMarqueeElement
49+
type Media = raw.HTMLMediaElement
50+
@inline def Media = raw.HTMLMediaElement
51+
type Menu = raw.HTMLMenuElement
52+
type Meta = raw.HTMLMetaElement
53+
type Mod = raw.HTMLModElement
54+
type NextIdElement = raw.HTMLNextIdElement
55+
type Object = raw.HTMLObjectElement
56+
type OList = raw.HTMLOListElement
57+
type OptGroup = raw.HTMLOptGroupElement
58+
type Option = raw.HTMLOptionElement
59+
type Paragraph = raw.HTMLParagraphElement
60+
type Param = raw.HTMLParamElement
61+
type Pre = raw.HTMLPreElement
62+
type Phrase = raw.HTMLPhraseElement
63+
type Progress = raw.HTMLProgressElement
64+
type Quote = raw.HTMLQuoteElement
65+
type Script = raw.HTMLScriptElement
66+
type Select = raw.HTMLSelectElement
67+
type Source = raw.HTMLSourceElement
68+
type Span = raw.HTMLSpanElement
69+
type Style = raw.HTMLStyleElement
70+
type Table = raw.HTMLTableElement
71+
type TableAlignment = raw.HTMLTableAlignment
72+
type TableCaption = raw.HTMLTableCaptionElement
73+
type TableCell = raw.HTMLTableCellElement
74+
type TableCol = raw.HTMLTableColElement
75+
type TableDataCell = raw.HTMLTableDataCellElement
76+
type TableHeaderCell = raw.HTMLTableHeaderCellElement
77+
type TableRow = raw.HTMLTableRowElement
78+
type TableSection = raw.HTMLTableSectionElement
79+
type Title = raw.HTMLTitleElement
80+
type TextArea = raw.HTMLTextAreaElement
81+
type Track = raw.HTMLTrackElement
82+
type UList = raw.HTMLUListElement
83+
type Unknown = raw.HTMLUnknownElement
84+
type Video = raw.HTMLVideoElement
85+
}

Diff for: src/main/scala/org/scalajs/dom/idb.scala

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.scalajs.dom
2+
3+
/**
4+
* Short aliasas of all the dom.IDBThing classes
5+
*/
6+
object idb {
7+
type Cursor = raw.IDBCursor
8+
@inline def Cursor = raw.IDBCursor
9+
type CursorWithValue = raw.IDBCursorWithValue
10+
type Database = raw.IDBDatabase
11+
type Environment = raw.IDBEnvironment
12+
type Factory = raw.IDBFactory
13+
type Index = raw.IDBIndex
14+
type KeyRange = raw.IDBKeyRange
15+
@inline def KeyRange = raw.IDBKeyRange
16+
type ObjectStore = raw.IDBObjectStore
17+
type OpenDBRequest = raw.IDBOpenDBRequest
18+
type Request = raw.IDBRequest
19+
type Transaction = raw.IDBTransaction
20+
@inline def Transaction = raw.IDBTransaction
21+
type VersionChangeEvent = raw.IDBVersionChangeEvent
22+
}

0 commit comments

Comments
 (0)