/** * Collect device informations * @private * @return {Object} Device informations */ function fetchDeviceInfo() { const device = {}; let ua = navigator.userAgent; // Facebook mobile app's integrated browser adds a bunch of strings that // match everything. Strip it out if it exists. let tmp = ua.split('[FBAN'); if (typeof tmp[1] !== 'undefined') { ua = tmp[0]; /** * Is running inside of Facebook? * @memberof module:engine/device * @type {boolean} */ device.facebook = true; } // Twitter mobile app's integrated browser on iPad adds a "Twitter for // iPhone" string. Same probable happens on other tablet platforms. // This will confuse detection so strip it out if it exists. tmp = ua.split('Twitter'); if (typeof tmp[1] !== 'undefined') { ua = tmp[0]; /** * Is running inside of Twitter? * @memberof module:engine/device * @type {boolean} */ device.twitter = true; } // Desktop /** * Is running on Linux? * @memberof module:engine/device * @type {boolean} */ device.linux = /Linux/.test(ua); /** * Is running on MacOSX? * @memberof module:engine/device * @type {boolean} */ device.macOS = /Mac OS/.test(ua); /** * Is running on Windows? * @memberof module:engine/device * @type {boolean} */ device.windows = /Windows/.test(ua); // - Internet Explorer /** * Is running on IE9 browser? * @memberof module:engine/device * @type {boolean} */ device.ie9 = /MSIE 9/i.test(ua); /** * Is running on IE10 browser? * @memberof module:engine/device * @type {boolean} */ device.ie10 = /MSIE 10/i.test(ua); /** * Is running on IE11 browser? * @memberof module:engine/device * @type {boolean} */ device.ie11 = /rv:11.0/i.test(ua); /** * Is running on IE browser? * @memberof module:engine/device * @type {boolean} */ device.ie = device.ie10 || device.ie11 || device.ie9; // Mobile // - iPod /** * Is running on an iPod? * @memberof module:engine/device * @type {boolean} */ device.iPod = /iPod/i.test(ua); // - iPhone /** * Is running on an iPhone? * @memberof module:engine/device * @type {boolean} */ device.iPhone = /iPhone/i.test(ua); /** * Is running on an iPhone4? * @memberof module:engine/device * @type {boolean} */ device.iPhone4 = (device.iPhone && device.pixelRatio === 2 && device.screen.height === 920); /** * Is running on an iPhone5? * @memberof module:engine/device * @type {boolean} */ device.iPhone5 = (device.iPhone && device.pixelRatio === 2 && device.screen.height === 1096); // - iPad /** * Is running on an iPad? * @memberof module:engine/device * @type {boolean} */ device.iPad = /iPad/i.test(ua); /** * Is running on a retina iPad? * @memberof module:engine/device * @type {boolean} */ device.iPadRetina = (device.iPad && device.pixelRatio === 2); // - iOS /** * Is running on iOS system? * @memberof module:engine/device * @type {boolean} */ device.iOS = device.iPod || device.iPhone || device.iPad; /** * Is running on iOS 5? * @memberof module:engine/device * @type {boolean} */ device.iOS5 = (device.iOS && /OS 5/i.test(ua)); /** * Is running on iOS 6? * @memberof module:engine/device * @type {boolean} */ device.iOS6 = (device.iOS && /OS 6/i.test(ua)); /** * Is running on iOS 7? * @memberof module:engine/device * @type {boolean} */ device.iOS7 = (device.iOS && /OS 7/i.test(ua)); /** * Is running on iOS 7.1? * @memberof module:engine/device * @type {boolean} */ device.iOS71 = (device.iOS && /OS 7_1/i.test(ua)); /** * Is running on iOS 8? * @memberof module:engine/device * @type {boolean} */ device.iOS8 = (device.iOS && /OS 8/i.test(ua)); /** * Is running on iOS 9? * @memberof module:engine/device * @type {boolean} */ device.iOS9 = (device.iOS && /OS 9/i.test(ua)); // - Android /** * Is running on Android devices? * @memberof module:engine/device * @type {boolean} */ device.android = /Android/.test(ua); /** * Is running on Android tablets? * @memberof module:engine/device * @type {boolean} */ device.androidTablet = /Android/i.test(ua); /** * Is running on Android phones? * @memberof module:engine/device * @type {boolean} */ device.androidPhone = /(?=.*\bAndroid\b)(?=.*\bMobile\b)/i.test(ua); var androidVer = ua.match(/Android.*AppleWebKit\/([\d.]+)/); /** * Is running on old Android stock browser? * @memberof module:engine/device * @type {boolean} */ device.androidStock = !!(androidVer && androidVer[1] < 537); // - Amazon /** * Is running on Amazon phone? * @memberof module:engine/device * @type {boolean} */ device.amazonPhone = /(?=.*\bAndroid\b)(?=.*\bSD4930UR\b)/i.test(ua); /** * Is running on Amazon tablet? * @memberof module:engine/device * @type {boolean} */ device.amazonTablet = /(?=.*\bAndroid\b)(?=.*\b(?:KFOT|KFTT|KFJWI|KFJWA|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|KFARWI|KFASWI|KFSAWI|KFSAWA)\b)/i.test(ua); // - Windows mobile /** * Is running on Windows phone? * @memberof module:engine/device * @type {boolean} */ device.windowsPhone = /IEMobile/i.test(ua); /** * Is running on Windows tablet? * @memberof module:engine/device * @type {boolean} */ device.windowsTablet = /(?=.*\bWindows\b)(?=.*\bARM\b)/i.test(ua), // Match 'Windows' AND 'ARM' // - Other /** * Is running on Blackberry? * @memberof module:engine/device * @type {boolean} */ device.blackberry = /BlackBerry/i.test(ua); /** * Is running on Blackberry 10? * @memberof module:engine/device * @type {boolean} */ device.blackberry10 = /BB10/i.test(ua); /** * Is running on mobile Opera browser? * @memberof module:engine/device * @type {boolean} */ device.mobileOpera = /Opera Mini/i.test(ua); /** * Is running on mobile Chrome browser? * @memberof module:engine/device * @type {boolean} */ device.mobileChrome = /(CriOS|Chrome)(?=.*\bMobile\b)/i.test(ua); /** * Is running on mobile Firefox browser? * @memberof module:engine/device * @type {boolean} */ device.mobileFirefox = /(?=.*\bFirefox\b)(?=.*\bMobile\b)/i.test(ua); device.sevenInch = new RegExp( '(?:' + // Non-capturing group 'Nexus 7' + // Nexus 7 '|' + // OR 'BNTV250' + // B&N Nook Tablet 7 inch '|' + // OR 'Kindle Fire' + // Kindle Fire '|' + // OR 'Silk' + // Kindle Fire, Silk Accelerated '|' + // OR 'GT-P1000' + // Galaxy Tab 7 inch ')', // End non-capturing group 'i').test(ua); // Case-insensitive matching // Special devices /** * Is running on crosswalk? * @memberof module:engine/device * @type {boolean} */ device.crosswalk = /Crosswalk/i.test(ua); /** * Is running on CocoonJS? * @memberof module:engine/device * @type {boolean} */ device.cocoonJS = !!navigator.isCocoonJS; /** * Is running on CocoonJS Canvas+ mode? * @memberof module:engine/device * @type {boolean} */ device.cocoonCanvasPlus = /CocoonJS/i.test(navigator.browser); /** * Is running on Ejecta? * @memberof module:engine/device * @type {boolean} */ device.ejecta = /Ejecta/i.test(ua); /** * Is running on WiiU? * @memberof module:engine/device * @type {boolean} */ device.wiiu = /Nintendo WiiU/i.test(ua); // General /** * Is running on tablets? * @memberof module:engine/device * @type {boolean} */ device.tablet = device.iPad || device.androidTablet || device.windowsTablet; /** * Is running on phones? * @memberof module:engine/device * @type {boolean} */ device.phone = device.iPhone || device.androidPhone || device.windowsPhone; /** * Is running on mobile devices? * @memberof module:engine/device * @type {boolean} */ device.mobile = device.iOS || device.androidPhone || device.androidTablet || device.amazonPhone || device.amazonTablet || device.windowsPhone || device.windowsTablet || device.blackberry || device.blackberry10 || device.mobileOpera || device.mobileFirefox || device.mobileChrome || device.sevenInch || device.crosswalk || device.cocoonJS || device.cocoonCanvasPlus || device.ejecta; /** * Is running on desktop devices? * @memberof module:engine/device * @type {boolean} */ device.desktop = (!device.mobile) || device.wiiu; return device; } /** * @exports engine/device */ module.exports = fetchDeviceInfo();