diff --git a/amendments.json b/amendments.json index 5a7b920c9..e2c9bde98 100644 --- a/amendments.json +++ b/amendments.json @@ -950,5 +950,68 @@ ], "id": 45 } + ], + "webidl-rtcdatachannel": [ + { + "description": "Make RTCDataChannel transferable to DedicatedWorker", + "pr": 2988, + "type": "addition", + "status": "candidate", + "id": 48, + "tests": [ + "webrtc/transfer-datachannel.html" + ], + "testUpdates": [ + "web-platform-tests/wpt#47707" + ] + } + ], + "rtcdatachannel-slots-init": [ + { + "description": "Make RTCDataChannel transferable to DedicatedWorker", + "pr": 2988, + "type": "addition", + "status": "candidate", + "difftype": "append", + "id": 48, + "tests": [ + "webrtc/transfer-datachannel.html" + ], + "testUpdates": [ + "web-platform-tests/wpt#47707" + ] + } + ], + "rtcdatachannel-send-1": [ + { + "description": "Make RTCDataChannel transferable to DedicatedWorker", + "pr": 2988, + "type": "addition", + "status": "candidate", + "difftype": "append", + "id": 48, + "tests": [ + "webrtc/transfer-datachannel.html" + ], + "testUpdates": [ + "web-platform-tests/wpt#47707" + ] + } + ], + "announcing-a-data-channel-as-closed": [ + { + "description": "Make RTCDataChannel transferable to DedicatedWorker", + "pr": 2988, + "type": "addition", + "status": "candidate", + "difftype": "append", + "id": 48, + "tests": [ + "webrtc/transfer-datachannel.html" + ], + "testUpdates": [ + "web-platform-tests/wpt#47707" + ] + } ] } diff --git a/base-rec.html b/base-rec.html index de7fea7b7..59fe31df9 100644 --- a/base-rec.html +++ b/base-rec.html @@ -13526,7 +13526,7 @@
0
.
- Let channel have internal slots named [[DataChannelLabel]], [[Ordered]], @@ -13892,7 +13892,7 @@
WebIDL[Exposed=Window] +WebIDL[Exposed=Window] interfaceRTCDataChannel
: EventTarget { readonly attribute USVStringlabel
; readonly attribute booleanordered
; @@ -14232,7 +14232,7 @@steps:
-
-- +
- -
Let channel be the
object on which data is to be sent. diff --git a/webrtc.html b/webrtc.html index 008d13688..e9469fe10 100644 --- a/webrtc.html +++ b/webrtc.html @@ -13923,7 +13923,7 @@
RTCDataChannel
internal slot initialized to
0
.- +
- +
Let channel have internal slots named [[\DataChannelLabel]], [[\Ordered]], @@ -13933,6 +13933,14 @@
[[\Negotiated]], and [[\DataChannelId]].
- Let channel have a [[\IsTransferable]] internal slot initialized to
+true
.- [=Queue a task=] to run the following step:
+
+- Set channel.{{RTCDataChannel/[[IsTransferable]]}} to
+false
. +This task needs to run before any task enqueued by the [=receiving messages on a data channel=] algorithm for channel. + This ensures that no message is lost during the transfer of a {{RTCDataChannel}}.
+Return channel. @@ -14145,9 +14153,9 @@
+ + - Announcing a data channel as closed + Announcing a data channel as closed
When an {{RTCDataChannel}} object's [= underlying data transport =] @@ -14193,6 +14201,42 @@
+ Transfering data channel
+The {{RTCDataChannel}} [=transfer steps=], given value and dataHolder, are:
++
+- +
If value.{{RTCDataChannel/[[IsTransferable]]}} is
false
, throw a {{DataCloneError}} DOMException.- +
Set dataHolder.{{RTCDataChannel/[[ReadyState]]}} to value.{{RTCDataChannel/[[ReadyState]]}}.
- +
Set dataHolder.{{RTCDataChannel/[[DataChannelLabel]]}} to value.{{RTCDataChannel/[[DataChannelLabel]]}}.
- +
Set dataHolder.{{RTCDataChannel/[[Ordered]]}} to value.{{RTCDataChannel/[[Ordered]]}}.
- +
Set dataHolder.{{RTCDataChannel/[[MaxPacketLifeTime]]}} to value..{{RTCDataChannel/[[MaxPacketLifeTime]]}}
- +
Set dataHolder.{{RTCDataChannel/[[MaxRetransmits]]}} to value.{{RTCDataChannel/[[MaxRetransmits]]}}.
- +
Set dataHolder.{{RTCDataChannel/[[DataChannelProtocol]]}} to value.{{RTCDataChannel/[[DataChannelProtocol]]}}.
- +
Set dataHolder.{{RTCDataChannel/[[Negotiated]]}} to value.{{RTCDataChannel/[[Negotiated]]}}.
- +
Set dataHolder.{{RTCDataChannel/[[DataChannelId]]}} to value.{{RTCDataChannel/[[DataChannelId]]}}.
- +
Set dataHolder’s [= underlying data transport =] to value [=underlying data transport=].
- +
Set value.{{RTCDataChannel/[[IsTransferable]]}} to
false
.- +
Set value.{{RTCDataChannel/[[ReadyState]]}} to "closed".
The {{RTCDataChannel}} [=transfer-receiving steps=], given dataHolder and channel, are:
+Initialize channel.{{RTCDataChannel/[[ReadyState]]}} to dataHolder.{{RTCDataChannel/[[ReadyState]]}}.
Initialize channel.{{RTCDataChannel/[[DataChannelLabel]]}} to dataHolder.{{RTCDataChannel/[[DataChannelLabel]]}}.
Initialize channel.{{RTCDataChannel/[[Ordered]]}} to dataHolder.{{RTCDataChannel/[[Ordered]]}}.
Initialize channel.{{RTCDataChannel/[[MaxPacketLifeTime]]}} to dataHolder.{{RTCDataChannel/[[MaxPacketLifeTime]]}}.
Initialize channel.{{RTCDataChannel/[[MaxRetransmits]]}} to dataHolder.{{RTCDataChannel/[[MaxRetransmits]]}}.
Initialize channel.{{RTCDataChannel/[[DataChannelProtocol]]}} to dataHolder.{{RTCDataChannel/[[DataChannelProtocol]]}}.
Initialize channel.{{RTCDataChannel/[[Negotiated]]}} to dataHolder.{{RTCDataChannel/[[Negotiated]]}}.
Initialize channel.{{RTCDataChannel/[[DataChannelId]]}} to dataHolder.{{RTCDataChannel/[[DataChannelId]]}}.
Initialize channel’s [=underlying data transport=] to dataHolder’s [= underlying data transport =].
The above steps do not need to transfer {{RTCDataChannel/[[BufferedAmount]]}} as its value will always be equal to 0
.
+ The reason is an {{RTCDataChannel}} can be transferred only if its [=send() algorithm=] was not called prior the transfer.
If the [=underlying data transport=] is closed at the time of the [=transfer-receiving steps=], + the {{RTCDataChannel}} object will be closed by running the [=announcing a data channel as closed=] algorithm immediately after the [=transfer-receiving steps=].
+ +When an {{RTCDataChannel}} message has @@ -14323,7 +14367,7 @@
[Exposed=Window] +[Exposed=(Window,DedicatedWorker), Transferable] interface RTCDataChannel : EventTarget { readonly attribute USVString label; readonly attribute boolean ordered; @@ -14679,12 +14723,14 @@steps:
-
- +
- +
Let channel be the {{RTCDataChannel}} object on which data is to be sent.
- +
Set channel.{{RTCDataChannel/[[IsTransferable]]}} to
false
.If channel.{{RTCDataChannel/[[ReadyState]]}} is not