@@ -11,9 +11,16 @@ angular.module('jlareau.bowser', [])
11
11
return ( match && match . length > 1 && match [ 1 ] ) || '' ;
12
12
}
13
13
14
+ function getSecondMatch ( regex ) {
15
+ var match = ua . match ( regex ) ;
16
+ return ( match && match . length > 1 && match [ 2 ] ) || '' ;
17
+ }
18
+
14
19
var iosdevice = getFirstMatch ( / ( i p o d | i p h o n e | i p a d ) / i) . toLowerCase ( )
15
20
, likeAndroid = / l i k e a n d r o i d / i. test ( ua )
16
21
, android = ! likeAndroid && / a n d r o i d / i. test ( ua )
22
+ , chromeBook = / C r O S / . test ( ua )
23
+ , edgeVersion = getFirstMatch ( / e d g e \/ ( \d + ( \. \d + ) ? ) / i)
17
24
, versionIdentifier = getFirstMatch ( / v e r s i o n \/ ( \d + ( \. \d + ) ? ) / i)
18
25
, tablet = / t a b l e t / i. test ( ua )
19
26
, mobile = ! tablet && / [ ^ - ] m o b i / i. test ( ua )
@@ -26,12 +33,25 @@ angular.module('jlareau.bowser', [])
26
33
, version : versionIdentifier || getFirstMatch ( / (?: o p e r a | o p r ) [ \s \/ ] ( \d + ( \. \d + ) ? ) / i)
27
34
}
28
35
}
36
+ else if ( / y a b r o w s e r / i. test ( ua ) ) {
37
+ result = {
38
+ name : 'Yandex Browser'
39
+ , yandexbrowser : t
40
+ , version : versionIdentifier || getFirstMatch ( / (?: y a b r o w s e r ) [ \s \/ ] ( \d + ( \. \d + ) ? ) / i)
41
+ }
42
+ }
29
43
else if ( / w i n d o w s p h o n e / i. test ( ua ) ) {
30
44
result = {
31
45
name : 'Windows Phone'
32
46
, windowsphone : t
33
- , msie : t
34
- , version : getFirstMatch ( / i e m o b i l e \/ ( \d + ( \. \d + ) ? ) / i)
47
+ }
48
+ if ( edgeVersion ) {
49
+ result . msedge = t
50
+ result . version = edgeVersion
51
+ }
52
+ else {
53
+ result . msie = t
54
+ result . version = getFirstMatch ( / i e m o b i l e \/ ( \d + ( \. \d + ) ? ) / i)
35
55
}
36
56
}
37
57
else if ( / m s i e | t r i d e n t / i. test ( ua ) ) {
@@ -40,6 +60,19 @@ angular.module('jlareau.bowser', [])
40
60
, msie : t
41
61
, version : getFirstMatch ( / (?: m s i e | r v : ) ( \d + ( \. \d + ) ? ) / i)
42
62
}
63
+ } else if ( chromeBook ) {
64
+ result = {
65
+ name : 'Chrome'
66
+ , chromeBook : t
67
+ , chrome : t
68
+ , version : getFirstMatch ( / (?: c h r o m e | c r i o s | c r m o ) \/ ( \d + ( \. \d + ) ? ) / i)
69
+ }
70
+ } else if ( / c h r o m e .+ ? e d g e / i. test ( ua ) ) {
71
+ result = {
72
+ name : 'Microsoft Edge'
73
+ , msedge : t
74
+ , version : edgeVersion
75
+ }
43
76
}
44
77
else if ( / c h r o m e | c r i o s | c r m o / i. test ( ua ) ) {
45
78
result = {
@@ -82,7 +115,7 @@ angular.module('jlareau.bowser', [])
82
115
}
83
116
}
84
117
else if ( / s i l k / i. test ( ua ) ) {
85
- result = {
118
+ result = {
86
119
name : 'Amazon Silk'
87
120
, silk : t
88
121
, version : getFirstMatch ( / s i l k \/ ( \d + ( \. \d + ) ? ) / i)
@@ -137,10 +170,15 @@ angular.module('jlareau.bowser', [])
137
170
, version : versionIdentifier
138
171
}
139
172
}
140
- else result = { }
173
+ else {
174
+ result = {
175
+ name : getFirstMatch ( / ^ ( .* ) \/ ( .* ) / ) ,
176
+ version : getSecondMatch ( / ^ ( .* ) \/ ( .* ) / )
177
+ } ;
178
+ }
141
179
142
180
// set webkit or gecko flag for browsers based on these engines
143
- if ( / ( a p p l e ) ? w e b k i t / i. test ( ua ) ) {
181
+ if ( ! result . msedge && / ( a p p l e ) ? w e b k i t / i. test ( ua ) ) {
144
182
result . name = result . name || "Webkit"
145
183
result . webkit = t
146
184
if ( ! result . version && versionIdentifier ) {
@@ -153,7 +191,7 @@ angular.module('jlareau.bowser', [])
153
191
}
154
192
155
193
// set OS flags for platforms that have multiple browsers
156
- if ( android || result . silk ) {
194
+ if ( ! result . msedge && ( android || result . silk ) ) {
157
195
result . android = t
158
196
} else if ( iosdevice ) {
159
197
result [ iosdevice ] = t
@@ -162,13 +200,13 @@ angular.module('jlareau.bowser', [])
162
200
163
201
// OS version extraction
164
202
var osVersion = '' ;
165
- if ( iosdevice ) {
203
+ if ( result . windowsphone ) {
204
+ osVersion = getFirstMatch ( / w i n d o w s p h o n e (?: o s ) ? \s ? ( \d + ( \. \d + ) * ) / i) ;
205
+ } else if ( iosdevice ) {
166
206
osVersion = getFirstMatch ( / o s ( \d + ( [ _ \s ] \d + ) * ) l i k e m a c o s x / i) ;
167
207
osVersion = osVersion . replace ( / [ _ \s ] / g, '.' ) ;
168
208
} else if ( android ) {
169
209
osVersion = getFirstMatch ( / a n d r o i d [ \/ - ] ( \d + ( \. \d + ) * ) / i) ;
170
- } else if ( result . windowsphone ) {
171
- osVersion = getFirstMatch ( / w i n d o w s p h o n e (?: o s ) ? \s ? ( \d + ( \. \d + ) * ) / i) ;
172
210
} else if ( result . webos ) {
173
211
osVersion = getFirstMatch ( / (?: w e b | h p w ) o s \/ ( \d + ( \. \d + ) * ) / i) ;
174
212
} else if ( result . blackberry ) {
@@ -192,12 +230,15 @@ angular.module('jlareau.bowser', [])
192
230
193
231
// Graded Browser Support
194
232
// http://developer.yahoo.com/yui/articles/gbs
195
- if ( ( result . msie && result . version >= 10 ) ||
233
+ if ( result . msedge ||
234
+ ( result . msie && result . version >= 10 ) ||
235
+ ( result . yandexbrowser && result . version >= 15 ) ||
196
236
( result . chrome && result . version >= 20 ) ||
197
237
( result . firefox && result . version >= 20.0 ) ||
198
238
( result . safari && result . version >= 6 ) ||
199
239
( result . opera && result . version >= 10.0 ) ||
200
- ( result . ios && result . osversion && result . osversion . split ( "." ) [ 0 ] >= 6 )
240
+ ( result . ios && result . osversion && result . osversion . split ( "." ) [ 0 ] >= 6 ) ||
241
+ ( result . blackberry && result . version >= 10.1 )
201
242
) {
202
243
result . a = t ;
203
244
}
@@ -216,6 +257,18 @@ angular.module('jlareau.bowser', [])
216
257
217
258
var bowser = detect ( typeof navigator !== 'undefined' ? navigator . userAgent : '' )
218
259
260
+ bowser . test = function ( browserList ) {
261
+ for ( var i = 0 ; i < browserList . length ; ++ i ) {
262
+ var browserItem = browserList [ i ] ;
263
+ if ( typeof browserItem === 'string' ) {
264
+ if ( browserItem in bowser ) {
265
+ return true ;
266
+ }
267
+ }
268
+ }
269
+ return false ;
270
+ }
271
+
219
272
220
273
/*
221
274
* Set our detect method to the main bowser object so we can
0 commit comments