driver-info.js (3626B)
1 DriverInfo = (function () { 2 // --------------------------------------------------------------------------- 3 // Debug info handling 4 5 function info(str) { 6 window.console.log("Info: " + str); 7 } 8 9 // --------------------------------------------------------------------------- 10 // OS and driver identification 11 // Stolen from dom/canvas/test/webgl/test_webgl_conformance_test_suite.html 12 function detectDriverInfo() { 13 var canvas = document.createElement("canvas"); 14 canvas.width = 1; 15 canvas.height = 1; 16 17 var type = ""; 18 var gl = null; 19 try { 20 gl = canvas.getContext("experimental-webgl"); 21 } catch (e) {} 22 23 if (!gl) { 24 info("Failed to create WebGL context for querying driver info."); 25 throw "WebGL failed"; 26 } 27 28 var ext = gl.getExtension("WEBGL_debug_renderer_info"); 29 if (!ext) { 30 throw "WEBGL_debug_renderer_info not available"; 31 } 32 33 var webglRenderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL); 34 return webglRenderer; 35 } 36 37 function detectOSInfo() { 38 var os = null; 39 var version = null; 40 if (navigator.platform.indexOf("Win") == 0) { 41 os = OS.WINDOWS; 42 43 var versionMatch = /Windows NT (\d+.\d+)/.exec(navigator.userAgent); 44 version = versionMatch ? parseFloat(versionMatch[1]) : null; 45 // Version 6.0 is Vista, 6.1 is 7. 46 } else if (navigator.platform.indexOf("Mac") == 0) { 47 os = OS.MAC; 48 49 var versionMatch = /Mac OS X (\d+.\d+)/.exec(navigator.userAgent); 50 version = versionMatch ? parseFloat(versionMatch[1]) : null; 51 } else if (navigator.appVersion.includes("Android")) { 52 os = OS.ANDROID; 53 54 try { 55 // From layout/tools/reftest/reftest.js: 56 version = SpecialPowers.Services.sysinfo.getProperty("version"); 57 } catch (e) { 58 info("No SpecialPowers: can't query android version"); 59 } 60 } else if (navigator.platform.indexOf("Linux") == 0) { 61 // Must be checked after android, as android also has a 'Linux' platform string. 62 os = OS.LINUX; 63 } 64 65 return [os, version]; 66 } 67 68 var OS = { 69 WINDOWS: "windows", 70 MAC: "mac", 71 LINUX: "linux", 72 ANDROID: "android", 73 }; 74 75 var DRIVER = { 76 INTEL: "intel", 77 MESA: "mesa", 78 NVIDIA: "nvidia", 79 ANDROID_X86_EMULATOR: "android x86 emulator", 80 ANGLE: "angle", 81 }; 82 83 var kOS = null; 84 var kOSVersion = null; 85 var kRawDriver = null; 86 var kDriver = null; 87 88 try { 89 [kOS, kOSVersion] = detectOSInfo(); 90 } catch (e) { 91 // Generally just fails when we don't have SpecialPowers. 92 } 93 94 try { 95 kRawDriver = detectDriverInfo(); 96 97 if (kRawDriver.includes("llvmpipe")) { 98 kDriver = DRIVER.MESA; 99 } else if (kRawDriver.includes("Android Emulator")) { 100 kDriver = DRIVER.ANDROID_X86_EMULATOR; 101 } else if (kRawDriver.includes("ANGLE")) { 102 kDriver = DRIVER.ANGLE; 103 } else if (kRawDriver.includes("NVIDIA")) { 104 kDriver = DRIVER.NVIDIA; 105 } else if (kRawDriver.includes("Intel")) { 106 kDriver = DRIVER.INTEL; 107 } 108 } catch (e) { 109 // detectDriverInfo is fallible where WebGL fails. 110 } 111 112 function dump(line_out_func) { 113 let lines = [ 114 "[DriverInfo] userAgent: " + navigator.userAgent, 115 "[DriverInfo] kRawDriver: " + kRawDriver, 116 "[DriverInfo] kDriver: " + kDriver, 117 "[DriverInfo] kOS: " + kOS, 118 "[DriverInfo] kOSVersion: " + kOSVersion, 119 ]; 120 lines.forEach(line_out_func); 121 } 122 123 dump(x => console.log(x)); 124 125 return { 126 DRIVER, 127 OS, 128 dump, 129 getDriver() { 130 return kDriver; 131 }, 132 getOS() { 133 return kOS; 134 }, 135 getOSVersion() { 136 return kOSVersion; 137 }, 138 }; 139 })();