Title: [281985] trunk
Revision
281985
Author
you...@apple.com
Date
2021-09-03 04:30:15 -0700 (Fri, 03 Sep 2021)

Log Message

Signaling state check when applying a local or remote description is no longer aligned with the WebRTC spec
https://bugs.webkit.org/show_bug.cgi?id=229138

Reviewed by Eric Carlson.

LayoutTests/imported/w3c:

Rebasing tests.
Some tests are going from PASS to FAIL:
- LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-operations.https.html: we do not support yet rollback.
- LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html:  is no longer throwing the right exception (and we are not supporting pranswer yet).
- LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription.html: we are throwing with a different exception.

* web-platform-tests/webrtc/RTCPeerConnection-SLD-SRD-timing.https-expected.txt:
* web-platform-tests/webrtc/RTCPeerConnection-operations.https-expected.txt:
* web-platform-tests/webrtc/RTCPeerConnection-restartIce.https-expected.txt:
* web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver-expected.txt:
* web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-answer-expected.txt:
* web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-offer-expected.txt:
* web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-pranswer-expected.txt:
* web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-rollback-expected.txt:
* web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-expected.txt:
* web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-offer-expected.txt:
* web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback-expected.txt:
* web-platform-tests/webrtc/RTCRtpTransceiver.https-expected.txt:

Source/WebCore:

These checks have been removed from the spec and are no longer valid.
Covered by rebased tests.

* Modules/mediastream/PeerConnectionBackend.cpp:
(WebCore::PeerConnectionBackend::setLocalDescription):
(WebCore::PeerConnectionBackend::setRemoteDescription):
(WebCore::isLocalDescriptionTypeValidForState): Deleted.
(WebCore::isRemoteDescriptionTypeValidForState): Deleted.
* testing/MockLibWebRTCPeerConnection.cpp:
(WebCore::MockLibWebRTCPeerConnection::SetLocalDescription):
(WebCore::MockLibWebRTCPeerConnection::SetRemoteDescription):
* testing/MockLibWebRTCPeerConnection.h:

LayoutTests:

* fast/mediastream/RTCPeerConnection-setRemoteDescription-offer-expected.txt:
* fast/mediastream/RTCPeerConnection-stable-expected.txt:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (281984 => 281985)


--- trunk/LayoutTests/ChangeLog	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/ChangeLog	2021-09-03 11:30:15 UTC (rev 281985)
@@ -1,5 +1,15 @@
 2021-09-03  Youenn Fablet  <you...@apple.com>
 
+        Signaling state check when applying a local or remote description is no longer aligned with the WebRTC spec
+        https://bugs.webkit.org/show_bug.cgi?id=229138
+
+        Reviewed by Eric Carlson.
+
+        * fast/mediastream/RTCPeerConnection-setRemoteDescription-offer-expected.txt:
+        * fast/mediastream/RTCPeerConnection-stable-expected.txt:
+
+2021-09-03  Youenn Fablet  <you...@apple.com>
+
         Migrate to latest libwebrtc AddIceCandidate
         https://bugs.webkit.org/show_bug.cgi?id=229700
 

Modified: trunk/LayoutTests/fast/mediastream/RTCPeerConnection-setRemoteDescription-offer-expected.txt (281984 => 281985)


--- trunk/LayoutTests/fast/mediastream/RTCPeerConnection-setRemoteDescription-offer-expected.txt	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/fast/mediastream/RTCPeerConnection-setRemoteDescription-offer-expected.txt	2021-09-03 11:30:15 UTC (rev 281985)
@@ -20,8 +20,8 @@
 FAIL pc.signalingState should be have-remote-offer. Was stable.
 
 *** Try setting local descriptions with bad types for the current state
-PASS promise pc.setRemoteDescription({type:'answer', sdp:remoteOffer1.sdp}); rejected with InvalidStateError: Remote description type 2 is incompatible with current signaling state 0
-PASS promise pc.setRemoteDescription({type:'pranswer', sdp:remoteOffer1.sdp}); rejected with InvalidStateError: Remote description type 1 is incompatible with current signaling state 0
+PASS promise pc.setRemoteDescription({type:'answer', sdp:remoteOffer1.sdp}); rejected with InvalidStateError: The object is in an invalid state.
+PASS promise pc.setRemoteDescription({type:'pranswer', sdp:remoteOffer1.sdp}); rejected with InvalidStateError: The object is in an invalid state.
 
 *** Create (remote) offer with video (remoteOffer2)
 *** Done, start testing with remoteOffer2

Modified: trunk/LayoutTests/fast/mediastream/RTCPeerConnection-stable-expected.txt (281984 => 281985)


--- trunk/LayoutTests/fast/mediastream/RTCPeerConnection-stable-expected.txt	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/fast/mediastream/RTCPeerConnection-stable-expected.txt	2021-09-03 11:30:15 UTC (rev 281985)
@@ -6,25 +6,25 @@
 PASS pc.signalingState is "stable"
 PASS pc.setLocalDescription(sessionDescription).then(finishIfSucceeded, requestFailed1); did not throw exception.
 PASS setLocalDescription failed.
