browser 2.7.1 → 5.3.1

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.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE.md +1 -1
  3. data/.github/workflows/tests.yml +57 -0
  4. data/.gitignore +1 -0
  5. data/.prettierignore +1 -0
  6. data/.rubocop.yml +13 -1
  7. data/CHANGELOG.md +122 -13
  8. data/FUNDING.yml +3 -0
  9. data/README.md +134 -88
  10. data/Rakefile +8 -1
  11. data/bot_exceptions.yml +1 -0
  12. data/bots.yml +300 -293
  13. data/browser.gemspec +4 -1
  14. data/gemfiles/{rails5.gemfile → rails6_1.gemfile} +1 -1
  15. data/lib/browser/accept_language.rb +4 -4
  16. data/lib/browser/aliases.rb +1 -1
  17. data/lib/browser/alipay.rb +1 -1
  18. data/lib/browser/base.rb +82 -18
  19. data/lib/browser/blackberry.rb +1 -1
  20. data/lib/browser/bot/empty_user_agent_matcher.rb +11 -0
  21. data/lib/browser/bot/keyword_matcher.rb +11 -0
  22. data/lib/browser/bot/known_bots_matcher.rb +11 -0
  23. data/lib/browser/bot.rb +34 -26
  24. data/lib/browser/browser.rb +59 -56
  25. data/lib/browser/chrome.rb +13 -3
  26. data/lib/browser/device/android.rb +1 -1
  27. data/lib/browser/device/blackberry_playbook.rb +1 -1
  28. data/lib/browser/device/ipad.rb +1 -1
  29. data/lib/browser/device/iphone.rb +1 -1
  30. data/lib/browser/device/ipod_touch.rb +1 -1
  31. data/lib/browser/device/kindle.rb +1 -1
  32. data/lib/browser/device/kindle_fire.rb +1 -1
  33. data/lib/browser/device/playstation3.rb +1 -1
  34. data/lib/browser/device/playstation4.rb +1 -1
  35. data/lib/browser/device/psp.rb +1 -1
  36. data/lib/browser/device/psvita.rb +1 -1
  37. data/lib/browser/device/samsung.rb +33 -0
  38. data/lib/browser/device/surface.rb +1 -1
  39. data/lib/browser/device/switch.rb +1 -1
  40. data/lib/browser/device/tv.rb +1 -1
  41. data/lib/browser/device/unknown.rb +1 -1
  42. data/lib/browser/device/wii.rb +1 -1
  43. data/lib/browser/device/wiiu.rb +1 -1
  44. data/lib/browser/device/xbox_360.rb +1 -1
  45. data/lib/browser/device/xbox_one.rb +1 -1
  46. data/lib/browser/device.rb +37 -27
  47. data/lib/browser/duck_duck_go.rb +22 -0
  48. data/lib/browser/edge.rb +3 -3
  49. data/lib/browser/electron.rb +1 -1
  50. data/lib/browser/facebook.rb +1 -1
  51. data/lib/browser/firefox.rb +1 -1
  52. data/lib/browser/google_search_app.rb +21 -0
  53. data/lib/browser/huawei_browser.rb +21 -0
  54. data/lib/browser/instagram.rb +1 -1
  55. data/lib/browser/internet_explorer.rb +2 -2
  56. data/lib/browser/maxthon.rb +21 -0
  57. data/lib/browser/meta/base.rb +0 -1
  58. data/lib/browser/meta.rb +12 -13
  59. data/lib/browser/micro_messenger.rb +1 -1
  60. data/lib/browser/middleware/context/additions.rb +1 -1
  61. data/lib/browser/middleware.rb +1 -1
  62. data/lib/browser/miui_browser.rb +21 -0
  63. data/lib/browser/nokia.rb +1 -1
  64. data/lib/browser/opera.rb +1 -1
  65. data/lib/browser/otter.rb +1 -1
  66. data/lib/browser/phantom_js.rb +1 -1
  67. data/lib/browser/platform/adobe_air.rb +1 -1
  68. data/lib/browser/platform/android.rb +1 -1
  69. data/lib/browser/platform/base.rb +3 -2
  70. data/lib/browser/platform/blackberry.rb +1 -1
  71. data/lib/browser/platform/chrome_os.rb +1 -1
  72. data/lib/browser/platform/firefox_os.rb +1 -1
  73. data/lib/browser/platform/ios.rb +2 -2
  74. data/lib/browser/platform/kai_os.rb +23 -0
  75. data/lib/browser/platform/linux.rb +1 -1
  76. data/lib/browser/platform/mac.rb +5 -3
  77. data/lib/browser/platform/{other.rb → unknown.rb} +3 -3
  78. data/lib/browser/platform/windows.rb +2 -2
  79. data/lib/browser/platform/windows_mobile.rb +1 -1
  80. data/lib/browser/platform/windows_phone.rb +1 -1
  81. data/lib/browser/platform.rb +37 -28
  82. data/lib/browser/qq.rb +1 -1
  83. data/lib/browser/rails.rb +3 -3
  84. data/lib/browser/safari.rb +16 -1
  85. data/lib/browser/samsung_browser.rb +21 -0
  86. data/lib/browser/snapchat.rb +1 -1
  87. data/lib/browser/sougou_browser.rb +24 -0
  88. data/lib/browser/sputnik.rb +2 -5
  89. data/lib/browser/uc_browser.rb +1 -1
  90. data/lib/browser/{generic.rb → unknown.rb} +3 -3
  91. data/lib/browser/version.rb +1 -1
  92. data/lib/browser/weibo.rb +1 -1
  93. data/lib/browser/yandex.rb +1 -1
  94. data/lib/browser.rb +2 -2
  95. data/samsung.yml +138 -0
  96. data/test/browser_test.rb +37 -10
  97. data/test/test_helper.rb +8 -0
  98. data/test/ua.yml +26 -3
  99. data/test/ua_bots.yml +9 -2
  100. data/test/ua_search_engines.yml +1 -0
  101. data/test/unit/accept_language_test.rb +6 -0
  102. data/test/unit/adobe_air_test.rb +1 -1
  103. data/test/unit/alipay_test.rb +6 -0
  104. data/test/unit/blackberry_test.rb +0 -6
  105. data/test/unit/bots_test.rb +26 -39
  106. data/test/unit/chrome_test.rb +8 -3
  107. data/test/unit/console_test.rb +2 -2
  108. data/test/unit/device_test.rb +30 -3
  109. data/test/unit/duck_duck_go_test.rb +37 -0
  110. data/test/unit/edge_test.rb +34 -6
  111. data/test/unit/firefox_test.rb +0 -3
  112. data/test/unit/google_search_app_test.rb +54 -0
  113. data/test/unit/huawei_browser_test.rb +25 -0
  114. data/test/unit/internet_explorer_test.rb +0 -12
  115. data/test/unit/ios_test.rb +0 -5
  116. data/test/unit/kai_os_test.rb +31 -0
  117. data/test/unit/kindle_test.rb +0 -2
  118. data/test/unit/maxthon_test.rb +25 -0
  119. data/test/unit/meta_test.rb +10 -2
  120. data/test/unit/micro_messenger_test.rb +21 -6
  121. data/test/unit/miui_browser_test.rb +25 -0
  122. data/test/unit/opera_test.rb +1 -2
  123. data/test/unit/platform_test.rb +13 -8
  124. data/test/unit/qq_test.rb +12 -0
  125. data/test/unit/safari_test.rb +12 -7
  126. data/test/unit/samsung_browser_test.rb +23 -0
  127. data/test/unit/sougou_browser_test.rb +41 -0
  128. data/test/unit/sputnik_test.rb +1 -0
  129. metadata +46 -16
  130. data/.bundle/config +0 -2
  131. data/.travis.yml +0 -23
  132. data/lib/browser/meta/modern.rb +0 -11
  133. /data/gemfiles/{rails6.gemfile → rails6_0.gemfile} +0 -0
