Title: [276242] trunk/LayoutTests
Revision
276242
Author
[email protected]
Date
2021-04-19 02:49:20 -0700 (Mon, 19 Apr 2021)

Log Message

Migrate some WebRTC encoded transform tests to WPT
https://bugs.webkit.org/show_bug.cgi?id=224604

Reviewed by Eric Carlson.

LayoutTests/imported/w3c:

* web-platform-tests/webrtc-encoded-transform/routines.js: Added.
(async createConnections):
(waitFor):
* web-platform-tests/webrtc-encoded-transform/script-audio-transform-worker.js: Added.
(MockRTCRtpTransformer):
(MockRTCRtpTransformer.prototype.start):
(MockRTCRtpTransformer.prototype.process):
(onrtctransform):
* web-platform-tests/webrtc-encoded-transform/script-audio-transform.https-expected.txt: Added.
* web-platform-tests/webrtc-encoded-transform/script-audio-transform.https.html: Renamed from LayoutTests/http/wpt/webrtc/audio-script-transform.html.
* web-platform-tests/webrtc-encoded-transform/script-change-transform-worker.js: Renamed from LayoutTests/http/wpt/webrtc/change-encoded-transform.js.
* web-platform-tests/webrtc-encoded-transform/script-change-transform.https-expected.txt: Added.
* web-platform-tests/webrtc-encoded-transform/script-change-transform.https.html: Renamed from LayoutTests/http/wpt/webrtc/change-encoded-transform.html.
* web-platform-tests/webrtc-encoded-transform/script-late-transform.https-expected.txt: Added.
* web-platform-tests/webrtc-encoded-transform/script-late-transform.https.html: Renamed from LayoutTests/http/wpt/webrtc/webrtc-late-transform.html.
* web-platform-tests/webrtc-encoded-transform/script-metadata-transform-worker.js: Renamed from LayoutTests/http/wpt/webrtc/metadata-transform-worker.js.
* web-platform-tests/webrtc-encoded-transform/script-metadata-transform.https-expected.txt: Added.
* web-platform-tests/webrtc-encoded-transform/script-metadata-transform.https.html: Renamed from LayoutTests/http/wpt/webrtc/metadata-transform.html.
* web-platform-tests/webrtc-encoded-transform/script-transform-worker.js: Renamed from LayoutTests/http/wpt/webrtc/script-transform.js.
* web-platform-tests/webrtc-encoded-transform/script-transform.https-expected.txt: Added.
* web-platform-tests/webrtc-encoded-transform/script-transform.https.html: Renamed from LayoutTests/http/wpt/webrtc/webrtc-transform.html.
* web-platform-tests/webrtc-encoded-transform/script-write-twice-transform-worker.js: Renamed from LayoutTests/http/wpt/webrtc/write-twice-transform.js.
* web-platform-tests/webrtc-encoded-transform/script-write-twice-transform.https-expected.txt: Added.
* web-platform-tests/webrtc-encoded-transform/script-write-twice-transform.https.html: Renamed from LayoutTests/http/wpt/webrtc/write-twice-transform.html.
* web-platform-tests/webrtc-encoded-transform/sframe-keys.https-expected.txt: Added.
* web-platform-tests/webrtc-encoded-transform/sframe-keys.https.html: Added.
* web-platform-tests/webrtc-encoded-transform/sframe-transform-buffer-source-expected.txt: Added.
* web-platform-tests/webrtc-encoded-transform/sframe-transform-buffer-source.html: Added.
* web-platform-tests/webrtc-encoded-transform/sframe-transform-expected.txt: Added.
* web-platform-tests/webrtc-encoded-transform/sframe-transform-in-worker.https-expected.txt: Added.
* web-platform-tests/webrtc-encoded-transform/sframe-transform-in-worker.https.html: Renamed from LayoutTests/http/wpt/webrtc/sframe-transform-in-worker.html.
* web-platform-tests/webrtc-encoded-transform/sframe-transform-readable-expected.txt: Added.
* web-platform-tests/webrtc-encoded-transform/sframe-transform-readable.html: Added.
* web-platform-tests/webrtc-encoded-transform/sframe-transform-worker.js: Renamed from LayoutTests/http/wpt/webrtc/sframe-transform.js.
* web-platform-tests/webrtc-encoded-transform/sframe-transform.html: Renamed from LayoutTests/http/wpt/webrtc/sframe-transform.html.

LayoutTests:

* http/wpt/webrtc/sframe-transform-readable-crash.html: Removed.
* platform/glib/TestExpectations:
* platform/ios-wk1/TestExpectations:
* platform/mac-wk1/TestExpectations:
* webrtc/script-transform.js: Removed.

Modified Paths

Added Paths

Removed Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (276241 => 276242)


--- trunk/LayoutTests/ChangeLog	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/ChangeLog	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,3 +1,16 @@
+2021-04-19  Youenn Fablet  <[email protected]>
+
+        Migrate some WebRTC encoded transform tests to WPT
+        https://bugs.webkit.org/show_bug.cgi?id=224604
+
+        Reviewed by Eric Carlson.
+
+        * http/wpt/webrtc/sframe-transform-readable-crash.html: Removed.
+        * platform/glib/TestExpectations:
+        * platform/ios-wk1/TestExpectations:
+        * platform/mac-wk1/TestExpectations:
+        * webrtc/script-transform.js: Removed.
+
 2021-04-19  Felipe Erias  <[email protected]>
 
         [css-flexbox] Table layout disregards overriding height

Deleted: trunk/LayoutTests/http/wpt/webrtc/audio-script-transform.html (276241 => 276242)


--- trunk/LayoutTests/http/wpt/webrtc/audio-script-transform.html	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/http/wpt/webrtc/audio-script-transform.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,70 +0,0 @@
-<!doctype html>
-<html>
-    <head>
-        <meta charset="utf-8">
-        <script src=""
-        <script src=""
-    </head>
-    <body>
-        <video id="video" autoplay playsInline></video>
-        <script src=""
-        <script>
-function waitForMessage(port, data)
-{
-    let gotMessage;
-    const promise = new Promise((resolve, reject) => {
-        gotMessage = resolve;
-        setTimeout(() => { reject("did not get " + data) }, 5000);
-    });
-    port._onmessage_ = event => {
-       if (event.data ="" data)
-           gotMessage();
-    };
-    return promise;
-}
-
-let senderTransform, receiverTransform;
-let stream;
-promise_test(async (test) => {
-    worker = new Worker("context-transform.js");
-    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-    assert_equals(data, "registered");
-
-    const localStream = await navigator.mediaDevices.getUserMedia({audio: true});
-
-    const senderChannel = new MessageChannel;
-    const receiverChannel = new MessageChannel;
-    let sender, receiver;
-    senderTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', mediaType:'audio', side:'sender', port:senderChannel.port2}, [senderChannel.port2]);
-    receiverTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', mediaType:'audio', side:'receiver', port:receiverChannel.port2}, [receiverChannel.port2]);
-    senderTransform.port = senderChannel.port1;
-    receiverTransform.port = receiverChannel.port1;
-
-    promise1 = waitForMessage(senderTransform.port, "started audio sender");
-    promise2 = waitForMessage(receiverTransform.port, "started audio receiver");
-
-    stream = await new Promise((resolve, reject) => {
-        createConnections((firstConnection) => {
-            sender = firstConnection.addTrack(localStream.getAudioTracks()[0], localStream);
-            sender.transform = senderTransform;
-        }, (secondConnection) => {
-            secondConnection._ontrack_ = (trackEvent) => {
-                receiver = trackEvent.receiver;
-                receiver.transform = receiverTransform;
-                resolve(trackEvent.streams[0]);
-            };
-        });
-        setTimeout(() => reject("Test timed out"), 5000);
-    });
-
-    await promise1;
-    await promise2;
-}, "setup and check context");
-
-promise_test((test) => {
-    video.srcObject = stream;
-    return video.play();
-}, "audio is playing");
-        </script>
-    </body>
-</html>

Deleted: trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform.html (276241 => 276242)


--- trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform.html	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,57 +0,0 @@
-<!doctype html>
-<html>
-    <head>
-        <meta charset="utf-8">
-        <script src=""
-        <script src=""
-    </head>
-    <body>
-        <video id="video1" autoplay controls playsinline></video>
-        <script src =""
-        <script>
-async function waitForMessage(worker, data)
-{
-    while (true) {
-        const received = await new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-        if (data ="" received)
-            return;
-    }
-}
-
-promise_test(async (test) => {
-    worker = new Worker('change-encoded-transform.js');
-    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-    assert_equals(data, "registered");
-
-    const localStream = await navigator.mediaDevices.getUserMedia({video: true});
-
-    let sender, receiver;
-    const senderTransform1 = new RTCRtpScriptTransform(worker, {name:'sender1'});
-    const senderTransform2 = new RTCRtpScriptTransform(worker, {name:'sender2'});
-    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
-
-    const stream = await new Promise((resolve, reject) => {
-        createConnections((firstConnection) => {
-            sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
-            firstConnection.getTransceivers()[0].setCodecPreferences([{mimeType: "video/VP8", clockRate: 90000}]);
-            sender.transform = senderTransform1;
-        }, (secondConnection) => {
-            secondConnection._ontrack_ = (trackEvent) => {
-                receiver = trackEvent.receiver;
-                receiver.transform = receiverTransform;
-                resolve(trackEvent.streams[0]);
-            };
-        });
-        setTimeout(() => reject("Test timed out"), 5000);
-    });
-
-    video1.srcObject = stream;
-    await video1.play();
-
-    const updatePromise = new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-    sender.transform = senderTransform2;
-    assert_equals(await updatePromise, "got value 2");
-}, "change sender transform");
-        </script>
-    </body>
-</html>

Deleted: trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform.js (276241 => 276242)


--- trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform.js	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform.js	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,39 +0,0 @@
-function appendToBuffer(buffer, value) {
-    const result = new ArrayBuffer(buffer.byteLength + 1);
-    const byteResult = new Uint8Array(result);
-    byteResult.set(new Uint8Array(buffer), 0);
-    byteResult[buffer.byteLength] = value;
-    return result;
-}
-
-_onrtctransform_ = (event) => {
-    const transformer = event.transformer;
-
-    transformer.reader = transformer.readable.getReader();
-    transformer.writer = transformer.writable.getWriter();
-
-    function process(transformer)
-    {
-        transformer.reader.read().then(chunk => {
-            if (chunk.done)
-                return;
-            if (transformer.options.name === 'sender1')
-                chunk.value.data = "" 1);
-            else if (transformer.options.name === 'sender2')
-                chunk.value.data = "" 2);
-            else {
-                const value = new Uint8Array(chunk.value.data)[chunk.value.data.byteLength - 1];
-                if (value !== 1 && value !== 2)
-                    self.postMessage("unexpected value: " + value);
-                else if (value === 2)
-                    self.postMessage("got value 2");
-                chunk.value.data = "" chunk.value.data.byteLength - 1);
-            }
-            transformer.writer.write(chunk.value);
-            process(transformer);
-        });
-    }
-
-    process(transformer);
-};
-self.postMessage("registered");

Deleted: trunk/LayoutTests/http/wpt/webrtc/metadata-transform-worker.js (276241 => 276242)


--- trunk/LayoutTests/http/wpt/webrtc/metadata-transform-worker.js	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/http/wpt/webrtc/metadata-transform-worker.js	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,24 +0,0 @@
-_onrtctransform_ = (event) => {
-    const transformer = event.transformer;
-
-    transformer.reader = transformer.readable.getReader();
-    transformer.writer = transformer.writable.getWriter();
-
-    let isFirstFrame = true;
-    function process(transformer)
-    {
-        transformer.reader.read().then(chunk => {
-            if (chunk.done)
-                return;
-
-            if (isFirstFrame) {
-                isFirstFrame = false;
-                self.postMessage({ name: transformer.options.name, timestamp: chunk.value.timestamp, metadata: chunk.value.getMetadata() });
-            }
-            transformer.writer.write(chunk.value);
-            process(transformer);
-        });
-    }
-    process(transformer);
-};
-self.postMessage("registered");

Deleted: trunk/LayoutTests/http/wpt/webrtc/metadata-transform.html (276241 => 276242)


--- trunk/LayoutTests/http/wpt/webrtc/metadata-transform.html	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/http/wpt/webrtc/metadata-transform.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,84 +0,0 @@
-<!doctype html>
-<html>
-    <head>
-        <meta charset="utf-8">
-        <script src=""
-        <script src=""
-    </head>
-    <body>
-        <video id="video1" autoplay></video>
-        <script src =""
-        <script>
-async function waitForMessage(worker, data)
-{
-    while (true) {
-        const received = await new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-        if (data ="" received)
-            return;
-    }
-}
-
-async function gatherMetadata(audio)
-{
-    worker = new Worker('metadata-transform-worker.js');
-    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-    assert_equals(data, "registered");
-
-    const localStream = await navigator.mediaDevices.getUserMedia({audio: audio, video: !audio});
-
-    let sender, receiver;
-    const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'});
-    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
-
-    await new Promise((resolve, reject) => {
-        createConnections((firstConnection) => {
-            pc1 = firstConnection;
-            sender = firstConnection.addTrack(localStream.getTracks()[0], localStream);
-            sender.transform = senderTransform;
-        }, (secondConnection) => {
-            pc2 = secondConnection;
-            secondConnection._ontrack_ = (trackEvent) => {
-                receiver = trackEvent.receiver;
-                receiver.transform = receiverTransform;
-                resolve(trackEvent.streams[0]);
-            };
-        });
-        setTimeout(() => reject("Test timed out"), 5000);
-    });
-
-    return new Promise((resolve, reject) => {
-        let senderMetadata, senderTimestamp;
-        worker._onmessage_ = (event) => {
-            if (event.data.name === 'sender') {
-                senderMetadata = event.data.metadata;
-                senderTimestamp = event.data.timestamp;
-            } else if (event.data.name === 'receiver')
-               resolve([senderMetadata, senderTimestamp, event.data.metadata, event.data.timestamp]);
-        };
-        setTimeout(() => reject("Metadata test timed out"), 5000); 
-    });
-}
-
-promise_test(async (test) => {
-    const [senderMetadata, senderTimestamp, receiverMetadata, receiverTimestamp] = await gatherMetadata(true);
-
-    assert_equals(senderTimestamp, receiverTimestamp, "timestamp");
-    assert_true(!!senderMetadata.synchronizationSource, "ssrc");
-    assert_equals(senderMetadata.synchronizationSource, receiverMetadata.synchronizationSource, "ssrc");
-    assert_array_equals(senderMetadata.contributingSources, receiverMetadata.contributingSources, "csrc");
-}, "audio exchange with transform");
-
-promise_test(async (test) => {
-    const [senderMetadata, senderTimestamp, receiverMetadata, receiverTimestamp] = await gatherMetadata(true);
-
-    assert_equals(senderTimestamp, receiverTimestamp, "timestamp");
-    assert_true(!!senderMetadata.synchronizationSource, "ssrc");
-    assert_equals(senderMetadata.synchronizationSource, receiverMetadata.synchronizationSource, "ssrc");
-    assert_equals(senderMetadata.height, receiverMetadata.height, "height");
-    assert_equals(senderMetadata.width, receiverMetadata.width, "width");
-    assert_equals(senderMetadata.spatialIndex, receiverMetadata.spatialIndex, "spatialIndex");
-    assert_equals(senderMetadata.temporalIndex, receiverMetadata.temporalIndex, "temporalIndex");
-}, "video exchange with transform");
-        </script>
-    </body>
-</html>

Deleted: trunk/LayoutTests/http/wpt/webrtc/script-transform.js (276241 => 276242)


--- trunk/LayoutTests/http/wpt/webrtc/script-transform.js	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/http/wpt/webrtc/script-transform.js	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,25 +0,0 @@
-_onrtctransform_ = (event) => {
-    const transformer = event.transformer;
-    transformer.options.port._onmessage_ = (event) => transformer.options.port.postMessage(event.data);
-
-    self.postMessage("started");
-    transformer.reader = transformer.readable.getReader();
-    transformer.writer = transformer.writable.getWriter();
-
-    function process(transformer)
-    {
-        transformer.reader.read().then(chunk => {
-            if (chunk.done)
-                return;
-            if (chunk.value instanceof RTCEncodedVideoFrame)
-                self.postMessage("video chunk");
-            else if (chunk.value instanceof RTCEncodedAudioFrame)
-                self.postMessage("audio chunk");
-            transformer.writer.write(chunk.value);
-            process(transformer);
-        });
-    }
-
-    process(transformer);
-};
-self.postMessage("registered");

Deleted: trunk/LayoutTests/http/wpt/webrtc/sframe-transform-in-worker.html (276241 => 276242)


--- trunk/LayoutTests/http/wpt/webrtc/sframe-transform-in-worker.html	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/http/wpt/webrtc/sframe-transform-in-worker.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,57 +0,0 @@
-<!doctype html>
-<html>
-    <head>
-        <meta charset="utf-8">
-        <script src=""
-        <script src=""
-    </head>
-    <body>
-        <video id="video1" controls autoplay></video>
-        <script src =""
-        <script>
-async function waitForMessage(worker, data)
-{
-    while (true) {
-        const received = await new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-        if (data ="" received)
-            return;
-    }
-}
-
-promise_test(async (test) => {
-    worker = new Worker('sframe-transform.js');
-    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-    assert_equals(data, "registered");
-    const localStream = await navigator.mediaDevices.getUserMedia({ video: true });
-
-    let sender, receiver;
-    const senderTransform = new SFrameTransform({ compatibilityMode: "H264" });
-    const receiverTransform = new RTCRtpScriptTransform(worker, "SFrameRTCRtpTransform");
-
-    const key = await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
-    senderTransform.setEncryptionKey(key);
-
-    const startedPromise = new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-
-    const stream = await new Promise((resolve, reject) => {
-        createConnections((firstConnection) => {
-            pc1 = firstConnection;
-            sender = firstConnection.addTrack(localStream.getTracks()[0], localStream);
-            sender.transform = senderTransform;
-        }, (secondConnection) => {
-            pc2 = secondConnection;
-            secondConnection._ontrack_ = (trackEvent) => {
-                receiver = trackEvent.receiver;
-                receiver.transform = receiverTransform;
-                resolve(trackEvent.streams[0]);
-            };
-        });
-        setTimeout(() => reject("Test timed out"), 5000);
-    });
-
-    video1.srcObject = stream;
-    await video1.play();
-}, "video exchange with SFrame transform in worker");
-        </script>
-    </body>
-</html>

Deleted: trunk/LayoutTests/http/wpt/webrtc/sframe-transform-readable-crash.html (276241 => 276242)


--- trunk/LayoutTests/http/wpt/webrtc/sframe-transform-readable-crash.html	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/http/wpt/webrtc/sframe-transform-readable-crash.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,11 +0,0 @@
-<iframe src="" id="frame"></iframe>
-<script>
-_onload_ = async () => {
-if (window.testRunner)
-    testRunner.dumpAsText();
-const transform = new frame.contentWindow.SFrameTransform;
-frame.remove();
-transform.readable;
-}
-</script>
-<p>This test should not crash.</p>

Deleted: trunk/LayoutTests/http/wpt/webrtc/sframe-transform.html (276241 => 276242)


