summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webrtc-encoded-transform/script-transform.https.html
blob: e02982f4703786265a325d6da77aab484d41a73c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
<script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src=/resources/testdriver.js></script>
<script src=/resources/testdriver-vendor.js></script>
<script src='../mediacapture-streams/permission-helper.js'></script>
    </head>
    <body>
        <video id="video1" autoplay></video>
        <video id="video2" autoplay></video>
        <script src ="routines.js"></script>
        <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 = await 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 = await 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 = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
    assert_equals(data, "registered");
    // Video is needed in a later test, so we ask for both permissions
    await setMediaPermission();
    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 = await 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>