data/test/ua.yml CHANGED
@@ -18,6 +18,7 @@ ANDROID_LOLLIPOP_50: Mozilla/5.0 (Linux; Android 5.0; Nexus 5 Build/LPX13D) Appl
18
18
  ANDROID_LOLLIPOP_51: Mozilla/5.0 (Linux; Android 5.1; Nexus 5 Build/LMY47I) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.0.0 Mobile Safari/537.36; DailymotionEmbedSDK 1.0
19
19
  ANDROID_NEXUS_PLAYER: Mozilla/5.0 (Linux; Android 5.0; Nexus Player Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.0
20
20
  ANDROID_OREO: Mozilla/5.0 (Linux; Android 8.0.0; Pixel Build/OPR6.170623.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.03112.107 Mobile Safari/537.36
21
+ ANDROID_Q: Mozilla/5.0 (Linux; Android 10; Pixel 2 Build/QQ1A.191205.008; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Mobile Safari/537.36
21
22
  ANDROID_TV: Mozilla/5.0 (Linux; Android 5.0; ADT-1 Build/LRW87K) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36
22
23
  ANDROID_WEBVIEW: 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
23
24
  ANDROID_WITH_SAFARI: "Mozilla/5.0 (Linux; U; Android 4.3; en-us; SCH-I535 Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"
@@ -31,6 +32,8 @@ CHROME: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/53
31
32
  CHROME_OS: "Mozilla/5.0 (X11; CrOS x86_64 3701.81.0) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.57 Safari/537.31."
32
33
  COREMEDIA: "Apple Mac OS X v10.6.4 CoreMedia v1.0.0.10F569"
33
34
  CUSTOM_APP: "Our App 0.0.1 (Linux; Android 4.0.3; HTC Ruby Build/IML74K; en_CA)"
35
+ DUCKDUCKGO_BROWSER_ANDROID: Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.96 Mobile Safari/537.36 DuckDuckGo/5"
36
+ DUCKDUCKGO_BROWSER_IOS: "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 DuckDuckGo/7"
34
37
  ELECTRON: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Electron/1.4.12 Safari/537.36"
35
38
  FACEBOOK: Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 [FBAN/FBIOS;FBAV/135.0.0.45.90;FBBV/66877072;FBDV/iPhone9,3;FBMD/iPhone;FBSN/iOS;FBSV/10.3.3;FBSS/2;FBCR/AT&T;FBID/phone;FBLC/en_US;FBOP/5;FBRV/0]
36
39
  FACEBOOK_ANDROID: "Mozilla/5.0 (Linux; Android 9; ONEPLUS A6003 Build/PKQ1.180716.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/73.0.3683.90 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/214.0.0.43.83;]"
@@ -41,6 +44,10 @@ FIREFOX_IOS: "Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/
41
44
  FIREFOX_MODERN: "Mozilla/5.0 (X11; Ubuntu; Linux armv7l; rv:17.0) Gecko/20100101 Firefox/17.0"
42
45
  FIREFOX_OS: "Mozilla/5.0 (Mobile; rv:18.0) Gecko/18.0 Firefox/18.0"
43
46
  FIREFOX_TABLET: "Mozilla/5.0 (Android; Tablet; rv:14.0) Gecko/14.0 Firefox/14.0"
47
+ GOOGLE_SEARCH_APP_ANDROID: "Mozilla/5.0 (Linux; Android 10; SM-G960U Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/81.0.4044.117 Mobile Safari/537.36 GSA/11.6.8.21.arm64"
48
+ GOOGLE_SEARCH_APP_IPAD: "Mozilla/5.0 (iPad; CPU OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/102.0.304944559 Mobile/15E148 Safari/605.1"
49
+ GOOGLE_SEARCH_APP_IPHONE: "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/105.0.307913796 Mobile/17D50 Safari/604.1"
50
+ HUAWEI_BROWSER: "Mozilla/5.0 (Linux; Android 10; HMA-AL00; HMSCore 5.0.0.304; GMSCore 19.6.29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 HuaweiBrowser/10.1.2.300 Mobile Safari/537.36"
44
51
  IE10: "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; EIE10;ENUSMSN)"
45
52
  IE10_COMPAT: "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; EIE10;ENUSMSN)"
46
53
  IE10_X64_WINX64: "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)"
@@ -57,6 +64,7 @@ IE9_COMPAT: "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)"
57
64
  IE_WITHOUT_TRIDENT: Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.0) .NET CLR 2.0.50727)
58
65
  INSTAGRAM: "Mozilla/5.0 (iPhone; CPU iPhone OS 11_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E216 Instagram 41.0.0.14.90 (iPhone9,3; iOS 11_3; pl_PL; pl-PL; scale=2.00; gamut=wide; 750x1334)"
59
66
  INSTAGRAM_OTHER: "Instagram/182257141 CFNetwork/1107.1 Darwin/19.0.0"
67
+ IOS12: "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1"
60
68
  IOS3: "Mozilla/5.0 (iPad; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10"
61
69
  IOS4: "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7"
62
70
  IOS5: "Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3"
@@ -66,22 +74,29 @@ IOS8: "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4
66
74
  IOS8_1_2: 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B440 Safari/600.1.4'
67
75
  IOS8_3: 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12F70 Safari/600.1.4'
68
76
  IOS9: "Mozilla/5.0 (iPad; CPU OS 9_0 like Mac OS X) AppleWebKit/601.1.17 (KHTML, like Gecko) Version/8.0 Mobile/13A175 Safari/600.1.4"
69
- IOS12: "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1"
70
77
  IOS_WEBVIEW: Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12H141
71
78
  IPAD: "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10"
72
79
  IPHONE: "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/1A542a Safari/419.3"
73
80
  IPOD: "Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A100a Safari/419.3"
81
+ JIOPHONE_2: "Mozilla/5.0 (Mobile; LYF/F300B/LYF-F300B-001-01-15-130718-i;Android; rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/2.5"
74
82
  KINDLE: "Mozilla/5.0 (Linux; U; en-US) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) Version/4.0 Kindle/3.0 (screen 600×800; rotate)"
75
83
  KINDLE_FIRE: "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"
76
84
  KINDLE_FIRE_HD: "Mozilla/5.0 (Linux; U; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.4 Safari/535.19 Silk-Accelerated=true"
77
85
  KINDLE_FIRE_HD_MOBILE: "Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.4 Mobile Safari/535.19 Silk-Accelerated=true"
78
86
  LUMIA800: "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; XBLWP7; ZuneWP7"
79
- MICRO_MESSENGER: "Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13E238 MicroMessenger/6.3.15 NetType/3G+ Language/zh_CN"
87
+ MAC_OS: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15"
88
+ MAC_OSX: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9"
89
+ MAXTHON: "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36 Maxthon/5.3.8.2000"
90
+ MICRO_MESSENGER_ANDROID: "Mozilla/5.0 (Linux; Android 7.1.2; Redmi 4X Build/N2G47H; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36 MMWEBID/9286 MicroMessenger/7.0.13.1640(0x27000D37) Process/tools NetType/WIFI Language/zh_CN ABI/arm64 WeChat/arm64"
91
+ MICRO_MESSENGER_IOS: "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.10(0x17000a21) NetType/4G Language/zh_CN"
80
92
  MIDP: MIDP-2.0
93
+ MIUI_BROWSER: "Mozilla/5.0 (Linux; U; Android 7.1.2; zh-cn; Redmi 4X Build/N2G47H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.141 Mobile Safari/537.36 XiaoMi/MiuiBrowser/12.3.3-g"
81
94
  MOBILE_CHROME: "Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3"
82
95
  MS_EDGE: "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0"
96
+ MS_EDGE_ANDROID: "Mozilla/5.0 (Linux; Android 7.1.2; Redmi 4X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.0 Mobile Safari/537.36 EdgA/44.11.2.4122"
83
97
  MS_EDGE_CHROME: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.29 Safari/537.36 Edg/79.0.309.18"
84
98
  MS_EDGE_COMPAT: "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/8.0; .NET4.0C; .NET4.0E; Tablet PC 2.0; Microsoft Outlook 15.0.4433; ms-office; MSOffice 15)"
99
+ MS_EDGE_IOS: "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 EdgiOS/44.5.0.10 Mobile/15E148 Safari/604.1"
85
100
  MS_EDGE_MOBILE: "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; DEVICE INFO) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Mobile Safari/537.36 Edge/12.0"
86
101
  NEXUS7: "Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JWR66Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36"
87
102
  NEXUS_TABLET: "Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19"
@@ -89,6 +104,7 @@ NINTENDO_SWITCH: "Mozilla/5.0 (Nintendo Switch; WifiWebAuthApplet) AppleWebKit/6
89
104
  NINTENDO_WII: "Opera/9.00 (Nintendo Wii; U; ; 1309-9; en)"
90
105
  NINTENDO_WIIU: "Mozilla/5.0 (Nintendo WiiU) AppleWebKit/534.52 (KHTML, like Gecko) NX/2.1.0.8.23 NintendoBrowser/1.1.0.7579.EU"
91
106
  NOKIA: "Mozilla/5.0 (Series40; NokiaX3-02/le6.32; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/2.0.2.62.10"
107
+ NOKIA_8110: "Mozilla/5.0 (Mobile; Nokia_8110_4G; rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/2.5"
92
108
  NOOK: "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; NOOK BNTV250A Build/GINGERBREAD 1.4.3) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1"
93
109
  OPERA: "Opera/9.80 (Macintosh; Intel Mac OS X 10.7.4; U; en) Presto/2.10.229 Version/11.64"
94
110
  OPERA_ANDROID: "Mozill/5.0 (Linux; Android 4.4.2; A1-810 Build/KOT49H) Apple/WebKit/537.36 (KHTML, like Gecko) Chrome/48.0.25 64.99 Safari/537.36 OPR/35.0.2070.100283"
@@ -106,6 +122,8 @@ QQ_BROWSER_ANDROID: "Mozilla/5.0 (Linux; Android 5.1.1; SM-N9108V Build/LMY47X)
106
122
  QQ_BROWSER_IOS: "Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13E238 QQ/6.3.3.432 V1_IPH_SQ_6.3.3_1_APP_A Pixel/640 Core/UIWebView NetType/WIFI Mem/47"
107
123
  QQ_BROWSER_MAC: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36 QQBrowser/4.2.4753.400"
108
124
  QQ_BROWSER_MAC_LITE: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14 QQBrowserLite/1.0.4"
125
+ SOUGOU_BROWSER: "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0"
126
+ SOUGOU_BROWSER_MOBILE: "Mozilla/5.0 (Linux; Android 7.1.2; Redmi 4X Build/N2G47H; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/68.0.3440.106 Mobile Safari/537.36 AWP/2.0 SogouMSE,SogouMobileBrowser/5.28.12"
109
127
  QUICKTIME: "QuickTime/7.6.8 (qtver=7.6.8;os=Windows NT 5.1Service Pack 3)"
110
128
  SAFARI3: "Mozilla/5.0 (Windows; U; Windows NT 6.0; en) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5"
111
129
  SAFARI4: "Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-ch) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9"
@@ -118,11 +136,16 @@ SAFARI: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-us) AppleWebKit/53
118
136
  SAFARI_IPAD_WEBAPP_MODE: "Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405"