--- trunk/LayoutTests/http/wpt/webrtc/sframe-transform.html	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/http/wpt/webrtc/sframe-transform.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,141 +0,0 @@
-<!doctype html>
-<html>
-    <head>
-        <meta charset="utf-8">
-        <script src=""
-        <script src=""
-    </head>
-    <body>
-        <script>
-
-promise_test(async (test) => {
-    const pc = new RTCPeerConnection();
-    const senderTransform = new SFrameTransform();
-    const receiverTransform = new SFrameTransform();
-    const sender1 = pc.addTransceiver('audio').sender;
-    const sender2 = pc.addTransceiver('video').sender;
-    const receiver1 = pc.getReceivers()[0];
-    const receiver2 = pc.getReceivers()[1];
-
-    sender1.transform = senderTransform;
-    receiver1.transform = receiverTransform;
-    assert_throws_dom("InvalidStateError", () => sender2.transform = senderTransform);
-    assert_throws_dom("InvalidStateError", () => receiver2.transform = receiverTransform);
-
-    sender1.transform = senderTransform;
-    receiver1.transform = receiverTransform;
-
-    sender1.transform = null;
-    receiver1.transform = null;
-}, "Cannot reuse attached transforms");
-
-test(() => {
-    const senderTransform = new SFrameTransform();
-
-    assert_true(senderTransform.readable instanceof ReadableStream);
-    assert_true(senderTransform.writable instanceof WritableStream);
-}, "SFrameTransform exposes readable and writable");
-
-promise_test(async (test) => {
-    const pc = new RTCPeerConnection();
-    const senderTransform = new SFrameTransform();
-    const receiverTransform = new SFrameTransform();
-    const sender1 = pc.addTransceiver('audio').sender;
-    const sender2 = pc.addTransceiver('video').sender;
-    const receiver1 = pc.getReceivers()[0];
-    const receiver2 = pc.getReceivers()[1];
-
-    assert_false(senderTransform.readable.locked, "sender readable before");
-    assert_false(senderTransform.writable.locked, "sender writable before");
-    assert_false(receiverTransform.readable.locked, "receiver readable before");
-    assert_false(receiverTransform.writable.locked, "receiver writable before");
-
-    sender1.transform = senderTransform;
-    receiver1.transform = receiverTransform;
-
-    assert_true(senderTransform.readable.locked, "sender readable during");
-    assert_true(senderTransform.writable.locked, "sender writable during");
-    assert_true(receiverTransform.readable.locked, "receiver readable during");
-    assert_true(receiverTransform.writable.locked, "receiver writable during");
-
-    sender1.transform = null;
-    receiver1.transform = null;
-
-    assert_true(senderTransform.readable.locked, "sender readable after");
-    assert_true(senderTransform.writable.locked, "sender writable after");
-    assert_true(receiverTransform.readable.locked, "receiver readable after");
-    assert_true(receiverTransform.writable.locked, "receiver writable after");
-}, "readable/writable are locked when attached and after being attached");
-
-promise_test(async (test) => {
-    const key = await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
-
-    const senderTransform = new SFrameTransform({ role : 'encrypt', authenticationSize: 10 });
-    senderTransform.setEncryptionKey(key);
-
-    const receiverTransform = new SFrameTransform({ role : 'decrypt', authenticationSize: 10 });
-    receiverTransform.setEncryptionKey(key);
-
-    const writer = senderTransform.writable.getWriter();
-    const reader = receiverTransform.readable.getReader();
-
-    senderTransform.readable.pipeTo(receiverTransform.writable);
-
-    const sent = new ArrayBuffer(8);
-    const view = new Int8Array(sent);
-    for (let cptr = 0; cptr < sent.byteLength; ++cptr)
-        view[cptr] = cptr;
-
-    writer.write(sent);
-    const received = await reader.read();
-
-    assert_equals(received.value.byteLength, 8);
-    const view2 = new Int8Array(received.value);
-    for (let cptr = 0; cptr < sent.byteLength; ++cptr)
-        assert_equals(view2[cptr], view[cptr]);
-}, "SFrame with array buffer - authentication size 10");
-
-promise_test(async (test) => {
-    const key = await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
-
-    const senderTransform = new SFrameTransform({ role : 'encrypt', authenticationSize: 10 });
-    const senderWriter = senderTransform.writable.getWriter();
-    const senderReader = senderTransform.readable.getReader();
-
-    const receiverTransform = new SFrameTransform({ role : 'decrypt', authenticationSize: 10 });
-    const receiverWriter = receiverTransform.writable.getWriter();
-    const receiverReader = receiverTransform.readable.getReader();
-
-    senderTransform.setEncryptionKey(key);
-    receiverTransform.setEncryptionKey(key);
-
-    const chunk = new ArrayBuffer(8);
-
-    // decryption should fail, leading to an empty array buffer.
-    await receiverWriter.write(chunk);
-    let received = await receiverReader.read();
-    assert_equals(received.value.byteLength, 0);
-
-    // We write again but this time with a chunk we can decrypt.
-    await senderWriter.write(chunk);
-    const encrypted = await senderReader.read();
-    await receiverWriter.write(encrypted.value);
-    received = await receiverReader.read();
-    assert_equals(received.value.byteLength, 8);
-}, "SFrame decryption with array buffer that is too small");
-
-promise_test(async (test) => {
-    const key = await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
-
-    const receiverTransform = new SFrameTransform({ role : 'decrypt', authenticationSize: 10 });
-    const receiverWriter = receiverTransform.writable.getWriter();
-    receiverTransform.setEncryptionKey(key);
-
-    // decryption should fail, leading to erroring the transform.
-    await promise_rejects_js(test, TypeError, receiverWriter.write({ }));
-    await promise_rejects_js(test, TypeError, receiverWriter.closed);
-}, "SFrame transform gets errored if trying to process unexpected value types");
-
-        </script>
-    </body>
-</html>

Deleted: trunk/LayoutTests/http/wpt/webrtc/sframe-transform.js (276241 => 276242)


--- trunk/LayoutTests/http/wpt/webrtc/sframe-transform.js	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/http/wpt/webrtc/sframe-transform.js	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,7 +0,0 @@
-_onrtctransform_ = (event) => {
-    const sframeTransform = new SFrameTransform({ role : "decrypt", authenticationSize: "10", compatibilityMode: "H264" });
-    crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]).then(key => sframeTransform.setEncryptionKey(key));
-    const transformer = event.transformer;
-    transformer.readable.pipeThrough(sframeTransform).pipeTo(transformer.writable);
-}
-self.postMessage("registered");

Deleted: trunk/LayoutTests/http/wpt/webrtc/webrtc-late-transform.html (276241 => 276242)


--- trunk/LayoutTests/http/wpt/webrtc/webrtc-late-transform.html	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/http/wpt/webrtc/webrtc-late-transform.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,90 +0,0 @@
-<!doctype html>
-<html>
-    <head>
-        <meta charset="utf-8">
-        <script src=""
-        <script src=""
-    </head>
-    <body>
-        <video controls id="video" autoplay></video>
-        <canvas id="canvas" width="640" height="480"></canvas>
-        <script src =""
-        <script>
-function grabFrameData(x, y, w, h)
-{
-    canvas.width = video.videoWidth;
-    canvas.height = video.videoHeight;
-
-    canvas.getContext('2d').drawImage(video, x, y, w, h, x, y, w, h);
-    return canvas.getContext('2d').getImageData(x, y, w, h).data;
-}
-
-function getCircleImageData()
-{
-    return grabFrameData(450, 100, 150, 100);
-}
-
-async function checkVideoIsUpdated(shouldBeUpdated, count, referenceData)
-{
-    if (count === undefined)
-        count = 0;
-    else if (count >= 20)
-        return Promise.reject("checkVideoIsUpdated timed out :" + shouldBeUpdated + " " + count);
-
-    if (referenceData === undefined)
-        referenceData = getCircleImageData();
-
-    await waitFor(200);
-    const newData = getCircleImageData();
-
-    if (shouldBeUpdated === (JSON.stringify(referenceData) !== JSON.stringify(newData)))
-        return;
-
-    await checkVideoIsUpdated(shouldBeUpdated, ++count, newData);
-}
-
-promise_test(async (test) => {
-    const localStream = await navigator.mediaDevices.getUserMedia({video: true});
-    const senderTransform = new SFrameTransform({ compatibilityMode: "H264" });
-    const receiverTransform = new SFrameTransform({ compatibilityMode: "H264" });
-    await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]).then(key => {
-       senderTransform.setEncryptionKey(key);
-       receiverTransform.setEncryptionKey(key);
-    });
-
-    let sender, receiver;
-    const stream = await new Promise((resolve, reject) => {
-        createConnections((firstConnection) => {
-            pc1 = firstConnection;
-            sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
-            sender.transform = senderTransform;
-        }, (secondConnection) => {
-            pc2 = secondConnection;
-            secondConnection._ontrack_ = (trackEvent) => {
-                receiver = trackEvent.receiver;
-                // we do not set the receiver transform here;
-                resolve(trackEvent.streams[0]);
-            };
-        }, {
-            observeOffer : (offer) => {
-                const lines = offer.sdp.split('\r\n');
-                const h264Lines = lines.filter(line => line.indexOf("a=fmtp") === 0 && line.indexOf("42e01f") !== -1);
-                const baselineNumber = h264Lines[0].substring(6).split(' ')[0];
-                offer.sdp = lines.filter(line => {
-                    return (line.indexOf('a=fmtp') === -1 && line.indexOf('a=rtcp-fb') === -1 && line.indexOf('a=rtpmap') === -1) || line.indexOf(baselineNumber) !== -1;
-                }).join('\r\n');
-            }
-        });
-        setTimeout(() => reject("Test timed out"), 5000);
-    });
-
-    video.srcObject = stream;
-    video.play();
-
-    // We set the receiver transform here so that the decoder probably tried to decode sframe content.
-    setTimeout(() => receiver.transform = receiverTransform, 50);
-    await checkVideoIsUpdated(true);
-}, "video exchange with late receiver transform");
-        </script>
-    </body>
-</html>

Deleted: trunk/LayoutTests/http/wpt/webrtc/webrtc-transform.html (276241 => 276242)