-FAIL errorReason.name should be InvalidSessionDescriptionError. Was InvalidStateError.
+FAIL errorReason.name should be InvalidSessionDescriptionError. Was OperationError.
 FAIL pc.localDescription should throw an exception. Was null.
 FAIL pc.remoteDescription should throw an exception. Was null.
 PASS pc.signalingState is "stable"
 PASS pc.setLocalDescription(sessionDescription).then(finishIfSucceeded, requestFailed2); did not throw exception.
 PASS setLocalDescription failed.
-FAIL errorReason.name should be InvalidSessionDescriptionError. Was InvalidStateError.
+FAIL errorReason.name should be InvalidSessionDescriptionError. Was OperationError.
 FAIL pc.localDescription should throw an exception. Was null.
 FAIL pc.remoteDescription should throw an exception. Was null.
 PASS pc.signalingState is "stable"
 PASS pc.setRemoteDescription(sessionDescription).then(finishIfSucceeded, requestFailed3); did not throw exception.
 PASS setRemoteDescription failed.
-FAIL errorReason.name should be InvalidSessionDescriptionError. Was InvalidStateError.
+FAIL errorReason.name should be InvalidSessionDescriptionError. Was SyntaxError.
 FAIL pc.localDescription should throw an exception. Was null.
 FAIL pc.remoteDescription should throw an exception. Was null.
 PASS pc.signalingState is "stable"
 PASS pc.setRemoteDescription(sessionDescription).then(finishIfSucceeded, requestFailed4); did not throw exception.
 PASS setRemoteDescription failed.
-FAIL errorReason.name should be InvalidSessionDescriptionError. Was InvalidStateError.
+FAIL errorReason.name should be InvalidSessionDescriptionError. Was SyntaxError.
 FAIL pc.localDescription should throw an exception. Was null.
 FAIL pc.remoteDescription should throw an exception. Was null.
 PASS pc.signalingState is "stable"

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (281984 => 281985)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2021-09-03 11:30:15 UTC (rev 281985)
@@ -1,5 +1,31 @@
 2021-09-03  Youenn Fablet  <you...@apple.com>
 
+        Signaling state check when applying a local or remote description is no longer aligned with the WebRTC spec
+        https://bugs.webkit.org/show_bug.cgi?id=229138
+
+        Reviewed by Eric Carlson.
+
+        Rebasing tests.
+        Some tests are going from PASS to FAIL:
+        - LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-operations.https.html: we do not support yet rollback.
+        - LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html:  is no longer throwing the right exception (and we are not supporting pranswer yet).
+        - LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription.html: we are throwing with a different exception.
+
+        * web-platform-tests/webrtc/RTCPeerConnection-SLD-SRD-timing.https-expected.txt:
+        * web-platform-tests/webrtc/RTCPeerConnection-operations.https-expected.txt:
+        * web-platform-tests/webrtc/RTCPeerConnection-restartIce.https-expected.txt:
+        * web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver-expected.txt:
+        * web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-answer-expected.txt:
+        * web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-offer-expected.txt:
+        * web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-pranswer-expected.txt:
+        * web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-rollback-expected.txt:
+        * web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-expected.txt:
+        * web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-offer-expected.txt:
+        * web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback-expected.txt:
+        * web-platform-tests/webrtc/RTCRtpTransceiver.https-expected.txt:
+
+2021-09-03  Youenn Fablet  <you...@apple.com>
+
         Migrate to latest libwebrtc AddIceCandidate
         https://bugs.webkit.org/show_bug.cgi?id=229700
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-SLD-SRD-timing.https-expected.txt (281984 => 281985)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-SLD-SRD-timing.https-expected.txt	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-SLD-SRD-timing.https-expected.txt	2021-09-03 11:30:15 UTC (rev 281985)
@@ -1,3 +1,3 @@
 
-FAIL setLocalDescription and setRemoteDescription are not racy promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 0 is incompatible with current signaling state 1"
+FAIL setLocalDescription and setRemoteDescription are not racy promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to set remote offer sdp: Called in wrong state: have-local-offer"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-operations.https-expected.txt (281984 => 281985)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-operations.https-expected.txt	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-operations.https-expected.txt	2021-09-03 11:30:15 UTC (rev 281985)
@@ -5,7 +5,7 @@
 PASS promiseStateFinal helper works
 FAIL createOffer must detect InvalidStateError synchronously when chain is empty (prerequisite) assert_equals: expected "InvalidStateError" but got "Error"
 PASS createAnswer must detect InvalidStateError synchronously when chain is empty (prerequisite)
-PASS SLD(rollback) must detect InvalidStateError synchronously when chain is empty
+FAIL SLD(rollback) must detect InvalidStateError synchronously when chain is empty assert_equals: promise rejected on same task expected "rejected" but got "pending"
 FAIL addIceCandidate must detect InvalidStateError synchronously when chain is empty assert_equals: expected "InvalidStateError" but got "TypeError"
 PASS replaceTrack must detect InvalidStateError synchronously when chain is empty and transceiver is stopped
 PASS setParameters must detect InvalidStateError synchronously always when transceiver is stopped
