summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webrtc-encoded-transform/script-transform-sendKeyFrameRequest.https.html
blob: 51b797eb68346e928bba18bff94c39f1c9d7a4e4 (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
<!doctype html>
<html>
  <head>
    <meta charset=utf-8>
    <title>RTCRtpScriptTransformer.sendKeyFrameRequest tests</title>
    <meta name='timeout' content='long'>
    <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>

const sendKeyFrameRequest = (port, opts) => postMethod(port, 'sendKeyFrameRequest', opts);
const waitForFrame = port => postMethod(port, 'waitForFrame');

promise_test(async (test) => {
  const {sender, receiver} = await createConnectionWithTransform(test, 'script-transform-sendKeyFrameRequest.js', {video: true});
  assert_equals(await waitForFrame(receiver.transform.port), 'got frame');

  assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'success');

  assert_equals(await sendKeyFrameRequest(sender.transform.port), 'failure: InvalidStateError');

  video1.srcObject = new MediaStream([receiver.track]);
  await video1.play();
}, 'sendKeyFrameRequest resolves for video receiver, and throws for video sender');

promise_test(async (test) => {
  const {sender, receiver} = await createConnectionWithTransform(test, 'script-transform-sendKeyFrameRequest.js', {audio: true});
  assert_equals(await waitForFrame(receiver.transform.port), 'got frame');

  assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'failure: InvalidStateError');

  assert_equals(await waitForFrame(sender.transform.port), 'got frame');

  assert_equals(await sendKeyFrameRequest(sender.transform.port), 'failure: InvalidStateError');

  video1.srcObject = new MediaStream([receiver.track]);
  await video1.play();
}, 'sendKeyFrameRequest throws for audio sender/receiver');

promise_test(async (test) => {
  const [senderTransform] = await createTransforms('script-transform-sendKeyFrameRequest.js');
  assert_equals(await sendKeyFrameRequest(senderTransform.port), 'failure: InvalidStateError');
}, 'sendKeyFrameRequest throws for unused transforms');

promise_test(async (test) => {
  const {sender, receiver} = await createConnectionWithTransform(test, 'script-transform-sendKeyFrameRequest.js', {video: true});
  assert_equals(await waitForFrame(receiver.transform.port), 'got frame');

  const receiverTransform = receiver.transform;
  assert_equals(await sendKeyFrameRequest(receiverTransform.port), 'success');

  // TODO: Spec currently says that this will immediately cause the transformer
  // to stop working. This may change.
  receiver.transform = null;

  assert_equals(await sendKeyFrameRequest(receiverTransform.port), 'failure: InvalidStateError');
}, 'sendKeyFrameRequest throws for unset transforms');

promise_test(async (test) => {
  const {sender, receiver, senderPc, receiverPc} = await createConnectionWithTransform(test, 'script-transform-sendKeyFrameRequest.js', {video: true});
  assert_equals(await waitForFrame(receiver.transform.port), 'got frame');

  assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'success');

  senderPc.getTransceivers()[0].direction = 'inactive';
  await senderPc.setLocalDescription();
  await receiverPc.setRemoteDescription(senderPc.localDescription);
  await receiverPc.setLocalDescription();
  await senderPc.setRemoteDescription(receiverPc.localDescription);

  assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'failure: InvalidStateError');

  senderPc.getTransceivers()[0].direction = 'sendonly';
  await senderPc.setLocalDescription();
  await receiverPc.setRemoteDescription(senderPc.localDescription);
  await receiverPc.setLocalDescription();
  await senderPc.setRemoteDescription(receiverPc.localDescription);

  assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'success');
}, 'sendKeyFrameRequest rejects when the receiver is negotiated inactive, and resumes succeeding when negotiated back to active');

promise_test(async (test) => {
  const {sender, receiver, senderPc, receiverPc} = await createConnectionWithTransform(test, 'script-transform-sendKeyFrameRequest.js', {video: true});
  assert_equals(await waitForFrame(receiver.transform.port), 'got frame');

  assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'success');

  receiverPc.getTransceivers()[0].stop();

  assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'failure: InvalidStateError');
}, 'sendKeyFrameRequest rejects when the receiver is stopped');

// Testing that sendKeyFrameRequest actually results in the sending of keyframe
// requests is effectively impossible, because there is no API to expose the
// reception of a keyframe request, keyframes are sent regularly anyway, and
// the spec allows the receiver to ignore these calls if sending a keyframe
// request is 'not deemed appropriate'! sendKeyFrameRequest is at most a
// suggestion.

    </script>
  </body>
</html>