--- trunk/LayoutTests/http/wpt/webrtc/webrtc-transform.html	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/http/wpt/webrtc/webrtc-transform.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,148 +0,0 @@
-<!doctype html>
-<html>
-    <head>
-        <meta charset="utf-8">
-        <script src=""
-        <script src=""
-    </head>
-    <body>
-        <video id="video1" autoplay></video>
-        <video id="video2" autoplay></video>
-        <script src =""
-        <script>
-async function waitForMessage(worker, data)
-{
-    while (true) {
-        const received = await new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-        if (data ="" received)
-            return;
-    }
-}
-
-promise_test(async (test) => {
-    worker = new Worker('script-transform.js');
-    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-    assert_equals(data, "registered");
-
-    const channel = new MessageChannel;
-    const transform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: channel.port2}, [channel.port2]);
-    transform.port = channel.port1;
-    const promise = new Promise(resolve => transform.port._onmessage_ = (event) => resolve(event.data));
-    transform.port.postMessage("test");
-    assert_equals(await promise, "test");
-}, "transform messaging");
-
-promise_test(async (test) => {
-    worker = new Worker('script-transform.js');
-    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-    assert_equals(data, "registered");
-
-    const pc = new RTCPeerConnection();
-
-    const senderChannel = new MessageChannel;
-    const receiverChannel = new MessageChannel;
-    const senderTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: senderChannel.port2}, [senderChannel.port2]);
-    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: receiverChannel.port2}, [receiverChannel.port2]);
-    senderTransform.port = senderChannel.port1;
-    receiverTransform.port = receiverChannel.port1;
-
-    const sender1 = pc.addTransceiver('audio').sender;
-    const sender2 = pc.addTransceiver('video').sender;
-    const receiver1 = pc.getReceivers()[0];
-    const receiver2 = pc.getReceivers()[1];
-
-    sender1.transform = senderTransform;
-    receiver1.transform = receiverTransform;
-    assert_throws_dom("InvalidStateError", () => sender2.transform = senderTransform);
-    assert_throws_dom("InvalidStateError", () => receiver2.transform = receiverTransform);
-
-    sender1.transform = senderTransform;
-    receiver1.transform = receiverTransform;
-
-    sender1.transform = null;
-    receiver1.transform = null;
-}, "Cannot reuse attached transforms");
-
-promise_test(async (test) => {
-    worker = new Worker('script-transform.js');
-    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-    assert_equals(data, "registered");
-    const localStream = await navigator.mediaDevices.getUserMedia({audio: true});
-
-    const senderChannel = new MessageChannel;
-    const receiverChannel = new MessageChannel;
-    let sender, receiver;
-    const senderTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: senderChannel.port2}, [senderChannel.port2]);
-    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: receiverChannel.port2}, [receiverChannel.port2]);
-    senderTransform.port = senderChannel.port1;
-    receiverTransform.port = receiverChannel.port1;
-
-    const startedPromise = new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-
-    const stream = await new Promise((resolve, reject) => {
-        createConnections((firstConnection) => {
-            pc1 = firstConnection;
-            sender = firstConnection.addTrack(localStream.getAudioTracks()[0], localStream);
-            sender.transform = senderTransform;
-        }, (secondConnection) => {
-            pc2 = secondConnection;
-            secondConnection._ontrack_ = (trackEvent) => {
-                receiver = trackEvent.receiver;
-                receiver.transform = receiverTransform;
-                resolve(trackEvent.streams[0]);
-            };
-        });
-        setTimeout(() => reject("Test timed out"), 5000);
-    });
-
-    assert_equals(await startedPromise, "started");
-
-    await waitForMessage(worker, "audio chunk");
-
-    video1.srcObject = stream;
-    await video1.play();
-}, "audio exchange with transform");
-
-promise_test(async (test) => {
-    worker = new Worker('script-transform.js');
-    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-    assert_equals(data, "registered");
-
-    const localStream = await navigator.mediaDevices.getUserMedia({video: true});
-
-    const senderChannel = new MessageChannel;
-    const receiverChannel = new MessageChannel;
-    let sender, receiver;
-    const senderTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: senderChannel.port2}, [senderChannel.port2]);
-    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: receiverChannel.port2}, [receiverChannel.port2]);
-    senderTransform.port = senderChannel.port1;
-    receiverTransform.port = receiverChannel.port1;
-
-    const startedPromise = new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-
-    const stream = await new Promise((resolve, reject) => {
-        createConnections((firstConnection) => {
-            pc1 = firstConnection;
-            sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
-            sender.transform = senderTransform;
-        }, (secondConnection) => {
-            pc2 = secondConnection;
-            secondConnection._ontrack_ = (trackEvent) => {
-                receiver = trackEvent.receiver;
-                receiver.transform = receiverTransform;
-                resolve(trackEvent.streams[0]);
-            };
-        });
-        setTimeout(() => reject("Test timed out"), 5000);
-    });
-
-    assert_equals(await startedPromise, "started");
-
-    await waitForMessage(worker, "video chunk");
-
-    video1.srcObject = stream;
-    await video1.play();
-}, "video exchange with transform");
-        </script>
-    </body>
-</html>

Deleted: trunk/LayoutTests/http/wpt/webrtc/write-twice-transform.html (276241 => 276242)


--- trunk/LayoutTests/http/wpt/webrtc/write-twice-transform.html	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/http/wpt/webrtc/write-twice-transform.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,58 +0,0 @@
-<!doctype html>
-<html>
-    <head>
-        <meta charset="utf-8">
-        <script src=""
-        <script src=""
-    </head>
-    <body>
-        <video id="video1" autoplay></video>
-        <video id="video2" autoplay></video>
-        <script src =""
-        <script>
-async function waitForMessage(worker, data)
-{
-    while (true) {
-        const received = await new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-        if (data ="" received)
-            return;
-    }
-}
-
-promise_test(async (test) => {
-    worker = new Worker('write-twice-transform.js');
-    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-    assert_equals(data, "registered");
-
-    const localStream = await navigator.mediaDevices.getUserMedia({video: true});
-
-    let sender, receiver;
-    const senderTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', side:'sender', role:'encrypt'});
-    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', side:'receiver', role:'decrypt'});
-
-    const startedPromise = new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
-
-    const stream = await new Promise((resolve, reject) => {
-        createConnections((firstConnection) => {
-            pc1 = firstConnection;
-            sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
-            sender.transform = senderTransform;
-        }, (secondConnection) => {
-            pc2 = secondConnection;
-            secondConnection._ontrack_ = (trackEvent) => {
-                receiver = trackEvent.receiver;
-                receiver.transform = receiverTransform;
-                resolve(trackEvent.streams[0]);
-            };
-        });
-        setTimeout(() => reject("Test timed out"), 5000);
-    });
-
-    assert_equals(await startedPromise, "started");
-
-    video1.srcObject = stream;
-    await video1.play();
-}, "video exchange with write twice transform");
-        </script>
-    </body>
-</html>

Deleted: trunk/LayoutTests/http/wpt/webrtc/write-twice-transform.js (276241 => 276242)