@@ -26,7 +26,7 @@
 PASS sender.getStats does NOT use the operations chain
 PASS receiver.getStats does NOT use the operations chain
 FAIL addIceCandidate chains onto SRD, fails before assert_equals: expected "InvalidStateError" but got "OperationError"
-FAIL Operations queue not vulnerable to recursion by chained negotiationneeded promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 0 is incompatible with current signaling state 1"
+FAIL Operations queue not vulnerable to recursion by chained negotiationneeded promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to set remote offer sdp: Called in wrong state: have-local-offer"
 FAIL Pack operations queue with implicit offer and answer promise_test: Unhandled rejection with value: object "OperationError: Expect line: v="
 TIMEOUT Negotiate solely by operations queue and signaling state Test timed out
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-restartIce.https-expected.txt (281984 => 281985)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-restartIce.https-expected.txt	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-restartIce.https-expected.txt	2021-09-03 11:30:15 UTC (rev 281985)
@@ -10,6 +10,6 @@
 PASS restartIce() survives remote offer
 PASS restartIce() is satisfied by remote ICE restart
 PASS restartIce() trumps {iceRestart: false}
-FAIL restartIce() survives rollback promise_test: Unhandled rejection with value: object "InvalidStateError: Local description type 3 is incompatible with current signaling state 1"
+PASS restartIce() survives rollback
 FAIL restartIce() survives remote offer containing partial restart assert_false: Restarted 2 expected false got true
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver-expected.txt (281984 => 281985)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver-expected.txt	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver-expected.txt	2021-09-03 11:30:15 UTC (rev 281985)
@@ -1,8 +1,8 @@
 
 PASS setLocalDescription(offer) with m= section should assign mid to corresponding transceiver
 PASS setRemoteDescription(offer) with m= section and no existing transceiver should create corresponding transceiver
-FAIL setLocalDescription(rollback) should unset transceiver.mid promise_test: Unhandled rejection with value: object "InvalidStateError: Local description type 3 is incompatible with current signaling state 1"
-FAIL setLocalDescription(rollback) should only unset transceiver mids associated with current round promise_test: Unhandled rejection with value: object "InvalidStateError: Local description type 3 is incompatible with current signaling state 1"
-FAIL setRemoteDescription(rollback) should remove newly created transceiver from transceiver list promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
+PASS setLocalDescription(rollback) should unset transceiver.mid
+PASS setLocalDescription(rollback) should only unset transceiver mids associated with current round
+FAIL setRemoteDescription(rollback) should remove newly created transceiver from transceiver list assert_array_equals: Expect transceiver to be removed from pc2's transceiver list lengths differ, expected array [] length 0, got [object "[object RTCRtpTransceiver]"] length 1
 PASS setRemoteDescription should set transceiver inactive if its corresponding m section is rejected
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-answer-expected.txt (281984 => 281985)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-answer-expected.txt	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-answer-expected.txt	2021-09-03 11:30:15 UTC (rev 281985)
@@ -1,9 +1,9 @@
 
 PASS setLocalDescription() with valid answer should succeed
 FAIL setLocalDescription() with type answer and null sdp should use lastAnswer generated from createAnswer promise_test: Unhandled rejection with value: object "OperationError: Expect line: v="
