Bug 1826040 - Add ", or similar" to sanitized RENDERER strings. r=gfx-reviewers,lsalzman
[gecko.git] / dom / canvas / test / webgl-mochitest / test_renderer_strings.html
blob257a16d45e3d0eb3de23a232290524f90b440586
1 <!DOCTYPE HTML>
2 <html>
3 <head>
4 <script src="/tests/SimpleTest/SimpleTest.js"></script>
5 <link rel="stylesheet" href="/tests/SimpleTest/test.css">
6 </head>
7 <body>
8 <script>
10 let gl, ext;
12 function getStrings() {
13 const ret = {
14 renderer: gl.getParameter(gl.RENDERER),
15 vendor: gl.getParameter(gl.VENDOR),
17 if (ext) {
18 ret.unmasked_renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);
19 ret.unmasked_vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);
21 return ret;
24 const RTX3070_R = 'ANGLE (NVIDIA, NVIDIA GeForce RTX 3070 Direct3D11 vs_5_0 ps_5_0, D3D11-27.21.14.5751)';
25 const RTX3070_V = 'Google Inc.';
26 const RTX3070_R_SANITIZED = 'ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar';
28 function expectJsonEqual(was, expected, when) {
29 if (when) {
30 when = when + ': ';
31 } else {
32 when = '';
34 const wasStr = JSON.stringify(was);
35 const expectedStr = JSON.stringify(expected);
36 let str = `${when}Was ${wasStr}`;
37 const matches = (wasStr == expectedStr);
38 if (!matches) {
39 str += `, expected ${expectedStr}`;
41 ok(matches, str);
44 async function testKnownCiStrings() {
45 gl = document.createElement('canvas').getContext('webgl');
46 if (!gl) return;
48 await SpecialPowers.pushPrefEnv({'set': [
49 ['webgl.sanitize-unmasked-renderer', false],
50 ]});
51 ext = gl.getExtension('WEBGL_debug_renderer_info');
52 const was = getStrings();
54 const KNOWN_ON_CI = {
55 renderer: [
56 'Adreno (TM) 540', // Android
57 'Adreno (TM) 650', // Android pixel5
58 'llvmpipe', // Linux
59 'Intel(R) HD Graphics 400', // Mac
60 'Apple M1', // Mac
61 'ANGLE (NVIDIA, NVIDIA GeForce 8800 GTX Direct3D11 vs_5_0 ps_5_0)', // Windows
62 ].map(x => x + ', or similar'),
63 vendor: [
64 'Mozilla',
66 unmasked_renderer: [
67 'Adreno (TM) 540', // Android
68 'Adreno (TM) 620', // Android pixel5
69 'llvmpipe (LLVM 10.0.0, 256 bits)', // Linux
70 'Intel(R) UHD Graphics 630', // Mac
71 'Apple M1', // Mac
72 'ANGLE (NVIDIA, NVIDIA Tesla M60 Direct3D11 vs_5_0 ps_5_0, D3D11-23.21.13.9181)', // Windows
73 'ANGLE (NVIDIA, NVIDIA Tesla M60 Direct3D11 vs_5_0 ps_5_0, D3D11-30.0.14.7239)', // Windows 11
75 unmasked_vendor: [
76 'Qualcomm', // Android
77 'VMware, Inc.', // Linux
78 'Intel Inc.', // Mac
79 'Apple', // Mac
80 'Google Inc. (NVIDIA)', // Windows
83 for (const k in was) {
84 const wasVal = was[k];
85 const knownList = KNOWN_ON_CI[k];
86 ok(knownList.includes(wasVal),
87 `[ignore if not on CI] getParameter(${k}) -> '${wasVal}' must be in KNOWN_ON_CI`);
89 await SpecialPowers.popPrefEnv();
92 // -
94 async function testPrefBehaviorForExampleRtx3070() {
95 const canvas = document.createElement('canvas');
96 gl = canvas.getContext('webgl');
97 ext = null;
98 if (!gl) {
99 todo(gl, 'Get WebGL working here first.');
100 return;
103 // -
104 // Assuming that we're on CI, test against known-good strings.
105 // If we add machine configs, we'll need to add to these lists.
106 // This is to avoid situations like bug 1743734, where ANGLE added
107 // detailed driver version/date to its RENDERER strings, which
108 // we want to prevent.
110 await SpecialPowers.pushPrefEnv({'set': [
111 ['webgl.override-unmasked-renderer', RTX3070_R],
112 ['webgl.override-unmasked-vendor', RTX3070_V],
113 ]});
115 // -
116 // Test disabled
118 await SpecialPowers.pushPrefEnv({'set': [
119 ['webgl.enable-debug-renderer-info', false],
120 ]});
122 ext = gl.getExtension('WEBGL_debug_renderer_info');
123 ok(!ext,
124 'When pref disabled: Should not have access to \'WEBGL_debug_renderer_info\'.');
127 const EXPECTED = {
128 renderer: RTX3070_R_SANITIZED,
129 vendor: 'Mozilla',
131 const was = getStrings();
132 expectJsonEqual(was, EXPECTED, 'v92 behavior w/o ext');
135 await SpecialPowers.popPrefEnv();
137 // -
138 // Test RFP
140 await SpecialPowers.pushPrefEnv({'set': [
141 ['privacy.resistFingerprinting', true],
142 ]});
144 ext = gl.getExtension('WEBGL_debug_renderer_info');
145 ok(!ext,
146 'With RFP: Should not have access to \'WEBGL_debug_renderer_info\'.');
149 const EXPECTED = {
150 renderer: 'Mozilla',
151 vendor: 'Mozilla',
153 const was = getStrings();
154 expectJsonEqual(was, EXPECTED, 'RFP behavior');
157 await SpecialPowers.popPrefEnv();
159 // -
160 // Test default state (v92+)
162 ext = gl.getExtension('WEBGL_debug_renderer_info');
163 ok(ext,
164 'By default: Should have access to \'WEBGL_debug_renderer_info\'.');
167 const EXPECTED = {
168 renderer: RTX3070_R_SANITIZED,
169 vendor: 'Mozilla',
170 unmasked_renderer: RTX3070_R_SANITIZED,
171 unmasked_vendor: RTX3070_V,
173 const was = getStrings();
174 expectJsonEqual(was, EXPECTED, 'v92 behavior');
177 // -
178 // Test v91 behavior
180 await SpecialPowers.pushPrefEnv({'set': [
181 ['webgl.enable-renderer-query', false],
182 ]});
185 const EXPECTED = {
186 renderer: 'Mozilla',
187 vendor: 'Mozilla',
188 unmasked_renderer: RTX3070_R_SANITIZED,
189 unmasked_vendor: RTX3070_V,
191 const was = getStrings();
192 expectJsonEqual(was, EXPECTED, 'v91 behavior');
195 // -
196 // Test v90 behavior
198 await SpecialPowers.pushPrefEnv({'set': [
199 ['webgl.sanitize-unmasked-renderer', false],
200 ]});
203 const EXPECTED = {
204 renderer: 'Mozilla',
205 vendor: 'Mozilla',
206 unmasked_renderer: RTX3070_R,
207 unmasked_vendor: RTX3070_V,
209 const was = getStrings();
210 expectJsonEqual(was, EXPECTED, 'v90 behavior');
214 // -
216 SimpleTest.waitForExplicitFinish();
217 (async function() {
218 await testKnownCiStrings();
219 await testPrefBehaviorForExampleRtx3070();
221 ok(true, 'Test complete.');
222 SimpleTest.finish();
223 })();
225 </script>
226 </body>
227 </html>