4fdd059fb0084b0326a0e549694f86ddce4ea91a
[WebKit-https.git] / LayoutTests / http / tests / media / media-stream / get-display-media-prompt.html
1 <!DOCTYPE html>
2 <html>
3     <head>
4         <title>getDisplayMedia prompt</title>
5         <script src="../../../../resources/js-test-pre.js"></script>
6     </head>
7     <body>
8     <p id="description"></p>
9     <div id="console"></div>
10
11 <script>
12     if (window.internals)
13         internals.setDisableGetDisplayMediaUserGestureConstraint(true);
14
15     let stream;
16     let err;
17     
18     function numberOfTimesGetUserMediaPromptHasBeenCalled() {
19         return testRunner.userMediaPermissionRequestCountForOrigin(document.location.href, document.location.href);
20     }
21     
22     async function promptForAudioOnly() {
23         debug("<br>** Request an audio-only stream, the user should not be prompted **");
24         stream = await navigator.mediaDevices.getDisplayMedia({ audio: true })
25             .catch((e) => { err = e; });
26         shouldBe("numberOfTimesGetUserMediaPromptHasBeenCalled()", "0");
27         shouldBeUndefined("stream");
28         shouldBeTrue("err instanceof Error ");
29         shouldBeEqualToString("err.name", "TypeError");
30     }
31
32     async function promptForVideoOnly() {
33         debug("<br>** Request an video-only stream, the user should be prompted **");
34         stream = await navigator.mediaDevices.getDisplayMedia({ video: true });
35         shouldBe("numberOfTimesGetUserMediaPromptHasBeenCalled()", "1");
36         shouldBe("stream.getAudioTracks().length", "0");
37         shouldBe("stream.getVideoTracks().length", "1");
38     }
39
40     async function promptForAudioAndVideo() {
41         debug("<br>** Request a stream with audio and video, the user should be prompted but no audio track should be created **");
42         stream = await navigator.mediaDevices.getDisplayMedia({ video: true, audio: true });
43         shouldBe("numberOfTimesGetUserMediaPromptHasBeenCalled()", "2");
44         shouldBe("stream.getAudioTracks().length", "0");
45         shouldBe("stream.getVideoTracks().length", "1");
46     }
47     
48     async function promptWithExactVideoConstraints() {
49         debug("<br>** Request a stream with 'max' constraints, the user should not be prompted **");
50
51         stream = null;
52         stream = await navigator.mediaDevices.getDisplayMedia({ video: {width: {exact: 640}, height: {exact: 480}} })
53             .catch((e) => { err = e; });
54         
55         shouldBe("numberOfTimesGetUserMediaPromptHasBeenCalled()", "2");
56         shouldBeUndefined("stream");
57         shouldBeTrue("err instanceof Error ");
58         shouldBeEqualToString("err.name", "TypeError");
59     }
60
61     async function promptWithMinVideoConstraints() {
62         debug("<br>** Request a stream with 'min' constraints, the user should not be prompted **");
63
64         stream = null;
65         stream = await navigator.mediaDevices.getDisplayMedia({ video: {width: {min: 640}, height: {min: 480}} })
66             .catch((e) => { err = e; });
67         shouldBe("numberOfTimesGetUserMediaPromptHasBeenCalled()", "2");
68         shouldBeUndefined("stream");
69         shouldBeTrue("err instanceof Error ");
70         shouldBeEqualToString("err.name", "TypeError");
71     }
72
73     async function promptWithAdvancedVideoConstraints() {
74         debug("<br>** Request a stream with 'advanced' constraints, the user should not be prompted **");
75
76         stream = null;
77         stream = await navigator.mediaDevices.getDisplayMedia({ video: { width: 640, height: 480, advanced: [ { width: 1920, height: 1280 } ] } })
78             .catch((e) => { err = e; });
79         shouldBe("numberOfTimesGetUserMediaPromptHasBeenCalled()", "2");
80         shouldBeUndefined("stream");
81         shouldBeTrue("err instanceof Error ");
82         shouldBeEqualToString("err.name", "TypeError");
83     }
84
85     async function promptWithValidVideoConstraints() {
86         debug("<br>** Request a stream with valid constraints, the user should be prompted **");
87
88         stream = null;
89         stream = await navigator.mediaDevices.getDisplayMedia({ video: {width: 640, height: 480} })
90             .catch((e) => { err = e; });
91         
92         shouldBe("numberOfTimesGetUserMediaPromptHasBeenCalled()", "3");
93         shouldBe("stream.getAudioTracks().length", "0");
94         shouldBe("stream.getVideoTracks().length", "1");
95     }
96
97     async function promptWithInvalidAudioConstraint() {
98         debug("<br>** Request a stream with an exact audio constraint, it should be ignored **");
99
100         stream = null;
101         stream = await navigator.mediaDevices.getDisplayMedia({ video: true, audio: { volume: { exact: 0.5 } } });
102         shouldBe("numberOfTimesGetUserMediaPromptHasBeenCalled()", "4");
103         shouldBe("stream.getAudioTracks().length", "0");
104         shouldBe("stream.getVideoTracks().length", "1");
105     }
106     
107     (async function() {
108         description('Test basic getDisplayMedia prompting behavior');
109         jsTestIsAsync = true;
110
111         testRunner.resetUserMediaPermissionRequestCountForOrigin(document.location.href, document.location.href);
112         window.internals.settings.setScreenCaptureEnabled(true);
113
114         shouldBe("numberOfTimesGetUserMediaPromptHasBeenCalled()", "0");
115
116         await promptForAudioOnly();
117         await promptForVideoOnly();
118         await promptForAudioAndVideo();
119         await promptWithExactVideoConstraints();
120         await promptWithMinVideoConstraints();
121         await promptWithAdvancedVideoConstraints();
122         await promptWithValidVideoConstraints();
123         await promptWithInvalidAudioConstraint();
124
125         debug("");
126         finishJSTest();
127     })()
128
129 </script>
130 <script src="../../../../resources/js-test-post.js"></script>
131 </body>
132 </html>