-FAIL setLocalDescription() with answer not created by own createAnswer() should reject with InvalidModificationError promise_rejects_dom: function "function () { throw e }" threw object "OperationError: Failed to set local answer sdp: Failed to apply the description for m= section with mid='0': Local fingerprint does not match identity. Expected: sha-256 0D:E2:FA:94:4D:00:FD:19:00:18:DC:96:C0:5D:20:81:53:91:E1:DE:73:E9:B6:99:A3:64:B9:F1:58:69:81:18 Got: sha-256 94:25:42:B4:B7:8C:8C:F5:DF:C5:ED:6A:82:03:44:0D:4E:1B:0A:B7:76:D6:BE:DA:72:80:7D:3D:6C:78:2B:F3" that is not a DOMException InvalidModificationError: property "code" is equal to 0, expected 13
-FAIL Calling setLocalDescription(answer) from stable state should reject with InvalidModificationError promise_rejects_dom: function "function () { throw e }" threw object "InvalidStateError: Local description type 2 is incompatible with current signaling state 0" that is not a DOMException InvalidModificationError: property "code" is equal to 11, expected 13
-FAIL Calling setLocalDescription(answer) from have-local-offer state should reject with InvalidModificationError promise_rejects_dom: function "function () { throw e }" threw object "InvalidStateError: Local description type 2 is incompatible with current signaling state 1" that is not a DOMException InvalidModificationError: property "code" is equal to 11, expected 13
-FAIL Setting previously generated answer after a call to createOffer should work promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
+FAIL setLocalDescription() with answer not created by own createAnswer() should reject with InvalidModificationError promise_rejects_dom: function "function () { throw e }" threw object "OperationError: Failed to set local answer sdp: Failed to apply the description for m= section with mid='0': Local fingerprint does not match identity. Expected: sha-256 5A:90:E6:76:2B:68:BA:02:57:FC:0E:37:B6:BF:A7:1E:79:58:12:D4:6C:0D:84:CB:08:D2:F7:BB:01:9E:B9:CB Got: sha-256 05:68:D4:79:D9:47:72:10:F1:2A:F8:81:C7:C0:C5:28:4C:9B:B9:90:9A:60:81:E6:2C:31:35:E5:9D:C7:E2:0A" that is not a DOMException InvalidModificationError: property "code" is equal to 0, expected 13
+FAIL Calling setLocalDescription(answer) from stable state should reject with InvalidModificationError promise_rejects_dom: function "function () { throw e }" threw object "InvalidStateError: Failed to set local answer sdp: no pending remote description." that is not a DOMException InvalidModificationError: property "code" is equal to 11, expected 13
+FAIL Calling setLocalDescription(answer) from have-local-offer state should reject with InvalidModificationError promise_rejects_dom: function "function () { throw e }" threw object "InvalidStateError: Failed to set local answer sdp: no pending remote description." that is not a DOMException InvalidModificationError: property "code" is equal to 11, expected 13
+PASS Setting previously generated answer after a call to createOffer should work
 FAIL setLocalDescription(answer) should update internal state with a queued task, in the right order assert_not_equals: pendingRemoteDescription should not be set synchronously after a call to sLD got disallowed value null
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-offer-expected.txt (281984 => 281985)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-offer-expected.txt	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-offer-expected.txt	2021-09-03 11:30:15 UTC (rev 281985)
@@ -1,10 +1,10 @@
 
 PASS setLocalDescription with valid offer should succeed
 FAIL setLocalDescription with type offer and null sdp should use lastOffer generated from createOffer promise_test: Unhandled rejection with value: object "OperationError: Expect line: v="
-FAIL setLocalDescription() with offer not created by own createOffer() should reject with InvalidModificationError promise_rejects_dom: function "function () { throw e }" threw object "OperationError: Failed to set local offer sdp: Failed to apply the description for m= section with mid='0': Local fingerprint does not match identity. Expected: sha-256 AC:89:BE:E6:A4:DB:0A:BB:A7:A5:85:7E:53:F6:60:11:D8:97:44:6D:D0:A1:4C:32:80:B3:03:94:C8:83:AD:A8 Got: sha-256 34:AF:27:F0:FE:EF:83:BC:1D:76:C6:89:C7:D9:81:7C:C3:FB:DA:F0:04:CF:D3:81:FC:62:FA:9A:84:B5:3B:E8" that is not a DOMException InvalidModificationError: property "code" is equal to 0, expected 13
+FAIL setLocalDescription() with offer not created by own createOffer() should reject with InvalidModificationError promise_rejects_dom: function "function () { throw e }" threw object "OperationError: Failed to set local offer sdp: Failed to apply the description for m= section with mid='0': Local fingerprint does not match identity. Expected: sha-256 CB:DD:6C:16:C3:EB:2B:91:4B:45:55:4F:C1:45:DC:BF:53:7C:F4:4B:F5:07:80:18:31:8A:51:3A:35:0E:36:4C Got: sha-256 DD:D9:E2:F3:33:68:9A:4C:1D:FD:BE:CA:4E:0F:35:78:FC:B5:2A:0A:C8:E5:CD:E2:93:7B:C7:7A:99:C2:31:63" that is not a DOMException InvalidModificationError: property "code" is equal to 0, expected 13
 FAIL Set created offer other than last offer should reject with InvalidModificationError assert_unreached: Should have rejected: undefined Reached unreachable code
 PASS Creating and setting offer multiple times should succeed
-FAIL Setting previously generated offer after a call to createAnswer should work promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
+PASS Setting previously generated offer after a call to createAnswer should work
 FAIL Negotiation works when there has been a repeated setLocalDescription(offer) assert_equals: expected 1 but got 0
 FAIL setLocalDescription(offer) should update internal state with a queued task, in the right order assert_equals: pendingRemoteDescription should never be set due to sLD expected null but got object "[object RTCSessionDescription]"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-pranswer-expected.txt (281984 => 281985)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-pranswer-expected.txt	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-pranswer-expected.txt	2021-09-03 11:30:15 UTC (rev 281985)
@@ -1,5 +1,5 @@
 
-PASS setLocalDescription(pranswer) from stable state should reject with InvalidStateError
+FAIL setLocalDescription(pranswer) from stable state should reject with InvalidStateError promise_rejects_dom: function "function () { throw e }" threw object "OperationError: Failed to set local pranswer sdp: Called in wrong state: stable" that is not a DOMException InvalidStateError: property "code" is equal to 0, expected 11
 FAIL setLocalDescription(pranswer) should succeed assert_equals: expected null but got object "[object RTCSessionDescription]"
 PASS setLocalDescription(pranswer) can be applied multiple times while still in have-local-pranswer
 PASS setLocalDescription(answer) from have-local-pranswer state should succeed

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-rollback-expected.txt (281984 => 281985)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-rollback-expected.txt	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-rollback-expected.txt	2021-09-03 11:30:15 UTC (rev 281985)
@@ -1,7 +1,7 @@
 