--- trunk/LayoutTests/http/wpt/webrtc/write-twice-transform.js	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/http/wpt/webrtc/write-twice-transform.js	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,22 +0,0 @@
-_onrtctransform_ = (event) => {
-    const transformer = event.transformer;
-
-    self.postMessage("started");
-
-    transformer.reader = transformer.readable.getReader();
-    transformer.writer = transformer.writable.getWriter();
-    function process(transformer)
-    {
-        transformer.reader.read().then(chunk => {
-            if (chunk.done)
-                return;
-
-            transformer.writer.write(chunk.value);
-            transformer.writer.write(chunk.value);
-            process(transformer);
-        });
-    }
-
-    process(transformer);
-};
-self.postMessage("registered");

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (276241 => 276242)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,3 +1,46 @@
+2021-04-19  Youenn Fablet  <[email protected]>
+
+        Migrate some WebRTC encoded transform tests to WPT
+        https://bugs.webkit.org/show_bug.cgi?id=224604
+
+        Reviewed by Eric Carlson.
+
+        * web-platform-tests/webrtc-encoded-transform/routines.js: Added.
+        (async createConnections):
+        (waitFor):
+        * web-platform-tests/webrtc-encoded-transform/script-audio-transform-worker.js: Added.
+        (MockRTCRtpTransformer):
+        (MockRTCRtpTransformer.prototype.start):
+        (MockRTCRtpTransformer.prototype.process):
+        (onrtctransform):
+        * web-platform-tests/webrtc-encoded-transform/script-audio-transform.https-expected.txt: Added.
+        * web-platform-tests/webrtc-encoded-transform/script-audio-transform.https.html: Renamed from LayoutTests/http/wpt/webrtc/audio-script-transform.html.
+        * web-platform-tests/webrtc-encoded-transform/script-change-transform-worker.js: Renamed from LayoutTests/http/wpt/webrtc/change-encoded-transform.js.
+        * web-platform-tests/webrtc-encoded-transform/script-change-transform.https-expected.txt: Added.
+        * web-platform-tests/webrtc-encoded-transform/script-change-transform.https.html: Renamed from LayoutTests/http/wpt/webrtc/change-encoded-transform.html.
+        * web-platform-tests/webrtc-encoded-transform/script-late-transform.https-expected.txt: Added.
+        * web-platform-tests/webrtc-encoded-transform/script-late-transform.https.html: Renamed from LayoutTests/http/wpt/webrtc/webrtc-late-transform.html.
+        * web-platform-tests/webrtc-encoded-transform/script-metadata-transform-worker.js: Renamed from LayoutTests/http/wpt/webrtc/metadata-transform-worker.js.
+        * web-platform-tests/webrtc-encoded-transform/script-metadata-transform.https-expected.txt: Added.
+        * web-platform-tests/webrtc-encoded-transform/script-metadata-transform.https.html: Renamed from LayoutTests/http/wpt/webrtc/metadata-transform.html.
+        * web-platform-tests/webrtc-encoded-transform/script-transform-worker.js: Renamed from LayoutTests/http/wpt/webrtc/script-transform.js.
+        * web-platform-tests/webrtc-encoded-transform/script-transform.https-expected.txt: Added.
+        * web-platform-tests/webrtc-encoded-transform/script-transform.https.html: Renamed from LayoutTests/http/wpt/webrtc/webrtc-transform.html.
+        * web-platform-tests/webrtc-encoded-transform/script-write-twice-transform-worker.js: Renamed from LayoutTests/http/wpt/webrtc/write-twice-transform.js.
+        * web-platform-tests/webrtc-encoded-transform/script-write-twice-transform.https-expected.txt: Added.
+        * web-platform-tests/webrtc-encoded-transform/script-write-twice-transform.https.html: Renamed from LayoutTests/http/wpt/webrtc/write-twice-transform.html.
+        * web-platform-tests/webrtc-encoded-transform/sframe-keys.https-expected.txt: Added.
+        * web-platform-tests/webrtc-encoded-transform/sframe-keys.https.html: Added.
+        * web-platform-tests/webrtc-encoded-transform/sframe-transform-buffer-source-expected.txt: Added.
+        * web-platform-tests/webrtc-encoded-transform/sframe-transform-buffer-source.html: Added.
+        * web-platform-tests/webrtc-encoded-transform/sframe-transform-expected.txt: Added.
+        * web-platform-tests/webrtc-encoded-transform/sframe-transform-in-worker.https-expected.txt: Added.
+        * web-platform-tests/webrtc-encoded-transform/sframe-transform-in-worker.https.html: Renamed from LayoutTests/http/wpt/webrtc/sframe-transform-in-worker.html.
+        * web-platform-tests/webrtc-encoded-transform/sframe-transform-readable-expected.txt: Added.
+        * web-platform-tests/webrtc-encoded-transform/sframe-transform-readable.html: Added.
+        * web-platform-tests/webrtc-encoded-transform/sframe-transform-worker.js: Renamed from LayoutTests/http/wpt/webrtc/sframe-transform.js.
+        * web-platform-tests/webrtc-encoded-transform/sframe-transform.html: Renamed from LayoutTests/http/wpt/webrtc/sframe-transform.html.
+
 2021-04-18  Manuel Rego Casasnovas  <[email protected]>
 
         [selectors] Update :focus-visible tests from WPT

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/routines.js (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/routines.js	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/routines.js	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,32 @@
+async function createConnections(test, setupLocalConnection, setupRemoteConnection, doNotCloseAutmoatically) {
+    const localConnection = new RTCPeerConnection();
+    const remoteConnection = new RTCPeerConnection();
+
+    remoteConnection._onicecandidate_ = (event) => { localConnection.addIceCandidate(event.candidate); };
+    localConnection._onicecandidate_ = (event) => { remoteConnection.addIceCandidate(event.candidate); };
+
+    await setupLocalConnection(localConnection);
+    await setupRemoteConnection(remoteConnection);
+
+    const offer = await localConnection.createOffer();
+    await localConnection.setLocalDescription(offer);
+    await remoteConnection.setRemoteDescription(offer);
+
+    const answer = await remoteConnection.createAnswer();
+    await remoteConnection.setLocalDescription(answer);
+    await localConnection.setRemoteDescription(answer);
+
+    if (!doNotCloseAutmoatically) {
+        test.add_cleanup(() => {
+            localConnection.close();
+            remoteConnection.close();
+        });
+    }
+
+    return [localConnection, remoteConnection];
+}
+
+function waitFor(test, duration)
+{
+    return new Promise((resolve) => test.step_timeout(resolve, duration));
+}

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-audio-transform-worker.js (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-audio-transform-worker.js	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-audio-transform-worker.js	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,30 @@
+class MockRTCRtpTransformer {
+    constructor(transformer) {
+        this.context = transformer;
+        this.start();
+    }
+    start()
+    {
+        this.reader = this.context.readable.getReader();
+        this.writer = this.context.writable.getWriter();
+        this.process();
+        this.context.options.port.postMessage("started " + this.context.options.mediaType + " " + this.context.options.side);
+    }
+
+    process()
+    {
+        this.reader.read().then(chunk => {
+            if (chunk.done)
+                return;
+
+            this.writer.write(chunk.value);
+            this.process();
+        });
+    }
+};
+
+_onrtctransform_ = (event) => {
+    new MockRTCRtpTransformer(event.transformer);
+};
+
+self.postMessage("registered");

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-audio-transform.https-expected.txt (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-audio-transform.https-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-audio-transform.https-expected.txt	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,4 @@
+
+
+PASS script-audio-transform
+

Copied: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-audio-transform.https.html (from rev 276241, trunk/LayoutTests/http/wpt/webrtc/audio-script-transform.html) (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-audio-transform.https.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-audio-transform.https.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,65 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+        <video id="video" autoplay playsInline></video>
+        <script src=""
+        <script>
+function waitForMessage(test, port, data)
+{
+    let gotMessage;
+    const promise = new Promise((resolve, reject) => {
+        gotMessage = resolve;
+        test.step_timeout(() => { reject("did not get " + data) }, 5000);
+    });
+    port._onmessage_ = event => {
+       if (event.data ="" data)
+           gotMessage();
+    };
+    return promise;
+}
+
+promise_test(async (test) => {
+    worker = new Worker("script-audio-transform-worker.js");
+    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+    assert_equals(data, "registered");
+
+    const localStream = await navigator.mediaDevices.getUserMedia({audio: true});
+
+    const senderChannel = new MessageChannel;
+    const receiverChannel = new MessageChannel;
+    const senderTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', mediaType:'audio', side:'sender', port:senderChannel.port2}, [senderChannel.port2]);
+    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', mediaType:'audio', side:'receiver', port:receiverChannel.port2}, [receiverChannel.port2]);
+    senderTransform.port = senderChannel.port1;
+    receiverTransform.port = receiverChannel.port1;
+
+    promise1 = waitForMessage(test, senderTransform.port, "started audio sender");
+    promise2 = waitForMessage(test, receiverTransform.port, "started audio receiver");
+
+    const stream = await new Promise((resolve, reject) => {
+        createConnections(test, (firstConnection) => {
+            sender = firstConnection.addTrack(localStream.getAudioTracks()[0], localStream);
+            sender.transform = senderTransform;
+        }, (secondConnection) => {
+            secondConnection._ontrack_ = (trackEvent) => {
+                receiver = trackEvent.receiver;
+                receiver.transform = receiverTransform;
+                resolve(trackEvent.streams[0]);
+            };
+        });
+        test.step_timeout(() => reject("Test timed out"), 5000);
+    });
+
+    await promise1;
+    await promise2;
+
+    video.srcObject = stream;
+    return video.play();
+});
+        </script>
+    </body>
+</html>

Copied: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-change-transform-worker.js (from rev 276241, trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform.js) (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-change-transform-worker.js	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-change-transform-worker.js	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,39 @@
+function appendToBuffer(buffer, value) {
+    const result = new ArrayBuffer(buffer.byteLength + 1);
+    const byteResult = new Uint8Array(result);
+    byteResult.set(new Uint8Array(buffer), 0);
+    byteResult[buffer.byteLength] = value;
+    return result;
+}
+
+_onrtctransform_ = (event) => {
+    const transformer = event.transformer;
+
+    transformer.reader = transformer.readable.getReader();
+    transformer.writer = transformer.writable.getWriter();
+
+    function process(transformer)
+    {
+        transformer.reader.read().then(chunk => {
+            if (chunk.done)
+                return;
+            if (transformer.options.name === 'sender1')
+                chunk.value.data = "" 1);
+            else if (transformer.options.name === 'sender2')
+                chunk.value.data = "" 2);
+            else {
+                const value = new Uint8Array(chunk.value.data)[chunk.value.data.byteLength - 1];
+                if (value !== 1 && value !== 2)
+                    self.postMessage("unexpected value: " + value);
+                else if (value === 2)
+                    self.postMessage("got value 2");
+                chunk.value.data = "" chunk.value.data.byteLength - 1);
+            }
+            transformer.writer.write(chunk.value);
+            process(transformer);
+        });
+    }
+
+    process(transformer);
+};
+self.postMessage("registered");

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-change-transform.https-expected.txt (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-change-transform.https-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-change-transform.https-expected.txt	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,4 @@
+
+
+PASS change sender transform
+

Copied: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-change-transform.https.html (from rev 276241, trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform.html) (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-change-transform.https.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-change-transform.https.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,57 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+        <video id="video1" autoplay controls playsinline></video>
+        <script src =""
+        <script>
+async function waitForMessage(worker, data)
+{
+    while (true) {
+        const received = await new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+        if (data ="" received)
+            return;
+    }
+}
+
+promise_test(async (test) => {
+    worker = new Worker('script-change-transform-worker.js');
+    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+    assert_equals(data, "registered");
+
+    const localStream = await navigator.mediaDevices.getUserMedia({video: true});
+
+    let sender, receiver;
+    const senderTransform1 = new RTCRtpScriptTransform(worker, {name:'sender1'});
+    const senderTransform2 = new RTCRtpScriptTransform(worker, {name:'sender2'});
+    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
+
+    const stream = await new Promise((resolve, reject) => {
+        createConnections(test, (firstConnection) => {
+            sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
+            firstConnection.getTransceivers()[0].setCodecPreferences([{mimeType: "video/VP8", clockRate: 90000}]);
+            sender.transform = senderTransform1;
+        }, (secondConnection) => {
+            secondConnection._ontrack_ = (trackEvent) => {
+                receiver = trackEvent.receiver;
+                receiver.transform = receiverTransform;
+                resolve(trackEvent.streams[0]);
+            };
+        });
+        test.step_timeout(() => reject("Test timed out"), 5000);
+    });
+
+    video1.srcObject = stream;
+    await video1.play();
+
+    const updatePromise = new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+    sender.transform = senderTransform2;
+    assert_equals(await updatePromise, "got value 2");
+}, "change sender transform");
+        </script>
+    </body>
+</html>

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-late-transform.https-expected.txt (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-late-transform.https-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-late-transform.https-expected.txt	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,4 @@
+
+
+PASS video exchange with late receiver transform
+

Copied: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-late-transform.https.html (from rev 276241, trunk/LayoutTests/http/wpt/webrtc/webrtc-late-transform.html) (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-late-transform.https.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-late-transform.https.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,90 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+        <video controls id="video" autoplay></video>
+        <canvas id="canvas" width="640" height="480"></canvas>
+        <script src =""
+        <script>
+function grabFrameData(x, y, w, h)
+{
+    canvas.width = video.videoWidth;
+    canvas.height = video.videoHeight;
+
+    canvas.getContext('2d').drawImage(video, x, y, w, h, x, y, w, h);
+    return canvas.getContext('2d').getImageData(x, y, w, h).data;
+}
+
+function getCircleImageData()
+{
+    return grabFrameData(450, 100, 150, 100);
+}
+
+async function checkVideoIsUpdated(test, shouldBeUpdated, count, referenceData)
+{
+    if (count === undefined)
+        count = 0;
+    else if (count >= 20)
+        return Promise.reject("checkVideoIsUpdated timed out :" + shouldBeUpdated + " " + count);
+
+    if (referenceData === undefined)
+        referenceData = getCircleImageData();
+
+    await waitFor(test, 200);
+    const newData = getCircleImageData();
+
+    if (shouldBeUpdated === (JSON.stringify(referenceData) !== JSON.stringify(newData)))
+        return;
+
+    await checkVideoIsUpdated(test, shouldBeUpdated, ++count, newData);
+}
+
+promise_test(async (test) => {
+    const localStream = await navigator.mediaDevices.getUserMedia({video: true});
+    const senderTransform = new SFrameTransform({ compatibilityMode: "H264" });
+    const receiverTransform = new SFrameTransform({ compatibilityMode: "H264" });
+    await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]).then(key => {
+       senderTransform.setEncryptionKey(key);
+       receiverTransform.setEncryptionKey(key);
+    });
+
+    let sender, receiver;
+    const stream = await new Promise((resolve, reject) => {
+        createConnections(test, (firstConnection) => {
+            pc1 = firstConnection;
+            sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
+            sender.transform = senderTransform;
+        }, (secondConnection) => {
+            pc2 = secondConnection;
+            secondConnection._ontrack_ = (trackEvent) => {
+                receiver = trackEvent.receiver;
+                // we do not set the receiver transform here;
+                resolve(trackEvent.streams[0]);
+            };
+        }, {
+            observeOffer : (offer) => {
+                const lines = offer.sdp.split('\r\n');
+                const h264Lines = lines.filter(line => line.indexOf("a=fmtp") === 0 && line.indexOf("42e01f") !== -1);
+                const baselineNumber = h264Lines[0].substring(6).split(' ')[0];
+                offer.sdp = lines.filter(line => {
+                    return (line.indexOf('a=fmtp') === -1 && line.indexOf('a=rtcp-fb') === -1 && line.indexOf('a=rtpmap') === -1) || line.indexOf(baselineNumber) !== -1;
+                }).join('\r\n');
+            }
+        });
+        test.step_timeout(() => reject("Test timed out"), 5000);
+    });
+
+    video.srcObject = stream;
+    video.play();
+
+    // We set the receiver transform here so that the decoder probably tried to decode sframe content.
+    test.step_timeout(() => receiver.transform = receiverTransform, 50);
+    await checkVideoIsUpdated(test, true);
+}, "video exchange with late receiver transform");
+        </script>
+    </body>
+</html>

Copied: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-metadata-transform-worker.js (from rev 276241, trunk/LayoutTests/http/wpt/webrtc/metadata-transform-worker.js) (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-metadata-transform-worker.js	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-metadata-transform-worker.js	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,24 @@
+_onrtctransform_ = (event) => {
+    const transformer = event.transformer;
+
+    transformer.reader = transformer.readable.getReader();
+    transformer.writer = transformer.writable.getWriter();
+
+    let isFirstFrame = true;
+    function process(transformer)
+    {
+        transformer.reader.read().then(chunk => {
+            if (chunk.done)
+                return;
+
+            if (isFirstFrame) {
+                isFirstFrame = false;
+                self.postMessage({ name: transformer.options.name, timestamp: chunk.value.timestamp, metadata: chunk.value.getMetadata() });
+            }
+            transformer.writer.write(chunk.value);
+            process(transformer);
+        });
+    }
+    process(transformer);
+};
+self.postMessage("registered");

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-metadata-transform.https-expected.txt (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-metadata-transform.https-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-metadata-transform.https-expected.txt	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,5 @@
+
+
+PASS audio exchange with transform
+PASS video exchange with transform
+

Copied: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-metadata-transform.https.html (from rev 276241, trunk/LayoutTests/http/wpt/webrtc/metadata-transform.html) (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-metadata-transform.https.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-metadata-transform.https.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,84 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+        <video id="video1" autoplay></video>
+        <script src =""
+        <script>
+async function waitForMessage(worker, data)
+{
+    while (true) {
+        const received = await new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+        if (data ="" received)
+            return;
+    }
+}
+
+async function gatherMetadata(test, audio)
+{
+    worker = new Worker('script-metadata-transform-worker.js');
+    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+    assert_equals(data, "registered");
+
+    const localStream = await navigator.mediaDevices.getUserMedia({audio: audio, video: !audio});
+
+    let sender, receiver;
+    const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'});
+    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
+
+    await new Promise((resolve, reject) => {
+        createConnections(test, (firstConnection) => {
+            pc1 = firstConnection;
+            sender = firstConnection.addTrack(localStream.getTracks()[0], localStream);
+            sender.transform = senderTransform;
+        }, (secondConnection) => {
+            pc2 = secondConnection;
+            secondConnection._ontrack_ = (trackEvent) => {
+                receiver = trackEvent.receiver;
+                receiver.transform = receiverTransform;
+                resolve(trackEvent.streams[0]);
+            };
+        });
+        test.step_timeout(() => reject("Test timed out"), 5000);
+    });
+
+    return new Promise((resolve, reject) => {
+        let senderMetadata, senderTimestamp;
+        worker._onmessage_ = (event) => {
+            if (event.data.name === 'sender') {
+                senderMetadata = event.data.metadata;
+                senderTimestamp = event.data.timestamp;
+            } else if (event.data.name === 'receiver')
+               resolve([senderMetadata, senderTimestamp, event.data.metadata, event.data.timestamp]);
+        };
+        test.step_timeout(() => reject("Metadata test timed out"), 5000);
+    });
+}
+
+promise_test(async (test) => {
+    const [senderMetadata, senderTimestamp, receiverMetadata, receiverTimestamp] = await gatherMetadata(test, true);
+
+    assert_equals(senderTimestamp, receiverTimestamp, "timestamp");
+    assert_true(!!senderMetadata.synchronizationSource, "ssrc");
+    assert_equals(senderMetadata.synchronizationSource, receiverMetadata.synchronizationSource, "ssrc");
+    assert_array_equals(senderMetadata.contributingSources, receiverMetadata.contributingSources, "csrc");
+}, "audio exchange with transform");
+
+promise_test(async (test) => {
+    const [senderMetadata, senderTimestamp, receiverMetadata, receiverTimestamp] = await gatherMetadata(test, true);
+
+    assert_equals(senderTimestamp, receiverTimestamp, "timestamp");
+    assert_true(!!senderMetadata.synchronizationSource, "ssrc");
+    assert_equals(senderMetadata.synchronizationSource, receiverMetadata.synchronizationSource, "ssrc");
+    assert_equals(senderMetadata.height, receiverMetadata.height, "height");
+    assert_equals(senderMetadata.width, receiverMetadata.width, "width");
+    assert_equals(senderMetadata.spatialIndex, receiverMetadata.spatialIndex, "spatialIndex");
+    assert_equals(senderMetadata.temporalIndex, receiverMetadata.temporalIndex, "temporalIndex");
+}, "video exchange with transform");
+        </script>
+    </body>
+</html>

Copied: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-transform-worker.js (from rev 276241, trunk/LayoutTests/http/wpt/webrtc/script-transform.js) (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-transform-worker.js	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-transform-worker.js	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,25 @@
+_onrtctransform_ = (event) => {
+    const transformer = event.transformer;
+    transformer.options.port._onmessage_ = (event) => transformer.options.port.postMessage(event.data);
+
+    self.postMessage("started");
+    transformer.reader = transformer.readable.getReader();
+    transformer.writer = transformer.writable.getWriter();
+
+    function process(transformer)
+    {
+        transformer.reader.read().then(chunk => {
+            if (chunk.done)
+                return;
+            if (chunk.value instanceof RTCEncodedVideoFrame)
+                self.postMessage("video chunk");
+            else if (chunk.value instanceof RTCEncodedAudioFrame)
+                self.postMessage("audio chunk");
+            transformer.writer.write(chunk.value);
+            process(transformer);
+        });
+    }
+
+    process(transformer);
+};
+self.postMessage("registered");

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-transform.https-expected.txt (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-transform.https-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-transform.https-expected.txt	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,7 @@
+
+
+PASS transform messaging
+PASS Cannot reuse attached transforms
+PASS audio exchange with transform
+PASS video exchange with transform
+

Copied: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-transform.https.html (from rev 276241, trunk/LayoutTests/http/wpt/webrtc/webrtc-transform.html) (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-transform.https.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-transform.https.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,148 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+        <video id="video1" autoplay></video>
+        <video id="video2" autoplay></video>
+        <script src =""
+        <script>
+async function waitForMessage(worker, data)
+{
+    while (true) {
+        const received = await new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+        if (data ="" received)
+            return;
+    }
+}
+
+promise_test(async (test) => {
+    worker = new Worker('script-transform-worker.js');
+    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+    assert_equals(data, "registered");
+
+    const channel = new MessageChannel;
+    const transform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: channel.port2}, [channel.port2]);
+    transform.port = channel.port1;
+    const promise = new Promise(resolve => transform.port._onmessage_ = (event) => resolve(event.data));
+    transform.port.postMessage("test");
+    assert_equals(await promise, "test");
+}, "transform messaging");
+
+promise_test(async (test) => {
+    worker = new Worker('script-transform-worker.js');
+    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+    assert_equals(data, "registered");
+
+    const pc = new RTCPeerConnection();
+
+    const senderChannel = new MessageChannel;
+    const receiverChannel = new MessageChannel;
+    const senderTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: senderChannel.port2}, [senderChannel.port2]);
+    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: receiverChannel.port2}, [receiverChannel.port2]);
+    senderTransform.port = senderChannel.port1;
+    receiverTransform.port = receiverChannel.port1;
+
+    const sender1 = pc.addTransceiver('audio').sender;
+    const sender2 = pc.addTransceiver('video').sender;
+    const receiver1 = pc.getReceivers()[0];
+    const receiver2 = pc.getReceivers()[1];
+
+    sender1.transform = senderTransform;
+    receiver1.transform = receiverTransform;
+    assert_throws_dom("InvalidStateError", () => sender2.transform = senderTransform);
+    assert_throws_dom("InvalidStateError", () => receiver2.transform = receiverTransform);
+
+    sender1.transform = senderTransform;
+    receiver1.transform = receiverTransform;
+
+    sender1.transform = null;
+    receiver1.transform = null;
+}, "Cannot reuse attached transforms");
+
+promise_test(async (test) => {
+    worker = new Worker('script-transform-worker.js');
+    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+    assert_equals(data, "registered");
+    const localStream = await navigator.mediaDevices.getUserMedia({audio: true});
+
+    const senderChannel = new MessageChannel;
+    const receiverChannel = new MessageChannel;
+    let sender, receiver;
+    const senderTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: senderChannel.port2}, [senderChannel.port2]);
+    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: receiverChannel.port2}, [receiverChannel.port2]);
+    senderTransform.port = senderChannel.port1;
+    receiverTransform.port = receiverChannel.port1;
+
+    const startedPromise = new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+
+    const stream = await new Promise((resolve, reject) => {
+        createConnections(test, (firstConnection) => {
+            pc1 = firstConnection;
+            sender = firstConnection.addTrack(localStream.getAudioTracks()[0], localStream);
+            sender.transform = senderTransform;
+        }, (secondConnection) => {
+            pc2 = secondConnection;
+            secondConnection._ontrack_ = (trackEvent) => {
+                receiver = trackEvent.receiver;
+                receiver.transform = receiverTransform;
+                resolve(trackEvent.streams[0]);
+            };
+        });
+        test.step_timeout(() => reject("Test timed out"), 5000);
+    });
+
+    assert_equals(await startedPromise, "started");
+
+    await waitForMessage(worker, "audio chunk");
+
+    video1.srcObject = stream;
+    await video1.play();
+}, "audio exchange with transform");
+
+promise_test(async (test) => {
+    worker = new Worker('script-transform-worker.js');
+    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+    assert_equals(data, "registered");
+
+    const localStream = await navigator.mediaDevices.getUserMedia({video: true});
+
+    const senderChannel = new MessageChannel;
+    const receiverChannel = new MessageChannel;
+    let sender, receiver;
+    const senderTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: senderChannel.port2}, [senderChannel.port2]);
+    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: receiverChannel.port2}, [receiverChannel.port2]);
+    senderTransform.port = senderChannel.port1;
+    receiverTransform.port = receiverChannel.port1;
+
+    const startedPromise = new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+
+    const stream = await new Promise((resolve, reject) => {
+        createConnections(test, (firstConnection) => {
+            pc1 = firstConnection;
+            sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
+            sender.transform = senderTransform;
+        }, (secondConnection) => {
+            pc2 = secondConnection;
+            secondConnection._ontrack_ = (trackEvent) => {
+                receiver = trackEvent.receiver;
+                receiver.transform = receiverTransform;
+                resolve(trackEvent.streams[0]);
+            };
+        });
+        test.step_timeout(() => reject("Test timed out"), 5000);
+    });
+
+    assert_equals(await startedPromise, "started");
+
+    await waitForMessage(worker, "video chunk");
+
+    video1.srcObject = stream;
+    await video1.play();
+}, "video exchange with transform");
+        </script>
+    </body>
+</html>

