Skip to content

Commit 2cec654

Browse files
committed
Revise all postMessage methods
Fixes #238
1 parent c95ef2c commit 2cec654

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
@@ -13964,7 +13964,7 @@ MessagePort[JT] def addEventListener[T <: Event](`type`: String, listener: js.Fu
1396413964
MessagePort[JT] def close(): Unit
1396513965
MessagePort[JT] def dispatchEvent(evt: Event): Boolean
1396613966
MessagePort[JT] var onmessage: js.Function1[MessageEvent, _]
13967-
MessagePort[JT] def postMessage(message: js.Any, ports: js.Any?): Unit
13967+
MessagePort[JT] def postMessage(message: js.Any, transferList: js.UndefOr[js.Array[Transferable]]?): Unit
1396813968
MessagePort[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
1396913969
MessagePort[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
1397013970
MessagePort[JT] def start(): Unit
@@ -23309,7 +23309,7 @@ Window[JC] def pageXOffset: Double
2330923309
Window[JC] def pageYOffset: Double
2331023310
Window[JC] def parent: Window
2331123311
Window[JC] def performance: Performance
23312-
Window[JC] def postMessage(message: js.Any, targetOrigin: String, transfer: js.Any?): Unit
23312+
Window[JC] def postMessage(message: js.Any, targetOrigin: String, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2331323313
Window[JC] def print(): Unit
2331423314
Window[JC] def prompt(): String
2331523315
Window[JC] def prompt(message: String, default: String?): String
@@ -23367,7 +23367,7 @@ Worker[JC] def addEventListener[T <: Event](`type`: String, listener: js.Functio
2336723367
Worker[JC] def dispatchEvent(evt: Event): Boolean
2336823368
Worker[JC] var onerror: js.Function1[ErrorEvent, _]
2336923369
Worker[JC] var onmessage: js.Function1[MessageEvent, _]
23370-
Worker[JC] def postMessage(aMessage: js.Any, transferList: js.UndefOr[js.Array[Transferable]]?): Unit
23370+
Worker[JC] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2337123371
Worker[JC] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
2337223372
Worker[JC] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
2337323373
Worker[JC] def terminate(): Unit
@@ -24309,7 +24309,7 @@ experimental/serviceworkers/CacheStorage[JT] def open(cacheName: String): js.Pro
2430924309
experimental/serviceworkers/CanvasProxy[JT] def setContext(context: RenderingContext): Unit
2431024310
experimental/serviceworkers/Client[JT] def frameType: FrameType
2431124311
experimental/serviceworkers/Client[JT] def id: String
24312-
experimental/serviceworkers/Client[JT] def postMessage(message: Any, transfer: Sequence[Transferable] = null): Unit
24312+
experimental/serviceworkers/Client[JT] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2431324313
experimental/serviceworkers/Client[JT] def url: String
2431424314
experimental/serviceworkers/ClientQueryOptions[JT] var includeUncontrolled: Boolean
2431524315
experimental/serviceworkers/ClientQueryOptions[JT] var `type`: ClientType
@@ -24406,7 +24406,7 @@ experimental/serviceworkers/ServiceWorker[JT] def addEventListener[T <: Event](`
2440624406
experimental/serviceworkers/ServiceWorker[JT] def addEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
2440724407
experimental/serviceworkers/ServiceWorker[JT] def dispatchEvent(evt: Event): Boolean
2440824408
experimental/serviceworkers/ServiceWorker[JT] var onstatechange: js.Function1[Event, _]
24409-
experimental/serviceworkers/ServiceWorker[JT] def postMessage(message: js.Any, transfer: js.Array[Transferable]?): Unit
24409+
experimental/serviceworkers/ServiceWorker[JT] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2441024410
experimental/serviceworkers/ServiceWorker[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
2441124411
experimental/serviceworkers/ServiceWorker[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
2441224412
experimental/serviceworkers/ServiceWorker[JT] def scriptURL: String
@@ -24496,7 +24496,7 @@ experimental/serviceworkers/WindowClient[JT] def focused: Boolean
2449624496
experimental/serviceworkers/WindowClient[JT] def frameType: FrameType
2449724497
experimental/serviceworkers/WindowClient[JT] def id: String
2449824498
experimental/serviceworkers/WindowClient[JT] def navigate(url: String): js.Promise[WindowClient]
24499-
experimental/serviceworkers/WindowClient[JT] def postMessage(message: Any, transfer: Sequence[Transferable] = null): Unit
24499+
experimental/serviceworkers/WindowClient[JT] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2450024500
experimental/serviceworkers/WindowClient[JT] def url: String
2450124501
experimental/serviceworkers/WindowClient[JT] def visibilityState: String
2450224502
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
@@ -13964,7 +13964,7 @@ MessagePort[JT] def addEventListener[T <: Event](`type`: String, listener: js.Fu
1396413964
MessagePort[JT] def close(): Unit
1396513965
MessagePort[JT] def dispatchEvent(evt: Event): Boolean
1396613966
MessagePort[JT] var onmessage: js.Function1[MessageEvent, _]
13967-
MessagePort[JT] def postMessage(message: js.Any, ports: js.Any?): Unit
13967+
MessagePort[JT] def postMessage(message: js.Any, transferList: js.UndefOr[js.Array[Transferable]]?): Unit
1396813968
MessagePort[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
1396913969
MessagePort[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
1397013970
MessagePort[JT] def start(): Unit
@@ -23309,7 +23309,7 @@ Window[JC] def pageXOffset: Double
2330923309
Window[JC] def pageYOffset: Double
2331023310
Window[JC] def parent: Window
2331123311
Window[JC] def performance: Performance
23312-
Window[JC] def postMessage(message: js.Any, targetOrigin: String, transfer: js.Any?): Unit
23312+
Window[JC] def postMessage(message: js.Any, targetOrigin: String, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2331323313
Window[JC] def print(): Unit
2331423314
Window[JC] def prompt(): String
2331523315
Window[JC] def prompt(message: String, default: String?): String
@@ -23367,7 +23367,7 @@ Worker[JC] def addEventListener[T <: Event](`type`: String, listener: js.Functio
2336723367
Worker[JC] def dispatchEvent(evt: Event): Boolean
2336823368
Worker[JC] var onerror: js.Function1[ErrorEvent, _]
2336923369
Worker[JC] var onmessage: js.Function1[MessageEvent, _]
23370-
Worker[JC] def postMessage(aMessage: js.Any, transferList: js.UndefOr[js.Array[Transferable]]?): Unit
23370+
Worker[JC] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2337123371
Worker[JC] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
2337223372
Worker[JC] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
2337323373
Worker[JC] def terminate(): Unit
@@ -24309,7 +24309,7 @@ experimental/serviceworkers/CacheStorage[JT] def open(cacheName: String): js.Pro
2430924309
experimental/serviceworkers/CanvasProxy[JT] def setContext(context: RenderingContext): Unit
2431024310
experimental/serviceworkers/Client[JT] def frameType: FrameType
2431124311
experimental/serviceworkers/Client[JT] def id: String
24312-
experimental/serviceworkers/Client[JT] def postMessage(message: Any, transfer: Sequence[Transferable] = null): Unit
24312+
experimental/serviceworkers/Client[JT] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2431324313
experimental/serviceworkers/Client[JT] def url: String
2431424314
experimental/serviceworkers/ClientQueryOptions[JT] var includeUncontrolled: Boolean
2431524315
experimental/serviceworkers/ClientQueryOptions[JT] var `type`: ClientType
@@ -24406,7 +24406,7 @@ experimental/serviceworkers/ServiceWorker[JT] def addEventListener[T <: Event](`
2440624406
experimental/serviceworkers/ServiceWorker[JT] def addEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
2440724407
experimental/serviceworkers/ServiceWorker[JT] def dispatchEvent(evt: Event): Boolean
2440824408
experimental/serviceworkers/ServiceWorker[JT] var onstatechange: js.Function1[Event, _]
24409-
experimental/serviceworkers/ServiceWorker[JT] def postMessage(message: js.Any, transfer: js.Array[Transferable]?): Unit
24409+
experimental/serviceworkers/ServiceWorker[JT] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2441024410
experimental/serviceworkers/ServiceWorker[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
2441124411
experimental/serviceworkers/ServiceWorker[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
2441224412
experimental/serviceworkers/ServiceWorker[JT] def scriptURL: String
@@ -24496,7 +24496,7 @@ experimental/serviceworkers/WindowClient[JT] def focused: Boolean
2449624496
experimental/serviceworkers/WindowClient[JT] def frameType: FrameType
2449724497
experimental/serviceworkers/WindowClient[JT] def id: String
2449824498
experimental/serviceworkers/WindowClient[JT] def navigate(url: String): js.Promise[WindowClient]
24499-
experimental/serviceworkers/WindowClient[JT] def postMessage(message: Any, transfer: Sequence[Transferable] = null): Unit
24499+
experimental/serviceworkers/WindowClient[JT] def postMessage(message: js.Any, transfer: js.UndefOr[js.Array[Transferable]]?): Unit
2450024500
experimental/serviceworkers/WindowClient[JT] def url: String
2450124501
experimental/serviceworkers/WindowClient[JT] def visibilityState: String
2450224502
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
@@ -1529,13 +1529,35 @@ class Window
15291529

15301530
def closed: Boolean = js.native
15311531

1532-
/** The window.postMessage method safely enables cross-origin communication. Normally, scripts on different pages are
1533-
* allowed to access each other if and only if the pages that executed them are at locations with the same protocol
1534-
* (usually both http), port number (80 being the default for http), and host (modulo document.domain being set by
1535-
* both pages to the same value). window.postMessage provides a controlled mechanism to circumvent this restriction
1536-
* in a way which is secure when properly used.
1532+
/** Safely enables cross-origin communication between Window objects; e.g., between a page and a pop-up that it
1533+
* spawned, or between a page and an iframe embedded within it.
1534+
*
1535+
* Normally, scripts on different pages are allowed to access each other if and only if the pages they originate from
1536+
* share the same protocol, port number, and host (also known as the "same-origin policy"). window.postMessage()
1537+
* provides a controlled mechanism to securely circumvent this restriction (if used properly).
1538+
*
1539+
* Broadly, one window may obtain a reference to another (e.g., via targetWindow = window.opener), and then dispatch
1540+
* a MessageEvent on it with targetWindow.postMessage(). The receiving window is then free to handle this event as
1541+
* needed. The arguments passed to window.postMessage() (i.e., the “message”) are exposed to the receiving window
1542+
* through the event object.
1543+
*
1544+
* @param targetOrigin
1545+
* Specifies what the origin of targetWindow must be for the event to be dispatched, either as the literal string
1546+
* "*" (indicating no preference) or as a URI. If at the time the event is scheduled to be dispatched the scheme,
1547+
* hostname, or port of targetWindow's document does not match that provided in targetOrigin, the event will not be
1548+
* dispatched; only if all three match will the event be dispatched. This mechanism provides control over where
1549+
* messages are sent; for example, if postMessage() was used to transmit a password, it would be absolutely
1550+
* critical that this argument be a URI whose origin is the same as the intended receiver of the message containing
1551+
* the password, to prevent interception of the password by a malicious third party. Always provide a specific
1552+
* targetOrigin, not *, if you know where the other window's document should be located. Failing to provide a
1553+
* specific target discloses the data you send to any interested malicious site.
1554+
*
1555+
* @param transfer
1556+
* A sequence of objects that are transferred with the message. The ownership of these objects is given to the
1557+
* destination side and they are no longer usable on the sending side.
15371558
*/
1538-
def postMessage(message: js.Any, targetOrigin: String, transfer: js.Any = js.native): Unit = js.native
1559+
def postMessage(message: js.Any, targetOrigin: String,
1560+
transfer: js.UndefOr[js.Array[Transferable]] = js.native): Unit = js.native
15391561

15401562
/** The Window.showModalDialog() creates and displays a modal dialog box containing a specified HTML document.
15411563
*
@@ -4734,12 +4756,12 @@ trait MessagePort extends EventTarget {
47344756
def close(): Unit = js.native
47354757

47364758
/** Sends a message from the port, and optionally, transfers ownership of objects to other browsing contexts.
4737-
* @param message
4738-
* The message you want to send through the channel. This can be of any basic data type. Multiple data items can be
4739-
* sent as an array.
4740-
* @param ports
4759+
*
4760+
* @param transferList
4761+
* Transferable objects to be transferred — these objects have their ownership transferred to the receiving
4762+
* browsing context, so are no longer usable by the sending browsing context.
47414763
*/
4742-
def postMessage(message: js.Any, ports: js.Any = js.native): Unit = js.native
4764+
def postMessage(message: js.Any, transferList: js.UndefOr[js.Array[Transferable]] = js.native): Unit = js.native
47434765

47444766
def start(): Unit = js.native
47454767
}

0 commit comments

Comments
 (0)