-FAIL setLocalDescription(rollback) from have-local-offer state should reset back to stable state promise_test: Unhandled rejection with value: object "InvalidStateError: Local description type 3 is incompatible with current signaling state 1"
+PASS setLocalDescription(rollback) from have-local-offer state should reset back to stable state
 PASS setLocalDescription(rollback) from stable state should reject with InvalidStateError
 PASS setLocalDescription(rollback) after setting answer description should reject with InvalidStateError
-FAIL setLocalDescription(rollback) should ignore invalid sdp content and succeed promise_test: Unhandled rejection with value: object "InvalidStateError: Local description type 3 is incompatible with current signaling state 1"
-FAIL setLocalDescription(rollback) should update internal state with a queued tassk, in the right order promise_test: Unhandled rejection with value: object "InvalidStateError: Local description type 3 is incompatible with current signaling state 1"
+PASS setLocalDescription(rollback) should ignore invalid sdp content and succeed
+FAIL setLocalDescription(rollback) should update internal state with a queued tassk, in the right order assert_not_equals: pendingLocalDescription should not be set synchronously after a call to sLD got disallowed value null
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-expected.txt (281984 => 281985)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-expected.txt	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-expected.txt	2021-09-03 11:30:15 UTC (rev 281985)
@@ -1,6 +1,6 @@
 
 PASS setRemoteDescription with invalid type and invalid SDP should reject with TypeError
-PASS setRemoteDescription() with invalid SDP and stable state should reject with InvalidStateError
+FAIL setRemoteDescription() with invalid SDP and stable state should reject with InvalidStateError assert_throws_dom: function "() => { throw e }" threw object "SyntaxError: Expect line: v=" that is not a DOMException InvalidStateError: property "code" is equal to 12, expected 11
 PASS Negotiation should fire signalingsstate events
 PASS Calling setRemoteDescription() again after one round of remote-offer/local-answer should succeed
 PASS Switching role from offerer to answerer after going back to stable state should succeed

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-offer-expected.txt (281984 => 281985)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-offer-expected.txt	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-offer-expected.txt	2021-09-03 11:30:15 UTC (rev 281985)
@@ -5,7 +5,7 @@
 PASS setRemoteDescription multiple times should succeed
 PASS setRemoteDescription multiple times with different offer should succeed
 FAIL setRemoteDescription(offer) with invalid SDP should reject with RTCError assert_equals: Expect error detail field to set to sdp-syntax-error expected (string) "sdp-syntax-error" but got (undefined) undefined
-FAIL setRemoteDescription(offer) from have-local-offer should roll back and succeed promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 0 is incompatible with current signaling state 1"
+FAIL setRemoteDescription(offer) from have-local-offer should roll back and succeed promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to set remote offer sdp: Called in wrong state: have-local-offer"
 TIMEOUT setRemoteDescription(offer) from have-local-offer fires signalingstatechange twice Test timed out
 NOTRUN setRemoteDescription(offer) in stable should update internal state with a queued task, in the right order
 NOTRUN setRemoteDescription(offer) in have-local-offer should update internal state with a queued task, in the right order

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback-expected.txt (281984 => 281985)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback-expected.txt	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback-expected.txt	2021-09-03 11:30:15 UTC (rev 281985)
@@ -1,23 +1,23 @@
 
-FAIL setRemoteDescription(rollback) in have-remote-offer state should revert to stable state promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
+PASS setRemoteDescription(rollback) in have-remote-offer state should revert to stable state
 PASS setRemoteDescription(rollback) from stable state should reject with InvalidStateError