Copied: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-write-twice-transform-worker.js (from rev 276241, trunk/LayoutTests/http/wpt/webrtc/write-twice-transform.js) (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-write-twice-transform-worker.js	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-write-twice-transform-worker.js	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,22 @@
+_onrtctransform_ = (event) => {
+    const transformer = event.transformer;
+
+    self.postMessage("started");
+
+    transformer.reader = transformer.readable.getReader();
+    transformer.writer = transformer.writable.getWriter();
+    function process(transformer)
+    {
+        transformer.reader.read().then(chunk => {
+            if (chunk.done)
+                return;
+
+            transformer.writer.write(chunk.value);
+            transformer.writer.write(chunk.value);
+            process(transformer);
+        });
+    }
+
+    process(transformer);
+};
+self.postMessage("registered");

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-write-twice-transform.https-expected.txt (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-write-twice-transform.https-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-write-twice-transform.https-expected.txt	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,4 @@
+
+
+PASS video exchange with write twice transform
+

Copied: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-write-twice-transform.https.html (from rev 276241, trunk/LayoutTests/http/wpt/webrtc/write-twice-transform.html) (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-write-twice-transform.https.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/script-write-twice-transform.https.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,58 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+        <video id="video1" autoplay></video>
+        <video id="video2" autoplay></video>
+        <script src =""
+        <script>
+async function waitForMessage(worker, data)
+{
+    while (true) {
+        const received = await new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+        if (data ="" received)
+            return;
+    }
+}
+
+promise_test(async (test) => {
+    worker = new Worker('script-write-twice-transform-worker.js');
+    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+    assert_equals(data, "registered");
+
+    const localStream = await navigator.mediaDevices.getUserMedia({video: true});
+
+    let sender, receiver;
+    const senderTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', side:'sender', role:'encrypt'});
+    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', side:'receiver', role:'decrypt'});
+
+    const startedPromise = new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+
+    const stream = await new Promise((resolve, reject) => {
+        createConnections(test, (firstConnection) => {
+            pc1 = firstConnection;
+            sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
+            sender.transform = senderTransform;
+        }, (secondConnection) => {
+            pc2 = secondConnection;
+            secondConnection._ontrack_ = (trackEvent) => {
+                receiver = trackEvent.receiver;
+                receiver.transform = receiverTransform;
+                resolve(trackEvent.streams[0]);
+            };
+        });
+        test.step_timeout(() => reject("Test timed out"), 5000);
+    });
+
+    assert_equals(await startedPromise, "started");
+
+    video1.srcObject = stream;
+    await video1.play();
+}, "video exchange with write twice transform");
+        </script>
+    </body>
+</html>

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-keys.https-expected.txt (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-keys.https-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-keys.https-expected.txt	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,5 @@
+
+
+PASS Passing various key IDs
+PASS Audio exchange with SFrame setup
+

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-keys.https.html (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-keys.https.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-keys.https.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,65 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+        <video id="audio" autoplay playsInline></video>
+        <script src =""
+        <script>
+let sender, receiver;
+let key1, key2, key3, key4;
+
+promise_test(async (test) => {
+    const key = await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
+    const transform = new SFrameTransform;
+
+    await transform.setEncryptionKey(key);
+    await transform.setEncryptionKey(key, 1);
+
+    await transform.setEncryptionKey(key, BigInt('18446744073709551613'));
+    await transform.setEncryptionKey(key, BigInt('18446744073709551614'));
+    await transform.setEncryptionKey(key, BigInt('18446744073709551615'));
+    await transform.setEncryptionKey(key, BigInt('18446744073709551616')).then(assert_unreached, (e) => {
+        assert_true(e instanceof RangeError);
+        assert_equals(e.message, "Not a 64 bits integer");
+    });
+}, "Passing various key IDs");
+
+promise_test(async (test) => {
+    key1 = await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
+    key2 = await crypto.subtle.importKey("raw", new Uint8Array([144, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
+    key3 = await crypto.subtle.importKey("raw", new Uint8Array([145, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
+    key4 = await crypto.subtle.importKey("raw", new Uint8Array([146, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
+
+    const localStream = await navigator.mediaDevices.getUserMedia({audio: true});
+    const stream = await new Promise((resolve, reject) => {
+        const connections = createConnections(test, (firstConnection) => {
+            sender = firstConnection.addTrack(localStream.getAudioTracks()[0], localStream);
+            let transform = new SFrameTransform;
+            transform.setEncryptionKey(key1);
+            sender.transform = transform;
+        }, (secondConnection) => {
+            secondConnection._ontrack_ = (trackEvent) => {
+                let transform = new SFrameTransform;
+                transform.setEncryptionKey(key1);
+                transform.setEncryptionKey(key2);
+                transform.setEncryptionKey(key3, 1000);
+                transform.setEncryptionKey(key4, BigInt('18446744073709551615'));
+                receiver = trackEvent.receiver;
+                receiver.transform = transform;
+                resolve(trackEvent.streams[0]);
+            };
+        });
+
+        test.step_timeout(() => reject("Test timed out"), 5000);
+    });
+
+    audio.srcObject = stream;
+    await audio.play();
+}, "Audio exchange with SFrame setup");
+        </script>
+    </body>
+</html>

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-buffer-source-expected.txt (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-buffer-source-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-buffer-source-expected.txt	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,3 @@
+
+PASS Uint8Array as input to SFrameTransform
+

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-buffer-source.html (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-buffer-source.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-buffer-source.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,50 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+        <script>
+
+async function getEncryptedData(transform)
+{
+    const chunk = await transform.readable.getReader().read();
+    const value = new Uint8Array(chunk.value);
+    return [...value];
+}
+
+promise_test(async (test) => {
+    const key = await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
+    const transform1 = new SFrameTransform;
+    const transform2 = new SFrameTransform;
+    const transform3 = new SFrameTransform;
+
+    await transform1.setEncryptionKey(key);
+    await transform2.setEncryptionKey(key);
+    await transform3.setEncryptionKey(key);
+
+    const buffer1 = new ArrayBuffer(10);
+    const buffer2 = new ArrayBuffer(11);
+    const view1 = new Uint8Array(buffer1);
+    const view2 = new Uint8Array(buffer2, 1);
+    for (let i = 0 ; i < buffer1.byteLength; ++i) {
+        view1[i] = i;
+        view2[i] = i;
+    }
+
+    transform1.writable.getWriter().write(buffer1);
+    transform2.writable.getWriter().write(view1);
+    transform3.writable.getWriter().write(view2);
+
+    const result1 = await getEncryptedData(transform1);
+    const result2 = await getEncryptedData(transform2);
+    const result3 = await getEncryptedData(transform3);
+
+    assert_array_equals(result1, result2, "result2");
+    assert_array_equals(result1, result3, "result3");
+}, "Uint8Array as input to SFrameTransform");
+        </script>
+    </body>
+</html>

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-expected.txt (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-expected.txt	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,8 @@
+
+PASS Cannot reuse attached transforms
+PASS SFrameTransform exposes readable and writable
+PASS readable/writable are locked when attached and after being attached
+PASS SFrame with array buffer - authentication size 10
+PASS SFrame decryption with array buffer that is too small
+PASS SFrame transform gets errored if trying to process unexpected value types
+

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-in-worker.https-expected.txt (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-in-worker.https-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-in-worker.https-expected.txt	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,4 @@
+
+
+PASS video exchange with SFrame transform in worker
+

Copied: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-in-worker.https.html (from rev 276241, trunk/LayoutTests/http/wpt/webrtc/sframe-transform-in-worker.html) (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-in-worker.https.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-in-worker.https.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,57 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+        <video id="video1" controls autoplay></video>
+        <script src =""
+        <script>
+async function waitForMessage(worker, data)
+{
+    while (true) {
+        const received = await new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+        if (data ="" received)
+            return;
+    }
+}
+
+promise_test(async (test) => {
+    worker = new Worker('sframe-transform-worker.js');
+    const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+    assert_equals(data, "registered");
+    const localStream = await navigator.mediaDevices.getUserMedia({ video: true });
+
+    let sender, receiver;
+    const senderTransform = new SFrameTransform({ compatibilityMode: "H264" });
+    const receiverTransform = new RTCRtpScriptTransform(worker, "SFrameRTCRtpTransform");
+
+    const key = await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
+    senderTransform.setEncryptionKey(key);
+
+    const startedPromise = new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+
+    const stream = await new Promise((resolve, reject) => {
+        createConnections(test, (firstConnection) => {
+            pc1 = firstConnection;
+            sender = firstConnection.addTrack(localStream.getTracks()[0], localStream);
+            sender.transform = senderTransform;
+        }, (secondConnection) => {
+            pc2 = secondConnection;
+            secondConnection._ontrack_ = (trackEvent) => {
+                receiver = trackEvent.receiver;
+                receiver.transform = receiverTransform;
+                resolve(trackEvent.streams[0]);
+            };
+        });
+        test.step_timeout(() => reject("Test timed out"), 5000);
+    });
+
+    video1.srcObject = stream;
+    await video1.play();
+}, "video exchange with SFrame transform in worker");
+        </script>
+    </body>
+</html>

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-readable-expected.txt (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-readable-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-readable-expected.txt	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,3 @@
+
+PASS sframe-transform-readable
+

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-readable.html (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-readable.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-readable.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,18 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+        <iframe src="" id="frame"></iframe>
+        <script>
+promise_test(async (test) => {
+    const transform = new frame.contentWindow.SFrameTransform;
+    frame.remove();
+    assert_throws_dom("InvalidStateError", () => transform.readable);
+});
+       </script>
+    </body>
+</html>

Copied: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-worker.js (from rev 276241, trunk/LayoutTests/http/wpt/webrtc/sframe-transform.js) (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-worker.js	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-worker.js	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,7 @@
+_onrtctransform_ = (event) => {
+    const sframeTransform = new SFrameTransform({ role : "decrypt", authenticationSize: "10", compatibilityMode: "H264" });
+    crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]).then(key => sframeTransform.setEncryptionKey(key));
+    const transformer = event.transformer;
+    transformer.readable.pipeThrough(sframeTransform).pipeTo(transformer.writable);
+}
+self.postMessage("registered");

Copied: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform.html (from rev 276241, trunk/LayoutTests/http/wpt/webrtc/sframe-transform.html) (0 => 276242)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform.html	2021-04-19 09:49:20 UTC (rev 276242)
@@ -0,0 +1,141 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+        <script>
+
+promise_test(async (test) => {
+    const pc = new RTCPeerConnection();
+    const senderTransform = new SFrameTransform();
+    const receiverTransform = new SFrameTransform();
+    const sender1 = pc.addTransceiver('audio').sender;
+    const sender2 = pc.addTransceiver('video').sender;
+    const receiver1 = pc.getReceivers()[0];
+    const receiver2 = pc.getReceivers()[1];
+
+    sender1.transform = senderTransform;
+    receiver1.transform = receiverTransform;
+    assert_throws_dom("InvalidStateError", () => sender2.transform = senderTransform);
+    assert_throws_dom("InvalidStateError", () => receiver2.transform = receiverTransform);
+
+    sender1.transform = senderTransform;
+    receiver1.transform = receiverTransform;
+
+    sender1.transform = null;
+    receiver1.transform = null;
+}, "Cannot reuse attached transforms");
+
+test(() => {
+    const senderTransform = new SFrameTransform();
+
+    assert_true(senderTransform.readable instanceof ReadableStream);
+    assert_true(senderTransform.writable instanceof WritableStream);
+}, "SFrameTransform exposes readable and writable");
+
+promise_test(async (test) => {
+    const pc = new RTCPeerConnection();
+    const senderTransform = new SFrameTransform();
+    const receiverTransform = new SFrameTransform();
+    const sender1 = pc.addTransceiver('audio').sender;
+    const sender2 = pc.addTransceiver('video').sender;
+    const receiver1 = pc.getReceivers()[0];
+    const receiver2 = pc.getReceivers()[1];
+
+    assert_false(senderTransform.readable.locked, "sender readable before");
+    assert_false(senderTransform.writable.locked, "sender writable before");
+    assert_false(receiverTransform.readable.locked, "receiver readable before");
+    assert_false(receiverTransform.writable.locked, "receiver writable before");
+
+    sender1.transform = senderTransform;
+    receiver1.transform = receiverTransform;
+
+    assert_true(senderTransform.readable.locked, "sender readable during");
+    assert_true(senderTransform.writable.locked, "sender writable during");
+    assert_true(receiverTransform.readable.locked, "receiver readable during");
+    assert_true(receiverTransform.writable.locked, "receiver writable during");
+
+    sender1.transform = null;
+    receiver1.transform = null;
+
+    assert_true(senderTransform.readable.locked, "sender readable after");
+    assert_true(senderTransform.writable.locked, "sender writable after");
+    assert_true(receiverTransform.readable.locked, "receiver readable after");
+    assert_true(receiverTransform.writable.locked, "receiver writable after");
+}, "readable/writable are locked when attached and after being attached");
+
+promise_test(async (test) => {
+    const key = await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
+
+    const senderTransform = new SFrameTransform({ role : 'encrypt', authenticationSize: 10 });
+    senderTransform.setEncryptionKey(key);
+
+    const receiverTransform = new SFrameTransform({ role : 'decrypt', authenticationSize: 10 });
+    receiverTransform.setEncryptionKey(key);
+
+    const writer = senderTransform.writable.getWriter();
+    const reader = receiverTransform.readable.getReader();
+
+    senderTransform.readable.pipeTo(receiverTransform.writable);
+
+    const sent = new ArrayBuffer(8);
+    const view = new Int8Array(sent);
+    for (let cptr = 0; cptr < sent.byteLength; ++cptr)
+        view[cptr] = cptr;
+
+    writer.write(sent);
+    const received = await reader.read();
+
+    assert_equals(received.value.byteLength, 8);
+    const view2 = new Int8Array(received.value);
+    for (let cptr = 0; cptr < sent.byteLength; ++cptr)
+        assert_equals(view2[cptr], view[cptr]);
+}, "SFrame with array buffer - authentication size 10");
+
+promise_test(async (test) => {
+    const key = await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
+
+    const senderTransform = new SFrameTransform({ role : 'encrypt', authenticationSize: 10 });
+    const senderWriter = senderTransform.writable.getWriter();
+    const senderReader = senderTransform.readable.getReader();
+
+    const receiverTransform = new SFrameTransform({ role : 'decrypt', authenticationSize: 10 });
+    const receiverWriter = receiverTransform.writable.getWriter();
+    const receiverReader = receiverTransform.readable.getReader();
+
+    senderTransform.setEncryptionKey(key);
+    receiverTransform.setEncryptionKey(key);
+
+    const chunk = new ArrayBuffer(8);
+
+    // decryption should fail, leading to an empty array buffer.
+    await receiverWriter.write(chunk);
+    let received = await receiverReader.read();
+    assert_equals(received.value.byteLength, 0);
+
+    // We write again but this time with a chunk we can decrypt.
+    await senderWriter.write(chunk);
+    const encrypted = await senderReader.read();
+    await receiverWriter.write(encrypted.value);
+    received = await receiverReader.read();
+    assert_equals(received.value.byteLength, 8);
+}, "SFrame decryption with array buffer that is too small");
+
+promise_test(async (test) => {
+    const key = await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
+
+    const receiverTransform = new SFrameTransform({ role : 'decrypt', authenticationSize: 10 });
+    const receiverWriter = receiverTransform.writable.getWriter();
+    receiverTransform.setEncryptionKey(key);
+
+    // decryption should fail, leading to erroring the transform.
+    await promise_rejects_js(test, TypeError, receiverWriter.write({ }));
+    await promise_rejects_js(test, TypeError, receiverWriter.closed);
+}, "SFrame transform gets errored if trying to process unexpected value types");
+
+        </script>
+    </body>
+</html>

Modified: trunk/LayoutTests/platform/glib/TestExpectations (276241 => 276242)


--- trunk/LayoutTests/platform/glib/TestExpectations	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/platform/glib/TestExpectations	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1579,8 +1579,8 @@
 webkit.org/b/136224 fast/speechrecognition [ Skip ]
 
 # No plans to support Sframes for a while
-http/wpt/webrtc/sframe-transform.html [ Skip ]
-http/wpt/webrtc/sframe-transform-in-worker.html [ Skip ]
+imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform.html [ Skip ]
+imported/w3c/web-platform-tests/webrtc-encoded-transform/sframe-transform-in-worker.https.html [ Skip ]
 webrtc/audio-sframe.html [ Skip ]
 webrtc/sframe-test-vectors.html [ Skip ]
 webrtc/sframe-transform-buffer-source.html [ Skip ]
@@ -2045,7 +2045,7 @@
 webkit.org/b/223965 http/tests/contentextensions/hide-on-csp-report.py [ Crash ]
 webkit.org/b/223965 http/tests/contentextensions/main-resource-redirect-blocked.py [ Crash ]
 
-webkit.org/b/224068 http/wpt/webrtc/webrtc-late-transform.html [ Failure ]
+webkit.org/b/224068 imported/w3c/web-platform-tests/webrtc-encoded-transform/script-late-transform.https.html [ Failure ]
 
 webkit.org/b/224071 webgl/pending/conformance/context/context-attributes-alpha-depth-stencil-antialias.html [ Timeout ]
 

Modified: trunk/LayoutTests/platform/ios-wk1/TestExpectations (276241 => 276242)


--- trunk/LayoutTests/platform/ios-wk1/TestExpectations	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/platform/ios-wk1/TestExpectations	2021-04-19 09:49:20 UTC (rev 276242)
@@ -16,6 +16,7 @@
 
 # Skip WebRTC for now in WK1
 imported/w3c/web-platform-tests/webrtc [ Skip ]
+imported/w3c/web-platform-tests/webrtc-encoded-transform [ Skip ]
 webrtc [ Skip ]
 
 # Not supported on WK1

Modified: trunk/LayoutTests/platform/mac-wk1/TestExpectations (276241 => 276242)


--- trunk/LayoutTests/platform/mac-wk1/TestExpectations	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/platform/mac-wk1/TestExpectations	2021-04-19 09:49:20 UTC (rev 276242)
@@ -395,6 +395,7 @@
 webrtc/datachannel/mdns-ice-candidates.html [ Skip ]
 imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-offer.html [ Failure ]
 webkit.org/b/209878  [ Debug ] webrtc/datachannel/multiple-connections.html [ Slow ]
+imported/w3c/web-platform-tests/webrtc-encoded-transform [ Skip ]
 
 # These tests test the Shadow DOM based HTML form validation UI but Mac WK1 is using native dialogs instead.
 fast/forms/validation-message-on-listbox.html

Deleted: trunk/LayoutTests/webrtc/script-transform.js (276241 => 276242)


--- trunk/LayoutTests/webrtc/script-transform.js	2021-04-19 09:03:52 UTC (rev 276241)
+++ trunk/LayoutTests/webrtc/script-transform.js	2021-04-19 09:49:20 UTC (rev 276242)
@@ -1,7 +0,0 @@
-class MockRTCRtpTransformer extends RTCRtpScriptTransformer {
-    constructor() { }
-    start(readableStream, writableStream) { readableStream.pipeTo(writableStream); }
-};
-
-registerRTCRtpScriptTransformer("MockRTCRtpTransform", MockRTCRtpTransformer);
-self.postMessage("started");
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to