119
137
  SAFARI_IPHONE_WEBAPP_MODE: "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.20 (KHTML, like Gecko) Mobile/7B298g"
120
138
  SAMSUNG: "Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; SAMSUNG-SGH-I497 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30"
139
+ SAMSUNG_BROWSER: "Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-N960U) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/11.1 Chrome/75.0.3770.143 Mobile Safari/537.36"
121
140
  SAMSUNG_CHROME: "Mozilla/5.0 (Linux; Android 4.4.2; en-gb; SAMSUNG GT-I9195/I9195XXUCNEA Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36"
141
+ SAMSUNG_SM-G975F: "Mozilla/5.0 (Linux; Android 10; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.101 Mobile Safari/537.36"
142
+ SAMSUNG_SM-G960F: "Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.127 Mobile Safari/537.36"
143
+ SAMSUNG_SM-F700F: "Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-F700F) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/11.1 Chrome/75.0.3770.143 Mobile Safari/537.36"
144
+ SAMSUNG_SM-FAKE: "Mozilla/5.0 (Linux; Android 8.0.0; SM-0000) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.127 Mobile Safari/537.36"
122
145
  SMART_TV: "Mozilla/5.0 (SmartHub; SMART-TV; U; Linux/SmartTV) AppleWebKit/531.2+ (KHTML, like Gecko) WebBrowser/1.0 SmartTV Safari/531.2+"
