Browsers   A
last analyzed

Complexity

Total Complexity 4

Size/Duplication

Total Lines 307
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 10
Bugs 1 Features 3
Metric Value
wmc 4
c 10
b 1
f 3
lcom 1
cbo 1
dl 0
loc 307
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A getSafariVersion() 0 9 2
B getSafariVersions() 0 112 1
A getFamily() 0 4 1
1
<?php
2
namespace MobileDetect\Providers;
3
4
class Browsers extends AbstractProvider
5
{
6
    /**
7
     * List of browsers.
8
     *
9
     * The order inside a browser family is _important_.
10
     *
11
     * Eg. When checking for isChrome() we will first check for 'mobile'
12
     * and at last the 'desktop' version.
13
     * This way we don't need to keep accurate two regexes.
14
     * The last 'desktop' regex is a fallback.
15
     * At the last step we already know what happened before.
16
     *
17
     * @var array
18
     */
19
    protected $data = array(
20
        /**
21
         * Microsoft Internet Explorer family
22
         *
23
         * @docs http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx
24
         */
25
        'IE' => array(
26
            'IE Mobile' => array(
27
                'vendor' => 'Microsoft',
28
                'model' => 'IE Mobile',
29
                'isMobile' => true,
30
                'identityMatches' => 'IEMobile|MSIEMobile|Trident/[0-9.]+; Touch; rv:[0-9.]+;',
31
                'versionMatches' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];', 'Trident.*rv.[VER]'),
32
            ),
33
            'IE Desktop' => array(
34
                'vendor' => 'Microsoft',
35
                'model' => 'IE Desktop',
36
                'isMobile' => false,
37
                'identityMatches' => 'MSIE [0-9.]+;|Trident.*rv.[0-9.]+',
38
                'versionMatches' => array('MSIE [VER];', 'Trident.*rv.[VER]'),
39
            ),
40
        ),
41
        /**
42
         * Opera family
43
         */
44
        'Opera' => array(
45
            'Opera Mini' => array(
46
                'vendor' => 'Opera',
47
                'model' => 'Opera Mini',
48
                'isMobile' => true,
49
                'identityMatches' => 'Opera.*Mini',
50
                'versionMatches' => array('Opera Mini/[VER]'),
51
            ),
52
            'Opera Mobi' => array(
53
                'vendor' => 'Opera',
54
                'model' => 'Opera Mobi',
55
                'isMobile' => true,
56
                'identityMatches' => 'Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+',
57
                'versionMatches' => array('Opera Mobi/[VER]', ' OPR/[VER]', 'Version/[VER]'),
58
            ),
59
            'Opera Coast' => array(
60
                'vendor' => 'Opera',
61
                'model' => 'Opera Coast',
62
                'isMobile' => true,
63
                'identityMatches' => 'Coast/[0-9.]+',
64
                'versionMatches' => array('Coast/[VER]'),
65
            ),
66
            'Opera Desktop' => array(
67
                'vendor' => 'Opera',
68
                'model' => 'Opera Desktop',
69
                'isMobile' => false,
70
                'identityMatches' => '\bOpera\b| OPR/',
71
                'versionMatches' => array('Opera/[VER]', ' OPR/[VER]', 'Version/[VER]' ),
72
            ),
73
        ),
74
        /**
75
         * Google Chrome browser family
76
         *
77
         * @docs https://developers.google.com/chrome/mobile/docs/user-agent
78
         */
79
        'Chrome' => array(
80
            'Chrome Mobile' => array(
81
                'vendor' => 'Google',
82
                'model' => 'Chrome Mobile',
83
                'isMobile' => true,
84
                'identityMatches' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?',
85
                'versionMatches' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'),
86
            ),
87
            'Chrome Desktop' => array(
88
                'vendor' => 'Google',
89
                'model' => 'Chrome Desktop',
90
                'isMobile' => false,
91
                'identityMatches' => '\bChrome\b/[.0-9]*',
92
                'versionMatches' => array('Chrome/[VER]'),
93
            ),
94
        ),
95
96
        /**
97
         * NetFront browsers family.
98
         * @todo (Serban) Should we split this into NetFront and NetFrontLife? Mobile/Desktop
99
         * @docs http://en.wikipedia.org/wiki/NetFront
100
         */
101
        'NetFront' => array(
102
            'NetFront Mobile' => array(
103
                'vendor' => 'NetFront',
104
                'model' => 'NetFront Mobile',
105
                'isMobile' => true,
106
                'identityMatches' => 'NetFront/[.0-9]+|NetFrontLifeBrowser|NF-Browser',
107
                'versionMatches' => array('NetFront/[VER]', 'NetFrontLifeBrowser/[VER]', 'Version/[VER]'),
108
            )
109
        ),
110
111
        'Generic' => array(
112
            /**
113
             * Dolfin family has only mobile browsers.
114
             * @docs https://en.wikipedia.org/wiki/Dolphin_Browser
115
             */
116
            'Dolfin' => array(
117
                'vendor' => 'Dolfin',
118
                'model' => 'Dolfin',
119
                'isMobile' => true,
120
                'identityMatches' => '\bDolfin\b',
121
                'versionMatches' => array('Dolfin/[VER]')
122
            ),
123
            /**
124
             * @docs http://www.ucweb.com/
125
             */
126
            'UCBrowser' => array(
127
                'vendor' => 'UCWeb',
128
                'model' => 'UCBrowser',
129
                'isMobile' => true,
130
                'identityMatches' => 'UC.*Browser|UCWEB',
131
                'versionMatches' => array('UCWEB[VER]', 'UCBrowser/[VER]')
132
            ),
133
            'Silk' => array(
134
                'vendor' => 'Amazon',
135
                'model' => 'Silk',
136
                'isMobile' => true,
137
                'identityMatches' => '\bSilk\b',
138
                'versionMatches' => 'Silk\[VER]'
139
            ),
140
            'Generic Mobile' => array(
141
                'vendor' => 'Generic',
142
                'model' => 'Generic Mobile',
143
                'isMobile' => true,
144
                'identityMatches' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|UP.Browser|ObigoInternetBrowser',
145
                // @todo If this grows, then split into multiple generic browsers as they become important.
146
                'versionMatches' => array('Version/[VER]', 'Safari/[VER]', 'Browser/[VER]'),
147
            )
148
        ),
149
150
        /**
151
         * Apple Safari family
152
         *
153
         * @docs http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3
154
         * @note Safari 7534.48.3 is actually Version 5.1.
155
         * @note On BlackBerry the Version is overwritten by the OS.
156
         */
157
        'Safari'         => array(
158
            'Safari Mobile' => array(
159
                'vendor' => 'Apple',
160
                'model' => 'Safari Mobile',
161
                'isMobile' => true,
162
                'identityMatches' => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari|Android.*Safari',
163
                // @note: Safari 7534.48.3 is actually Version 5.1.
164
                // On BlackBerry the Version is overwritten by the OS.
165
                'versionMatches' => array('Safari/[VER]', 'Version/[VER]'),
166
                'versionHelper' => 'getSafariVersion'
167
168
            ),
169
            'Safari Desktop' => array(
170
                'vendor' => 'Apple',
171
                'model' => 'Safari Desktop',
172
                'isMobile' => false,
173
                'identityMatches' => 'Safari/[0-9.]+',
174
                'versionMatches' => array('Version/[VER]', 'Safari/[VER]'),
175
                'versionHelper' => 'getSafariVersion'
176
            ),
177
        ),
178
179
    );
