browser 4.1.0 → 5.3.0
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.
- checksums.yaml +4 -4
- data/.github/workflows/tests.yml +57 -0
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +46 -3
- data/FUNDING.yml +3 -0
- data/README.md +101 -50
- data/bots.yml +299 -298
- data/browser.gemspec +5 -4
- data/lib/browser/accept_language.rb +4 -4
- data/lib/browser/alipay.rb +1 -1
- data/lib/browser/base.rb +72 -13
- data/lib/browser/blackberry.rb +1 -1
- data/lib/browser/bot/keyword_matcher.rb +1 -1
- data/lib/browser/browser.rb +21 -2
- data/lib/browser/chrome.rb +9 -3
- data/lib/browser/device.rb +12 -5
- data/lib/browser/device/android.rb +1 -1
- data/lib/browser/device/blackberry_playbook.rb +1 -1
- data/lib/browser/device/ipad.rb +1 -1
- data/lib/browser/device/iphone.rb +1 -1
- data/lib/browser/device/ipod_touch.rb +1 -1
- data/lib/browser/device/kindle.rb +1 -1
- data/lib/browser/device/kindle_fire.rb +1 -1
- data/lib/browser/device/playstation3.rb +1 -1
- data/lib/browser/device/playstation4.rb +1 -1
- data/lib/browser/device/psp.rb +1 -1
- data/lib/browser/device/psvita.rb +1 -1
- data/lib/browser/device/samsung.rb +33 -0
- data/lib/browser/device/surface.rb +1 -1
- data/lib/browser/device/switch.rb +1 -1
- data/lib/browser/device/tv.rb +1 -1
- data/lib/browser/device/unknown.rb +1 -1
- data/lib/browser/device/wii.rb +1 -1
- data/lib/browser/device/wiiu.rb +1 -1
- data/lib/browser/device/xbox_360.rb +1 -1
- data/lib/browser/device/xbox_one.rb +1 -1
- data/lib/browser/duck_duck_go.rb +1 -1
- data/lib/browser/edge.rb +2 -2
- data/lib/browser/electron.rb +1 -1
- data/lib/browser/facebook.rb +1 -1
- data/lib/browser/firefox.rb +1 -1
- data/lib/browser/google_search_app.rb +21 -0
- data/lib/browser/huawei_browser.rb +21 -0
- data/lib/browser/instagram.rb +1 -1
- data/lib/browser/internet_explorer.rb +2 -2
- data/lib/browser/maxthon.rb +21 -0
- data/lib/browser/micro_messenger.rb +1 -1
- data/lib/browser/miui_browser.rb +21 -0
- data/lib/browser/nokia.rb +1 -1
- data/lib/browser/opera.rb +1 -1
- data/lib/browser/otter.rb +1 -1
- data/lib/browser/phantom_js.rb +1 -1
- data/lib/browser/platform.rb +21 -15
- data/lib/browser/platform/adobe_air.rb +1 -1
- data/lib/browser/platform/android.rb +1 -1
- data/lib/browser/platform/blackberry.rb +1 -1
- data/lib/browser/platform/chrome_os.rb +1 -1
- data/lib/browser/platform/firefox_os.rb +1 -1
- data/lib/browser/platform/ios.rb +2 -2
- data/lib/browser/platform/kai_os.rb +23 -0
- data/lib/browser/platform/linux.rb +1 -1
- data/lib/browser/platform/mac.rb +2 -2
- data/lib/browser/platform/{other.rb → unknown.rb} +3 -3
- data/lib/browser/platform/windows.rb +2 -2
- data/lib/browser/platform/windows_mobile.rb +1 -1
- data/lib/browser/platform/windows_phone.rb +1 -1
- data/lib/browser/qq.rb +1 -1
- data/lib/browser/safari.rb +12 -3
- data/lib/browser/samsung_browser.rb +1 -1
- data/lib/browser/snapchat.rb +1 -1
- data/lib/browser/sougou_browser.rb +24 -0
- data/lib/browser/sputnik.rb +1 -1
- data/lib/browser/uc_browser.rb +1 -1
- data/lib/browser/{generic.rb → unknown.rb} +3 -3
- data/lib/browser/version.rb +1 -1
- data/lib/browser/weibo.rb +1 -1
- data/lib/browser/yandex.rb +1 -1
- data/samsung.yml +138 -0
- data/test/browser_test.rb +37 -6
- data/test/ua.yml +18 -4
- data/test/ua_bots.yml +3 -2
- data/test/unit/adobe_air_test.rb +1 -1
- data/test/unit/alipay_test.rb +6 -0
- data/test/unit/bots_test.rb +1 -1
- data/test/unit/console_test.rb +2 -2
- data/test/unit/device_test.rb +30 -3
- data/test/unit/duck_duck_go_test.rb +2 -0
- data/test/unit/google_search_app_test.rb +54 -0
- data/test/unit/huawei_browser_test.rb +25 -0
- data/test/unit/kai_os_test.rb +31 -0
- data/test/unit/maxthon_test.rb +25 -0
- data/test/unit/meta_test.rb +10 -1
- data/test/unit/miui_browser_test.rb +25 -0
- data/test/unit/opera_test.rb +1 -0
- data/test/unit/platform_test.rb +7 -7
- data/test/unit/qq_test.rb +12 -0
- data/test/unit/safari_test.rb +12 -7
- data/test/unit/samsung_browser_test.rb +1 -0
- data/test/unit/sougou_browser_test.rb +41 -0
- metadata +37 -16
- data/.travis.yml +0 -23
data/test/browser_test.rb
CHANGED
@@ -106,14 +106,13 @@ class BrowserTest < Minitest::Test
|
|
106
106
|
refute browser.chrome?(">=65")
|
107
107
|
end
|
108
108
|
|
109
|
-
test "detects unknown
|
109
|
+
test "detects unknown browser" do
|
110
110
|
browser = Browser.new("Unknown")
|
111
|
-
assert_equal :generic, browser.id
|
112
|
-
end
|
113
111
|
|
114
|
-
|
115
|
-
browser
|
116
|
-
assert_equal
|
112
|
+
assert browser.unknown?
|
113
|
+
refute browser.known?
|
114
|
+
assert_equal :unknown_browser, browser.id
|
115
|
+
assert_equal "Unknown Browser", browser.name
|
117
116
|
end
|
118
117
|
|
119
118
|
test "returns empty language set for missing accept language" do
|
@@ -155,4 +154,36 @@ class BrowserTest < Minitest::Test
|
|
155
154
|
browser = Browser.new("Fancy new browser")
|
156
155
|
refute browser.known?
|
157
156
|
end
|
157
|
+
|
158
|
+
test "rejects user agent larger than 2048 bytes" do
|
159
|
+
message = "user_agent cannot be larger than 2048 bytes; actual size is " \
|
160
|
+
"2049 bytes"
|
161
|
+
|
162
|
+
error =
|
163
|
+
begin
|
164
|
+
Browser.new("a" * 2049)
|
165
|
+
nil
|
166
|
+
rescue Browser::Error => error
|
167
|
+
error
|
168
|
+
end
|
169
|
+
|
170
|
+
refute_nil error
|
171
|
+
assert_equal message, error.message
|
172
|
+
end
|
173
|
+
|
174
|
+
test "rejects accept language larger than 2048 bytes" do
|
175
|
+
message = "accept_language cannot be larger than 2048 bytes; actual size " \
|
176
|
+
"is 2049 bytes"
|
177
|
+
|
178
|
+
error =
|
179
|
+
begin
|
180
|
+
Browser.new("Chrome", accept_language: "a" * 2049).accept_language
|
181
|
+
nil
|
182
|
+
rescue Browser::Error => error
|
183
|
+
error
|
184
|
+
end
|
185
|
+
|
186
|
+
refute_nil error
|
187
|
+
assert_equal message, error.message
|
188
|
+
end
|
158
189
|
end
|
data/test/ua.yml
CHANGED
@@ -32,8 +32,8 @@ CHROME: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/53
|
|
32
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."
|
33
33
|
COREMEDIA: "Apple Mac OS X v10.6.4 CoreMedia v1.0.0.10F569"
|
34
34
|
CUSTOM_APP: "Our App 0.0.1 (Linux; Android 4.0.3; HTC Ruby Build/IML74K; en_CA)"
|
35
|
-
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"
|
36
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"
|
37
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"
|
38
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]
|
39
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;]"
|
@@ -44,6 +44,10 @@ FIREFOX_IOS: "Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/
|
|
44
44
|
FIREFOX_MODERN: "Mozilla/5.0 (X11; Ubuntu; Linux armv7l; rv:17.0) Gecko/20100101 Firefox/17.0"
|
45
45
|
FIREFOX_OS: "Mozilla/5.0 (Mobile; rv:18.0) Gecko/18.0 Firefox/18.0"
|
46
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"
|
47
51
|
IE10: "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; EIE10;ENUSMSN)"
|
48
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)"
|
49
53
|
IE10_X64_WINX64: "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)"
|
@@ -74,6 +78,7 @@ IOS_WEBVIEW: Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/6
|
|
74
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"
|
75
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"
|
76
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"
|
77
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)"
|
78
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"
|
79
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"
|
@@ -81,22 +86,25 @@ KINDLE_FIRE_HD_MOBILE: "Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/
|
|
81
86
|
LUMIA800: "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; XBLWP7; ZuneWP7"
|
82
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"
|
83
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"
|
84
|
-
|
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"
|
85
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"
|
86
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"
|
87
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"
|
88
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"
|
89
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"
|
90
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)"
|
91
|
-
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"
|
92
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"
|
93
|
-
|
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"
|
94
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"
|
95
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"
|
96
103
|
NINTENDO_SWITCH: "Mozilla/5.0 (Nintendo Switch; WifiWebAuthApplet) AppleWebKit/601.6 (KHTML, like Gecko) NF/4.0.0.7.9 NintendoBrowser/5.1.0.15785"
|
97
104
|
NINTENDO_WII: "Opera/9.00 (Nintendo Wii; U; ; 1309-9; en)"
|
98
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"
|
99
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"
|
100
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"
|
101
109
|
OPERA: "Opera/9.80 (Macintosh; Intel Mac OS X 10.7.4; U; en) Presto/2.10.229 Version/11.64"
|
102
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"
|
@@ -114,6 +122,8 @@ QQ_BROWSER_ANDROID: "Mozilla/5.0 (Linux; Android 5.1.1; SM-N9108V Build/LMY47X)
|
|
114
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"
|
115
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"
|
116
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"
|
117
127
|
QUICKTIME: "QuickTime/7.6.8 (qtver=7.6.8;os=Windows NT 5.1Service Pack 3)"
|
118
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"
|
119
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"
|
@@ -128,6 +138,10 @@ SAFARI_IPHONE_WEBAPP_MODE: "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_2 like Mac O
|
|
128
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"
|
129
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"
|
130
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"
|
131
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+"
|
132
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)
|
133
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)"
|
data/test/ua_bots.yml
CHANGED
@@ -13,7 +13,7 @@ BINGBOT: "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm
|
|
13
13
|
BINGPREVIEW: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) BingPreview/1.0b"
|
14
14
|
BUBING: "BUbiNG (+http://law.di.unimi.it/BUbiNG.html)"
|
15
15
|
BUZZBOT: "Buzzbot/1.0 (Buzzbot; http://www.buzzstream.com; buzzbot@buzzstream.com)"
|
16
|
-
CHROME_LIGHTHOUSE: "Mozilla/5.0 (
|
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"
|
17
17
|
CIPACRAWLER: "CipaCrawler/3.0 (info@domaincrawler.com; http://www.domaincrawler.com/www.example.com)"
|
18
18
|
CLOUDFLARE: "Mozilla/5.0 (compatible; CloudFlare-AlwaysOnline/1.0; +http://www.cloudflare.com/always-online) AppleWebKit/534.34"
|
19
19
|
COMMONCRAWL: "CCBot/2.0 (http://commoncrawl.org/faq/)"
|
@@ -76,7 +76,8 @@ SEOBILITYBOT: "SeobilityBot (SEO Tool; https://www.seobility.net/sites/bot.html)
|
|
76
76
|
SEODIVER: "Mozilla/5.0 (compatible; SEOdiver/1.0; +http://www.seodiver.com/bot)"
|
77
77
|
SEOKICKS: "Mozilla/5.0 (compatible; SEOkicks-Robot; +http://www.seokicks.de/robot.html)"
|
78
78
|
SISTRIX: "Mozilla/5.0 (compatible; SISTRIX Crawler; http://crawler.sistrix.net/)"
|
79
|
-
SITECHECK:
|
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"
|
80
81
|
SOCIALRANKIO: SocialRankIOBot; http://socialrank.io/about
|
81
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"
|
82
83
|
STRIPE: "Stripe/1.0 (+https://stripe.com/docs/webhooks)"
|
data/test/unit/adobe_air_test.rb
CHANGED
@@ -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 "
|
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
|
data/test/unit/alipay_test.rb
CHANGED
@@ -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
|
data/test/unit/bots_test.rb
CHANGED
@@ -86,7 +86,7 @@ class BotsTest < Minitest::Test
|
|
86
86
|
end
|
87
87
|
|
88
88
|
test "adds custom bot matcher" do
|
89
|
-
Browser::Bot.matchers << ->(ua, _) { ua
|
89
|
+
Browser::Bot.matchers << ->(ua, _) { ua.match?(/some-script/) }
|
90
90
|
browser = Browser.new("some-script")
|
91
91
|
|
92
92
|
assert browser.bot?
|
data/test/unit/console_test.rb
CHANGED
@@ -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 "
|
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 "
|
13
|
+
assert_equal "Unknown Browser", browser.name
|
14
14
|
end
|
15
15
|
end
|
data/test/unit/device_test.rb
CHANGED
@@ -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
|
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 :
|
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 :
|
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
|
@@ -9,6 +9,7 @@ class DuckDuckGoTest < Minitest::Test
|
|
9
9
|
refute browser.safari?
|
10
10
|
refute browser.chrome?
|
11
11
|
assert browser.webkit?
|
12
|
+
refute browser.bot?
|
12
13
|
assert_equal "DuckDuckGo", browser.name
|
13
14
|
assert_equal :duckduckgo, browser.id
|
14
15
|
end
|
@@ -18,6 +19,7 @@ class DuckDuckGoTest < Minitest::Test
|
|
18
19
|
assert browser.duck_duck_go?
|
19
20
|
refute browser.safari?
|
20
21
|
refute browser.chrome?
|
22
|
+
refute browser.bot?
|
21
23
|
assert_equal "DuckDuckGo", browser.name
|
22
24
|
assert_equal :duckduckgo, browser.id
|
23
25
|
end
|
@@ -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
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class HuaweiBrowserTest < Minitest::Test
|
6
|
+
test "detects Huawei Browser" do
|
7
|
+
browser = Browser.new(Browser["HUAWEI_BROWSER"])
|
8
|
+
assert browser.huawei_browser?
|
9
|
+
refute browser.safari?
|
10
|
+
refute browser.chrome?
|
11
|
+
assert_equal "Huawei Browser", browser.name
|
12
|
+
assert_equal :huawei_browser, browser.id
|
13
|
+
end
|
14
|
+
|
15
|
+
test "detects correct version" do
|
16
|
+
browser = Browser.new(Browser["HUAWEI_BROWSER"])
|
17
|
+
assert_equal "10.1.2.300", browser.full_version
|
18
|
+
assert_equal "10", browser.version
|
19
|
+
end
|
20
|
+
|
21
|
+
test "detects version by range" do
|
22
|
+
browser = Browser.new(Browser["HUAWEI_BROWSER"])
|
23
|
+
assert browser.huawei_browser?(%w[>=10 <11])
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class KaiOSTest < Minitest::Test
|
6
|
+
test "detects KaiOS" do
|
7
|
+
browser = Browser.new(Browser["NOKIA_8110"])
|
8
|
+
|
9
|
+
assert browser.firefox?
|
10
|
+
assert_equal "48", browser.version
|
11
|
+
assert_equal "48.0", browser.full_version
|
12
|
+
assert_equal "Firefox", browser.name
|
13
|
+
assert browser.platform.kai_os?
|
14
|
+
assert_equal "KaiOS", browser.platform.name
|
15
|
+
assert_equal "2.5", browser.platform.version
|
16
|
+
refute browser.platform.android?
|
17
|
+
end
|
18
|
+
|
19
|
+
test "detects KaiOS with Android string in user-agent " do
|
20
|
+
browser = Browser.new(Browser["JIOPHONE_2"])
|
21
|
+
|
22
|
+
assert browser.firefox?
|
23
|
+
assert_equal "48", browser.version
|
24
|
+
assert_equal "48.0", browser.full_version
|
25
|
+
assert_equal "Firefox", browser.name
|
26
|
+
assert browser.platform.kai_os?
|
27
|
+
assert_equal "KaiOS", browser.platform.name
|
28
|
+
assert_equal "2.5", browser.platform.version
|
29
|
+
refute browser.platform.android?
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class MaxthonTest < Minitest::Test
|
6
|
+
test "detects Maxthon" do
|
7
|
+
browser = Browser.new(Browser["MAXTHON"])
|
8
|
+
assert browser.maxthon?
|
9
|
+
refute browser.safari?
|
10
|
+
refute browser.chrome?
|
11
|
+
assert_equal "Maxthon", browser.name
|
12
|
+
assert_equal :maxthon, browser.id
|
13
|
+
end
|
14
|
+
|
15
|
+
test "detects correct version" do
|
16
|
+
browser = Browser.new(Browser["MAXTHON"])
|
17
|
+
assert_equal "5.3.8.2000", browser.full_version
|
18
|
+
assert_equal "5", browser.version
|
19
|
+
end
|
20
|
+
|
21
|
+
test "detects version by range" do
|
22
|
+
browser = Browser.new(Browser["MAXTHON"])
|
23
|
+
assert browser.maxthon?(%w[>=5 <6])
|
24
|
+
end
|
25
|
+
end
|
data/test/unit/meta_test.rb
CHANGED
@@ -5,7 +5,7 @@ require "test_helper"
|
|
5
5
|
class MetaTest < Minitest::Test
|
6
6
|
class CustomRule < Browser::Meta::Base
|
7
7
|
def meta
|
8
|
-
"custom" if browser.ua
|
8
|
+
"custom" if /Custom/.match?(browser.ua)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -45,4 +45,13 @@ class MetaTest < Minitest::Test
|
|
45
45
|
assert meta.include?("blackberry")
|
46
46
|
assert meta.include?("mobile")
|
47
47
|
end
|
48
|
+
|
49
|
+
test "returns string representation for unknown platform/device/browser" do
|
50
|
+
browser = Browser.new("Unknown")
|
51
|
+
meta = browser.to_s
|
52
|
+
|
53
|
+
assert meta.include?("unknown_platform")
|
54
|
+
assert meta.include?("unknown_device")
|
55
|
+
assert meta.include?("unknown_browser")
|
56
|
+
end
|
48
57
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class MiuiBrowserTest < Minitest::Test
|
6
|
+
test "detects Miui Browser" do
|
7
|
+
browser = Browser.new(Browser["MIUI_BROWSER"])
|
8
|
+
assert browser.miui_browser?
|
9
|
+
refute browser.safari?
|
10
|
+
refute browser.chrome?
|
11
|
+
assert_equal "Miui Browser", browser.name
|
12
|
+
assert_equal :miui_browser, browser.id
|
13
|
+
end
|
14
|
+
|
15
|
+
test "detects correct version" do
|
16
|
+
browser = Browser.new(Browser["MIUI_BROWSER"])
|
17
|
+
assert_equal "12.3.3", browser.full_version
|
18
|
+
assert_equal "12", browser.version
|
19
|
+
end
|
20
|
+
|
21
|
+
test "detects version by range" do
|
22
|
+
browser = Browser.new(Browser["MIUI_BROWSER"])
|
23
|
+
assert browser.miui_browser?(%w[>=12 <13])
|
24
|
+
end
|
25
|
+
end
|