Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 37 additions & 38 deletions src/angular-bowser.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
angular.module('jlareau.bowser', [])

.factory('bowser', [function(){
.constant('bowser', (function(){

var t = true
var t = true;

function detect(ua) {

Expand All @@ -17,104 +17,104 @@ angular.module('jlareau.bowser', [])
, versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i)
, tablet = /tablet/i.test(ua)
, mobile = !tablet && /[^-]mobi/i.test(ua)
, result
, result;

if (/opera|opr/i.test(ua)) {
result = {
name: 'Opera'
, opera: t
, version: versionIdentifier || getFirstMatch(/(?:opera|opr)[\s\/](\d+(\.\d+)?)/i)
}
};
}
else if (/windows phone/i.test(ua)) {
result = {
name: 'Windows Phone'
, windowsphone: t
, msie: t
, version: getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i)
}
};
}
else if (/msie|trident/i.test(ua)) {
result = {
name: 'Internet Explorer'
, msie: t
, version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i)
}
};
}
else if (/chrome|crios|crmo/i.test(ua)) {
result = {
name: 'Chrome'
, chrome: t
, version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
}
};
}
else if (iosdevice) {
result = {
name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod'
}
};
// WTF: version is not part of user agent in web apps
if (versionIdentifier) {
result.version = versionIdentifier
result.version = versionIdentifier;
}
}
else if (/sailfish/i.test(ua)) {
result = {
name: 'Sailfish'
, sailfish: t
, version: getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i)
}
};
}
else if (/seamonkey\//i.test(ua)) {
result = {
name: 'SeaMonkey'
, seamonkey: t
, version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i)
}
};
}
else if (/firefox|iceweasel/i.test(ua)) {
result = {
name: 'Firefox'
, firefox: t
, version: getFirstMatch(/(?:firefox|iceweasel)[ \/](\d+(\.\d+)?)/i)
}
};
if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) {
result.firefoxos = t
result.firefoxos = t;
}
}
else if (/silk/i.test(ua)) {
result = {
name: 'Amazon Silk'
, silk: t
, version : getFirstMatch(/silk\/(\d+(\.\d+)?)/i)
}
};
}
else if (android) {
result = {
name: 'Android'
, version: versionIdentifier
}
};
}
else if (/phantom/i.test(ua)) {
result = {
name: 'PhantomJS'
, phantom: t
, version: getFirstMatch(/phantomjs\/(\d+(\.\d+)?)/i)
}
};
}
else if (/blackberry|\bbb\d+/i.test(ua) || /rim\stablet/i.test(ua)) {
result = {
name: 'BlackBerry'
, blackberry: t
, version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i)
}
};
}
else if (/(web|hpw)os/i.test(ua)) {
result = {
name: 'WebOS'
, webos: t
, version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)
};
/touchpad\//i.test(ua) && (result.touchpad = t)
/touchpad\//i.test(ua) && (result.touchpad = t);
}
else if (/bada/i.test(ua)) {
result = {
Expand All @@ -135,29 +135,29 @@ angular.module('jlareau.bowser', [])
name: 'Safari'
, safari: t
, version: versionIdentifier
}
};
}
else result = {}
else result = {};

// set webkit or gecko flag for browsers based on these engines
if (/(apple)?webkit/i.test(ua)) {
result.name = result.name || "Webkit"
result.webkit = t
result.name = result.name || "Webkit";
result.webkit = t;
if (!result.version && versionIdentifier) {
result.version = versionIdentifier
result.version = versionIdentifier;
}
} else if (!result.opera && /gecko\//i.test(ua)) {
result.name = result.name || "Gecko"
result.gecko = t
result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i)
result.name = result.name || "Gecko";
result.gecko = t;
result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i);
}

// set OS flags for platforms that have multiple browsers
if (android || result.silk) {
result.android = t
result.android = t;
} else if (iosdevice) {
result[iosdevice] = t
result.ios = t
result[iosdevice] = t;
result.ios = t;
}

// OS version extraction
Expand All @@ -184,10 +184,10 @@ angular.module('jlareau.bowser', [])

// device type extraction
var osMajorVersion = osVersion.split('.')[0];
if (tablet || iosdevice == 'ipad' || (android && (osMajorVersion == 3 || (osMajorVersion == 4 && !mobile))) || result.silk) {
result.tablet = t
if (tablet || iosdevice == 'ipad' || (android && (osMajorVersion === '3' || (osMajorVersion === '4' && !mobile))) || result.silk) {
result.tablet = t;
} else if (mobile || iosdevice == 'iphone' || iosdevice == 'ipod' || android || result.blackberry || result.webos || result.bada) {
result.mobile = t
result.mobile = t;
}

// Graded Browser Support
Expand All @@ -208,13 +208,13 @@ angular.module('jlareau.bowser', [])
(result.opera && result.version < 10.0) ||
(result.ios && result.osversion && result.osversion.split(".")[0] < 6)
) {
result.c = t
} else result.x = t
result.c = t;
} else result.x = t;

return result
return result;
}

var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '')
var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '');


/*
Expand All @@ -223,7 +223,6 @@ angular.module('jlareau.bowser', [])
* This is needed to implement future tests.
*/
bowser._detect = detect;

return bowser;

}]);
})());