MDL-52214 core: Fix the is_web_crawler() regression
[moodle.git] / lib / tests / useragent_test.php
CommitLineData
c3d2fbf9
SH
1<?php
2// This file is part of Moodle - http://moodle.org/
3//
4// Moodle is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// Moodle is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
16
17/**
18 * Tests the user agent class.
19 *
20 * @package core
21 * @copyright 2013 Sam Hemelryk
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23 */
24
25/**
26 * User agent test suite.
27 *
28 * @package core
29 * @copyright 2013 Sam Hemelryk
30 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
31 */
182d9990 32class core_useragent_testcase extends advanced_testcase {
c3d2fbf9 33
c3e1c9b1
DM
34 /**
35 * Restores the user agent to the default one.
36 */
37 public function tearDown() {
38 core_useragent::instance(true);
39 }
40
7c10ad33 41 public function user_agents_providers() {
96a54631
AN
42 // Note: When adding new entries to this list, please ensure that any new browser versions are added to the corresponding list.
43 // This ensures that regression tests are applied to all known user agents.
7c10ad33 44 return array(
39a731ef
AN
45 'Microsoft Edge for Windows 10 Desktop' => array(
46 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136',
47 array(
48 'is_edge' => true,
49 'check_edge_version' => array(
50 '12' => true,
51 ),
52
53 // Edge pretends to be WebKit.
54 'is_webkit' => true,
55
56 // Edge pretends to be Chrome.
57 // Note: Because Edge pretends to be Chrome, it will not be picked up as a Safari browser.
58 'is_chrome' => true,
59 'check_chrome_version' => array(
60 '7' => true,
61 '8' => true,
62 '10' => true,
63 '39' => true,
64 ),
65
66 'versionclasses' => array(
67 'safari',
68 ),
69 ),
70 ),
71 'Microsoft Edge for Windows 10 Mobile' => array(
72 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; DEVICE INFO) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Mobile Safari/537.36 Edge/12.10136',
73 array(
74 'is_edge' => true,
75 'check_edge_version' => array(
76 '12' => true,
77 ),
78
79 // Edge pretends to be WebKit.
80 'is_webkit' => true,
81
82 // Mobile Edge pretends to be Android.
83 'is_webkit_android' => true,
84 'check_webkit_android_version' => array(
85 '525' => true,
86 '527' => true,
87 ),
88
89 // Edge pretends to be Chrome.
90 // Note: Because Edge pretends to be Chrome, it will not be picked up as a Safari browser.
91 'is_chrome' => true,
92 'check_chrome_version' => array(
93 '7' => true,
94 '8' => true,
95 '10' => true,
96 '39' => true,
97 ),
98
99 'versionclasses' => array(
100 'safari',
101 'android',
102 ),
103
104 'devicetype' => 'mobile',
105 ),
106 ),
7c10ad33
AN
107 // Windows 98; Internet Explorer 5.0.
108 array(
109 'Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)',
110 array(
111 // MSIE 5.0 is not considered a browser at all: known false results.
112 'is_ie' => false,
113 'check_ie_version' => array(
114 '0' => true,
115 '5.0' => true,
116 ),
117 'versionclasses' => array(
118 // IE 5.0 is not considered a browser.
119 ),
120
121 // IE 5.0 is a legacy browser.
96a54631 122 'devicetype' => 'legacy',
7c10ad33
AN
123
124 'supports_svg' => false,
83af1329 125 'supports_json_contenttype' => false,
7c10ad33 126 ),
c3d2fbf9 127 ),
7c10ad33
AN
128
129 // Windows 2000; Internet Explorer 5.5.
130 array(
131 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)',
132 array(
133 'is_ie' => true,
134 'check_ie_version' => array(
135 '0' => true,
136 '5.0' => true,
137 '5.5' => true,
138 ),
139 'versionclasses' => array(
140 'ie',
141 ),
142
143 // IE 6.0 is a legacy browser.
96a54631 144 'devicetype' => 'legacy',
7c10ad33
AN
145
146 'supports_svg' => false,
83af1329 147 'supports_json_contenttype' => false,
7c10ad33 148 ),
c3d2fbf9 149 ),
7c10ad33
AN
150
151 // Windows XP SP2; Internet Explorer 6.0.
152 array(
153 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',
154 array(
155 'is_ie' => true,
156 'check_ie_version' => array(
157 '0' => true,
158 '5.0' => true,
159 '5.5' => true,
160 '6.0' => true,
161 ),
162 'versionclasses' => array(
163 'ie',
164 'ie6',
165 ),
166
167 // IE 7.0 is a legacy browser.
168 'devicetype' => 'legacy',
169
170 'supports_svg' => false,
83af1329 171 'supports_json_contenttype' => false,
7c10ad33 172 ),
c3d2fbf9 173 ),
7c10ad33
AN
174
175 // Windows XP SP2; Internet Explorer 7.0.
176 array(
177 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; YPC 3.0.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
178 array(
179 'is_ie' => true,
180 'check_ie_version' => array(
181 '0' => true,
182 '5.0' => true,
183 '5.5' => true,
184 '6.0' => true,
185 '7.0' => true,
186 ),
187 'versionclasses' => array(
188 'ie',
189 'ie7',
190 ),
191
192 'supports_svg' => false,
83af1329 193 'supports_json_contenttype' => false,
7c10ad33 194 ),
c3d2fbf9 195 ),
7c10ad33
AN
196
197 // Windows XP SP2; Internet Explorer 7.0; Meridio extension.
198 array(
199 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Meridio for Excel 5.0.251; Meridio for PowerPoint 5.0.251; Meridio for Word 5.0.251; Meridio Protocol; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)',
200 array(
201 'is_ie' => true,
202 'check_ie_version' => array(
203 '0' => true,
204 '5.0' => true,
205 '5.5' => true,
206 '6.0' => true,
207 '7.0' => true,
208 ),
209 'versionclasses' => array(
210 'ie',
211 'ie7',
212 ),
213
214 'supports_svg' => false,
83af1329 215 'supports_json_contenttype' => false,
7c10ad33 216 ),
d2fdad7c 217 ),
7c10ad33
AN
218
219 // Windows Vista; Internet Explorer 8.0.
220 array(
221 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)',
222 array(
223 'is_ie' => true,
224 'check_ie_version' => array(
225 '0' => true,
226 '5.0' => true,
227 '5.5' => true,
228 '6.0' => true,
229 '7.0' => true,
230 '8.0' => true,
231 ),
7c10ad33
AN
232 'versionclasses' => array(
233 'ie',
234 'ie8',
235 ),
236
237 'supports_svg' => false,
238 ),
c3d2fbf9 239 ),
7c10ad33
AN
240
241 // Windows 7; Internet Explorer 9.0.
242 array(
243 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',
244 array(
245 'is_ie' => true,
246 'check_ie_version' => array(
247 '0' => true,
248 '5.0' => true,
249 '5.5' => true,
250 '6.0' => true,
251 '7.0' => true,
252 '8.0' => true,
253 '9.0' => true,
254 ),
255 'versionclasses' => array(
256 'ie',
257 'ie9',
258 ),
259 ),
c3d2fbf9 260 ),
7c10ad33
AN
261
262 // Windows 7; Internet Explorer 9.0i.
263 array(
264 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)',
265 array(
266 'is_ie' => true,
267 'check_ie_version' => array(
268 '0' => true,
269 '5.0' => true,
270 '5.5' => true,
271 '6.0' => true,
272 '7.0' => true,
273 '8.0' => true,
274 '9.0' => true,
275 ),
276 'versionclasses' => array(
277 'ie',
278 'ie9',
279 ),
280 'iecompatibility' => true,
281
282 // IE 9 in Compatiblity mode does not support SVG.
283 'supports_svg' => false,
83af1329
AN
284
285 // IE in Compatiblity mode does not support JSON ContentType.
286 'supports_json_contenttype' => false,
7c10ad33 287 ),
c3d2fbf9 288 ),
7c10ad33
AN
289
290 // Windows 8; Internet Explorer 10.0.
291 array(
292 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0; Touch)',
293 array(
294 'is_ie' => true,
295 'check_ie_version' => array(
296 '0' => true,
297 '5.0' => true,
298 '5.5' => true,
299 '6.0' => true,
300 '7.0' => true,
301 '8.0' => true,
302 '9.0' => true,
303 '10' => true,
304 ),
305 'versionclasses' => array(
306 'ie',
307 'ie10',
308 ),
309 ),
c3d2fbf9 310 ),
c3d2fbf9 311
7c10ad33
AN
312 // Windows 8; Internet Explorer 10.0i.
313 array(
314 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Trident/6.0; Touch; .NET4.0E; .NET4.0C; Tablet PC 2.0)',
315 array(
316 'is_ie' => true,
317 'check_ie_version' => array(
318 '0' => true,
319 '5.0' => true,
320 '5.5' => true,
321 '6.0' => true,
322 '7.0' => true,
323 '8.0' => true,
324 '9.0' => true,
325 '10' => true,
326 ),
327 'iecompatibility' => true,
328 'versionclasses' => array(
329 'ie',
330 'ie10',
331 ),
83af1329
AN
332
333 // IE in Compatiblity mode does not support JSON ContentType.
334 'supports_json_contenttype' => false,
7c10ad33
AN
335 ),
336 ),
c3d2fbf9 337
7c10ad33
AN
338 // Windows 8.1; Internet Explorer 11.0.
339 array(
340 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0)',
341 array(
342 'is_ie' => true,
343 'check_ie_version' => array(
344 '0' => true,
345 '5.0' => true,
346 '5.5' => true,
347 '6.0' => true,
348 '7.0' => true,
349 '8.0' => true,
350 '9.0' => true,
351 '10' => true,
352 '11' => true,
353 ),
354 'versionclasses' => array(
355 'ie',
356 'ie11',
357 ),
358 ),
359 ),
c3d2fbf9 360
7c10ad33
AN
361 // Windows 8.1; Internet Explorer 11.0i.
362 array(
363 ' Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C)',
364 array(
365 'is_ie' => true,
366 'check_ie_version' => array(
367 '0' => true,
368 '5.0' => true,
369 '5.5' => true,
370 '6.0' => true,
371 '7.0' => true,
372 '8.0' => true,
373 '9.0' => true,
374 '10' => true,
375 '11' => true,
376 ),
377 'iecompatibility' => true,
378 'versionclasses' => array(
379 'ie',
380 'ie11',
381 ),
83af1329
AN
382
383 // IE in Compatiblity mode does not support JSON ContentType.
384 'supports_json_contenttype' => false,
7c10ad33
AN
385 ),
386 ),
387
388 // Windows XP; Firefox 1.0.6.
389 array(
390 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.10) Gecko/20050716 Firefox/1.0.6',
391 array(
392 'is_firefox' => true,
393
394 'is_gecko' => true,
395 'check_gecko_version' => array(
396 '1' => true,
397 ),
398
399 'versionclasses' => array(
400 'gecko',
401 'gecko17',
402 ),
403 ),
404 ),
405
406 // Windows XP; Firefox 1.0.6.
407 array(
408 'Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8) Gecko/20051107 Firefox/1.5',
409 array(
410 'is_firefox' => true,
411 'check_firefox_version' => array(
412 '1.5' => true,
413 ),
414
415 'is_gecko' => true,
416 'check_gecko_version' => array(
417 '1' => true,
418 '20030516' => true,
419 '20051116' => true,
420 ),
421
422 'versionclasses' => array(
423 'gecko',
424 'gecko18',
425 ),
426 ),
427 ),
428
429 // Windows XP; Firefox 1.5.0.1.
430 array(
431 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1',
432 array(
433 'is_firefox' => true,
434 'check_firefox_version' => array(
435 '1.5' => true,
436 ),
437
438 'is_gecko' => true,
439 'check_gecko_version' => array(
440 '1' => true,
441 '20030516' => true,
442 '20051116' => true,
443 ),
444
445 'versionclasses' => array(
446 'gecko',
447 'gecko18',
448 ),
449 ),
450 ),
451
452 // Windows XP; Firefox 2.0.
453 array(
454 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1',
455 array(
456 'is_firefox' => true,
457 'check_firefox_version' => array(
458 '1.5' => true,
459 ),
460
461 'is_gecko' => true,
462 'check_gecko_version' => array(
463 '1' => true,
464 '2' => true,
465 '20030516' => true,
466 '20051116' => true,
467 '2006010100' => true,
468 ),
469
470 'versionclasses' => array(
471 'gecko',
472 'gecko18',
473 ),
474 ),
475 ),
476
477 // Ubuntu Linux amd64; Firefox 2.0.
478 array(
479 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20060601 Firefox/2.0 (Ubuntu-edgy)',
480 array(
481 'is_firefox' => true,
482 'check_firefox_version' => array(
483 '1.5' => true,
484 ),
485
486 'is_gecko' => true,
487 'check_gecko_version' => array(
488 '1' => true,
489 '2' => true,
490 '20030516' => true,
491 '20051116' => true,
492 '2006010100' => true,
493 ),
494
495 'versionclasses' => array(
496 'gecko',
497 'gecko18',
498 ),
499 ),
500 ),
501
502 // SUSE; Firefox 3.0.6.
503 array(
504 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.6) Gecko/2009012700 SUSE/3.0.6-1.4 Firefox/3.0.6',
505 array(
506 'is_firefox' => true,
507 'check_firefox_version' => array(
508 '1.5' => true,
509 '3.0' => true,
510 ),
511
512 'is_gecko' => true,
513 'check_gecko_version' => array(
514 '1' => true,
515 '2' => true,
516 '20030516' => true,
517 '20051116' => true,
518 '2006010100' => true,
519 ),
520
521 'versionclasses' => array(
522 'gecko',
523 'gecko19',
524 ),
525 ),
526 ),
527
528 // Linux i686; Firefox 3.6.
529 array(
530 'Mozilla/5.0 (X11; Linux i686; rv:2.0) Gecko/20100101 Firefox/3.6',
531 array(
532 'is_firefox' => true,
533 'check_firefox_version' => array(
534 '1.5' => true,
535 '3.0' => true,
536 ),
537
538 'is_gecko' => true,
539 'check_gecko_version' => array(
540 '1' => true,
541 '2' => true,
542 '20030516' => true,
543 '20051116' => true,
544 '2006010100' => true,
545 '3.6' => true,
5ee4f581 546 '20100101' => true,
7c10ad33
AN
547 ),
548
549 'versionclasses' => array(
550 'gecko',
551 'gecko20',
552 ),
553 ),
554 ),
555
556 // Windows; Firefox 11.0.
557 array(
558 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko Firefox/11.0',
559 array(
560 'is_firefox' => true,
561 'check_firefox_version' => array(
562 '1.5' => true,
563 '3.0' => true,
564 '4' => true,
565 '10' => true,
566 ),
567
568 'is_gecko' => true,
569 'check_gecko_version' => array(
570 '1' => true,
571 '2' => true,
572 '20030516' => true,
573 '20051116' => true,
574 '2006010100' => true,
5ee4f581 575 '20100101' => true,
7c10ad33
AN
576 '3.6' => true,
577 '4.0' => true,
578 ),
579
580 'versionclasses' => array(
581 'gecko',
582 ),
583 ),
584 ),
585
586 // Windows; Firefox 15.0a2.
587 array(
588 'Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/15.0a2',
589 array(
590 'is_firefox' => true,
591 'check_firefox_version' => array(
592 '1.5' => true,
593 '3.0' => true,
594 '4' => true,
595 '10' => true,
596 '15' => true,
597 ),
598
599 'is_gecko' => true,
600 'check_gecko_version' => array(
601 '1' => true,
602 '2' => true,
603 '20030516' => true,
604 '20051116' => true,
605 '2006010100' => true,
5ee4f581 606 '20100101' => true,
7c10ad33
AN
607 '3.6' => true,
608 '4.0' => true,
609 '15.0' => true,
610 ),
611
612 'versionclasses' => array(
613 'gecko',
614 ),
615 ),
616 ),
617
618 // Firefox 18; Mac OS X 10.
619 array(
620 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:18.0) Gecko/18.0 Firefox/18.0',
621 array(
622 'is_firefox' => true,
623 'check_firefox_version' => array(
624 '1.5' => true,
625 '3.0' => true,
626 '4' => true,
627 '10' => true,
628 '15' => true,
629 '18' => true,
630 ),
631
632 'is_gecko' => true,
633 'check_gecko_version' => array(
634 '1' => true,
635 '2' => true,
636 '20030516' => true,
637 '20051116' => true,
638 '2006010100' => true,
639 '3.6' => true,
640 '4.0' => true,
641 '15.0' => true,
642 '18.0' => true,
5ee4f581
AN
643 '20100101' => true,
644 ),
645
646 'versionclasses' => array(
647 'gecko',
648 ),
649 ),
650 ),
651
652 // Firefox 33; Mac OS X 10.10.
653 array(
654 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:33.0) Gecko/20100101 Firefox/33.0',
655 array(
656 'is_firefox' => true,
657 'check_firefox_version' => array(
658 '1.5' => true,
659 '3.0' => true,
660 '4' => true,
661 '10' => true,
662 '15' => true,
663 '18' => true,
664 '19' => true,
665 '33' => true,
666 ),
667
668 'is_gecko' => true,
669 'check_gecko_version' => array(
670 '1' => true,
671 '2' => true,
672 '20030516' => true,
673 '20051116' => true,
674 '2006010100' => true,
675 '3.6' => true,
676 '4.0' => true,
677 '15.0' => true,
678 '18.0' => true,
679 '19.0' => true,
680 '20100101' => true,
7c10ad33
AN
681 ),
682
683 'versionclasses' => array(
684 'gecko',
685 ),
686 ),
687 ),
688
689 // SeaMonkey 2.0; Windows.
690 array(
691 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1b3pre) Gecko/20081208 SeaMonkey/2.0',
692 array(
693 'is_gecko' => true,
694 'check_gecko_version' => array(
695 '1' => true,
696 '2' => true,
697 '20030516' => true,
698 '20051106' => true,
699 '20051116' => true,
700 '2006010100' => true,
701 ),
702
703 'versionclasses' => array(
704 'gecko',
705 'gecko19',
706 ),
707 ),
708 ),
709
710 // SeaMonkey 2.1; Linux.
711 array(
712 'Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20110609 Firefox/4.0.1 SeaMonkey/2.1',
713 array(
714 'is_gecko' => true,
715 'check_gecko_version' => array(
716 '1' => true,
717 '2' => true,
718 '20030516' => true,
719 '20051116' => true,
720 '2006010100' => true,
5ee4f581 721 '20100101' => true,
7c10ad33
AN
722 '3.6' => true,
723 '4.0' => true,
724 ),
725
726 'is_firefox' => true,
727 'check_firefox_version' => array(
728 '1.5' => true,
729 '3.0' => true,
730 '4' => true,
731 ),
732
733 'versionclasses' => array(
734 'gecko',
735 'gecko20',
736 ),
737 ),
738 ),
739
740 // SeaMonkey 2.3; FreeBSD.
741 array(
742 'Mozilla/5.0 (X11; FreeBSD amd64; rv:6.0) Gecko/20110818 Firefox/6.0 SeaMonkey/2.3',
743 array(
744 'is_gecko' => true,
745 'check_gecko_version' => array(
746 '1' => true,
747 '2' => true,
748 '20030516' => true,
749 '20051116' => true,
750 '2006010100' => true,
5ee4f581 751 '20100101' => true,
7c10ad33
AN
752 '3.6' => true,
753 '4.0' => true,
754 ),
755
756 'is_firefox' => true,
757 'check_firefox_version' => array(
758 '1.5' => true,
759 '3.0' => true,
760 '4' => true,
761 ),
762
763 'versionclasses' => array(
764 'gecko',
765 ),
766 ),
767 ),
768
769 // Windows 7; MS Word 2010.
770 array(
771 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; ms-office)',
772 array(
773 'is_ie' => true,
774 'check_ie_version' => array(
775 '0' => true,
776 '5.0' => true,
777 '5.5' => true,
778 '6.0' => true,
779 '7.0' => true,
780 '8.0' => true,
781 ),
782 'iecompatibility' => true,
783 'versionclasses' => array(
784 'ie',
785 'ie8',
786 ),
787
788 'is_msword' => true,
789
790 'supports_svg' => false,
83af1329 791 'supports_json_contenttype' => false,
7c10ad33
AN
792 ),
793 ),
794
795 // Windows 7; MS Outlook 2010.
796 array(
797 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; Microsoft Outlook 14.0.7113; ms-office; MSOffice 14)',
798 array(
799 'is_ie' => true,
800 'check_ie_version' => array(
801 '0' => true,
802 '5.0' => true,
803 '5.5' => true,
804 '6.0' => true,
805 '7.0' => true,
806 '8.0' => true,
807 ),
808 'iecompatibility' => true,
809 'versionclasses' => array(
810 'ie',
811 'ie8',
812 ),
813
814 // Note: Outlook is deliberately not considered to be MS Word.
815 'is_msword' => false,
816
817 'supports_svg' => false,
83af1329 818 'supports_json_contenttype' => false,
7c10ad33
AN
819 ),
820 ),
821
822 // Mac OS X; MS Word 14.
823 array(
824 'Mozilla/5.0 (Macintosh; Intel Mac OS X) Word/14.38.0',
825 array(
826 'versionclasses' => array(
827 ),
828
829 'is_msword' => true,
830 ),
831 ),
832
833 // Safari 312; Max OS X.
834 array(
835 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312',
836 array(
837 'is_safari' => true,
838 'check_safari_version' => array(
839 '1' => true,
840 '312' => true,
841 ),
842
843 'is_webkit' => true,
844
845 'versionclasses' => array(
846 'safari',
847 ),
848 ),
849 ),
850
851 // Safari 412; Max OS X.
852 array(
853 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412 (KHTML, like Gecko) Safari/412',
854 array(
855 'is_safari' => true,
856 'check_safari_version' => array(
857 '1' => true,
858 '312' => true,
859 ),
860
861 'is_webkit' => true,
862
863 'versionclasses' => array(
864 'safari',
865 ),
866 ),
867 ),
657a94fc 868
7c10ad33
AN
869 // Safari 2.0; Max OS X.
870 array(
871 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412 (KHTML, like Gecko) Safari/412',
872 array(
873 'is_safari' => true,
874 'check_safari_version' => array(
875 '1' => true,
876 '312' => true,
877 ),
878
879 'is_webkit' => true,
880
881 'versionclasses' => array(
882 'safari',
883 ),
884 ),
885 ),
657a94fc 886
7c10ad33
AN
887 // iOS Safari 528; iPhone.
888 array(
889 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_2 like Mac OS X; cs-cz) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7D11 Safari/528.16',
890 array(
891 // Note: We do *not* identify mobile Safari as Safari.
892 'is_safari_ios' => true,
893 'check_safari_ios_version' => array(
894 '527' => true,
895 ),
896
897 'is_webkit' => true,
898
899 'versionclasses' => array(
900 'safari',
901 'ios',
902 ),
903
904 'devicetype' => 'mobile',
905 ),
906 ),
657a94fc 907
5ee4f581
AN
908 // Safari; iPhone 6 Plus; iOS 8.1; Build 12B411.
909 array(
910 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_10 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B411 Safari/600.1.4',
911 array(
912 // Note: We do *not* identify mobile Safari as Safari.
913 'is_safari_ios' => true,
914 'check_safari_ios_version' => array(
915 '527' => true,
916 '590' => true,
917 '600' => true,
918 ),
919
920 'is_webkit' => true,
921
922 'versionclasses' => array(
923 'safari',
924 'ios',
925 ),
926
927 'devicetype' => 'mobile',
928 ),
929 ),
930
7c10ad33
AN
931 // iOS Safari 533; iPad.
932 array(
933 'Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5',
934 array(
935 // Note: We do *not* identify mobile Safari as Safari.
936 'is_safari_ios' => true,
937 'check_safari_ios_version' => array(
938 '527' => true,
939 ),
940
941 'is_webkit' => true,
942
943 'versionclasses' => array(
944 'safari',
945 'ios',
946 ),
947
948 'devicetype' => 'tablet',
949 ),
950 ),
657a94fc 951
7c10ad33
AN
952 // Android WebKit 525; G1 Phone.
953 array(
954 'Mozilla/5.0 (Linux; U; Android 1.1; en-gb; dream) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2 – G1 Phone',
955 array(
956 'is_webkit_android' => true,
957 'check_webkit_android_version' => array(
958 '525' => true,
959 ),
657a94fc 960
7c10ad33 961 'is_webkit' => true,
657a94fc 962
7c10ad33
AN
963 'versionclasses' => array(
964 'android',
965 'safari',
966 ),
657a94fc 967
7c10ad33 968 'devicetype' => 'mobile',
657a94fc 969
7c10ad33
AN
970 'supports_svg' => false,
971 ),
972 ),
657a94fc 973
7c10ad33
AN
974 // Android WebKit 530; Nexus.
975 array(
976 'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17 –Nexus',
977 array(
978 'is_webkit_android' => true,
979 'check_webkit_android_version' => array(
980 '525' => true,
981 '527' => true,
982 ),
657a94fc 983
7c10ad33 984 'is_webkit' => true,
657a94fc 985
7c10ad33
AN
986 'versionclasses' => array(
987 'android',
988 'safari',
989 ),
657a94fc 990
7c10ad33 991 'devicetype' => 'mobile',
657a94fc 992
7c10ad33
AN
993 'supports_svg' => false,
994 ),
995 ),
657a94fc 996
7c10ad33
AN
997 // Android WebKit 537; Samsung GT-9505.
998 array(
999 'Mozilla/5.0 (Linux; Android 4.3; it-it; SAMSUNG GT-I9505/I9505XXUEMJ7 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36',
1000 array(
1001 'is_webkit_android' => true,
1002 'check_webkit_android_version' => array(
1003 '525' => true,
1004 '527' => true,
1005 ),
1006
1007 'is_webkit' => true,
1008
1009 'is_chrome' => true,
1010 'check_chrome_version' => array(
1011 '7' => true,
1012 '8' => true,
1013 '10' => true,
1014 ),
1015
1016 'versionclasses' => array(
1017 'safari',
1018 'android',
1019 ),
1020
1021 'devicetype' => 'mobile',
1022 ),
1023 ),
1024
1025 // Android WebKit 537; Nexus 5.
1026 array(
1027 'Mozilla/5.0 (Linux; Android 5.0; Nexus 5 Build/LPX13D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36',
1028 array(
1029 'is_webkit_android' => true,
1030 'check_webkit_android_version' => array(
1031 '525' => true,
1032 '527' => true,
1033 ),
1034
1035 'is_webkit' => true,
1036
1037 'is_chrome' => true,
1038 'check_chrome_version' => array(
1039 '7' => true,
1040 '8' => true,
1041 '10' => true,
1042 ),
1043
1044 'versionclasses' => array(
1045 'safari',
1046 'android',
1047 ),
1048
1049 'devicetype' => 'mobile',
1050 ),
1051 ),
1052
1053 // Chrome 8; Mac OS X.
1054 array(
1055 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10',
1056 array(
1057 'is_chrome' => true,
1058 'check_chrome_version' => array(
1059 '7' => true,
1060 '8' => true,
1061 ),
1062
1063 'is_webkit' => true,
1064
1065 'versionclasses' => array(
1066 'safari',
1067 ),
1068 ),
1069 ),
1070
5ee4f581
AN
1071 // Chrome 39; Mac OS X.
1072 array(
1073 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
1074 array(
1075 'is_chrome' => true,
1076 'check_chrome_version' => array(
1077 '7' => true,
1078 '8' => true,
1079 '10' => true,
1080 '39' => true,
1081 ),
1082
1083 'is_webkit' => true,
1084
1085 'versionclasses' => array(
1086 'safari',
1087 ),
1088 ),
1089 ),
1090
7c10ad33
AN
1091 // Opera 8.51; Windows XP.
1092 array(
1093 'Opera/8.51 (Windows NT 5.1; U; en)',
1094 array(
1095 'is_opera' => true,
1096 'check_opera_version' => array(
1097 '8.0' => true,
1098 ),
1099
1100 'versionclasses' => array(
1101 'opera',
1102 ),
1103
1104 'supports_svg' => false,
1105 ),
1106 ),
657a94fc 1107
7c10ad33
AN
1108 // Opera 9.0; Windows XP.
1109 array(
1110 'Opera/9.0 (Windows NT 5.1; U; en)',
1111 array(
1112 'is_opera' => true,
1113 'check_opera_version' => array(
1114 '8.0' => true,
5ee4f581
AN
1115 '9.0' => true,
1116 ),
1117
1118 'versionclasses' => array(
1119 'opera',
1120 ),
1121
1122 'supports_svg' => false,
1123 ),
1124 ),
1125
1126 // Opera 12.15 (Build 1748); Mac OS X.
1127 array(
1128 'Opera/9.80 (Macintosh; Intel Mac OS X 10.10.0; Edition MAS) Presto/2.12.388 Version/12.15',
1129 array(
1130 'is_opera' => true,
1131 'check_opera_version' => array(
1132 '8.0' => true,
1133 '9.0' => true,
1134 '10.0' => true,
1135 '12.15' => true,
7c10ad33
AN
1136 ),
1137
1138 'versionclasses' => array(
1139 'opera',
1140 ),
1141
1142 'supports_svg' => false,
1143 ),
1144 ),
657a94fc 1145
7c10ad33
AN
1146 // Opera 9.0; Debian Linux.
1147 array(
1148 'Opera/9.01 (X11; Linux i686; U; en)',
1149 array(
1150 'is_opera' => true,
1151 'check_opera_version' => array(
1152 '8.0' => true,
5ee4f581 1153 '9.0' => true,
7c10ad33
AN
1154 ),
1155
1156 'versionclasses' => array(
1157 'opera',
1158 ),
1159
1160 'supports_svg' => false,
1161 ),
1162 ),
34c6ec18
AN
1163
1164 // Google web crawlers.
1165 array(
1166 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
1167 array(
1168 'is_web_crawler' => true,
1169 'versionclasses' => array(
1170 ),
1171 ),
1172 ),
1173 array(
1174 'Googlebot/2.1 (+http://www.googlebot.com/bot.html)',
1175 array(
1176 'is_web_crawler' => true,
1177 'versionclasses' => array(
1178 ),
1179 ),
1180 ),
1181 array(
1182 'Googlebot-Image/1.0',
1183 array(
1184 'is_web_crawler' => true,
1185 'versionclasses' => array(
1186 ),
1187 ),
1188 ),
1189
1190 // Yahoo crawlers.
1191 // See https://help.yahoo.com/kb/slurp-crawling-page-sln22600.html.
1192 array(
1193 'Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)',
1194 array(
1195 'is_web_crawler' => true,
1196 'versionclasses' => array(
1197 ),
1198 ),
1199 ),
1200
1201 // Bing / MSN / AdIdx crawlers.
1202 // See http://www.bing.com/webmaster/help/which-crawlers-does-bing-use-8c184ec0.
1203 array(
1204 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)',
1205 array(
1206 'is_web_crawler' => true,
1207 'versionclasses' => array(
1208 ),
1209 ),
1210 ),
1211 array(
1212 'Mozilla/5.0 (compatible; bingbot/2.0 +http://www.bing.com/bingbot.htm)',
1213 array(
1214 'is_web_crawler' => true,
1215 'versionclasses' => array(
1216 ),
1217 ),
1218 ),
1219 array(
1220 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)',
1221 array(
1222 'is_web_crawler' => true,
1223 'is_webkit' => true,
1224 'is_safari_ios' => true,
1225 'check_safari_ios_version' => array(
1226 '527' => true,
1227 ),
1228
1229 'versionclasses' => array(
1230 'safari',
1231 'ios',
1232 ),
1233
1234 'devicetype' => 'mobile',
1235 ),
1236 ),
1237 array(
1238 'Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 530) like Gecko (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)',
1239 array(
1240 'is_web_crawler' => true,
1241 'is_ie' => true,
1242 'check_ie_version' => array(
1243 '0' => true,
1244 '5.0' => true,
1245 '5.5' => true,
1246 '6.0' => true,
1247 '7.0' => true,
1248 '8.0' => true,
1249 '9.0' => true,
1250 '10' => true,
1251 '11' => true,
1252 ),
1253 'versionclasses' => array(
1254 'ie',
1255 'ie11',
1256 ),
1257 'devicetype' => 'mobile',
1258 ),
1259 ),
1260
1261 array(
1262 'msnbot/2.0b (+http://search.msn.com/msnbot.htm)',
1263 array(
1264 'is_web_crawler' => true,
1265 'versionclasses' => array(
1266 ),
1267 ),
1268 ),
1269 array(
1270 'msnbot/2.1',
1271 array(
1272 'is_web_crawler' => true,
1273 'versionclasses' => array(
1274 ),
1275 ),
1276 ),
1277 array(
1278 'msnbot-media/1.1 (+http://search.msn.com/msnbot.htm)',
1279 array(
1280 'is_web_crawler' => true,
1281 'versionclasses' => array(
1282 ),
1283 ),
1284 ),
1285 array(
1286 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) BingPreview/1.0b',
1287 array(
1288 'is_web_crawler' => true,
1289 'is_webkit' => true,
1290 'is_safari' => true,
1291 'check_safari_version' => array(
1292 '1' => true,
1293 '312' => true,
1294 '500' => true,
1295 ),
1296
1297 'versionclasses' => array(
1298 'safari',
1299 ),
1300 ),
1301 ),
1302 array(
1303 'Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 530) like Gecko BingPreview/1.0b',
1304 array(
1305 'is_web_crawler' => true,
1306 'is_ie' => true,
1307 'check_ie_version' => array(
1308 '0' => true,
1309 '5.0' => true,
1310 '5.5' => true,
1311 '6.0' => true,
1312 '7.0' => true,
1313 '8.0' => true,
1314 '9.0' => true,
1315 '10' => true,
1316 '11' => true,
1317 ),
1318 'versionclasses' => array(
1319 'ie',
1320 'ie11',
1321 ),
1322 'devicetype' => 'mobile',
1323 ),
1324 ),
1325
1326 // Yandex.
1327 // See http://help.yandex.com/search/robots/agent.xml.
1328 array(
1329 'Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)',
1330 array(
1331 'is_web_crawler' => true,
1332 'versionclasses' => array(
1333 ),
1334 ),
1335 ),
1336 array(
1337 'Mozilla/5.0 (compatible; YandexImages/3.0; +http://yandex.com/bots)',
1338 array(
1339 'is_web_crawler' => true,
1340 'versionclasses' => array(
1341 ),
1342 ),
1343 ),
1344
1345 // AltaVista.
1346 array(
1347 'AltaVista V2.0B crawler@evreka.com',
1348 array(
1349 'is_web_crawler' => true,
1350 'versionclasses' => array(
1351 ),
1352 ),
1353 ),
1354
1355 // ZoomSpider.
1356 array(
1357 'ZoomSpider - wrensoft.com [ZSEBOT]',
1358 array(
1359 'is_web_crawler' => true,
1360 'versionclasses' => array(
1361 ),
1362 ),
1363 ),
1364
1365 // Baidu.
1366 array(
1367 'Baiduspider+(+http://www.baidu.com/search/spider_jp.html)',
1368 array(
1369 'is_web_crawler' => true,
1370 'versionclasses' => array(
1371 ),
1372 ),
1373 ),
1374 array(
1375 'Baiduspider+(+http://www.baidu.com/search/spider.htm)',
1376 array(
1377 'is_web_crawler' => true,
1378 'versionclasses' => array(
1379 ),
1380 ),
1381 ),
1382
1383 // Ask.com.
1384 array(
1385 'User-Agent: Mozilla/2.0 (compatible; Ask Jeeves/Teoma)',
1386 array(
1387 'is_web_crawler' => true,
1388 'versionclasses' => array(
1389 ),
1390 ),
1391 ),
7c10ad33 1392 );
657a94fc
MS
1393 }
1394
c3d2fbf9 1395 /**
7c10ad33 1396 * Test instance generation.
c3d2fbf9 1397 */
7c10ad33
AN
1398 public function test_instance() {
1399 $this->assertInstanceOf('core_useragent', core_useragent::instance());
1400 $this->assertInstanceOf('core_useragent', core_useragent::instance(true));
1401 }
c3d2fbf9 1402
39a731ef
AN
1403 /**
1404 * @dataProvider user_agents_providers
1405 */
1406 public function test_useragent_edge($useragent, $tests) {
1407 // Setup the core_useragent instance.
1408 core_useragent::instance(true, $useragent);
1409
1410 // Edge Tests.
1411 if (isset($tests['is_edge']) && $tests['is_edge']) {
1412 $this->assertTrue(core_useragent::is_edge());
1413 } else {
1414 $this->assertFalse(core_useragent::is_edge());
1415 }
1416
1417 $versions = array(
1418 // New versions of should be added here.
1419 '12' => false,
1420 );
1421
1422 if (isset($tests['check_edge_version'])) {
1423 // The test provider has overwritten some of the above checks.
1424 // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1425 $versions = $tests['check_edge_version'] + $versions;
1426 }
1427
1428 foreach ($versions as $version => $result) {
1429 $this->assertEquals($result, core_useragent::check_edge_version($version),
1430 "Version incorrectly determined for Edge version '{$version}'");
1431 }
1432 }
1433
7c10ad33
AN
1434 /**
1435 * @dataProvider user_agents_providers
1436 */
1437 public function test_useragent_ie($useragent, $tests) {
1438 // Setup the core_useragent instance.
1439 core_useragent::instance(true, $useragent);
1440
1441 // IE Tests.
1442 if (isset($tests['is_ie']) && $tests['is_ie']) {
1443 $this->assertTrue(core_useragent::is_ie());
1444 } else {
1445 $this->assertFalse(core_useragent::is_ie());
1446 }
1447
1448 $versions = array(
1449 // New versions of should be added here.
1450 '0' => false,
1451 '5.0' => false,
1452 '5.5' => false,
1453 '6.0' => false,
1454 '7.0' => false,
1455 '8.0' => false,
1456 '9.0' => false,
1457 '10' => false,
1458 '11' => false,
1459 '12' => false,
1460 '13' => false,
1461 '14' => false,
1462 );
1463
1464 if (isset($tests['check_ie_version'])) {
1465 // The test provider has overwritten some of the above checks.
1466 // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1467 $versions = $tests['check_ie_version'] + $versions;
1468 }
1469
1470 foreach ($versions as $version => $result) {
1471 $this->assertEquals($result, core_useragent::check_ie_version($version),
1472 "Version incorrectly determined for IE version '{$version}'");
1473 }
1474
1475 // IE Compatibility mode.
1476 if (isset($tests['iecompatibility']) && $tests['iecompatibility']) {
1477 $this->assertTrue(core_useragent::check_ie_compatibility_view(), "IE Compability false negative");
1478 } else {
1479 $this->assertFalse(core_useragent::check_ie_compatibility_view(), "IE Compability false positive");
1480 }
c3d2fbf9 1481
7c10ad33 1482 }
c3d2fbf9 1483
7c10ad33
AN
1484 /**
1485 * @dataProvider user_agents_providers
1486 */
1487 public function test_useragent_msword($useragent, $tests) {
1488 // Setup the core_useragent instance.
1489 core_useragent::instance(true, $useragent);
1490
1491 // MSWord Tests.
1492 if (isset($tests['is_msword']) && $tests['is_msword']) {
1493 $this->assertTrue(core_useragent::is_msword());
1494 } else {
1495 $this->assertFalse(core_useragent::is_msword());
1496 }
1497 }
c3d2fbf9 1498
c3d2fbf9 1499
7c10ad33
AN
1500 /**
1501 * @dataProvider user_agents_providers
1502 */
1503 public function test_useragent_supports($useragent, $tests) {
1504 // Setup the core_useragent instance.
1505 core_useragent::instance(true, $useragent);
1506
1507 // Supports SVG.
1508 if (!isset($tests['supports_svg']) || $tests['supports_svg']) {
1509 $this->assertTrue(core_useragent::supports_svg(),
1510 "SVG Support was not reported (and should have been)");
1511 } else {
1512 $this->assertFalse(core_useragent::supports_svg(),
1513 "SVG Support was reported (and should not have been)");
1514 }
83af1329
AN
1515
1516 // Supports JSON ContentType.
1517 if (!isset($tests['supports_json_contenttype']) || $tests['supports_json_contenttype']) {
1518 $this->assertTrue(core_useragent::supports_json_contenttype(),
1519 "JSON ContentType Support was not reported (and should have been)");
1520 } else {
1521 $this->assertFalse(core_useragent::supports_json_contenttype(),
1522 "JSON ContentType Support was reported (and should not have been)");
1523 }
7c10ad33 1524 }
c3d2fbf9 1525
7c10ad33
AN
1526 /**
1527 * @dataProvider user_agents_providers
1528 */
1529 public function test_useragent_webkit($useragent, $tests) {
1530 // Setup the core_useragent instance.
1531 core_useragent::instance(true, $useragent);
1532
1533 if (isset($tests['is_webkit']) && $tests['is_webkit']) {
1534 $this->assertTrue(core_useragent::is_webkit(),
1535 "Browser was not identified as a webkit browser");
1536 $this->assertTrue(core_useragent::check_webkit_version());
1537 } else {
1538 $this->assertFalse(core_useragent::is_webkit(),
1539 "Browser was incorrectly identified as a webkit browser");
1540 $this->assertFalse(core_useragent::check_webkit_version());
1541 }
1542
1543 $versions = array(
1544 // New versions should be added here.
1545 );
1546
1547 if (isset($tests['check_webkit_version'])) {
1548 // The test provider has overwritten some of the above checks.
1549 // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1550 $versions = $tests['check_webkit_version'] + $versions;
1551 }
1552
1553 foreach ($versions as $version => $result) {
1554 $this->assertEquals($result, core_useragent::check_webkit_version($version),
1555 "Version incorrectly determined for Webkit version '{$version}'");
1556 }
1557 }
c3d2fbf9 1558
7c10ad33
AN
1559 /**
1560 * @dataProvider user_agents_providers
1561 */
1562 public function test_useragent_webkit_android($useragent, $tests) {
1563 // Setup the core_useragent instance.
1564 core_useragent::instance(true, $useragent);
1565
1566 if (isset($tests['is_webkit_android']) && $tests['is_webkit_android']) {
1567 $this->assertTrue(core_useragent::is_webkit_android(),
1568 "Browser was not identified as an Android webkit browser");
1569 $this->assertTrue(core_useragent::check_webkit_android_version());
1570 } else {
1571 $this->assertFalse(core_useragent::is_webkit_android(),
1572 "Browser was incorrectly identified as an Android webkit browser");
1573 $this->assertFalse(core_useragent::check_webkit_android_version());
1574 }
1575
1576 $versions = array(
1577 // New versions should be added here.
1578 '525' => false,
1579 '527' => false,
1580 '590' => false,
1581 );
1582
1583 if (isset($tests['check_webkit_android_version'])) {
1584 // The test provider has overwritten some of the above checks.
1585 // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1586 $versions = $tests['check_webkit_android_version'] + $versions;
1587 }
1588
1589 foreach ($versions as $version => $result) {
1590 $this->assertEquals($result, core_useragent::check_webkit_android_version($version),
1591 "Version incorrectly determined for Android webkit version '{$version}'");
1592 }
1593 }
c3d2fbf9 1594
7c10ad33
AN
1595 /**
1596 * @dataProvider user_agents_providers
1597 */
1598 public function test_useragent_chrome($useragent, $tests) {
1599 // Setup the core_useragent instance.
1600 core_useragent::instance(true, $useragent);
1601
1602 if (isset($tests['is_chrome']) && $tests['is_chrome']) {
1603 $this->assertTrue(core_useragent::is_chrome(),
1604 "Browser was not identified as a chrome browser");
1605 $this->assertTrue(core_useragent::check_chrome_version());
1606 } else {
1607 $this->assertFalse(core_useragent::is_chrome(),
1608 "Browser was incorrectly identified as a chrome browser");
1609 $this->assertFalse(core_useragent::check_chrome_version());
1610 }
1611
1612 $versions = array(
1613 // New versions should be added here.
1614 '7' => false,
1615 '8' => false,
1616 '10' => false,
5ee4f581 1617 '39' => false,
7c10ad33
AN
1618 );
1619
1620 if (isset($tests['check_chrome_version'])) {
1621 // The test provider has overwritten some of the above checks.
1622 // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1623 $versions = $tests['check_chrome_version'] + $versions;
1624 }
1625
1626 foreach ($versions as $version => $result) {
1627 $this->assertEquals($result, core_useragent::check_chrome_version($version),
1628 "Version incorrectly determined for Chrome version '{$version}'");
1629 }
1630 }
c3d2fbf9 1631
7c10ad33
AN
1632 /**
1633 * @dataProvider user_agents_providers
1634 */
1635 public function test_useragent_safari($useragent, $tests) {
1636 // Setup the core_useragent instance.
1637 core_useragent::instance(true, $useragent);
1638
1639 if (isset($tests['is_safari']) && $tests['is_safari']) {
1640 $this->assertTrue(core_useragent::is_safari(),
1641 "Browser was not identified as a safari browser");
1642 $this->assertTrue(core_useragent::check_safari_version());
1643 } else {
1644 $this->assertFalse(core_useragent::is_safari(),
1645 "Browser was incorrectly identified as a safari browser");
1646 $this->assertFalse(core_useragent::check_safari_version());
1647 }
1648
1649 // Check Safari (generic).
1650 $versions = array(
1651 // New versions should be added here.
1652 '1' => false,
1653 '312' => false,
1654 '500' => false,
1655 );
1656
1657 if (isset($tests['check_safari_version'])) {
1658 // The test provider has overwritten some of the above checks.
1659 // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1660 $versions = $tests['check_safari_version'] + $versions;
1661 }
1662
1663 foreach ($versions as $version => $result) {
1664 $this->assertEquals($result, core_useragent::check_safari_version($version),
1665 "Version incorrectly determined for Safari (generic) version '{$version}'");
1666 }
1667 }
c3d2fbf9 1668
7c10ad33
AN
1669 /**
1670 * @dataProvider user_agents_providers
1671 */
1672 public function test_useragent_ios_safari($useragent, $tests) {
1673 // Setup the core_useragent instance.
1674 core_useragent::instance(true, $useragent);
1675
1676 if (isset($tests['is_safari_ios']) && $tests['is_safari_ios']) {
1677 $this->assertTrue(core_useragent::is_safari_ios(),
1678 "Browser was not identified as an iOS safari browser");
1679 $this->assertTrue(core_useragent::check_safari_ios_version());
1680 } else {
1681 $this->assertFalse(core_useragent::is_safari_ios(),
1682 "Browser was incorrectly identified as an iOS safari browser");
1683 $this->assertFalse(core_useragent::check_safari_ios_version());
1684 }
1685
1686 // Check iOS Safari.
1687 $versions = array(
1688 // New versions should be added here.
1689 '527' => false,
1690 '590' => false,
5ee4f581 1691 '600' => false,
7c10ad33
AN
1692 );
1693
1694 if (isset($tests['check_safari_ios_version'])) {
1695 // The test provider has overwritten some of the above checks.
1696 // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1697 $versions = $tests['check_safari_ios_version'] + $versions;
1698 }
1699
1700 foreach ($versions as $version => $result) {
1701 $this->assertEquals($result, core_useragent::check_safari_ios_version($version),
1702 "Version incorrectly determined for iOS Safari version '{$version}'");
1703 }
1704 }
1705
1706 /**
1707 * @dataProvider user_agents_providers
1708 */
1709 public function test_useragent_gecko($useragent, $tests) {
1710 // Setup the core_useragent instance.
1711 core_useragent::instance(true, $useragent);
1712
1713 if (isset($tests['is_gecko']) && $tests['is_gecko']) {
1714 $this->assertTrue(core_useragent::is_gecko(),
1715 "Browser was not identified as a gecko browser");
1716 $this->assertTrue(core_useragent::check_gecko_version());
1717 } else {
1718 $this->assertFalse(core_useragent::is_gecko(),
1719 "Browser was incorrectly identified as a gecko browser");
1720 $this->assertFalse(core_useragent::check_gecko_version());
1721 }
1722
1723 $versions = array(
1724 // New versions should be added here.
1725 '1' => false,
1726 '2' => false,
1727 '3.6' => false,
1728 '4.0' => false,
1729 '20030516' => false,
1730 '20051116' => false,
1731 '2006010100' => false,
5ee4f581 1732 '20100101' => false,
7c10ad33
AN
1733 '15.0' => false,
1734 '18.0' => false,
1735 '19.0' => false,
1736 );
1737
1738 if (isset($tests['check_gecko_version'])) {
1739 // The test provider has overwritten some of the above checks.
1740 // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1741 $versions = $tests['check_gecko_version'] + $versions;
1742 }
1743
1744 foreach ($versions as $version => $result) {
1745 $this->assertEquals($result, core_useragent::check_gecko_version($version),
1746 "Version incorrectly determined for Gecko version '{$version}'");
1747 }
1748 }
1749
1750 /**
1751 * @dataProvider user_agents_providers
1752 */
1753 public function test_useragent_firefox($useragent, $tests) {
1754 // Setup the core_useragent instance.
1755 core_useragent::instance(true, $useragent);
1756
1757 if (isset($tests['is_firefox']) && $tests['is_firefox']) {
1758 $this->assertTrue(core_useragent::is_firefox(),
1759 "Browser was not identified as a firefox browser");
1760 $this->assertTrue(core_useragent::check_firefox_version());
1761 } else {
1762 $this->assertFalse(core_useragent::is_firefox(),
1763 "Browser was incorrectly identified as a firefox browser");
1764 $this->assertFalse(core_useragent::check_firefox_version());
1765 }
1766
1767 $versions = array(
1768 // New versions should be added here.
1769 '1.5' => false,
1770 '3.0' => false,
1771 '4' => false,
1772 '10' => false,
1773 '15' => false,
1774 '18' => false,
1775 '19' => false,
5ee4f581 1776 '33' => false,
7c10ad33
AN
1777 );
1778
1779 if (isset($tests['check_firefox_version'])) {
1780 // The test provider has overwritten some of the above checks.
1781 // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1782 $versions = $tests['check_firefox_version'] + $versions;
1783 }
1784
1785 foreach ($versions as $version => $result) {
1786 $this->assertEquals($result, core_useragent::check_firefox_version($version),
1787 "Version incorrectly determined for Firefox version '{$version}'");
1788 }
1789 }
c3d2fbf9 1790
7c10ad33
AN
1791 /**
1792 * @dataProvider user_agents_providers
1793 */
1794 public function test_useragent_opera($useragent, $tests) {
1795 // Setup the core_useragent instance.
1796 core_useragent::instance(true, $useragent);
1797
1798 if (isset($tests['is_opera']) && $tests['is_opera']) {
1799 $this->assertTrue(core_useragent::is_opera(),
1800 "Browser was not identified as a opera browser");
1801 $this->assertTrue(core_useragent::check_opera_version());
1802 } else {
1803 $this->assertFalse(core_useragent::is_opera(),
1804 "Browser was incorrectly identified as a opera browser");
1805 $this->assertFalse(core_useragent::check_opera_version());
1806 }
1807
1808 $versions = array(
1809 // New versions should be added here.
1810 '8.0' => false,
5ee4f581 1811 '9.0' => false,
7c10ad33 1812 '10.0' => false,
5ee4f581 1813 '12.15' => false,
7c10ad33
AN
1814 );
1815
1816 if (isset($tests['check_opera_version'])) {
1817 // The test provider has overwritten some of the above checks.
1818 // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1819 $versions = $tests['check_opera_version'] + $versions;
1820 }
1821
1822 foreach ($versions as $version => $result) {
1823 $this->assertEquals($result, core_useragent::check_opera_version($version),
1824 "Version incorrectly determined for Opera version '{$version}'");
1825 }
1826 }
c3d2fbf9 1827
7c10ad33
AN
1828 /**
1829 * @dataProvider user_agents_providers
1830 */
1831 public function test_get_device_type($useragent, $tests) {
1832 // Setup the core_useragent instance.
1833 core_useragent::instance(true, $useragent);
c3d2fbf9 1834
7c10ad33
AN
1835 $expected = 'default';
1836 if (isset($tests['devicetype'])) {
1837 $expected = $tests['devicetype'];
1838 }
c3d2fbf9 1839
7c10ad33
AN
1840 $this->assertEquals($expected, core_useragent::get_device_type(),
1841 "Device Type was not correctly identified");
c3d2fbf9
SH
1842 }
1843
1844 /**
7c10ad33 1845 * @dataProvider user_agents_providers
c3d2fbf9 1846 */
7c10ad33
AN
1847 public function test_get_browser_version_classes($useragent, $tests) {
1848 // Setup the core_useragent instance.
1849 core_useragent::instance(true, $useragent);
1850
1851 $actual = core_useragent::get_browser_version_classes();
1852 foreach ($tests['versionclasses'] as $expectedclass) {
1853 $this->assertContains($expectedclass, $actual);
1854 }
1855 $this->assertCount(count($tests['versionclasses']), $actual);
c3d2fbf9 1856 }
34c6ec18
AN
1857
1858 /**
1859 * @dataProvider user_agents_providers
1860 */
1861 public function test_useragent_web_crawler($useragent, $tests) {
1862 // Setup the core_useragent instance.
1863 core_useragent::instance(true, $useragent);
1864
1865 $expectation = isset($tests['is_web_crawler']) ? $tests['is_web_crawler'] : false;
1866 $this->assertSame($expectation, core_useragent::is_web_crawler());
1867 }
182d9990
DM
1868
1869 /**
1870 * Regression tests for the deprecated is_web_crawler() function
1871 */
1872 public function test_deprecated_is_web_crawler() {
1873
1874 $browsers = array(
1875 'Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))',
1876 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:18.0) Gecko/18.0 Firefox/18.0',
1877 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412 (KHTML, like Gecko) Safari/412',
1878 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10',
1879 'Opera/9.0 (Windows NT 5.1; U; en)',
1880 'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17 –Nexus',
1881 'Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5',
1882 );
1883 $crawlers = array(
1884 // Google.
1885 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
1886 'Googlebot/2.1 (+http://www.googlebot.com/bot.html)',
1887 'Googlebot-Image/1.0',
1888 // Yahoo.
1889 'Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)',
1890 // Bing.
1891 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)',
1892 'Mozilla/5.0 (compatible; bingbot/2.0 +http://www.bing.com/bingbot.htm)',
1893 // MSN.
1894 'msnbot/2.1',
1895 // Yandex.
1896 'Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)',
1897 'Mozilla/5.0 (compatible; YandexImages/3.0; +http://yandex.com/bots)',
1898 // AltaVista.
1899 'AltaVista V2.0B crawler@evreka.com',
1900 // ZoomSpider.
1901 'ZoomSpider - wrensoft.com [ZSEBOT]',
1902 // Baidu.
1903 'Baiduspider+(+http://www.baidu.com/search/spider_jp.html)',
1904 'Baiduspider+(+http://www.baidu.com/search/spider.htm)',
1905 'BaiDuSpider',
1906 // Ask.com.
1907 'User-Agent: Mozilla/2.0 (compatible; Ask Jeeves/Teoma)',
1908 );
1909
1910 foreach ($browsers as $agent) {
1911 core_useragent::instance(true, $agent);
1912 $this->assertSame($agent, core_useragent::get_user_agent_string());
1913 $this->assertFalse(is_web_crawler());
1914 $this->assertDebuggingCalled('is_web_crawler() has been deprecated, please use core_useragent::is_web_crawler() instead.',
1915 DEBUG_DEVELOPER);
1916 }
1917 foreach ($crawlers as $agent) {
1918 core_useragent::instance(true, $agent);
1919 $this->assertSame($agent, core_useragent::get_user_agent_string());
1920 $this->assertTrue(is_web_crawler(), "$agent should be considered a search engine");
1921 $this->assertDebuggingCalled('is_web_crawler() has been deprecated, please use core_useragent::is_web_crawler() instead.',
1922 DEBUG_DEVELOPER);
1923 }
1924 }
378b3eac 1925}