123
146
  SNAPCHAT: Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Snapchat/10.69.5.72 (iPhone10,3; iOS 13.2.2; gzip)
124
- SNAPCHAT_SPACE_VERSION: "Mozilla/5.0 (Linux; Android 9; SM-N960U Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.96 Mobile Safari/537.36Snapchat 10.70.0.0 (SM-N960U; Android 9#N960USQS3CSJ2#28; gzip)"
125
147
  SNAPCHAT_EMPTY_STRING_VERSION: "Mozilla/5.0 (Linux; Android 9; SM-N960U Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.96 Mobile Safari/537.36Snapchat10.70.0.0 (SM-N960U; Android 9#N960USQS3CSJ2#28; gzip)"
148
+ SNAPCHAT_SPACE_VERSION: "Mozilla/5.0 (Linux; Android 9; SM-N960U Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.96 Mobile Safari/537.36Snapchat 10.70.0.0 (SM-N960U; Android 9#N960USQS3CSJ2#28; gzip)"
126
149
  SPUTNIK: "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 SputnikBrowser/4.1.2801.0 Safari/537.36"
127
150
  SURFACE: "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)"
128
151
  SYMBIAN: "Nokia5250/10.0.011 (SymbianOS/9.4; U; Series60/5.0 Mozilla/5.0; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Safari/525 3gpp-gba"
data/test/ua_bots.yml CHANGED
@@ -4,6 +4,7 @@ ADS_TXT_CRAWLER: "AdsTxtCrawler/1.0"
4
4
  ANDERSPINK: "Mozilla/5.0 (compatible; AndersPinkBot/1.0; +http://anderspink.com/bot.html)"
5
5
  APIS_GOOGLE: "APIs-Google; (+https://developers.google.com/webmasters/APIs-Google.html)"
6
6
  APPLE_BOT: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/600.2.5 (KHTML, like Gecko) Version/8.0.2 Safari/600.2.5 (Applebot/0.1)"
7
+ ARCHIVEBOT: "ArchiveTeam ArchiveBot/20190617.01 (wpull 2.0.3) and not Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36"
7
8
  ASK: "Mozilla/2.0 (compatible; Ask Jeeves/Teoma; +http://sp.ask.com/docs/about/tech_crawling.html)"
8
9
  AWS_ELB: ELB-HealthChecker/1.0
9
10
  BAIDU: "Baiduspider+(+http://www.baidu.com/search/spider.htm)"
@@ -12,6 +13,7 @@ BINGBOT: "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm
12
13
  BINGPREVIEW: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) BingPreview/1.0b"
13
14
  BUBING: "BUbiNG (+http://law.di.unimi.it/BUbiNG.html)"
14
15
  BUZZBOT: "Buzzbot/1.0 (Buzzbot; http://www.buzzstream.com; buzzbot@buzzstream.com)"
16
+ CHROME_LIGHTHOUSE: "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3694.0 Mobile Safari/537.36 Chrome-Lighthouse"
15
17
  CIPACRAWLER: "CipaCrawler/3.0 (info@domaincrawler.com; http://www.domaincrawler.com/www.example.com)"
16
18
  CLOUDFLARE: "Mozilla/5.0 (compatible; CloudFlare-AlwaysOnline/1.0; +http://www.cloudflare.com/always-online) AppleWebKit/534.34"
17
19
  COMMONCRAWL: "CCBot/2.0 (http://commoncrawl.org/faq/)"
@@ -29,7 +31,9 @@ FYREBOT: "Fyrebot/1.0"
29
31
  GARLIK: "GarlikCrawler/1.2 (http://garlik.com/, crawler@garlik.com)"