180
181
    public function getSafariVersion($versionMatch)
182
    {
183
        $versions = $this->getSafariVersions();
184
        if (isset($versions[$versionMatch])) {
185
            return $versions[$versionMatch];
186
        } else {
187
            return null;
188
        }
189
    }
190
191
    // Updated from https://en.wikipedia.org/wiki/Safari_version_history
192
    public function getSafariVersions()
193
    {
194
          return array(
195
              // On Mac OS.
196
              '0.8' => array('version' => '48', 'codename' => ''),
197
              '73' => array('version' => '0.9', 'codename' => ''),
198
              // v. 1.0
199
              '85' => array('version' => '1.0', 'codename' => ''),
200
              '85.8.5' => array('version' => '1.0.3', 'codename' => ''),
201
              '100' => array('version' => '1.1', 'codename' => ''),
202
              '125' => array('version' => '1.2', 'codename' => ''),
203
              '312' => array('version' => '1.3', 'codename' => ''),
204
              '312.3' => array('version' => '1.3.1', 'codename' => ''),
205
              '312.5' => array('version' => '1.3.2', 'codename' => ''),
206
              '312.6' => array('version' => '1.3.2', 'codename' => ''),
207
              '412' => array('version' => '2.0', 'codename' => ''),
208
              '416.11' => array('version' => '2.0.2', 'codename' => ''),
209
              '419.3' => array('version' => '2.0.4', 'codename' => ''),
210
              '522.11' => array('version' => '3.0', 'codename' => ''),
211
              '522.12' => array('version' => '3.0.2', 'codename' => ''),
212
              '522.12.1' => array('version' => '3.0.3', 'codename' => ''),
213
              '523.10' => array('version' => '3.0.4', 'codename' => ''),
214
              '525.13' => array('version' => '3.1', 'codename' => ''),
215
              '525.17' => array('version' => '3.1.1', 'codename' => ''),
216
              '525.20' => array('version' => '3.1.1', 'codename' => ''),
217
              '525.21' => array('version' => '3.1.2', 'codename' => ''),
218
              '525.26' => array('version' => '3.2', 'codename' => ''),
219
              '525.27' => array('version' => '3.2.1', 'codename' => ''),
220
              '525.28' => array('version' => '3.2.3', 'codename' => ''),
221
              '526.11.2' => array('version' => '4.0 Beta', 'codename' => ''),
222
              '528.16' => array('version' => array('4.0', '4.0 Beta'), 'codename' => ''),
223
              '528.17' => array('version' => array('4.0', '4.0 Beta'), 'codename' => ''),
224
              '530.17' => array('version' => array('4.0', '4.0.1'), 'codename' => ''),
225
              '530.18' => array('version' => '4.0.1', 'codename' => ''),
226
              '530.19' => array('version' => '4.0.2', 'codename' => ''),
227
              '531.9' => array('version' => '4.0.3', 'codename' => ''),
228
              '531.21.10' => array('version' => '4.0.4', 'codename' => ''),
229
              '531.22.7' => array('version' => '4.0.5', 'codename' => ''),
230
              '533.16' => array('version' => array('4.1', '5.0'), 'codename' => ''),
231
              '533.17.8' => array('version' => array('4.1.1', '5.0.1'), 'codename' => ''),
232
              '533.18.5' => array('version' => array('4.1.2', '5.0.2'), 'codename' => ''),
233
              '533.19.4' => array('version' => array('4.1.3', '5.0.3'), 'codename' => ''),
234
              '533.20.27' => array('version' => '5.0.4', 'codename' => ''),
235
              '533.21.1' => array('version' => '5.0.5', 'codename' => ''),
236
              '533.22.3' => array('version' => '5.0.6', 'codename' => ''),
237
238
              // From https://bugs.webkit.org/show_bug.cgi?id=44230
239
              '534.6+' => array('version' => '5.0.1', 'codename' => ''),
240
              // From https://bugs.webkit.org/show_bug.cgi?id=45632
241
              '534.8' => array('version' => '5.0.2', 'codename' => ''),
242
              '534.8+' => array('version' => '5.0.2', 'codename' => ''),
243
              // From https://bugs.webkit.org/show_bug.cgi?id=48312
244
              '534.11' => array('version' => '5.0.2', 'codename' => ''),
245
              '534.11+' => array('version' => '5.0.2', 'codename' => ''),
246
              '534.48.3' => array('version' => '5.1', 'codename' => ''),
247
              '534.51.22' => array('version' => '5.1.1', 'codename' => ''),
248
              '534.52.7' => array('version' => '5.1.2', 'codename' => ''),
249
              '534.53.10' => array('version' => '5.1.3', 'codename' => ''),
250
              '534.54.16' => array('version' => '5.1.4', 'codename' => ''),
251
              '534.55.3' => array('version' => '5.1.5', 'codename' => ''),
252
              '534.56.5' => array('version' => '5.1.6', 'codename' => ''),
253
              '534.57.2' => array('version' => '5.1.7', 'codename' => ''),
254
              '534.58.2' => array('version' => '5.1.8', 'codename' => ''),
255
              '534.59.8' => array('version' => '5.1.9', 'codename' => ''),
256
              '534.59.10' => array('version' => '5.1.10', 'codename' => ''),
257
              '536.2+' => array('version' => '5.1.2', 'codename' => ''),
258
              '536.25' => array('version' => '6.0', 'codename' => ''),
259
              '536.26' => array('version' => '6.0.1', 'codename' => ''),
260
              '536.26.17' => array('version' => '6.0.2', 'codename' => ''),
261
              '536.28.10' => array('version' => '6.0.3', 'codename' => ''),
262
              '536.29.13' => array('version' => '6.0.4', 'codename' => ''),
263
              '536.30.1' => array('version' => '6.0.5', 'codename' => ''),
264
              // From https://gist.github.com/rniwa/2721861
265
              '537.1+' => array('version' => '5.1.5', 'codename' => ''),
266
              '537.10+' => array('version' => '5.1', 'codename' => ''),
267
              '537.43.58' => array('version' => '6.1', 'codename' => ''),
268
              '537.73.11' => array('version' => array('6.1.1', '7.0.1'), 'codename' => ''),
269
              // @todo fill gaps here from 6.1.2 to 6.2.7
270
              '537.85.17' => array('version' => array('6.2.8', '7.1.8'), 'codename' => ''),
271
              '537.71' => array('version' => '7.0', 'codename' => ''),
272
              // @todo fill gaps here for 7.0.2
273
              '537.75.14' => array('version' => '7.0.3', 'codename' => ''),
274
              '537.76.4' => array('version' => '7.0.4', 'codename' => ''),
275
              '537.77.4' => array('version' => '7.0.5', 'codename' => ''),
276
              '537.78.2' => array('version' => '7.0.6', 'codename' => ''),
277
              // @todo fill gaps here for 7.1 to 7.1.7
278
              '538.35.8' => array('version' => '8.0', 'codename' => ''),
279
              // @todo fill gaps here for 8.0.1 to 8.0.5
280
              '600.6.3' => array('version' => '8.0.6', 'codename' => ''),
281
              '600.7.12' => array('version' => '8.0.7', 'codename' => ''),
282
              // @todo fill gap here for 8.0.8
283
284
              // On Windows
285
              '522.11.3' => array('version' => '3.0', 'codename' => ''),
286
              '522.12.2' => array('version' => '3.0.1', 'codename' => ''),
287
              '522.13.1' => array('version' => '3.0.2', 'codename' => ''),
288
              '522.15.5' => array('version' => '3.0.3', 'codename' => ''),
289
              '523.12.9' => array('version' => '3.0.4', 'codename' => ''),
290
              '523.13' => array('version' => '3.0.4', 'codename' => ''),
291
              '523.15' => array('version' => '3.0.4', 'codename' => ''),
292
              '525.26.13' => array('version' => '3.2', 'codename' => ''),
293
              '525.27.1' => array('version' => '3.2.1', 'codename' => ''),
294
              '525.28.1' => array('version' => '3.2.2', 'codename' => ''),
295
              '525.29.1' => array('version' => '3.2.3', 'codename' => ''),
296
              '526.12.2' => array('version' => '4.0', 'codename' => ''),
297
              '528.1.1' => array('version' => '4.0', 'codename' => ''),
298
              '530.19.1' => array('version' => '4.0.2', 'codename' => ''),
299
              '531.9.1' => array('version' => '4.0.3', 'codename' => ''),
300
              '534.30' => array('version' => '5.1', 'codename' => ''),
301
              '534.50' => array('version' => '5.1', 'codename' => ''),
302
          );
303
    }
304
    
305
    
306
    public function getFamily($familyName)
307
    {
308
        return $this->data[$familyName];
309
    }
310
}