// NOTE: Most of the detection stuff is from Modernizr 3.0 module.exports = function BrowserInfoServiceFactory() { var service = {} function createElement() { return document.createElement.apply(document, arguments) } function addTest(key, test) { service[key] = (typeof test == 'function') ? test() : test } addTest('touch', function() { return ('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch }) addTest('retina', function() { var mediaQuery = '(-webkit-min-device-pixel-ratio: 1.5), ' + '(min--moz-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3/2), ' + '(min-resolution: 1.5dppx)' if (window.devicePixelRatio > 1) { return true } return !!(window.matchMedia && window.matchMedia(mediaQuery).matches) }) addTest('small', function() { var windowWidth = window.screen.width < window.outerWidth ? window.screen.width : window.outerWidth return windowWidth < 800 }) addTest('mobile', function() { return !!(service.small && service.touch) }) addTest('os', function() { var ua = navigator.userAgent if (ua.match(/Android/i)) { return 'android' } else if (ua.match(/iPhone|iPad|iPod/i)) { return 'ios' } else { return 'pc' } }) addTest('webgl', function() { var canvas = createElement('canvas') if ('supportsContext' in canvas) { return canvas.supportsContext('webgl') || canvas.supportsContext('experimental-webgl') } return !!window.WebGLRenderingContext }) addTest('ua', navigator.userAgent) addTest('devicemotion', 'DeviceMotionEvent' in window) addTest('deviceorientation', 'DeviceOrientationEvent' in window) return service }