30
32
  GERMCRAWLER: "GermCrawler"
31
33
  GO_1.1_PACKAGE_HTTP: "Go 1.1 package http"
34
+ GO_HTTP_CLIENT: "Go-http-client"
32
35
  GOOGLE_BOT: "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
36
+ GOOGLE_IMAGE_PROXY: "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"
33
37
  GOOGLE_PAGE_SPEED_INSIGHTS: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko; Google Page Speed Insights) Chrome/22.0.1229 Safari/537.4"
34
38
  GOOGLE_SHOPPING: "google-xrawler"
35
39
  GOOGLE_SITE_VERIFICATION: Mozilla/5.0 (compatible; Google-Site-Verification/1.0)
@@ -39,8 +43,10 @@ GOOGLE_STRUCTURED_DATA_TESTING_TOOL: "Mozilla/5.0 (compatible; X11; Linux x86_64
39
43
  GRAPESHOT: "Mozilla/5.0 (compatible; GrapeshotCrawler/2.0; +http://www.grapeshot.co.uk/crawler.php)"
40
44
  HTTRACK: "Mozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)"
41
45
  IMPLISENSEBOT: "ImplisenseBot 1.0"
46
+ JAUNT: "Jaunt/1.5"
42
47
  JOBSEEKER: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) JobBot/5.0 (compatible; +http://www.jobseeker.com.au/bot.html) Safari/538.1"
43
48
  JOOBLE: "Mozilla/5.0 (compatible; Jooblebot/2.0; Windows NT 6.1; WOW64; +http://jooble.org/jooble-bot) Mobile"
49
+ KNOWLEDGE_AI: "The Knowledge AI"
44
50
  LINKDEXBOT: "Mozilla/5.0 (compatible; linkdexbot/2.0; +http://www.linkdex.com/bots/)"
45
51
  LINKEDIN: "LinkedInBot/1.0 (compatible; Mozilla/5.0; Jakarta Commons-HttpClient/3.1 +http://www.linkedin.com)"
46
52
  LOAD_TIME_BOT: "Mozilla/5.0 (compatible; LoadTimeBot/0.9; +http://www.loadtime.net/bot.html)"
@@ -66,13 +72,14 @@ SCOUT_URL_MONITOR: ScoutURLMonitor/6.2.2
66
72
  SCRAPY: "Scrapy/0.18.4 (+http://scrapy.org)"
67
73
  SEMANTICBOT: "Mozilla/5.0 (compatible; Semanticbot/1.0; +http://sempi.tech/bot.html)"
68
74
  SEO_AUDIT: "Mozilla/5.0 (compatible; seo-audit-check-bot/1.0)"
75
+ SEOBILITYBOT: "SeobilityBot (SEO Tool; https://www.seobility.net/sites/bot.html)"
69
76
  SEODIVER: "Mozilla/5.0 (compatible; SEOdiver/1.0; +http://www.seodiver.com/bot)"
70
77
  SEOKICKS: "Mozilla/5.0 (compatible; SEOkicks-Robot; +http://www.seokicks.de/robot.html)"
71
78
  SISTRIX: "Mozilla/5.0 (compatible; SISTRIX Crawler; http://crawler.sistrix.net/)"
72
- SITECHECK: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.0) SiteCheck-sitecrawl by Siteimprove.com'
79
+ SITECHECK: "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.0) SiteCheck-sitecrawl by Siteimprove.com"
80
+ SKYPE: "Mozilla/5.0 (Windows NT 6.1; WOW64) SkypeUriPreview Preview/0.5"
73
81
  SOCIALRANKIO: SocialRankIOBot; http://socialrank.io/about
74
82
  SQUIDER: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36 Squider/0.01"
75
- STRIPE: "Stripe/1.0 (+https://stripe.com/docs/webhooks)"
76
83
  SWIFTYPE: "Swiftbot"
77
84
  TANGIBLEEBOT: "TangibleeBot"
78
85
  TEERAID: "Mozilla/5.0 (compatible; TeeRaidBot; +https://teeraid.com/bot/)"
@@ -1,3 +1,4 @@
1
+ ---
1
2
  ASK: "Mozilla/2.0 (compatible; Ask Jeeves/Teoma; +http://sp.ask.com/docs/about/tech_crawling.html)"
2
3
  BAIDU: "Baiduspider+(+http://www.baidu.com/search/spider.htm)"
3
4
  BINGBOT: "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
@@ -157,4 +157,10 @@ class AcceptLanguageTest < Minitest::Test
157
157
  assert_equal 5, result.size
158
158
  assert_language result[3], code: "de", region: nil, quality: 0.7
159
159
  end
160
+
161
+ test "sets default quality value for invalid strings" do
162
+ result = Browser::AcceptLanguage.parse(";q=0.0.0.0")
163
+
164
+ assert_equal 0.1, result[0].quality
165
+ end
160
166
  end
@@ -9,7 +9,7 @@ class AdobeAirTest < Minitest::Test
9
9
  assert browser.webkit?
10
10
  assert_equal "0", browser.version
11
11
  assert_equal "0.0", browser.full_version
12
- assert_equal "Generic Browser", browser.name
12
+ assert_equal "Unknown Browser", browser.name
13
13
  assert_equal "Adobe AIR", browser.platform.name
14
14
  assert_equal "13.0", browser.platform.version
15
15
  end
@@ -10,6 +10,9 @@ class AlipayTest < Minitest::Test
10
10
  assert browser.alipay?
11
11
  assert_equal "Alipay", browser.name
12
12
  assert_equal "2.3.4", browser.full_version
13
+
14
+ refute browser.chrome?
15
+ refute browser.safari?
13
16
  end
14
17
 
15
18
  test "detects alipay Android" do
@@ -19,6 +22,9 @@ class AlipayTest < Minitest::Test
19
22
  assert browser.alipay?
20
23
  assert_equal "Alipay", browser.name
21
24
  assert_equal "9.0.1.073001", browser.full_version
