diff --git a/src/ua-parser.js b/src/ua-parser.js index d982c4e..3f88f14 100755 --- a/src/ua-parser.js +++ b/src/ua-parser.js @@ -847,6 +847,20 @@ ], [VERSION, NAME] ], + gpu : [[ + + /(intel).*\b(hd\sgraphics\s\d{4}|iris(?:\spro)|gma\s\w+)/i, // Intel + /(nvidia)\s(geforce\s(?:gtx?\s)\d\w+|quadro)/i, // NVIDIA + /(sis)\s(\w+)/i // SiS + ], [VENDOR, MODEL], [ + + /\b(radeon\shd\s\w{4,5})/i // ATI + ], [MODEL, [VENDOR, 'ATI']], [ + + /(adreno\s(?:\(TM\)\s)\w+)/i // Qualcomm + ], [[MODEL, /\(TM\)\s/, ''], [VENDOR, 'Qualcomm']] + ], + os : [[ // Windows based @@ -959,6 +973,14 @@ //var engine = new Engine(); //var os = new OS(); + var renderer; + // browser only + if (window && window.document) { + var canvas = document.createElement('canvas'); + var gl = canvas.getContext ? canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl') : undefined; + renderer = gl && gl.getParameter && getExtension && gl.getExtension('WEBGL_debug_renderer_info') ? gl.getParameter(gl.getExtension('WEBGL_debug_renderer_info').UNMASKED_RENDERER_WEBGL) : undefined; + } + this.getBrowser = function () { var browser = { name: undefined, version: undefined }; mapper.rgx.call(browser, ua, rgxmap.browser); @@ -980,6 +1002,13 @@ mapper.rgx.call(engine, ua, rgxmap.engine); return engine; }; + this.getGPU = function () { + var gpu = { vendor: undefined, model: undefined }; + if (renderer) { + mapper.rgx.call(gpu, renderer, rgxmap.gpu); + } + return gpu; + }; this.getOS = function () { var os = { name: undefined, version: undefined }; mapper.rgx.call(os, ua, rgxmap.os); @@ -992,12 +1021,17 @@ engine : this.getEngine(), os : this.getOS(), device : this.getDevice(), - cpu : this.getCPU() + cpu : this.getCPU(), + gpu : this.getGPU() }; }; this.getUA = function () { return ua; }; + this.setRenderer = function (rendererstr) { + renderer = rendererstr; + return this; + }; this.setUA = function (uastring) { ua = uastring; //browser = new Browser(); diff --git a/test/gpu-test.json b/test/gpu-test.json new file mode 100644 index 0000000..a5027e0 --- /dev/null +++ b/test/gpu-test.json @@ -0,0 +1,56 @@ +[ + { + "desc" : "Intel", + "renderer": "Intel HD Graphics 4000 OpenGL Engine", + "expect" : + { + "vendor" : "Intel", + "model" : "HD Graphics 4000" + } + }, + { + "desc" : "Intel", + "renderer": "Intel Iris Pro OpenGL Engine", + "expect" : + { + "vendor" : "Intel", + "model" : "Iris Pro" + } + }, + { + "desc" : "Intel", + "renderer": "Intel GMA X3100 OpenGL Engine", + "expect" : + { + "vendor" : "Intel", + "model" : "GMA X3100" + } + }, + { + "desc" : "ATI", + "renderer": "ATI Radeon HD 6750M OpenGL Engine", + "expect" : + { + "vendor" : "ATI", + "model" : "Radeon HD 6750M" + } + }, + { + "desc" : "NVIDIA", + "renderer": "NVIDIA GeForce GT 650M OpenGL Engine", + "expect" : + { + "vendor" : "NVIDIA", + "model" : "GeForce GT 650M" + } + }, + { + "desc" : "Qualcomm", + "renderer": "Adreno (TM) 320", + "expect" : + { + "vendor" : "Qualcomm", + "model" : "Adreno 320" + } + } +] \ No newline at end of file diff --git a/test/test.js b/test/test.js index 99e53ff..8e5d2fd 100644 --- a/test/test.js +++ b/test/test.js @@ -5,6 +5,7 @@ var browsers = require('./browser-test.json'); var cpus = require('./cpu-test.json'); var devices = require('./device-test.json'); var engines = require('./engine-test.json'); +var gpus = require('./gpu-test.json'); var os = require('./os-test.json'); var parser = new UAParser(); var methods = [ @@ -32,6 +33,12 @@ var methods = [ list : engines, properties : ['name', 'version'] }, + { + title : 'getGPU', + label : 'gpu', + list : gpus, + properties : ['model', 'vendor'] + }, { title : 'getOS', label : 'os', @@ -43,7 +50,7 @@ describe('UAParser()', function () { var ua = 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6'; assert.deepEqual(UAParser(ua), new UAParser().setUA(ua).getResult()); }); - +/* for (var i in methods) { describe(methods[i]['title'], function () { for (var j in methods[i]['list']) { @@ -63,7 +70,22 @@ for (var i in methods) { } } }); -} +}*/ + +describe('getGPU', function () { + for (var i in gpus) { + describe(`[${gpus[i].desc}] "${gpus[i].renderer}"`, function () { + var gpu = parser.setRenderer(gpus[i].renderer).getGPU(); + var expect = gpus[i].expect; + it(`should return vendor: ${expect.vendor}`, function(){ + assert.equal(gpu.vendor, expect.vendor != 'undefined' ? expect.vendor : undefined); + }) + it(`should return model: ${expect.model}`, function(){ + assert.equal(gpu.model, expect.model != 'undefined' ? expect.model : undefined); + }) + }); + } +}); describe('Returns', function () { it('getResult() should returns JSON', function(done) { @@ -74,6 +96,7 @@ describe('Returns', function () { cpu: { architecture: undefined }, device: { vendor: undefined, model: undefined, type: undefined }, engine: { name: undefined, version: undefined}, + gpu: { vendor: undefined, model: undefined}, os: { name: undefined, version: undefined } }); done();