-
Notifications
You must be signed in to change notification settings - Fork 70
/
getBrowserInformation.js
128 lines (111 loc) · 3.41 KB
/
getBrowserInformation.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/* @flow */
import bowser from 'bowser'
const prefixByBrowser = {
chrome: 'Webkit',
safari: 'Webkit',
ios: 'Webkit',
android: 'Webkit',
phantom: 'Webkit',
opera: 'Webkit',
webos: 'Webkit',
blackberry: 'Webkit',
bada: 'Webkit',
tizen: 'Webkit',
chromium: 'Webkit',
vivaldi: 'Webkit',
firefox: 'Moz',
seamoney: 'Moz',
sailfish: 'Moz',
msie: 'ms',
msedge: 'ms',
}
const browserByCanIuseAlias = {
chrome: 'chrome',
chromium: 'chrome',
safari: 'safari',
firfox: 'firefox',
msedge: 'edge',
opera: 'opera',
vivaldi: 'opera',
msie: 'ie',
}
function getBrowserName(browserInfo: Object): ?string {
if (browserInfo.firefox) {
return 'firefox'
}
if (browserInfo.mobile || browserInfo.tablet) {
if (browserInfo.ios) {
return 'ios_saf'
} else if (browserInfo.android) {
return 'android'
} else if (browserInfo.opera) {
return 'op_mini'
}
}
for (const browser in browserByCanIuseAlias) {
if (browserInfo.hasOwnProperty(browser)) {
return browserByCanIuseAlias[browser]
}
}
}
/**
* Uses bowser to get default browser browserInformation such as version and name
* Evaluates bowser browserInfo and adds vendorPrefix browserInformation
* @param {string} userAgent - userAgent that gets evaluated
*/
export default function getBrowserInformation(
userAgent: string
): Object | boolean {
let browserInfo = bowser._detect(userAgent)
if (browserInfo.yandexbrowser) {
browserInfo = bowser._detect(userAgent.replace(/YaBrowser\/[0-9.]*/, ''))
}
for (const browser in prefixByBrowser) {
if (browserInfo.hasOwnProperty(browser)) {
const prefix = prefixByBrowser[browser]
browserInfo.jsPrefix = prefix
browserInfo.cssPrefix = `-${prefix.toLowerCase()}-`
break
}
}
browserInfo.browserName = getBrowserName(browserInfo)
// For cordova IOS 8 the version is missing, set truncated osversion to prevent NaN
if (browserInfo.version) {
browserInfo.browserVersion = parseFloat(browserInfo.version)
} else {
browserInfo.browserVersion = parseInt(parseFloat(browserInfo.osversion), 10)
}
browserInfo.osVersion = parseFloat(browserInfo.osversion)
// iOS forces all browsers to use Safari under the hood
// as the Safari version seems to match the iOS version
// we just explicitely use the osversion instead
// https://github.com/rofrischmann/inline-style-prefixer/issues/72
if (
browserInfo.browserName === 'ios_saf' &&
browserInfo.browserVersion > browserInfo.osVersion
) {
browserInfo.browserVersion = browserInfo.osVersion
}
// seperate native android chrome
// https://github.com/rofrischmann/inline-style-prefixer/issues/45
if (
browserInfo.browserName === 'android' &&
browserInfo.chrome &&
browserInfo.browserVersion > 37
) {
browserInfo.browserName = 'and_chr'
}
// For android < 4.4 we want to check the osversion
// not the chrome version, see issue #26
// https://github.com/rofrischmann/inline-style-prefixer/issues/26
if (browserInfo.browserName === 'android' && browserInfo.osVersion < 5) {
browserInfo.browserVersion = browserInfo.osVersion
}
// Samsung browser are basically build on Chrome > 44
// https://github.com/rofrischmann/inline-style-prefixer/issues/102
if (browserInfo.browserName === 'android' && browserInfo.samsungBrowser) {
browserInfo.browserName = 'and_chr'
browserInfo.browserVersion = 44
}
return browserInfo
}