ua-parser-js 0.7.13 → 0.7.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ua-parser-js might be problematic. Click here for more details.

package/src/ua-parser.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * UAParser.js v0.7.13
2
+ * UAParser.js v0.7.17
3
3
  * Lightweight JavaScript-based User-Agent string parser
4
4
  * https://github.com/faisalman/ua-parser-js
5
5
  *
@@ -16,7 +16,7 @@
16
16
  /////////////
17
17
 
18
18
 
19
- var LIBVERSION = '0.7.13',
19
+ var LIBVERSION = '0.7.17',
20
20
  EMPTY = '',
21
21
  UNKNOWN = '?',
22
22
  FUNC_TYPE = 'function',
@@ -138,7 +138,7 @@
138
138
  }
139
139
  i += 2;
140
140
  }
141
- //console.log(this);
141
+ // console.log(this);
142
142
  //return this;
143
143
  },
144
144
 
@@ -270,10 +270,7 @@
270
270
  /(puffin)\/([\w\.]+)/i // Puffin
271
271
  ], [[NAME, 'Puffin'], VERSION], [
272
272
 
273
- /(uc\s?browser)[\/\s]?([\w\.]+)/i,
274
- /ucweb.+(ucbrowser)[\/\s]?([\w\.]+)/i,
275
- /juc.+(ucweb)[\/\s]?([\w\.]+)/i,
276
- /(ucbrowser)\/([\w\.]+)/i
273
+ /((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i
277
274
  // UCBrowser
278
275
  ], [[NAME, 'UCBrowser'], VERSION], [
279
276
 
@@ -283,6 +280,9 @@
283
280
  /(micromessenger)\/([\w\.]+)/i // WeChat
284
281
  ], [[NAME, 'WeChat'], VERSION], [
285
282
 
283
+ /(QQ)\/([\d\.]+)/i // QQ, aka ShouQ
284
+ ], [NAME, VERSION], [
285
+
286
286
  /m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
287
287
  ], [NAME, VERSION], [
288
288
 
@@ -292,13 +292,15 @@
292
292
  /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android
293
293
  ], [VERSION, [NAME, 'Facebook']], [
294
294
 
295
- /(headlesschrome) ([\w\.]+)/i // Chrome Headless
295
+ /headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless
296
296
  ], [VERSION, [NAME, 'Chrome Headless']], [
297
297
 
298
298
  /\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
299
299
  ], [[NAME, /(.+)/, '$1 WebView'], VERSION], [
300
300
 
301
- /android.+samsungbrowser\/([\w\.]+)/i,
301
+ /((?:oculus|samsung)browser)\/([\w\.]+)/i
302
+ ], [[NAME, /(.+(?:g|us))(.+)/, '$1 $2'], VERSION], [ // Oculus / Samsung Browser
303
+
302
304
  /android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
303
305
  ], [VERSION, [NAME, 'Android Browser']], [
304
306
 
@@ -324,6 +326,9 @@
324
326
  /version\/([\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
325
327
  ], [VERSION, NAME], [
326
328
 
329
+ /webkit.+?(gsa)\/([\w\.]+).+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Google Search Appliance on iOS
330
+ ], [[NAME, 'GSA'], VERSION], [
331
+
327
332
  /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
328
333
  ], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
329
334
 
@@ -518,8 +523,8 @@
518
523
  ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
519
524
 
520
525
  /(blackberry)[\s-]?(\w+)/i, // BlackBerry
521
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|huawei|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,
522
- // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Huawei/Meizu/Motorola/Polytron
526
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,
527
+ // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
523
528
  /(hp)\s([\w\s]+\w)/i, // HP iPAQ
524
529
  /(asus)-?(\w+)/i // Asus
525
530
  ], [VENDOR, MODEL, [TYPE, MOBILE]], [
@@ -532,8 +537,8 @@
532
537
  /(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
533
538
  /(sony)?(?:sgp.+)\sbuild\//i
534
539
  ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
535
- /(?:sony)?(?:(?:(?:c|d)\d{4})|(?:so[-l].+))\sbuild\//i
536
- ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Phone'], [TYPE, MOBILE]], [
540
+ /android.+\s([c-g]\d{4}|so[-l]\w+)\sbuild\//i
541
+ ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
537
542
 
538
543
  /\s(ouya)\s/i, // Ouya
539
544
  /(nintendo)\s([wids3u]+)/i // Nintendo
@@ -553,14 +558,15 @@
553
558
 
554
559
  /(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, // HTC
555
560
  /(zte)-(\w+)*/i, // ZTE
556
- /(alcatel|geeksphone|huawei|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i
557
- // Alcatel/GeeksPhone/Huawei/Lenovo/Nexian/Panasonic/Sony
561
+ /(alcatel|geeksphone|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i
562
+ // Alcatel/GeeksPhone/Lenovo/Nexian/Panasonic/Sony
558
563
  ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
559
564
 
560
565
  /(nexus\s9)/i // HTC Nexus 9
561
566
  ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
562
567
 
563
- /(nexus\s6p)/i // Huawei Nexus 6P
568
+ /d\/huawei([\w\s-]+)[;\)]/i,
569
+ /(nexus\s6p)/i // Huawei
564
570
  ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
565
571
 
566
572
  /(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
@@ -609,12 +615,15 @@
609
615
  /android\s3\.[\s\w;-]{10}(a\d{3})/i // Acer
610
616
  ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
611
617
 
618
+ /android.+([vl]k\-?\d{3})\s+build/i // LG Tablet
619
+ ], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [
612
620
  /android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i // LG Tablet
613
621
  ], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [
614
622
  /(lg) netcast\.tv/i // LG SmartTV
615
623
  ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
616
624
  /(nexus\s[45])/i, // LG
617
- /lg[e;\s\/-]+(\w+)*/i
625
+ /lg[e;\s\/-]+(\w+)*/i,
626
+ /android.+lg(\-?[\d\w]+)\s+build/i
618
627
  ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
619
628
 
620
629
  /android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
@@ -643,17 +652,90 @@
643
652
 
644
653
  /android.+(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
645
654
  /android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
646
- /android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d\w)?)\s+build/i // Xiaomi Mi
655
+ /android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Mi
656
+ /android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+)?)\s+build/i // Redmi Phones
647
657
  ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
658
+ /android.+(mi[\s\-_]*(?:pad)?(?:[\s_]*[\w\s]+)?)\s+build/i // Mi Pad tablets
659
+ ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
660
+ /android.+;\s(m[1-5]\snote)\sbuild/i // Meizu Tablet
661
+ ], [MODEL, [VENDOR, 'Meizu'], [TYPE, TABLET]], [
648
662
 
649
663
  /android.+a000(1)\s+build/i // OnePlus
650
664
  ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
651
665
 
652
- /\s(tablet)[;\/]/i, // Unidentifiable Tablet
666
+ /android.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets
667
+ ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
668
+
669
+ /android.+[;\/]\s*(Venue[\d\s]*)\s+build/i // Dell Venue Tablets
670
+ ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
671
+
672
+ /android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i // Verizon Tablet
673
+ ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
674
+
675
+ /android.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(V?.*)\s+build/i // Barnes & Noble Tablet
676
+ ], [[VENDOR, 'Barnes & Noble'], MODEL, [TYPE, TABLET]], [
677
+
678
+ /android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i // Barnes & Noble Tablet
679
+ ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
680
+
681
+ /android.+[;\/]\s*(zte)?.+(k\d{2})\s+build/i // ZTE K Series Tablet
682
+ ], [[VENDOR, 'ZTE'], MODEL, [TYPE, TABLET]], [
683
+
684
+ /android.+[;\/]\s*(gen\d{3})\s+build.*49h/i // Swiss GEN Mobile
685
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
686
+
687
+ /android.+[;\/]\s*(zur\d{3})\s+build/i // Swiss ZUR Tablet
688
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
689
+
690
+ /android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i // Zeki Tablets
691
+ ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
692
+
693
+ /(android).+[;\/]\s+([YR]\d{2}x?.*)\s+build/i,
694
+ /android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(.+)\s+build/i // Dragon Touch Tablet
695
+ ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
696
+
697
+ /android.+[;\/]\s*(NS-?.+)\s+build/i // Insignia Tablets
698
+ ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
699
+
700
+ /android.+[;\/]\s*((NX|Next)-?.+)\s+build/i // NextBook Tablets
701
+ ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
702
+
703
+ /android.+[;\/]\s*(Xtreme\_?)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i
704
+ ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
705
+
706
+ /android.+[;\/]\s*(LVTEL\-?)?(V1[12])\s+build/i // LvTel Phones
707
+ ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
708
+
709
+ /android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i // Envizen Tablets
710
+ ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
711
+
712
+ /android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(.*\b)\s+build/i // Le Pan Tablets
713
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
714
+
715
+ /android.+[;\/]\s*(Trio[\s\-]*.*)\s+build/i // MachSpeed Tablets
716
+ ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
717
+
718
+ /android.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i // Trinity Tablets
719
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
720
+
721
+ /android.+[;\/]\s*TU_(1491)\s+build/i // Rotor Tablets
722
+ ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
723
+
724
+ /android.+(KS(.+))\s+build/i // Amazon Kindle Tablets
725
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
726
+
727
+ /android.+(Gigaset)[\s\-]+(Q.+)\s+build/i // Gigaset Tablets
728
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
729
+
730
+ /\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
653
731
  /\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
654
- ], [[TYPE, util.lowerize], VENDOR, MODEL]
732
+ ], [[TYPE, util.lowerize], VENDOR, MODEL], [
733
+
734
+ /(android.+)[;\/].+build/i // Generic Android Device
735
+ ], [MODEL, [VENDOR, 'Generic']]
655
736
 
656
- /*//////////////////////////
737
+
738
+ /*//////////////////////////
657
739
  // TODO: move to string map
658
740
  ////////////////////////////
659
741
 
@@ -775,8 +857,9 @@
775
857
  /(haiku)\s(\w+)/i // Haiku
776
858
  ], [NAME, VERSION],[
777
859
 
778
- /(ip[honead]+)(?:.*os\s([\w]+)*\slike\smac|;\sopera)/i // iOS
779
- ], [[NAME, 'iOS'], [VERSION, /_/g, '.']], [
860
+ /cfnetwork\/.+darwin/i,
861
+ /ip[honead]+(?:.*os\s([\w]+)\slike\smac|;\sopera)/i // iOS
862
+ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
780
863
 
781
864
  /(mac\sos\sx)\s?([\w\s\.]+\w)*/i,
782
865
  /(macintosh|mac(?=_powerpc)\s)/i // Mac OS
@@ -796,7 +879,7 @@
796
879
  /////////////////
797
880
  // Constructor
798
881
  ////////////////
799
-
882
+ /*
800
883
  var Browser = function (name, version) {
801
884
  this[NAME] = name;
802
885
  this[VERSION] = version;
@@ -811,39 +894,49 @@
811
894
  };
812
895
  var Engine = Browser;
813
896
  var OS = Browser;
814
-
897
+ */
815
898
  var UAParser = function (uastring, extensions) {
816
899
 
900
+ if (typeof uastring === 'object') {
901
+ extensions = uastring;
902
+ uastring = undefined;
903
+ }
904
+
817
905
  if (!(this instanceof UAParser)) {
818
906
  return new UAParser(uastring, extensions).getResult();
819
907
  }
820
908
 
821
909
  var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
822
910
  var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
823
- var browser = new Browser();
824
- var cpu = new CPU();
825
- var device = new Device();
826
- var engine = new Engine();
827
- var os = new OS();
911
+ //var browser = new Browser();
912
+ //var cpu = new CPU();
913
+ //var device = new Device();
914
+ //var engine = new Engine();
915
+ //var os = new OS();
828
916
 
829
917
  this.getBrowser = function () {
918
+ var browser = { name: undefined, version: undefined };
830
919
  mapper.rgx.call(browser, ua, rgxmap.browser);
831
920
  browser.major = util.major(browser.version); // deprecated
832
921
  return browser;
833
922
  };
834
923
  this.getCPU = function () {
924
+ var cpu = { architecture: undefined };
835
925
  mapper.rgx.call(cpu, ua, rgxmap.cpu);
836
926
  return cpu;
837
927
  };
838
928
  this.getDevice = function () {
929
+ var device = { vendor: undefined, model: undefined, type: undefined };
839
930
  mapper.rgx.call(device, ua, rgxmap.device);
840
931
  return device;
841
932
  };
842
933
  this.getEngine = function () {
934
+ var engine = { name: undefined, version: undefined };
843
935
  mapper.rgx.call(engine, ua, rgxmap.engine);
844
936
  return engine;
845
937
  };
846
938
  this.getOS = function () {
939
+ var os = { name: undefined, version: undefined };
847
940
  mapper.rgx.call(os, ua, rgxmap.os);
848
941
  return os;
849
942
  };
@@ -862,11 +955,11 @@
862
955
  };
863
956
  this.setUA = function (uastring) {
864
957
  ua = uastring;
865
- browser = new Browser();
866
- cpu = new CPU();
867
- device = new Device();
868
- engine = new Engine();
869
- os = new OS();
958
+ //browser = new Browser();
959
+ //cpu = new CPU();
960
+ //device = new Device();
961
+ //engine = new Engine();
962
+ //os = new OS();
870
963
  return this;
871
964
  };
872
965
  return this;
@@ -913,6 +1006,35 @@
913
1006
  if (typeof module !== UNDEF_TYPE && module.exports) {
914
1007
  exports = module.exports = UAParser;
915
1008
  }
1009
+ // TODO: test!!!!!!!!
1010
+ /*
1011
+ if (require && require.main === module && process) {
1012
+ // cli
1013
+ var jsonize = function (arr) {
1014
+ var res = [];
1015
+ for (var i in arr) {
1016
+ res.push(new UAParser(arr[i]).getResult());
1017
+ }
1018
+ process.stdout.write(JSON.stringify(res, null, 2) + '\n');
1019
+ };
1020
+ if (process.stdin.isTTY) {
1021
+ // via args
1022
+ jsonize(process.argv.slice(2));
1023
+ } else {
1024
+ // via pipe
1025
+ var str = '';
1026
+ process.stdin.on('readable', function() {
1027
+ var read = process.stdin.read();
1028
+ if (read !== null) {
1029
+ str += read;
1030
+ }
1031
+ });
1032
+ process.stdin.on('end', function () {
1033
+ jsonize(str.replace(/\n$/, '').split('\n'));
1034
+ });
1035
+ }
1036
+ }
1037
+ */
916
1038
  exports.UAParser = UAParser;
917
1039
  } else {
918
1040
  // requirejs env (optional)
@@ -920,7 +1042,7 @@
920
1042
  define(function () {
921
1043
  return UAParser;
922
1044
  });
923
- } else {
1045
+ } else if (window) {
924
1046
  // browser env
925
1047
  window.UAParser = UAParser;
926
1048
  }
@@ -931,7 +1053,7 @@
931
1053
  // In AMD env the global scope should be kept clean, but jQuery is an exception.
932
1054
  // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
933
1055
  // and we should catch that.
934
- var $ = window.jQuery || window.Zepto;
1056
+ var $ = window && (window.jQuery || window.Zepto);
935
1057
  if (typeof $ !== UNDEF_TYPE) {
936
1058
  var parser = new UAParser();
937
1059
  $.ua = parser.getResult();
@@ -1,14 +1,4 @@
1
1
  [
2
- {
3
- "desc" : "Chrome Headless",
4
- "ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome Safari/537.36",
5
- "expect" :
6
- {
7
- "name" : "Chrome Headless",
8
- "version" : "HeadlessChrome",
9
- "major" : ""
10
- }
11
- },
12
2
  {
13
3
  "desc" : "Android Browser on Galaxy Nexus",
14
4
  "ua" : "Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
@@ -64,7 +54,7 @@
64
54
  "ua" : "Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-G925F Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.0 Chrome/38.0.2125.102 Mobile Safari/537.36",
65
55
  "expect" :
66
56
  {
67
- "name" : "Android Browser",
57
+ "name" : "Samsung Browser",
68
58
  "version" : "3.0",
69
59
  "major" : "3"
70
60
  }
@@ -149,6 +139,26 @@
149
139
  "major" : "20"
150
140
  }
151
141
  },
142
+ {
143
+ "desc" : "Chrome Headless",
144
+ "ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome Safari/537.36",
145
+ "expect" :
146
+ {
147
+ "name" : "Chrome Headless",
148
+ "version" : "undefined",
149
+ "major" : "undefined"
150
+ }
151
+ },
152
+ {
153
+ "desc" : "Chrome Headless",
154
+ "ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/60.0.3112.113 Safari/537.36",
155
+ "expect" :
156
+ {
157
+ "name" : "Chrome Headless",
158
+ "version" : "60.0.3112.113",
159
+ "major" : "60"
160
+ }
161
+ },
152
162
  {
153
163
  "desc" : "Chrome WebView",
154
164
  "ua" : "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36",
@@ -549,6 +559,16 @@
549
559
  "major" : "7"
550
560
  }
551
561
  },
562
+ {
563
+ "desc" : "Oculus Browser",
564
+ "ua" : "Mozilla/5.0 (Linux; Android 7.0; SM-G920I Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/3.4.9 SamsungBrowser/4.0 Chrome/57.0.2987.146 Mobile VR Safari/537.36",
565
+ "expect" :
566
+ {
567
+ "name" : "Oculus Browser",
568
+ "version" : "3.4.9",
569
+ "major" : "3"
570
+ }
571
+ },
552
572
  {
553
573
  "desc" : "OmniWeb",
554
574
  "ua" : "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.48",
@@ -719,6 +739,16 @@
719
739
  "major" : "2"
720
740
  }
721
741
  },
742
+ {
743
+ "desc" : "Samsung Browser",
744
+ "ua" : "Mozilla/5.0 (Linux; Android 6.0.1; SAMSUNG-SM-G925A Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile Safari/537.36",
745
+ "expect" :
746
+ {
747
+ "name" : "Samsung Browser",
748
+ "version" : "4.0",
749
+ "major" : "4"
750
+ }
751
+ },
722
752
  {
723
753
  "desc" : "SeaMonkey",
724
754
  "ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b4pre) Gecko/20090405 SeaMonkey/2.0b1pre",
@@ -779,6 +809,16 @@
779
809
  "major" : "1"
780
810
  }
781
811
  },
