Skip to content

Commit f079ec8

Browse files
authored
Merge pull request #563 from scala-js/issue/238
Revise all `postMessage` methods
2 parents 1a14eb3 + 2cec654 commit f079ec8

File tree

5 files changed

+70
-42
lines changed

5 files changed

+70
-42
lines changed

api-reports/2_12.txt

+7-7
Original file line numberDiff line numberDiff line change
@@ -1195,7 +1195,7 @@ DedicatedWorkerGlobalScope[JT] var onmessage: js.Function1[MessageEvent, _]
11951195
DedicatedWorkerGlobalScope[JT] var onoffline: js.Function1[Event, _]
11961196
DedicatedWorkerGlobalScope[JT] var ononline: js.Function1[Event, _]
11971197
DedicatedWorkerGlobalScope[JT] def origin: String
1198-
DedicatedWorkerGlobalScope[JT] def postMessage(aMessage: js.Any, transferList: js.UndefOr[js.Array[Transferable]]?): Unit
1198+
DedicatedWorkerGlobalScope[JT] def postMessage(message: js.Any, transferList: js.UndefOr[js.Array[Transferable]]?): Unit
11991199
DedicatedWorkerGlobalScope[JT] def queueMicrotask(function: js.Function0[Any]): Unit
12001200
DedicatedWorkerGlobalScope[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
12011201
DedicatedWorkerGlobalScope[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
@@ -14254,7 +14254,7 @@ MessagePort[JT] def addEventListener[T <: Event](`type`: String, listener: js.Fu
1425414254
MessagePort[JT] def close(): Unit
1425514255
MessagePort[JT] def dispatchEvent(evt: Event): Boolean
1425614256
MessagePort[JT] var onmessage: js.Function1[MessageEvent, _]
14257-
MessagePort[JT] def postMessage(message: js.Any, ports: js.Any?): Unit
14257+
MessagePort[JT] def postMessage(message: js.Any, transferList: js.UndefOr[js.Array[Transferable]]?): Unit
1425814258
MessagePort[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
1425914259
MessagePort[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
1426014260
MessagePort[JT] def start(): Unit
@@ -23904,7 +23904,7 @@ Window[JC] def pageXOffset: Double
2390423904
Window[JC] def pageYOffset: Double
2390523905
Window[JC] def parent: Window
2390623906
Window[JC] def performance: Performance
23907-
Window[JC] def postMessage(message: js.Any, targetOrigin: String, transfer: js.Any?): Unit
23907+
Window[JC] def postMessage(message: js.Any, targetOrigin: String, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2390823908
Window[JC] def print(): Unit
2390923909
Window[JC] def prompt(): String
2391023910
Window[JC] def prompt(message: String, default: String?): String
@@ -23962,7 +23962,7 @@ Worker[JC] def addEventListener[T <: Event](`type`: String, listener: js.Functio
2396223962
Worker[JC] def dispatchEvent(evt: Event): Boolean
2396323963
Worker[JC] var onerror: js.Function1[ErrorEvent, _]
2396423964
Worker[JC] var onmessage: js.Function1[MessageEvent, _]
23965-
Worker[JC] def postMessage(aMessage: js.Any, transferList: js.UndefOr[js.Array[Transferable]]?): Unit
23965+
Worker[JC] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2396623966
Worker[JC] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
2396723967
Worker[JC] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
2396823968
Worker[JC] def terminate(): Unit
@@ -24904,7 +24904,7 @@ experimental/serviceworkers/CacheStorage[JT] def open(cacheName: String): js.Pro
2490424904
experimental/serviceworkers/CanvasProxy[JT] def setContext(context: RenderingContext): Unit
2490524905
experimental/serviceworkers/Client[JT] def frameType: FrameType
2490624906
experimental/serviceworkers/Client[JT] def id: String
24907-
experimental/serviceworkers/Client[JT] def postMessage(message: Any, transfer: Sequence[Transferable] = null): Unit
24907+
experimental/serviceworkers/Client[JT] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2490824908
experimental/serviceworkers/Client[JT] def url: String
2490924909
experimental/serviceworkers/ClientQueryOptions[JT] var includeUncontrolled: Boolean
2491024910
experimental/serviceworkers/ClientQueryOptions[JT] var `type`: ClientType
@@ -25001,7 +25001,7 @@ experimental/serviceworkers/ServiceWorker[JT] def addEventListener[T <: Event](`
2500125001
experimental/serviceworkers/ServiceWorker[JT] def addEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
2500225002
experimental/serviceworkers/ServiceWorker[JT] def dispatchEvent(evt: Event): Boolean
2500325003
experimental/serviceworkers/ServiceWorker[JT] var onstatechange: js.Function1[Event, _]
25004-
experimental/serviceworkers/ServiceWorker[JT] def postMessage(message: js.Any, transfer: js.Array[Transferable]?): Unit
25004+
experimental/serviceworkers/ServiceWorker[JT] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2500525005
experimental/serviceworkers/ServiceWorker[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
2500625006
experimental/serviceworkers/ServiceWorker[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
2500725007
experimental/serviceworkers/ServiceWorker[JT] def scriptURL: String
@@ -25091,7 +25091,7 @@ experimental/serviceworkers/WindowClient[JT] def focused: Boolean
2509125091
experimental/serviceworkers/WindowClient[JT] def frameType: FrameType
2509225092
experimental/serviceworkers/WindowClient[JT] def id: String
2509325093
experimental/serviceworkers/WindowClient[JT] def navigate(url: String): js.Promise[WindowClient]
25094-
experimental/serviceworkers/WindowClient[JT] def postMessage(message: Any, transfer: Sequence[Transferable] = null): Unit
25094+
experimental/serviceworkers/WindowClient[JT] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2509525095
experimental/serviceworkers/WindowClient[JT] def url: String
2509625096
experimental/serviceworkers/WindowClient[JT] def visibilityState: String
2509725097
experimental/serviceworkers/package[SO] type Transferable = org.scalajs.dom.Transferable | CanvasProxy

api-reports/2_13.txt

+7-7
Original file line numberDiff line numberDiff line change
@@ -1195,7 +1195,7 @@ DedicatedWorkerGlobalScope[JT] var onmessage: js.Function1[MessageEvent, _]
11951195
DedicatedWorkerGlobalScope[JT] var onoffline: js.Function1[Event, _]
11961196
DedicatedWorkerGlobalScope[JT] var ononline: js.Function1[Event, _]
11971197
DedicatedWorkerGlobalScope[JT] def origin: String
1198-
DedicatedWorkerGlobalScope[JT] def postMessage(aMessage: js.Any, transferList: js.UndefOr[js.Array[Transferable]]?): Unit
1198+
DedicatedWorkerGlobalScope[JT] def postMessage(message: js.Any, transferList: js.UndefOr[js.Array[Transferable]]?): Unit
11991199
DedicatedWorkerGlobalScope[JT] def queueMicrotask(function: js.Function0[Any]): Unit
12001200
DedicatedWorkerGlobalScope[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
12011201
DedicatedWorkerGlobalScope[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
@@ -14254,7 +14254,7 @@ MessagePort[JT] def addEventListener[T <: Event](`type`: String, listener: js.Fu
1425414254
MessagePort[JT] def close(): Unit
1425514255
MessagePort[JT] def dispatchEvent(evt: Event): Boolean
1425614256
MessagePort[JT] var onmessage: js.Function1[MessageEvent, _]
14257-
MessagePort[JT] def postMessage(message: js.Any, ports: js.Any?): Unit
14257+
MessagePort[JT] def postMessage(message: js.Any, transferList: js.UndefOr[js.Array[Transferable]]?): Unit
1425814258
MessagePort[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
1425914259
MessagePort[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
1426014260
MessagePort[JT] def start(): Unit
@@ -23904,7 +23904,7 @@ Window[JC] def pageXOffset: Double
2390423904
Window[JC] def pageYOffset: Double
2390523905
Window[JC] def parent: Window
2390623906
Window[JC] def performance: Performance
23907-
Window[JC] def postMessage(message: js.Any, targetOrigin: String, transfer: js.Any?): Unit
23907+
Window[JC] def postMessage(message: js.Any, targetOrigin: String, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2390823908
Window[JC] def print(): Unit
2390923909
Window[JC] def prompt(): String
2391023910
Window[JC] def prompt(message: String, default: String?): String
@@ -23962,7 +23962,7 @@ Worker[JC] def addEventListener[T <: Event](`type`: String, listener: js.Functio
2396223962
Worker[JC] def dispatchEvent(evt: Event): Boolean
2396323963
Worker[JC] var onerror: js.Function1[ErrorEvent, _]
2396423964
Worker[JC] var onmessage: js.Function1[MessageEvent, _]
23965-
Worker[JC] def postMessage(aMessage: js.Any, transferList: js.UndefOr[js.Array[Transferable]]?): Unit
23965+
Worker[JC] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2396623966
Worker[JC] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
2396723967
Worker[JC] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
2396823968
Worker[JC] def terminate(): Unit
@@ -24904,7 +24904,7 @@ experimental/serviceworkers/CacheStorage[JT] def open(cacheName: String): js.Pro
2490424904
experimental/serviceworkers/CanvasProxy[JT] def setContext(context: RenderingContext): Unit
2490524905
experimental/serviceworkers/Client[JT] def frameType: FrameType
2490624906
experimental/serviceworkers/Client[JT] def id: String
24907-
experimental/serviceworkers/Client[JT] def postMessage(message: Any, transfer: Sequence[Transferable] = null): Unit
24907+
experimental/serviceworkers/Client[JT] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2490824908
experimental/serviceworkers/Client[JT] def url: String
2490924909
experimental/serviceworkers/ClientQueryOptions[JT] var includeUncontrolled: Boolean
2491024910
experimental/serviceworkers/ClientQueryOptions[JT] var `type`: ClientType
@@ -25001,7 +25001,7 @@ experimental/serviceworkers/ServiceWorker[JT] def addEventListener[T <: Event](`
2500125001
experimental/serviceworkers/ServiceWorker[JT] def addEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
2500225002
experimental/serviceworkers/ServiceWorker[JT] def dispatchEvent(evt: Event): Boolean
2500325003
experimental/serviceworkers/ServiceWorker[JT] var onstatechange: js.Function1[Event, _]
25004-
experimental/serviceworkers/ServiceWorker[JT] def postMessage(message: js.Any, transfer: js.Array[Transferable]?): Unit
25004+
experimental/serviceworkers/ServiceWorker[JT] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2500525005
experimental/serviceworkers/ServiceWorker[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
2500625006
experimental/serviceworkers/ServiceWorker[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
2500725007
experimental/serviceworkers/ServiceWorker[JT] def scriptURL: String
@@ -25091,7 +25091,7 @@ experimental/serviceworkers/WindowClient[JT] def focused: Boolean
2509125091
experimental/serviceworkers/WindowClient[JT] def frameType: FrameType
2509225092
experimental/serviceworkers/WindowClient[JT] def id: String
2509325093
experimental/serviceworkers/WindowClient[JT] def navigate(url: String): js.Promise[WindowClient]
25094-
experimental/serviceworkers/WindowClient[JT] def postMessage(message: Any, transfer: Sequence[Transferable] = null): Unit
25094+
experimental/serviceworkers/WindowClient[JT] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2509525095
experimental/serviceworkers/WindowClient[JT] def url: String
2509625096
experimental/serviceworkers/WindowClient[JT] def visibilityState: String
2509725097
experimental/serviceworkers/package[SO] type Transferable = org.scalajs.dom.Transferable | CanvasProxy

src/main/scala/org/scalajs/dom/WebWorkerTypes.scala

+13-10
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,20 @@ class Worker(stringUrl: String) extends AbstractWorker {
4040
* The Worker can send back information to the thread that spawned it using the
4141
* DedicatedWorkerGlobalScope.postMessage method.
4242
*
43-
* @param aMessage
43+
* @param message
4444
* The object to deliver to the worker; this will be in the data field in the event delivered to the
4545
* DedicatedWorkerGlobalScope.onmessage handler. This may be any value or JavaScript object handled by the
4646
* structured clone algorithm, which includes cyclical references.
4747
*
48-
* @param transferList
48+
* @param transfer
4949
* An optional array of Transferable objects to transfer ownership of. If the ownership of an object is
50-
* transferred, it becomes unusable (neutered) in the context it was sent from and it becomes available only to the
51-
* main thread it was sent to.
50+
* transferred, it becomes unusable in the context it was sent from and becomes available only to the worker it was
51+
* sent to.
5252
*
53-
* Only MessagePort and ArrayBuffer objects can be transferred. null is not an acceptable value for the transferList.
53+
* Transferable objects are instances of classes like ArrayBuffer, MessagePort or ImageBitmap objects that can be
54+
* transferred. null is not an acceptable value for transfer.
5455
*/
55-
def postMessage(aMessage: js.Any, transferList: js.UndefOr[js.Array[Transferable]] = js.native): Unit = js.native
56+
def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]] = js.native): Unit = js.native
5657

5758
/** The Worker.terminate() method immediately terminates the Worker. This does not offer the worker an opportunity to
5859
* finish its operations; it is simply stopped at once.
@@ -139,16 +140,18 @@ trait DedicatedWorkerGlobalScope extends WorkerGlobalScope {
139140
* The main scope that spawned the worker can send back information to the thread that spawned it using the
140141
* Worker.postMessage method.
141142
*
142-
* @param aMessage
143+
* @param message
143144
* The object to deliver to the main thread; this will be in the data field in the event delivered to the
144145
* Worker.onmessage handler. This may be any value or JavaScript object handled by the structured clone algorithm,
145146
* which includes cyclical references.
146147
* @param transferList
147148
* An optional array of Transferable objects to transfer ownership of. If the ownership of an object is
148-
* transferred, it becomes unusable (neutered) in the context it was sent from and it becomes available only to the
149-
* main thread it was sent to.
149+
* transferred, it becomes unusable in the context it was sent from and it becomes available only to the main
150+
* thread it was sent to.
151+
*
152+
* Only MessagePort and ArrayBuffer objects can be transferred.
150153
*/
151-
def postMessage(aMessage: js.Any, transferList: js.UndefOr[js.Array[Transferable]] = js.native): Unit = js.native
154+
def postMessage(message: js.Any, transferList: js.UndefOr[js.Array[Transferable]] = js.native): Unit = js.native
152155
}
153156

154157
@js.native

src/main/scala/org/scalajs/dom/experimental/serviceworkers/ServiceWorkers.scala

+10-7
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,14 @@ trait Client extends js.Object {
4040
/** The id attribute must return its associated service worker client's id. */
4141
def id: String = js.native
4242

43-
/** @param message
44-
* the spec says this is of type any (?!)
43+
/** Allows a service worker to send a message to a client (a Window, Worker, or SharedWorker). The message is received
44+
* in the "message" event on navigator.serviceWorker.
45+
*
4546
* @param transfer
46-
* https://html.spec.whatwg.org/multipage/infrastructure.html#transferable-objects
47+
* A sequence of objects that are transferred with the message. The ownership of these objects is given to the
48+
* destination side and they are no longer usable on the sending side.
4749
*/
48-
def postMessage(message: Any, transfer: Sequence[Transferable] = null): Unit = js.native
50+
def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]] = js.native): Unit = js.native
4951
}
5052

5153
/** see [[https://html.spec.whatwg.org/multipage/scripting.html#canvasproxy ¶4.12.4.1 Proxying canvases to workers]] in
@@ -119,15 +121,16 @@ trait ServiceWorker extends EventTarget {
119121
*/
120122
def state: String = js.native
121123

122-
/** An EventListener property called whenever an event of type statechange is fired; it is basically fired anytime the
123-
* ServiceWorker.state changes.
124+
/** @param transfer
125+
* A sequence of objects that are transferred with the message. The ownership of these objects is given to the
126+
* destination side and they are no longer usable on the sending side.
124127
*/
125128
var onstatechange: js.Function1[Event, _] = js.native
126129

127130
/** [[https://slightlyoff.github.io/ServiceWorker/spec/service_worker_1/#service-worker-postmessage ¶3.1.3 postMessage]]
128131
* on whatwg ServiceWorker spec.
129132
*/
130-
def postMessage(message: js.Any, transfer: js.Array[Transferable] = js.native): Unit = js.native
133+
def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]] = js.native): Unit = js.native
131134
}
132135