25
+
26
+ refute browser.chrome?
27
+ refute browser.safari?
22
28
  end
23
29
 
24
30
  test "detects version by range" do
@@ -9,7 +9,6 @@ class BlackberryTest < Minitest::Test
9
9
  assert_equal "BlackBerry", browser.name
10
10
  refute browser.device.tablet?
11
11
  assert browser.device.mobile?
12
- refute browser.modern?
13
12
  assert_equal "4.1.0", browser.full_version
14
13
  assert_equal "4", browser.version
15
14
  end
@@ -18,7 +17,6 @@ class BlackberryTest < Minitest::Test
18
17
  browser = Browser.new(Browser["BLACKBERRY4"])
19
18
 
20
19
  assert_equal "BlackBerry", browser.name
21
- refute browser.modern?
22
20
  assert_equal "4.2.1", browser.full_version
23
21
  assert_equal "4", browser.version
24
22
  end
@@ -29,7 +27,6 @@ class BlackberryTest < Minitest::Test
29
27
  assert_equal "BlackBerry", browser.name
30
28
  refute browser.device.tablet?
31
29
  assert browser.device.mobile?
32
- refute browser.modern?
33
30
  assert_equal "5.0.0.93", browser.full_version
34
31
  assert_equal "5", browser.version
35
32
  end
@@ -40,7 +37,6 @@ class BlackberryTest < Minitest::Test
40
37
  assert_equal "BlackBerry", browser.name
41
38
  refute browser.device.tablet?
42
39
  assert browser.device.mobile?
43
- assert browser.modern?
44
40
  assert_equal "6.0.0.141", browser.full_version
45
41
  assert_equal "6", browser.version
46
42
  end
@@ -51,7 +47,6 @@ class BlackberryTest < Minitest::Test
51
47
  assert_equal "BlackBerry", browser.name
52
48
  refute browser.device.tablet?
53
49
  assert browser.device.mobile?
54
- assert browser.modern?
55
50
  assert_equal "7.0.0.1", browser.full_version
56
51
  assert_equal "7", browser.version
57
52
  end
@@ -62,7 +57,6 @@ class BlackberryTest < Minitest::Test
62
57
  assert_equal "BlackBerry", browser.name
63
58
  refute browser.device.tablet?
64
59
  assert browser.device.mobile?
65
- assert browser.modern?
66
60
  assert_equal "10.0.9.1675", browser.full_version
67
61
  assert_equal "10", browser.version
68
62
  end
@@ -15,34 +15,6 @@ class BotsTest < Minitest::Test
15
15
  refute browser.bot?
16
16
  end
17
17
 
18
- test "doesn't consider empty UA as bot" do
19
- browser = Browser.new("")
20
- refute browser.bot?
21
- end
22
-
23
- test "allows setting empty string as bots" do
24
- Browser::Bot.detect_empty_ua!
25
- browser = Browser.new("")
26
-
27
- assert browser.bot?
28
- end
29
-
30
- test "allows setting nil as user agent for bots" do
31
- browser = Browser.new(nil)
32
- refute browser.bot?
33
-
34
- Browser::Bot.detect_empty_ua!
35
- browser = Browser.new(nil)
36
- assert browser.bot?
37
- end
38
-
39
- test "doesn't detect mozilla as a bot when considering empty UA" do
40
- Browser::Bot.detect_empty_ua!
41
- browser = Browser.new("Mozilla")
42
-
43
- refute browser.bot?
44
- end
45
-
46
18
  test "returns bot name" do
47
19
  browser = Browser.new(Browser["GOOGLE_BOT"])
48
20
  assert_equal "Google Bot", browser.bot.name
@@ -51,13 +23,6 @@ class BotsTest < Minitest::Test
51
23
  assert_equal "Facebook Bot", browser.bot.name
52
24
  end
53
25
 
54
- test "returns bot name (empty string ua detection enabled)" do
55
- Browser::Bot.detect_empty_ua!
56
- browser = Browser.new("")
57
-
58
- assert_equal browser.bot.name, "Generic Bot"
59
- end
60
-
61
26
  test "returns nil for non-bots" do
62
27
  browser = Browser.new(Browser["CHROME"])
63
28
  assert_nil browser.bot.name
@@ -84,7 +49,6 @@ class BotsTest < Minitest::Test
84
49
  refute browser.platform.windows10?
85
50
  refute browser.platform.windows_phone?
86
51
  refute browser.edge?
87
- refute browser.modern?
88
52
  refute browser.device.mobile?
89
53
  refute browser.webkit?
90
54
  refute browser.chrome?
@@ -116,9 +80,32 @@ class BotsTest < Minitest::Test
116
80
  end
117
81
 
118
82
  test "tells why user agent is considered a bot" do
119
- id, name = Browser::Bot.why?(Browser.bot_user_agents["LINKEDIN"])
83
+ matcher = Browser::Bot.why?(Browser.bot_user_agents["LINKEDIN"])
84
+
85
+ assert_equal Browser::Bot::KnownBotsMatcher, matcher
86
+ end
87
+
88
+ test "adds custom bot matcher" do
89
+ Browser::Bot.matchers << ->(ua, _) { ua.match?(/some-script/) }
90
+ browser = Browser.new("some-script")
120
91
 
121
- assert_equal "linkedinbot", id
122
- assert_equal "LinkedIn", name
92
+ assert browser.bot?
93
+ assert_equal "Generic Bot", browser.bot.name
94
+ end
95
+
96
+ %w[
97
+ content-fetcher
98
+ content-crawler
99
+ some-search-engine
100
+ monitoring-service
101
+ content-spider
102
+ some-bot
103
+ ].each do |ua|
104
+ test "detects user agents based on keywords (#{ua})" do
105
+ browser = Browser.new(ua)
106
+
107
+ assert browser.bot?
108
+ assert_equal Browser::Bot::KeywordMatcher, browser.bot.why?
109
+ end
123
110
  end
124
111
  end
@@ -10,7 +10,6 @@ class ChromeTest < Minitest::Test
10
10
  assert browser.chrome?
11
11
  refute browser.safari?