812
+ {
813
+ "desc" : "UC Browser",
814
+ "ua" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 UBrowser/5.6.12860.7 Safari/537.36",
815
+ "expect" :
816
+ {
817
+ "name" : "UCBrowser",
818
+ "version" : "5.6.12860.7",
819
+ "major" : "5"
820
+ }
821
+ },
782
822
  {
783
823
  "desc" : "UC Browser",
784
824
  "ua" : "Mozilla/5.0 (Linux; U; Android 6.0.1; en-US; Lenovo P2a42 Build/MMB29M) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/11.2.0.915 U3/0.8.0 Mobile Safari/534.30",
@@ -908,5 +948,35 @@
908
948
  "version" : "1.1",
909
949
  "major" : "1"
910
950
  }
951
+ },
952
+ {
953
+ "desc" : "QQ on iOS",
954
+ "ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Mobile/14A456 QQ/6.5.3.410 V1_IPH_SQ_6.5.3_1_APP_A Pixel/1080 Core/UIWebView NetType/WIFI Mem/26",
955
+ "expect" :
956
+ {
957
+ "name" : "QQ",
958
+ "version" : "6.5.3.410",
959
+ "major" : "6"
960
+ }
961
+ },
962
+ {
963
+ "desc" : "QQ on Android",
964
+ "ua" : "Mozilla/5.0 (Linux; Android 6.0; PRO 6 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.8 TBS/036824 Safari/537.36 V1_AND_SQ_6.5.8_422_YYB_D PA QQ/6.5.8.2910 NetType/WIFI WebP/0.3.0 Pixel/1080",
965
+ "expect" :
966
+ {
967
+ "name" : "QQ",
968
+ "version" : "6.5.8.2910",
969
+ "major" : "6"
970
+ }
971
+ },
972
+ {
973
+ "desc" : "GSA on iOS",
974
+ "ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) GSA/30.1.161623614 Mobile/14F89 Safari/602.1",
975
+ "expect" :
976
+ {
977
+ "name" : "GSA",
978
+ "version" : "30.1.161623614",
979
+ "major" : "30"
980
+ }
911
981
  }
912
982
  ]