133136
/** The ServiceWorkerRegistion interface of the ServiceWorker API represents the service worker registration. You

src/main/scala/org/scalajs/dom/lib.scala

+33-11
Original file line numberDiff line numberDiff line change
@@ -1559,13 +1559,35 @@ class Window
15591559

15601560
def closed: Boolean = js.native
15611561

1562-
/** The window.postMessage method safely enables cross-origin communication. Normally, scripts on different pages are
1563-
* allowed to access each other if and only if the pages that executed them are at locations with the same protocol
1564-
* (usually both http), port number (80 being the default for http), and host (modulo document.domain being set by
1565-
* both pages to the same value). window.postMessage provides a controlled mechanism to circumvent this restriction
1566-
* in a way which is secure when properly used.
1562+
/** Safely enables cross-origin communication between Window objects; e.g., between a page and a pop-up that it
1563+
* spawned, or between a page and an iframe embedded within it.
1564+
*
1565+
* Normally, scripts on different pages are allowed to access each other if and only if the pages they originate from
1566+
* share the same protocol, port number, and host (also known as the "same-origin policy"). window.postMessage()
1567+
* provides a controlled mechanism to securely circumvent this restriction (if used properly).
1568+
*
1569+
* Broadly, one window may obtain a reference to another (e.g., via targetWindow = window.opener), and then dispatch
1570+
* a MessageEvent on it with targetWindow.postMessage(). The receiving window is then free to handle this event as
1571+
* needed. The arguments passed to window.postMessage() (i.e., the “message”) are exposed to the receiving window
1572+
* through the event object.
1573+
*
1574+
* @param targetOrigin
1575+
* Specifies what the origin of targetWindow must be for the event to be dispatched, either as the literal string
1576+
* "*" (indicating no preference) or as a URI. If at the time the event is scheduled to be dispatched the scheme,
1577+
* hostname, or port of targetWindow's document does not match that provided in targetOrigin, the event will not be
1578+
* dispatched; only if all three match will the event be dispatched. This mechanism provides control over where
1579+
* messages are sent; for example, if postMessage() was used to transmit a password, it would be absolutely
1580+
* critical that this argument be a URI whose origin is the same as the intended receiver of the message containing
1581+
* the password, to prevent interception of the password by a malicious third party. Always provide a specific
1582+
* targetOrigin, not *, if you know where the other window's document should be located. Failing to provide a
1583+
* specific target discloses the data you send to any interested malicious site.
1584+
*
1585+
* @param transfer
1586+
* A sequence of objects that are transferred with the message. The ownership of these objects is given to the
1587+
* destination side and they are no longer usable on the sending side.
15671588
*/
1568-
def postMessage(message: js.Any, targetOrigin: String, transfer: js.Any = js.native): Unit = js.native
1589+
def postMessage(message: js.Any, targetOrigin: String,
1590+
transfer: js.UndefOr[js.Array[Transferable]] = js.native): Unit = js.native
15691591

15701592
/** The Window.showModalDialog() creates and displays a modal dialog box containing a specified HTML document.
15711593
*
@@ -4764,12 +4786,12 @@ trait MessagePort extends EventTarget {
47644786
def close(): Unit = js.native
47654787

47664788
/** Sends a message from the port, and optionally, transfers ownership of objects to other browsing contexts.
4767-
* @param message
4768-
* The message you want to send through the channel. This can be of any basic data type. Multiple data items can be
4769-
* sent as an array.
4770-
* @param ports
4789+
*
4790+
* @param transferList
4791+
* Transferable objects to be transferred — these objects have their ownership transferred to the receiving
4792+
* browsing context, so are no longer usable by the sending browsing context.
47714793
*/
4772-
def postMessage(message: js.Any, ports: js.Any = js.native): Unit = js.native
4794+
def postMessage(message: js.Any, transferList: js.UndefOr[js.Array[Transferable]] = js.native): Unit = js.native
47734795

47744796
def start(): Unit = js.native
47754797
}

0 commit comments

Comments
 (0)