tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 })();