Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: display == 'wayland'
- Manifest: dom/canvas/test/webgl-mochitest/mochitest.toml
<!DOCTYPE HTML>
<html>
<head>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" href="/tests/SimpleTest/test.css">
</head>
<body>
<script>
let gl, ext;
function getStrings() {
const ret = {
renderer: gl.getParameter(gl.RENDERER),
vendor: gl.getParameter(gl.VENDOR),
};
if (ext) {
ret.unmasked_renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);
ret.unmasked_vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);
}
return ret;
}
const RTX3070_R = 'ANGLE (NVIDIA, NVIDIA GeForce RTX 3070 Direct3D11 vs_5_0 ps_5_0, D3D11-27.21.14.5751)';
const RTX3070_V = 'Google Inc.';
const RTX3070_R_SANITIZED = 'ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar';
function expectJsonEqual(was, expected, when) {
if (when) {
when = when + ': ';
} else {
when = '';
}
const wasStr = JSON.stringify(was);
const expectedStr = JSON.stringify(expected);
let str = `${when}Was ${wasStr}`;
const matches = (wasStr == expectedStr);
if (!matches) {
str += `, expected ${expectedStr}`;
}
ok(matches, str);
}
async function testKnownCiStrings() {
gl = document.createElement('canvas').getContext('webgl');
if (!gl) return;
await SpecialPowers.pushPrefEnv({'set': [
['webgl.sanitize-unmasked-renderer', false],
]});
ext = gl.getExtension('WEBGL_debug_renderer_info');
const was = getStrings();
const KNOWN_ON_CI = {
renderer: [
'Adreno (TM) 540', // Android
'Adreno (TM) 650', // Android pixel5
'llvmpipe', // Linux
'Intel(R) HD Graphics 400', // Mac
'Apple M1', // Mac
'Apple M2', // Mac
'ANGLE (NVIDIA, NVIDIA GeForce 8800 GTX Direct3D11 vs_5_0 ps_5_0)', // Windows
].map(x => x + ', or similar'),
vendor: [
'Mozilla',
],
unmasked_renderer: [
'Adreno (TM) 540', // Android
'Adreno (TM) 620', // Android pixel5
'llvmpipe (LLVM 10.0.0, 256 bits)', // Linux (Ubuntu 18.04)
'llvmpipe (LLVM 17.0.6, 256 bits)', // Linux (Ubuntu 24.04)
'Intel(R) UHD Graphics 630', // Mac
'Apple M1', // Mac
'Apple M2', // Mac
'ANGLE (NVIDIA, NVIDIA Tesla M60 Direct3D11 vs_5_0 ps_5_0, D3D11-23.21.13.9181)', // Windows
'ANGLE (NVIDIA, NVIDIA Tesla M60 Direct3D11 vs_5_0 ps_5_0, D3D11-30.0.14.7239)', // Windows 11
'ANGLE (NVIDIA, NVIDIA Tesla M60 Direct3D11 vs_5_0 ps_5_0, D3D11-31.0.15.3815)', //Windows 11
],
unmasked_vendor: [
'Qualcomm', // Android
'VMware, Inc.', // Linux
'Mesa', // Linux
'Intel Inc.', // Mac
'Apple', // Mac
'Google Inc. (NVIDIA)', // Windows
],
};
for (const k in was) {
const wasVal = was[k];
const knownList = KNOWN_ON_CI[k];
ok(knownList.includes(wasVal),
`[ignore if not on CI] getParameter(${k}) -> '${wasVal}' must be in KNOWN_ON_CI`);
}
await SpecialPowers.popPrefEnv();
}
// -
async function testPrefBehaviorForExampleRtx3070() {
const canvas = document.createElement('canvas');
gl = canvas.getContext('webgl');
ext = null;
if (!gl) {
todo(gl, 'Get WebGL working here first.');
return;
}
// -
// Assuming that we're on CI, test against known-good strings.
// If we add machine configs, we'll need to add to these lists.
// detailed driver version/date to its RENDERER strings, which
// we want to prevent.
await SpecialPowers.pushPrefEnv({'set': [
['webgl.override-unmasked-renderer', RTX3070_R],
['webgl.override-unmasked-vendor', RTX3070_V],
]});
// -
// Test disabled
await SpecialPowers.pushPrefEnv({'set': [
['webgl.enable-debug-renderer-info', false],
]});
ext = gl.getExtension('WEBGL_debug_renderer_info');
ok(!ext,
'When pref disabled: Should not have access to \'WEBGL_debug_renderer_info\'.');
{
const EXPECTED = {
renderer: RTX3070_R_SANITIZED,
vendor: 'Mozilla',
};
const was = getStrings();
expectJsonEqual(was, EXPECTED, 'v92 behavior w/o ext');
}
await SpecialPowers.popPrefEnv();
// -
// Test RFP
await SpecialPowers.pushPrefEnv({'set': [
['privacy.resistFingerprinting', true],
]});
ext = gl.getExtension('WEBGL_debug_renderer_info');
ok(!ext,
'With RFP: Should not have access to \'WEBGL_debug_renderer_info\'.');
{
const EXPECTED = {
renderer: 'Mozilla',
vendor: 'Mozilla',
};
const was = getStrings();
expectJsonEqual(was, EXPECTED, 'RFP behavior');
}
await SpecialPowers.popPrefEnv();
// -
// Test default state (v92+)
ext = gl.getExtension('WEBGL_debug_renderer_info');
ok(ext,
'By default: Should have access to \'WEBGL_debug_renderer_info\'.');
{
const EXPECTED = {
renderer: RTX3070_R_SANITIZED,
vendor: 'Mozilla',
unmasked_renderer: RTX3070_R_SANITIZED,
unmasked_vendor: RTX3070_V,
};
const was = getStrings();
expectJsonEqual(was, EXPECTED, 'v92 behavior');
}
// -
// Test v91 behavior
await SpecialPowers.pushPrefEnv({'set': [
['webgl.enable-renderer-query', false],
]});
{
const EXPECTED = {
renderer: 'Mozilla',
vendor: 'Mozilla',
unmasked_renderer: RTX3070_R_SANITIZED,
unmasked_vendor: RTX3070_V,
};
const was = getStrings();
expectJsonEqual(was, EXPECTED, 'v91 behavior');
}
// -
// Test v90 behavior
await SpecialPowers.pushPrefEnv({'set': [
['webgl.sanitize-unmasked-renderer', false],
]});
{
const EXPECTED = {
renderer: 'Mozilla',
vendor: 'Mozilla',
unmasked_renderer: RTX3070_R,
unmasked_vendor: RTX3070_V,
};
const was = getStrings();
expectJsonEqual(was, EXPECTED, 'v90 behavior');
}
}
// -
SimpleTest.waitForExplicitFinish();
(async function() {
await testKnownCiStrings();
await testPrefBehaviorForExampleRtx3070();
ok(true, 'Test complete.');
SimpleTest.finish();
})();
</script>
</body>
</html>