-FAIL setRemoteDescription(rollback) should ignore invalid sdp content and succeed promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
-FAIL local offer created before setRemoteDescription(remote offer) then rollback should still be usable promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
-FAIL local offer created before setRemoteDescription(remote offer) with different transceiver level assignments then rollback should still be usable promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
-FAIL rollback of a remote offer should remove a transceiver promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
-FAIL rollback of a remote offer should remove touched transceiver promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
-FAIL rollback of a remote offer should keep a transceiver promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
-FAIL rollback of a remote offer should keep a transceiver created by addtrack promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
-FAIL rollback of a remote offer should keep a transceiver without tracks promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
-FAIL explicit rollback of local offer should remove transceivers and transport promise_test: Unhandled rejection with value: object "InvalidStateError: Local description type 3 is incompatible with current signaling state 1"
-FAIL when using addTransceiver, implicit rollback of a local offer should visit stable state, but not fire negotiationneeded until we settle in stable promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 0 is incompatible with current signaling state 1"
-FAIL when using addTrack, implicit rollback of a local offer should visit stable state, but not fire negotiationneeded promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 0 is incompatible with current signaling state 1"
-FAIL rollback of a remote offer to negotiated stable state should enable applying of a local offer promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
-FAIL rollback of a local offer to negotiated stable state should enable applying of a remote offer promise_test: Unhandled rejection with value: object "InvalidStateError: Local description type 3 is incompatible with current signaling state 1"
-FAIL rollback a local offer with audio direction change to negotiated stable state and then add video receiver promise_test: Unhandled rejection with value: object "InvalidStateError: Local description type 3 is incompatible with current signaling state 1"
-FAIL two transceivers with same mids promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 0 is incompatible with current signaling state 1"
-FAIL onremovetrack fires during remote rollback promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
+PASS setRemoteDescription(rollback) should ignore invalid sdp content and succeed
+PASS local offer created before setRemoteDescription(remote offer) then rollback should still be usable
+PASS local offer created before setRemoteDescription(remote offer) with different transceiver level assignments then rollback should still be usable
+FAIL rollback of a remote offer should remove a transceiver assert_equals: expected 0 but got 1
+FAIL rollback of a remote offer should remove touched transceiver assert_equals: expected 0 but got 1
+PASS rollback of a remote offer should keep a transceiver
+PASS rollback of a remote offer should keep a transceiver created by addtrack
+PASS rollback of a remote offer should keep a transceiver without tracks
+PASS explicit rollback of local offer should remove transceivers and transport
+FAIL when using addTransceiver, implicit rollback of a local offer should visit stable state, but not fire negotiationneeded until we settle in stable promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to set remote offer sdp: Called in wrong state: have-local-offer"
+FAIL when using addTrack, implicit rollback of a local offer should visit stable state, but not fire negotiationneeded promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to set remote offer sdp: Called in wrong state: have-local-offer"
+PASS rollback of a remote offer to negotiated stable state should enable applying of a local offer
+PASS rollback of a local offer to negotiated stable state should enable applying of a remote offer
+PASS rollback a local offer with audio direction change to negotiated stable state and then add video receiver
+FAIL two transceivers with same mids promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to set remote offer sdp: Called in wrong state: have-local-offer"
+PASS onremovetrack fires during remote rollback
 FAIL rollback of a remote offer with stream changes assert_equals: expected 2 but got 1
 PASS removeTrack() with a sender being rolled back does not crash or throw
-FAIL Implicit rollback with only a datachannel works promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 0 is incompatible with current signaling state 1"
+FAIL Implicit rollback with only a datachannel works promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to set remote offer sdp: Called in wrong state: have-local-offer"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCRtpTransceiver.https-expected.txt (281984 => 281985)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCRtpTransceiver.https-expected.txt	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCRtpTransceiver.https-expected.txt	2021-09-03 11:30:15 UTC (rev 281985)
@@ -21,7 +21,7 @@
 PASS checkReplaceTrackNullDoesntPreventPairing
 PASS checkRemoveAndReadd
 PASS checkAddTrackExistingTransceiverThenRemove
-FAIL checkRemoveTrackNegotiation promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
+FAIL checkRemoveTrackNegotiation assert_equals: Rollback should have added two tracks expected 2 but got 0
 FAIL checkMute assert_true: expected true got false
 FAIL checkStop assert_equals: expected "[{currentDirection:\"sendrecv\",direction:\"stopped\",receiver:{track:{kind:\"audio\",readyState:\"ended\"}},sender:{track:{kind:\"audio\"}}}]" but got "[{currentDirection:\"sendrecv\",direction:\"inactive\",receiver:{track:{kind:\"audio\",readyState:\"ended\"}},sender:{track:null}}]"
 FAIL checkStopAfterCreateOffer assert_equals: expected "[{currentDirection:\"sendrecv\",direction:\"stopped\"}]" but got "[{currentDirection:\"sendrecv\",direction:\"inactive\"}]"
@@ -30,11 +30,11 @@
 FAIL checkStopAfterCreateAnswer assert_equals: expected "[{currentDirection:null,direction:\"stopped\"}]" but got "[{currentDirection:null,direction:\"inactive\"}]"
 FAIL checkStopAfterSetLocalAnswer assert_equals: expected "[{currentDirection:\"sendrecv\",direction:\"stopped\"}]" but got "[{currentDirection:\"sendrecv\",direction:\"inactive\"}]"
 PASS checkStopAfterClose
-FAIL checkLocalRollback promise_test: Unhandled rejection with value: object "InvalidStateError: Local description type 3 is incompatible with current signaling state 1"
-FAIL checkRollbackAndSetRemoteOfferWithDifferentType promise_test: Unhandled rejection with value: object "InvalidStateError: Local description type 3 is incompatible with current signaling state 1"
-FAIL checkRemoteRollback promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 3 is incompatible with current signaling state 2"
+FAIL checkLocalRollback assert_equals: expected "[{direction:\"stopped\"}]" but got "[{direction:\"inactive\"}]"
+PASS checkRollbackAndSetRemoteOfferWithDifferentType
+FAIL checkRemoteRollback assert_equals: expected "[]" but got "[{}]"
 FAIL checkMsectionReuse assert_equals: expected "[{currentDirection:null,mid:null}]" but got "[{currentDirection:\"inactive\",mid:\"0\"}]"
 PASS checkStopAfterCreateOfferWithReusedMsection