12
12
  assert browser.webkit?
13
- assert browser.modern?
14
13
  assert_equal "5.0.375.99", browser.full_version
15
14
  assert_equal "5", browser.version
16
15
  end
@@ -22,7 +21,6 @@ class ChromeTest < Minitest::Test
22
21
  assert browser.chrome?
23
22
  refute browser.safari?
24
23
  assert browser.webkit?
25
- assert browser.modern?
26
24
  assert_equal "19.0.1084.60", browser.full_version
27
25
  assert_equal "19", browser.version
28
26
  end
@@ -35,7 +33,6 @@ class ChromeTest < Minitest::Test
35
33
  assert browser.platform.android?
36
34
  refute browser.safari?
37
35
  assert browser.webkit?
38
- assert browser.modern?
39
36
  assert_equal "28.0.1500.94", browser.full_version
40
37
  assert_equal "28", browser.version
41
38
  end
@@ -61,6 +58,14 @@ class ChromeTest < Minitest::Test
61
58
  assert browser.chrome?
62
59
  end
63
60
 
61
+ test "detects chrome on android 10" do
62
+ browser = Browser.new(Browser["ANDROID_Q"])
63
+
64
+ assert browser.chrome?
65
+ assert_equal "Chrome", browser.name
66
+ assert_equal "78", browser.version
67
+ end
68
+
64
69
  test "detects version by range" do
65
70
  browser = Browser.new(Browser["CHROME"])
66
71
  assert browser.chrome?(%w[>=5 <6])
@@ -5,11 +5,11 @@ require "test_helper"
5
5
  class ConsoleTest < Minitest::Test
6
6
  test "detects psp" do
7
7
  browser = Browser.new(Browser["PSP"])
8
- assert_equal "Generic Browser", browser.name
8
+ assert_equal "Unknown Browser", browser.name
9
9
  end
10
10
 
11
11
  test "detects psp vita" do
12
12
  browser = Browser.new(Browser["PSP_VITA"])
13
- assert_equal "Generic Browser", browser.name
13
+ assert_equal "Unknown Browser", browser.name
14
14
  end
15
15
  end
@@ -5,7 +5,7 @@ require "test_helper"
5
5
  class DeviceTest < Minitest::Test
6
6
  class CustomDevice < Browser::Device::Base
7
7
  def match?
8
- ua =~ /Custom/
8
+ ua.include?("Custom")
9
9
  end
10
10
 
11
11
  def id
@@ -20,14 +20,14 @@ class DeviceTest < Minitest::Test
20
20
 
21
21
  Browser::Device.matchers.shift
22
22
  device = Browser::Device.new("Custom")
23
- assert_equal :unknown, device.id
23
+ assert_equal :unknown_device, device.id
24
24
  end
25
25
 
26
26
  test "detect generic device" do
27
27
  device = Browser::Device.new("")
28
28
 
29
29
  assert device.unknown?
30
- assert_equal :unknown, device.id
30
+ assert_equal :unknown_device, device.id
31
31
  end
32
32
 
33
33
  test "detect ipad" do
@@ -258,4 +258,31 @@ class DeviceTest < Minitest::Test
258
258
  assert_equal name, device.name
259
259
  end
260
260
  end
261
+
262
+ test "detect samsung devices" do
263
+ device = Browser::Device.new(Browser["SAMSUNG_SM-G975F"])
264
+
265
+ assert device.samsung?
266
+ assert_equal :samsung, device.id
267
+ assert_equal "Samsung Galaxy S10+", device.name
268
+ end
269
+
270
+ test "detect generic samsung devices" do
271
+ device = Browser::Device.new(Browser["SAMSUNG_SM-FAKE"])
272
+
273
+ assert device.samsung?
274
+ assert_equal :samsung, device.id
275
+ assert_equal "Samsung SM-0000", device.name
276
+ end
277
+
278
+ {
279
+ "SAMSUNG_SM-G975F" => "Samsung Galaxy S10+",
280
+ "SAMSUNG_SM-G960F" => "Samsung Galaxy S9",
281
+ "SAMSUNG_SM-F700F" => "Samsung Galaxy Z Flip"
282
+ }.each do |key, name|
283
+ test "detect device name of #{key} as #{name}" do
284
+ device = Browser::Device.new(Browser[key])
285
+ assert_equal name, device.name
286
+ end
287
+ end
261
288
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class DuckDuckGoTest < Minitest::Test
6
+ test "detects DuckDuckGo on iOS device" do
7
+ browser = Browser.new(Browser["DUCKDUCKGO_BROWSER_IOS"])
8
+ assert browser.duck_duck_go?
9
+ refute browser.safari?
10
+ refute browser.chrome?
11
+ assert browser.webkit?
12
+ refute browser.bot?
13
+ assert_equal "DuckDuckGo", browser.name
14
+ assert_equal :duckduckgo, browser.id
15
+ end
16
+
17
+ test "detects DuckDuckGo on Android device" do
18
+ browser = Browser.new(Browser["DUCKDUCKGO_BROWSER_ANDROID"])
19
+ assert browser.duck_duck_go?
20
+ refute browser.safari?
21
+ refute browser.chrome?
22
+ refute browser.bot?
23
+ assert_equal "DuckDuckGo", browser.name
24
+ assert_equal :duckduckgo, browser.id
25
+ end
26
+
27
+ test "detects correct version" do
28
+ browser = Browser.new(Browser["DUCKDUCKGO_BROWSER_IOS"])
29
+ assert_equal "7", browser.full_version
30
+ assert_equal "7", browser.version
31
+ end
32
+
33
+ test "detects version by range" do
34
+ browser = Browser.new(Browser["DUCKDUCKGO_BROWSER_IOS"])
35
+ assert browser.duck_duck_go?(%w[>=7 <8])
36
+ end
37
+ end
@@ -12,7 +12,6 @@ class EdgeTest < ActionController::TestCase
12
12
  assert_equal "12", browser.version
13
13
  assert browser.platform.windows10?
14
14
  assert browser.edge?
15
- assert browser.modern?
16
15
  refute browser.webkit?
