Update WPT mediacapture-streams tests
[WebKit-https.git] / LayoutTests / imported / w3c / web-platform-tests / mediacapture-streams / MediaStream-MediaElement-firstframe.https.html
1 <!doctype html>
2 <html>
3 <head>
4 <title>Assigning a MediaStream to a media element and not playing it results in rendering a first frame</title>
5 </head>
6 <body>
7 <p class="instructions">When prompted, accept to share your video stream.</p>
8 <h1 class="instructions">Description</h1>
9 <p class="instructions">This test checks that a HTMLMediaElement with an
10 assigned MediaStream with a video track fires the appropriate events to reach
11 the "canplay" event and readyState HAVE_ENOUGH_DATA even when not playing or
12 autoplaying.</p>
13 <video id="vid"></video>
14 <script src=/resources/testharness.js></script>
15 <script src=/resources/testharnessreport.js></script>
16 <script>
17 'use strict';
18 const vid = document.getElementById("vid");
19
20 promise_test(async t => {
21   const wait = ms => new Promise(r => t.step_timeout(r, ms));
22   const timeout = (promise, time, msg) => Promise.race([
23     promise,
24     wait(time).then(() => Promise.reject(new Error(msg)))
25   ]);
26   const stream = await navigator.mediaDevices.getUserMedia({video: true});
27   t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
28   vid.srcObject = stream;
29
30   await timeout(new Promise(r => vid.oncanplay = r), 8000, "canplay timeout");
31   assert_equals(vid.readyState, vid.HAVE_ENOUGH_DATA,
32     "readyState is HAVE_ENOUGH_DATA after \"canplay\"");
33 }, "Tests that loading a MediaStream in a media element eventually results in \"canplay\" even when not playing or autoplaying");
34
35 promise_test(async t => {
36   const wait = ms => new Promise(r => t.step_timeout(r, ms));
37   const timeout = (promise, time, msg) => Promise.race([
38     promise,
39     wait(time).then(() => Promise.reject(new Error(msg)))
40   ]);
41   const unexpected = e => assert_unreached(`Got unexpected event ${e.type}`);
42   const stream = await navigator.mediaDevices.getUserMedia({video: true});
43   t.add_cleanup(() => {
44     vid.ondurationchange = null;
45     stream.getTracks().forEach(track => track.stop())
46   });
47   vid.srcObject = stream;
48
49   vid.onloadstart = unexpected;
50   vid.ondurationchange = unexpected;
51   vid.onresize = unexpected;
52   vid.onloadedmetadata = unexpected;
53   vid.onloadeddata = unexpected;
54   vid.oncanplay = unexpected;
55   vid.oncanplaythrough = unexpected;
56
57   await timeout(new Promise(r => vid.onloadstart = r), 8000,
58     "loadstart timeout");
59   vid.onloadstart = unexpected;
60
61   await timeout(new Promise(r => vid.ondurationchange = r), 8000,
62     "durationchange timeout");
63   vid.ondurationchange = unexpected;
64   assert_equals(vid.duration, Infinity, "duration changes to Infinity");
65
66   await timeout(new Promise(r => vid.onresize = r), 8000,
67     "resize timeout");
68   vid.onresize = unexpected;
69   assert_not_equals(vid.videoWidth, 0,
70     "videoWidth is something after \"resize\"");
71   assert_not_equals(vid.videoHeight, 0,
72     "videoHeight is something after \"resize\"");
73
74   await timeout(new Promise(r => vid.onloadedmetadata = r), 8000,
75     "loadedmetadata timeout");
76   vid.onloadedmetadata = unexpected;
77   assert_greater_than_equal(vid.readyState, vid.HAVE_METADATA,
78     "readyState is at least HAVE_METADATA after \"loadedmetadata\"");
79
80   await timeout(new Promise(r => vid.onloadeddata = r), 8000,
81     "loadeddata timeout");
82   vid.onloadeddata = unexpected;
83   assert_equals(vid.readyState, vid.HAVE_ENOUGH_DATA,
84     "readyState is HAVE_ENOUGH_DATA after \"loadeddata\" since there's no buffering");
85
86   await timeout(new Promise(r => vid.oncanplay = r), 8000, "canplay timeout");
87   vid.oncanplay = unexpected;
88   assert_equals(vid.readyState, vid.HAVE_ENOUGH_DATA,
89     "readyState is HAVE_ENOUGH_DATA after \"canplay\" since there's no buffering");
90
91   await timeout(new Promise(r => vid.oncanplaythrough = r), 8000,
92     "canplaythrough timeout");
93   vid.oncanplaythrough = unexpected;
94   assert_equals(vid.readyState, vid.HAVE_ENOUGH_DATA,
95     "readyState is HAVE_ENOUGH_DATA after \"canplaythrough\"");
96
97   // Crank the event loop to see whether any more events are fired.
98   await wait(100);
99 }, "Tests that loading a MediaStream in a media element sees all the expected (deterministic) events even when not playing or autoplaying");
100 </script>
101 </body>
102 </html>