-FAIL checkAddIceCandidateToStoppedTransceiver promise_test: Unhandled rejection with value: object "InvalidStateError: Remote description type 0 is incompatible with current signaling state 1"
+PASS checkAddIceCandidateToStoppedTransceiver
 FAIL checkBundleTagRejected promise_test: Unhandled rejection with value: object "InvalidAccessError: Failed to set remote offer sdp: The m= section with mid='1' should be rejected."
 

Modified: trunk/Source/WebCore/ChangeLog (281984 => 281985)


--- trunk/Source/WebCore/ChangeLog	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/Source/WebCore/ChangeLog	2021-09-03 11:30:15 UTC (rev 281985)
@@ -1,3 +1,23 @@
+2021-09-03  Youenn Fablet  <you...@apple.com>
+
+        Signaling state check when applying a local or remote description is no longer aligned with the WebRTC spec
+        https://bugs.webkit.org/show_bug.cgi?id=229138
+
+        Reviewed by Eric Carlson.
+
+        These checks have been removed from the spec and are no longer valid.
+        Covered by rebased tests.
+
+        * Modules/mediastream/PeerConnectionBackend.cpp:
+        (WebCore::PeerConnectionBackend::setLocalDescription):
+        (WebCore::PeerConnectionBackend::setRemoteDescription):
+        (WebCore::isLocalDescriptionTypeValidForState): Deleted.
+        (WebCore::isRemoteDescriptionTypeValidForState): Deleted.
+        * testing/MockLibWebRTCPeerConnection.cpp:
+        (WebCore::MockLibWebRTCPeerConnection::SetLocalDescription):
+        (WebCore::MockLibWebRTCPeerConnection::SetRemoteDescription):
+        * testing/MockLibWebRTCPeerConnection.h:
+
 2021-09-03  David Kilzer  <ddkil...@apple.com>
 
         RemoteVideoSample needs CVPixelBufferRef to be kept alive, but relies on caller to retain it

Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp (281984 => 281985)


--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp	2021-09-03 11:30:15 UTC (rev 281985)
@@ -160,34 +160,10 @@
     });
 }
 
-static inline bool isLocalDescriptionTypeValidForState(RTCSdpType type, RTCSignalingState state)
-{
-    switch (state) {
-    case RTCSignalingState::Stable:
-        return type == RTCSdpType::Offer;
-    case RTCSignalingState::HaveLocalOffer:
-        return type == RTCSdpType::Offer;
-    case RTCSignalingState::HaveRemoteOffer:
-        return type == RTCSdpType::Answer || type == RTCSdpType::Pranswer;
-    case RTCSignalingState::HaveLocalPranswer:
-        return type == RTCSdpType::Answer || type == RTCSdpType::Pranswer;
-    default:
-        return false;
-    };
-
-    ASSERT_NOT_REACHED();
-    return false;
-}
-
 void PeerConnectionBackend::setLocalDescription(const RTCSessionDescription* sessionDescription, DOMPromiseDeferred<void>&& promise)
 {
     ASSERT(!m_peerConnection.isClosed());
 
-    if (sessionDescription && !isLocalDescriptionTypeValidForState(sessionDescription->type(), m_peerConnection.signalingState())) {
-        promise.reject(InvalidStateError, makeString("Local description type ", sessionDescription->type(), " is incompatible with current signaling state ", m_peerConnection.signalingState()));
-        return;
-    }
-
     m_setDescriptionPromise = WTF::makeUnique<DOMPromiseDeferred<void>>(WTFMove(promise));
     doSetLocalDescription(sessionDescription);
 }
@@ -220,34 +196,10 @@
     });
 }
 
-static inline bool isRemoteDescriptionTypeValidForState(RTCSdpType type, RTCSignalingState state)
-{
-    switch (state) {
-    case RTCSignalingState::Stable:
-        return type == RTCSdpType::Offer;
-    case RTCSignalingState::HaveLocalOffer:
-        return type == RTCSdpType::Answer || type == RTCSdpType::Pranswer;
-    case RTCSignalingState::HaveRemoteOffer:
-        return type == RTCSdpType::Offer;
-    case RTCSignalingState::HaveRemotePranswer:
-        return type == RTCSdpType::Answer || type == RTCSdpType::Pranswer;
-    default:
-        return false;
-    };
-
-    ASSERT_NOT_REACHED();
-    return false;
-}
-
 void PeerConnectionBackend::setRemoteDescription(const RTCSessionDescription& sessionDescription, DOMPromiseDeferred<void>&& promise)
 {
     ASSERT(!m_peerConnection.isClosed());
 
-    if (!isRemoteDescriptionTypeValidForState(sessionDescription.type(), m_peerConnection.signalingState())) {
-        promise.reject(InvalidStateError, makeString("Remote description type ", sessionDescription.type(), " is incompatible with current signaling state ", m_peerConnection.signalingState()));
-        return;
-    }
-
     m_setDescriptionPromise = WTF::makeUnique<DOMPromiseDeferred<void>>(WTFMove(promise));
     doSetRemoteDescription(sessionDescription);
 }