17
16
  refute browser.chrome?
18
17
  refute browser.safari?
@@ -30,7 +29,6 @@ class EdgeTest < ActionController::TestCase
30
29
  assert_equal "7", browser.msie_version
31
30
  assert browser.edge?
32
31
  assert browser.compatibility_view?
33
- refute browser.modern?
34
32
  refute browser.webkit?
35
33
  refute browser.chrome?
36
34
  refute browser.safari?
@@ -47,7 +45,6 @@ class EdgeTest < ActionController::TestCase
47
45
  refute browser.platform.windows10?
48
46
  assert browser.platform.windows_phone?
49
47
  assert browser.edge?
50
- assert browser.modern?
51
48
  refute browser.webkit?
52
49
  refute browser.chrome?
53
50
  refute browser.safari?
@@ -63,14 +60,45 @@ class EdgeTest < ActionController::TestCase
63
60
  assert browser.platform.mac?
64
61
  refute browser.platform.windows?
65
62
  assert browser.edge?
66
- assert browser.modern?
67
63
  assert browser.webkit?
68
64
  refute browser.chrome?
69
65
  refute browser.safari?
70
66
  end
71
67
 
68
+ test "detects Microsoft Edge Mobile on iOS" do
69
+ browser = Browser.new(Browser["MS_EDGE_IOS"])
70
+
71
+ assert_equal :edge, browser.id
72
+ assert_equal "Microsoft Edge", browser.name
73
+ assert_equal "44.5.0.10", browser.full_version
74
+ assert_equal "44", browser.version
75
+ refute browser.platform.windows10?
76
+ refute browser.platform.windows_phone?
77
+ assert browser.platform.ios?
78
+ assert browser.edge?
79
+ refute browser.webkit?
80
+ refute browser.chrome?
81
+ refute browser.safari?
82
+ end
83
+
84
+ test "detects Microsoft Edge Mobile on Android" do
85
+ browser = Browser.new(Browser["MS_EDGE_ANDROID"])
86
+
87
+ assert_equal :edge, browser.id
88
+ assert_equal "Microsoft Edge", browser.name
89
+ assert_equal "44.11.2.4122", browser.full_version
90
+ assert_equal "44", browser.version
91
+ refute browser.platform.windows10?
92
+ refute browser.platform.windows_phone?
93
+ assert browser.platform.android?
94
+ assert browser.edge?
95
+ refute browser.webkit?
96
+ refute browser.chrome?
97
+ refute browser.safari?
98
+ end
99
+
72
100
  test "detects version by range" do
73
- browser = Browser.new(Browser["MS_EDGE"])
74
- assert browser.edge?(%w[>=12 <13])
101
+ browser = Browser.new(Browser["MS_EDGE_IOS"])
102
+ assert browser.edge?(%w[>=43 <45])
75
103
  end
76
104
  end
@@ -8,7 +8,6 @@ class FirefoxTest < Minitest::Test
8
8
 
9
9
  assert_equal "Firefox", browser.name
10
10
  assert browser.firefox?
11
- refute browser.modern?
12
11
  assert_equal "3.8", browser.full_version
13
12
  assert_equal "3", browser.version
14
13
  end
@@ -29,7 +28,6 @@ class FirefoxTest < Minitest::Test
29
28
  assert_equal :firefox, browser.id
30
29
  assert_equal "Firefox", browser.name
31
30
  assert browser.firefox?
32
- assert browser.modern?
33
31
  assert_equal "17.0", browser.full_version
34
32
  assert_equal "17", browser.version
35
33
  end
@@ -40,7 +38,6 @@ class FirefoxTest < Minitest::Test
40
38
  assert_equal :firefox, browser.id
41
39
  assert_equal "Firefox", browser.name
42
40
  assert browser.firefox?
43
- assert browser.modern?
44
41
  assert browser.platform.android?
45
42
  assert_equal "14.0", browser.full_version
46
43
  assert_equal "14", browser.version
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class GoogleSearchAppTest < Minitest::Test
6
+ test "detects Google Search App (Android)" do
7
+ browser = Browser.new(Browser["GOOGLE_SEARCH_APP_ANDROID"])
8
+
9
+ assert browser.webkit?
10
+ assert browser.google_search_app?
11
+ assert browser.platform.android?
12
+ assert_equal :google_search_app, browser.id
13
+ assert_equal "11", browser.version
14
+ assert_equal "11.6.8.21", browser.full_version
15
+ assert_equal "Google Search App", browser.name
16
+ refute browser.chrome?
17
+ refute browser.safari?
18
+ end
19
+
20
+ test "detects Google Search App (iPad)" do
21
+ browser = Browser.new(Browser["GOOGLE_SEARCH_APP_IPAD"])
22
+
23
+ assert browser.webkit?
24
+ assert browser.google_search_app?
25
+ assert browser.device.ipad?
26
+ assert browser.platform.ios?
27
+ assert_equal :google_search_app, browser.id
28
+ assert_equal "102", browser.version
29
+ assert_equal "102.0.304944559", browser.full_version
30
+ assert_equal "Google Search App", browser.name
31
+ refute browser.chrome?
32
+ refute browser.safari?
33
+ end
34
+
35
+ test "detects Google Search App (iPhone)" do
36
+ browser = Browser.new(Browser["GOOGLE_SEARCH_APP_IPHONE"])
37
+
38
+ assert browser.webkit?
39
+ assert browser.google_search_app?
40
+ assert browser.device.iphone?
41
+ assert browser.platform.ios?
42
+ assert_equal :google_search_app, browser.id
43
+ assert_equal "105", browser.version
44
+ assert_equal "105.0.307913796", browser.full_version
45
+ assert_equal "Google Search App", browser.name
46
+ refute browser.chrome?
47
+ refute browser.safari?
48
+ end
49
+
50
+ test "detects version by range (iPad)" do
51
+ browser = Browser.new(Browser["GOOGLE_SEARCH_APP_IPAD"])
52
+ assert browser.google_search_app?(%w[>=102 <103])
53
+ end
54
+ end