Modified: trunk/Source/WebCore/platform/mediastream/RTCSignalingState.h (281984 => 281985)


--- trunk/Source/WebCore/platform/mediastream/RTCSignalingState.h	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/Source/WebCore/platform/mediastream/RTCSignalingState.h	2021-09-03 11:30:15 UTC (rev 281985)
@@ -26,6 +26,8 @@
 
 #if ENABLE(WEB_RTC)
 
+#include <wtf/text/WTFString.h>
+
 namespace WebCore {
 
 enum class RTCSignalingState {

Modified: trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.cpp (281984 => 281985)


--- trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.cpp	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.cpp	2021-09-03 11:30:15 UTC (rev 281985)
@@ -262,6 +262,31 @@
 
 void MockLibWebRTCPeerConnection::SetLocalDescription(webrtc::SetSessionDescriptionObserver* observer, webrtc::SessionDescriptionInterface* sessionDescription)
 {
+    bool isCorrectState = true;
+    switch (m_signalingState) {
+    case RTCSignalingState::Stable:
+    case RTCSignalingState::HaveLocalOffer:
+        isCorrectState = sessionDescription->GetType() == webrtc::SdpType::kOffer;
+        if (isCorrectState)
+            m_signalingState = RTCSignalingState::HaveLocalOffer;
+        break;
+    case RTCSignalingState::HaveRemoteOffer:
+        isCorrectState = sessionDescription->GetType() == webrtc::SdpType::kAnswer;
+        if (isCorrectState)
+            m_signalingState = RTCSignalingState::Stable;
+        break;
+    case RTCSignalingState::HaveLocalPranswer:
+    case RTCSignalingState::HaveRemotePranswer:
+    case RTCSignalingState::Closed:
+        isCorrectState = false;
+    }
+    if (!isCorrectState) {
+        LibWebRTCProvider::callOnWebRTCSignalingThread([observer] {
+            observer->OnFailure(webrtc::RTCError(webrtc::RTCErrorType::INVALID_STATE));
+        });
+        return;
+    }
+
     std::unique_ptr<webrtc::SessionDescriptionInterface> toBeFreed(sessionDescription);
     LibWebRTCProvider::callOnWebRTCSignalingThread([this, observer] {
         observer->OnSuccess();
@@ -271,6 +296,31 @@
 
 void MockLibWebRTCPeerConnection::SetRemoteDescription(webrtc::SetSessionDescriptionObserver* observer, webrtc::SessionDescriptionInterface* sessionDescription)
 {
+    bool isCorrectState = true;
+    switch (m_signalingState) {
+    case RTCSignalingState::HaveRemoteOffer:
+    case RTCSignalingState::Stable:
+        isCorrectState = sessionDescription->GetType() == webrtc::SdpType::kOffer;
+        if (isCorrectState)
+            m_signalingState = RTCSignalingState::HaveRemoteOffer;
+        break;
+    case RTCSignalingState::HaveLocalOffer:
+        isCorrectState = sessionDescription->GetType() == webrtc::SdpType::kAnswer;
+        if (isCorrectState)
+            m_signalingState = RTCSignalingState::Stable;
+        break;
+    case RTCSignalingState::HaveLocalPranswer:
+    case RTCSignalingState::HaveRemotePranswer:
+    case RTCSignalingState::Closed:
+        isCorrectState = false;
+    }
+    if (!isCorrectState) {
+        LibWebRTCProvider::callOnWebRTCSignalingThread([observer] {
+            observer->OnFailure(webrtc::RTCError(webrtc::RTCErrorType::INVALID_STATE));
+        });
+        return;
+    }
+
     std::unique_ptr<webrtc::SessionDescriptionInterface> toBeFreed(sessionDescription);
     LibWebRTCProvider::callOnWebRTCSignalingThread([observer] {
         observer->OnSuccess();

Modified: trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.h (281984 => 281985)


--- trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.h	2021-09-03 10:51:23 UTC (rev 281984)
+++ trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.h	2021-09-03 11:30:15 UTC (rev 281985)
@@ -27,6 +27,7 @@
 #if USE(LIBWEBRTC)
 
 #include "LibWebRTCMacros.h"
+#include "RTCSignalingState.h"
 
 ALLOW_UNUSED_PARAMETERS_BEGIN
 ALLOW_DEPRECATED_DECLARATIONS_BEGIN
@@ -326,6 +327,7 @@
     bool m_isReceivingAudio { false };
     bool m_isReceivingVideo { false };
     std::string m_streamLabel;
+    RTCSignalingState m_signalingState { RTCSignalingState::Stable };
 };
 
 class MockLibWebRTCPeerConnectionFactory : public webrtc::PeerConnectionFactoryInterface {
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to