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.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE.md +1 -1
- data/.github/workflows/tests.yml +57 -0
- data/.gitignore +1 -0
- data/.prettierignore +1 -0
- data/.rubocop.yml +13 -1
- data/CHANGELOG.md +122 -13
- data/FUNDING.yml +3 -0
- data/README.md +134 -88
- data/Rakefile +8 -1
- data/bot_exceptions.yml +1 -0
- data/bots.yml +300 -293
- data/browser.gemspec +4 -1
- data/gemfiles/{rails5.gemfile → rails6_1.gemfile} +1 -1
- data/lib/browser/accept_language.rb +4 -4
- data/lib/browser/aliases.rb +1 -1
- data/lib/browser/alipay.rb +1 -1
- data/lib/browser/base.rb +82 -18
- data/lib/browser/blackberry.rb +1 -1
- data/lib/browser/bot/empty_user_agent_matcher.rb +11 -0
- data/lib/browser/bot/keyword_matcher.rb +11 -0
- data/lib/browser/bot/known_bots_matcher.rb +11 -0
- data/lib/browser/bot.rb +34 -26
- data/lib/browser/browser.rb +59 -56
- data/lib/browser/chrome.rb +13 -3
- 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/device.rb +37 -27
- data/lib/browser/duck_duck_go.rb +22 -0
- data/lib/browser/edge.rb +3 -3
- 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/meta/base.rb +0 -1
- data/lib/browser/meta.rb +12 -13
- data/lib/browser/micro_messenger.rb +1 -1
- data/lib/browser/middleware/context/additions.rb +1 -1
- data/lib/browser/middleware.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/adobe_air.rb +1 -1
- data/lib/browser/platform/android.rb +1 -1
- data/lib/browser/platform/base.rb +3 -2
- 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 +5 -3
- 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/platform.rb +37 -28
- data/lib/browser/qq.rb +1 -1
- data/lib/browser/rails.rb +3 -3
- data/lib/browser/safari.rb +16 -1
- data/lib/browser/samsung_browser.rb +21 -0
- data/lib/browser/snapchat.rb +1 -1
- data/lib/browser/sougou_browser.rb +24 -0
- data/lib/browser/sputnik.rb +2 -5
- 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/lib/browser.rb +2 -2
- data/samsung.yml +138 -0
- data/test/browser_test.rb +37 -10
- data/test/test_helper.rb +8 -0
- data/test/ua.yml +26 -3
- data/test/ua_bots.yml +9 -2
- data/test/ua_search_engines.yml +1 -0
- data/test/unit/accept_language_test.rb +6 -0
- data/test/unit/adobe_air_test.rb +1 -1
- data/test/unit/alipay_test.rb +6 -0
- data/test/unit/blackberry_test.rb +0 -6
- data/test/unit/bots_test.rb +26 -39
- data/test/unit/chrome_test.rb +8 -3
- data/test/unit/console_test.rb +2 -2
- data/test/unit/device_test.rb +30 -3
- data/test/unit/duck_duck_go_test.rb +37 -0
- data/test/unit/edge_test.rb +34 -6
- data/test/unit/firefox_test.rb +0 -3
- data/test/unit/google_search_app_test.rb +54 -0
- data/test/unit/huawei_browser_test.rb +25 -0
- data/test/unit/internet_explorer_test.rb +0 -12
- data/test/unit/ios_test.rb +0 -5
- data/test/unit/kai_os_test.rb +31 -0
- data/test/unit/kindle_test.rb +0 -2
- data/test/unit/maxthon_test.rb +25 -0
- data/test/unit/meta_test.rb +10 -2
- data/test/unit/micro_messenger_test.rb +21 -6
- data/test/unit/miui_browser_test.rb +25 -0
- data/test/unit/opera_test.rb +1 -2
- data/test/unit/platform_test.rb +13 -8
- data/test/unit/qq_test.rb +12 -0
- data/test/unit/safari_test.rb +12 -7
- data/test/unit/samsung_browser_test.rb +23 -0
- data/test/unit/sougou_browser_test.rb +41 -0
- data/test/unit/sputnik_test.rb +1 -0
- metadata +46 -16
- data/.bundle/config +0 -2
- data/.travis.yml +0 -23
- data/lib/browser/meta/modern.rb +0 -11
- /data/gemfiles/{rails6.gemfile → rails6_0.gemfile} +0 -0
|
@@ -4,7 +4,7 @@ module Browser
|
|
|
4
4
|
class Platform
|
|
5
5
|
class Windows < Base
|
|
6
6
|
def version
|
|
7
|
-
ua[/Windows NT\s*([0-9_
|
|
7
|
+
ua[/Windows NT\s*([0-9_.]+)?/, 1] || "0"
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def name
|
|
@@ -16,7 +16,7 @@ module Browser
|
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def match?
|
|
19
|
-
ua
|
|
19
|
+
ua.include?("Windows")
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
22
|
end
|
data/lib/browser/platform.rb
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
3
|
+
require_relative "platform/base"
|
|
4
|
+
require_relative "platform/ios"
|
|
5
|
+
require_relative "platform/linux"
|
|
6
|
+
require_relative "platform/windows"
|
|
7
|
+
require_relative "platform/mac"
|
|
8
|
+
require_relative "platform/windows_phone"
|
|
9
|
+
require_relative "platform/windows_mobile"
|
|
10
|
+
require_relative "platform/firefox_os"
|
|
11
|
+
require_relative "platform/blackberry"
|
|
12
|
+
require_relative "platform/android"
|
|
13
|
+
require_relative "platform/unknown"
|
|
14
|
+
require_relative "platform/chrome_os"
|
|
15
|
+
require_relative "platform/adobe_air"
|
|
16
|
+
require_relative "platform/kai_os"
|
|
16
17
|
|
|
17
18
|
module Browser
|
|
18
19
|
class Platform
|
|
@@ -32,10 +33,11 @@ module Browser
|
|
|
32
33
|
BlackBerry,
|
|
33
34
|
IOS,
|
|
34
35
|
Mac,
|
|
36
|
+
KaiOS,
|
|
35
37
|
FirefoxOS,
|
|
36
38
|
Windows,
|
|
37
39
|
Linux,
|
|
38
|
-
|
|
40
|
+
Unknown
|
|
39
41
|
]
|
|
40
42
|
end
|
|
41
43
|
|
|
@@ -45,7 +47,7 @@ module Browser
|
|
|
45
47
|
|
|
46
48
|
def subject
|
|
47
49
|
@subject ||= self.class.matchers
|
|
48
|
-
.map {|matcher| matcher.new(ua) }
|
|
50
|
+
.map {|matcher| matcher.new(ua, self) }
|
|
49
51
|
.find(&:match?)
|
|
50
52
|
end
|
|
51
53
|
|
|
@@ -61,8 +63,8 @@ module Browser
|
|
|
61
63
|
id == :android && detect_version?(version, expected_version)
|
|
62
64
|
end
|
|
63
65
|
|
|
64
|
-
def
|
|
65
|
-
id == :
|
|
66
|
+
def unknown?
|
|
67
|
+
id == :unknown_platform
|
|
66
68
|
end
|
|
67
69
|
|
|
68
70
|
def linux?
|
|
@@ -81,6 +83,10 @@ module Browser
|
|
|
81
83
|
id == :firefox_os
|
|
82
84
|
end
|
|
83
85
|
|
|
86
|
+
def kai_os?
|
|
87
|
+
id == :kai_os
|
|
88
|
+
end
|
|
89
|
+
|
|
84
90
|
def ios?(expected_version = nil)
|
|
85
91
|
id == :ios && detect_version?(version, expected_version)
|
|
86
92
|
end
|
|
@@ -130,46 +136,46 @@ module Browser
|
|
|
130
136
|
# Detect if in an Android app webview (Lollipop and newer)
|
|
131
137
|
# https://developer.chrome.com/multidevice/user-agent#webview_user_agent
|
|
132
138
|
def android_app?
|
|
133
|
-
android? && ua
|
|
139
|
+
android? && ua.match?(/\bwv\b/)
|
|
134
140
|
end
|
|
135
141
|
alias_method :android_webview?, :android_app?
|
|
136
142
|
|
|
137
143
|
# http://msdn.microsoft.com/fr-FR/library/ms537503.aspx#PltToken
|
|
138
144
|
def windows_xp?
|
|
139
|
-
windows? && ua
|
|
145
|
+
windows? && ua.match?(/Windows NT 5\.[12]/)
|
|
140
146
|
end
|
|
141
147
|
|
|
142
148
|
def windows_vista?
|
|
143
|
-
windows? && ua
|
|
149
|
+
windows? && ua.include?("Windows NT 6.0")
|
|
144
150
|
end
|
|
145
151
|
|
|
146
152
|
def windows7?
|
|
147
|
-
windows? && ua
|
|
153
|
+
windows? && ua.include?("Windows NT 6.1")
|
|
148
154
|
end
|
|
149
155
|
|
|
150
156
|
def windows8?
|
|
151
|
-
windows? && ua
|
|
157
|
+
windows? && ua.match?(/Windows NT 6\.[2-3]/)
|
|
152
158
|
end
|
|
153
159
|
|
|
154
160
|
def windows8_1?
|
|
155
|
-
windows? && ua
|
|
161
|
+
windows? && ua.include?("Windows NT 6.3")
|
|
156
162
|
end
|
|
157
163
|
|
|
158
164
|
def windows10?
|
|
159
|
-
windows? && ua
|
|
165
|
+
windows? && ua.include?("Windows NT 10")
|
|
160
166
|
end
|
|
161
167
|
|
|
162
168
|
def windows_rt?
|
|
163
|
-
windows8? && ua
|
|
169
|
+
windows8? && ua.include?("ARM")
|
|
164
170
|
end
|
|
165
171
|
|
|
166
172
|
# Detect if current platform is Windows in 64-bit architecture.
|
|
167
173
|
def windows_x64?
|
|
168
|
-
windows? && ua
|
|
174
|
+
windows? && ua.match?(/(Win64|x64|Windows NT 5\.2)/)
|
|
169
175
|
end
|
|
170
176
|
|
|
171
177
|
def windows_wow64?
|
|
172
|
-
windows? && ua
|
|
178
|
+
windows? && ua.match?(/WOW64/i)
|
|
173
179
|
end
|
|
174
180
|
|
|
175
181
|
def windows_x64_inclusive?
|
|
@@ -177,7 +183,10 @@ module Browser
|
|
|
177
183
|
end
|
|
178
184
|
|
|
179
185
|
def windows_touchscreen_desktop?
|
|
180
|
-
windows? && ua
|
|
186
|
+
windows? && ua.include?("Touch")
|
|
181
187
|
end
|
|
188
|
+
|
|
189
|
+
private :subject
|
|
190
|
+
private :ua
|
|
182
191
|
end
|
|
183
192
|
end
|
data/lib/browser/qq.rb
CHANGED
data/lib/browser/rails.rb
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require "rails/railtie"
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
require_relative "action_controller"
|
|
5
|
+
require_relative "middleware/context/additions"
|
|
6
6
|
|
|
7
7
|
module Browser
|
|
8
8
|
class Railtie < Rails::Railtie
|
|
@@ -12,7 +12,7 @@ module Browser
|
|
|
12
12
|
ActiveSupport.on_load(:action_controller) do
|
|
13
13
|
::ActionController::Base.include(Browser::ActionController)
|
|
14
14
|
|
|
15
|
-
::ActionController::Metal.include(Browser::ActionController) if defined?(::ActionController::Metal) # rubocop:disable
|
|
15
|
+
::ActionController::Metal.include(Browser::ActionController) if defined?(::ActionController::Metal) # rubocop:disable Layout/LineLength
|
|
16
16
|
|
|
17
17
|
Browser::Middleware::Context.include(
|
|
18
18
|
Browser::Middleware::Context::Additions
|
data/lib/browser/safari.rb
CHANGED
|
@@ -18,7 +18,22 @@ module Browser
|
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
def match?
|
|
21
|
-
ua
|
|
21
|
+
ua.include?("Safari") &&
|
|
22
|
+
!ua.match?(/PhantomJS|FxiOS/) &&
|
|
23
|
+
!edge? &&
|
|
24
|
+
!chrome? &&
|
|
25
|
+
!opera? &&
|
|
26
|
+
!samsung_browser? &&
|
|
27
|
+
!huawei_browser? &&
|
|
28
|
+
!miui_browser? &&
|
|
29
|
+
!duck_duck_go? &&
|
|
30
|
+
!yandex? &&
|
|
31
|
+
!sputnik? &&
|
|
32
|
+
!maxthon? &&
|
|
33
|
+
!qq? &&
|
|
34
|
+
!alipay? &&
|
|
35
|
+
!sougou_browser? &&
|
|
36
|
+
!google_search_app?
|
|
22
37
|
end
|
|
23
38
|
end
|
|
24
39
|
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Browser
|
|
4
|
+
class SamsungBrowser < Chrome
|
|
5
|
+
def id
|
|
6
|
+
:samsung_browser
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def name
|
|
10
|
+
"Samsung Browser"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def full_version
|
|
14
|
+
ua[%r{SamsungBrowser/([\d.]+)}, 1] || super
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def match?
|
|
18
|
+
ua.include?("SamsungBrowser")
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
data/lib/browser/snapchat.rb
CHANGED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Browser
|
|
4
|
+
class SougouBrowser < Base
|
|
5
|
+
def id
|
|
6
|
+
:sougou_browser
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def name
|
|
10
|
+
"Sougou Browser"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# We can't get the real version on desktop device from the ua string
|
|
14
|
+
def full_version
|
|
15
|
+
ua[%r{(?:SogouMobileBrowser)/([\d.]+)}, 1] || "0.0"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# SogouMobileBrowser for mobile device
|
|
19
|
+
# SE for desktop device
|
|
20
|
+
def match?
|
|
21
|
+
ua.match?(/SogouMobileBrowser/i) || ua.match?(/\bSE\b/)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/lib/browser/sputnik.rb
CHANGED
|
@@ -11,14 +11,11 @@ module Browser
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def full_version
|
|
14
|
-
|
|
15
|
-
ua[%r{SputnikBrowser/([\d.]+)}, 1] ||
|
|
16
|
-
ua[%r{Chrome/([\d.]+)}, 1] ||
|
|
17
|
-
"0.0"
|
|
14
|
+
ua[%r{SputnikBrowser/([\d.]+)}, 1] || "0.0"
|
|
18
15
|
end
|
|
19
16
|
|
|
20
17
|
def match?
|
|
21
|
-
ua
|
|
18
|
+
ua.include?("SputnikBrowser")
|
|
22
19
|
end
|
|
23
20
|
end
|
|
24
21
|
end
|
data/lib/browser/uc_browser.rb
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module Browser
|
|
4
|
-
class
|
|
4
|
+
class Unknown < Base
|
|
5
5
|
NAMES = {
|
|
6
6
|
"QuickTime" => "QuickTime",
|
|
7
7
|
"CoreMedia" => "Apple CoreMedia"
|
|
8
8
|
}.freeze
|
|
9
9
|
|
|
10
10
|
def id
|
|
11
|
-
:
|
|
11
|
+
:unknown_browser
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def name
|
|
15
|
-
infer_name || "
|
|
15
|
+
infer_name || "Unknown Browser"
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def full_version
|
data/lib/browser/version.rb
CHANGED
data/lib/browser/weibo.rb
CHANGED
data/lib/browser/yandex.rb
CHANGED
data/lib/browser.rb
CHANGED
data/samsung.yml
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Source: https://en.wikipedia.org/wiki/Samsung_Galaxy
|
|
2
|
+
SM-G900H: Galaxy S5 Exynos
|
|
3
|
+
SM-A320FL: Galaxy A3
|
|
4
|
+
SM-G780F: Galaxy S20 Fan Edition
|
|
5
|
+
SM-G781B: Galaxy S20 Fan Edition
|
|
6
|
+
SM-F196B: Galaxy Z Fold2 5G
|
|
7
|
+
SM-G928A: Galaxy S6 Edge+
|
|
8
|
+
SM-G928AZ: Galaxy S6 Edge+
|
|
9
|
+
SM-G928D: Galaxy S6 Edge+
|
|
10
|
+
SM-G928F: Galaxy S6 Edge+
|
|
11
|
+
SM-G928FD: Galaxy S6 Edge+
|
|
12
|
+
SM-G928I: Galaxy S6 Edge+
|
|
13
|
+
SM-G928K: Galaxy S6 Edge+
|
|
14
|
+
SM-G928L: Galaxy S6 Edge+
|
|
15
|
+
SM-G928P: Galaxy S6 Edge+
|
|
16
|
+
SM-G928PZ: Galaxy S6 Edge+
|
|
17
|
+
SM-G928R4: Galaxy S6 Edge+
|
|
18
|
+
SM-G928R7: Galaxy S6 Edge+
|
|
19
|
+
SM-G928S: Galaxy S6 Edge+
|
|
20
|
+
SM-G928T: Galaxy S6 Edge+
|
|
21
|
+
SM-G928T1: Galaxy S6 Edge+
|
|
22
|
+
SM-G928TR: Galaxy S6 Edge+
|
|
23
|
+
SM-G928V: Galaxy S6 Edge+
|
|
24
|
+
SM-G9280: Galaxy S6 Edge+
|
|
25
|
+
SM-G9288: Galaxy S6 Edge+
|
|
26
|
+
SM-G9289: Galaxy S6 Edge+
|
|
27
|
+
SM-A8000: Galaxy A8
|
|
28
|
+
SM-A800F: Galaxy A8
|
|
29
|
+
SM-A800I: Galaxy A8
|
|
30
|
+
SM-A800S: Galaxy A8
|
|
31
|
+
SM-A800Y: Galaxy A8
|
|
32
|
+
SM-N9200: Galaxy Note 5
|
|
33
|
+
SM-N920C: Galaxy Note 5
|
|
34
|
+
SM-N920T: Galaxy Note 5
|
|
35
|
+
SM-N920A: Galaxy Note 5
|
|
36
|
+
SM-N920I: Galaxy Note 5
|
|
37
|
+
SM-N9208: Galaxy Note 5
|
|
38
|
+
SM-G903FP: Galaxy S5 Neo
|
|
39
|
+
SM-G903WP: Galaxy S5 Neo
|
|
40
|
+
SM-G925A: Galaxy S6 Edge
|
|
41
|
+
SM-G925AZ: Galaxy S6 Edge
|
|
42
|
+
SM-G925F: Galaxy S6 Edge
|
|
43
|
+
SM-G925I: Galaxy S6 Edge
|
|
44
|
+
SM-G925K: Galaxy S6 Edge
|
|
45
|
+
SM-G925L: Galaxy S6 Edge
|
|
46
|
+
SM-G925P: Galaxy S6 Edge
|
|
47
|
+
SM-G925PZ: Galaxy S6 Edge
|
|
48
|
+
SM-G925R4: Galaxy S6 Edge
|
|
49
|
+
SM-G925R7: Galaxy S6 Edge
|
|
50
|
+
SM-G925S: Galaxy S6 Edge
|
|
51
|
+
SM-G925T: Galaxy S6 Edge
|
|
52
|
+
SM-G925T1: Galaxy S6 Edge
|
|
53
|
+
SM-G925TR: Galaxy S6 Edge
|
|
54
|
+
SM-G925V: Galaxy S6 Edge
|
|
55
|
+
SM-G9250: Galaxy S6 Edge
|
|
56
|
+
SM-G9258: Galaxy S6 Edge
|
|
57
|
+
SM-G9259: Galaxy S6 Edge
|
|
58
|
+
SM-G920A: Galaxy S6
|
|
59
|
+
SM-G920AZ: Galaxy S6
|
|
60
|
+
SM-G920D: Galaxy S6
|
|
61
|
+
SM-G920F: Galaxy S6
|
|
62
|
+
SM-G920FD: Galaxy S6
|
|
63
|
+
SM-G920I: Galaxy S6
|
|
64
|
+
SM-G920K: Galaxy S6
|
|
65
|
+
SM-G920L: Galaxy S6
|
|
66
|
+
SM-G920P: Galaxy S6
|
|
67
|
+
SM-G920PZ: Galaxy S6
|
|
68
|
+
SM-G920R4: Galaxy S6
|
|
69
|
+
SM-G920R7: Galaxy S6
|
|
70
|
+
SM-G920S: Galaxy S6
|
|
71
|
+
SM-G920T: Galaxy S6
|
|
72
|
+
SM-G920T1: Galaxy S6
|
|
73
|
+
SM-G920TR: Galaxy S6
|
|
74
|
+
SM-G920V: Galaxy S6
|
|
75
|
+
SM-G9200: Galaxy S6
|
|
76
|
+
SM-G9208: Galaxy S6
|
|
77
|
+
SM-G9209: Galaxy S6
|
|
78
|
+
SM-A700F: Galaxy A7
|
|
79
|
+
SM-A700FD: Galaxy A7
|
|
80
|
+
SM-A700FQ: Galaxy A7
|
|
81
|
+
SM-A700H: Galaxy A7
|
|
82
|
+
SM-A700K: Galaxy A7
|
|
83
|
+
SM-A700L: Galaxy A7
|
|
84
|
+
SM-A700M: Galaxy A7
|
|
85
|
+
SM-A700S: Galaxy A7
|
|
86
|
+
SM-A700X: Galaxy A7
|
|
87
|
+
SM-A700YD: Galaxy A7
|
|
88
|
+
SM-A700YZ: Galaxy A7
|
|
89
|
+
SM-A7000: Galaxy A7
|
|
90
|
+
SM-A7009: Galaxy A7
|
|
91
|
+
SM-A7009W: Galaxy A7
|
|
92
|
+
SM-G530BT: Galaxy Grand Prime
|
|
93
|
+
SM-G530F: Galaxy Grand Prime
|
|
94
|
+
SM-G530FQ: Galaxy Grand Prime
|
|
95
|
+
SM-G530FZ: Galaxy Grand Prime
|
|
96
|
+
SM-G530H: Galaxy Grand Prime
|
|
97
|
+
SM-G530M: Galaxy Grand Prime
|
|
98
|
+
SM-G530MU: Galaxy Grand Prime
|
|
99
|
+
SM-G530P: Galaxy Grand Prime
|
|
100
|
+
SM-G530R4: Galaxy Grand Prime
|
|
101
|
+
SM-G530R7: Galaxy Grand Prime
|
|
102
|
+
SM-G530T: Galaxy Grand Prime
|
|
103
|
+
SM-G530W: Galaxy Grand Prime
|
|
104
|
+
SM-G530Y: Galaxy Grand Prime
|
|
105
|
+
SM-G5306W: Galaxy Grand Prime
|
|
106
|
+
SM-G5308W: Galaxy Grand Prime
|
|
107
|
+
SM-G5309W: Galaxy Grand Prime
|
|
108
|
+
SM-J7109: Galaxy J7
|
|
109
|
+
SM-J710F: Galaxy J7
|
|
110
|
+
SM-J710FN: Galaxy J7
|
|
111
|
+
SM-J710H: Galaxy J7
|
|
112
|
+
SM-J710MN: Galaxy J7
|
|
113
|
+
SM-J710FQ: Galaxy J7
|
|
114
|
+
SM-J710K: Galaxy J7
|
|
115
|
+
SM-J710K: Galaxy J7
|
|
116
|
+
SM-J710GN: Galaxy J7
|
|
117
|
+
SM-J5109: Galaxy J5
|
|
118
|
+
SM-J510F: Galaxy J5
|
|
119
|
+
SM-J510FN: Galaxy J5
|
|
120
|
+
SM-J510H: Galaxy J5
|
|
121
|
+
SM-J510G: Galaxy J5
|
|
122
|
+
SM-J510MN: Galaxy J5
|
|
123
|
+
SM-J510Y: Galaxy J5
|
|
124
|
+
SM-J5108: Galaxy J5
|
|
125
|
+
SM-J510K: Galaxy J5
|
|
126
|
+
SM-J510L: Galaxy J5
|
|
127
|
+
SM-J510S: Galaxy J5
|
|
128
|
+
SM-J510UN: Galaxy J5
|
|
129
|
+
SM-G570F: Galaxy J2 Prime
|
|
130
|
+
SM-G570M: Galaxy J2 Prime
|
|
131
|
+
SM-G532F: Galaxy J2 Prime
|
|
132
|
+
SM-G532M: Galaxy J2 Prime
|
|
133
|
+
SM-G532G: Galaxy J2 Prime
|
|
134
|
+
SM-G610F: Galaxy J7 Prime
|
|
135
|
+
SM-G610M: Galaxy J7 Prime
|
|
136
|
+
SM-G975F: Galaxy S10+
|
|
137
|
+
SM-G960F: Galaxy S9
|
|
138
|
+
SM-F700F: Galaxy Z Flip
|
data/test/browser_test.rb
CHANGED
|
@@ -39,7 +39,6 @@ class BrowserTest < Minitest::Test
|
|
|
39
39
|
assert browser.platform.android?
|
|
40
40
|
assert browser.safari?
|
|
41
41
|
assert browser.webkit?
|
|
42
|
-
assert browser.modern?
|
|
43
42
|
assert_equal "3.1.2", browser.full_version
|
|
44
43
|
assert_equal "3", browser.version
|
|
45
44
|
end
|
|
@@ -51,7 +50,6 @@ class BrowserTest < Minitest::Test
|
|
|
51
50
|
assert browser.platform.android?
|
|
52
51
|
assert browser.safari?
|
|
53
52
|
assert browser.webkit?
|
|
54
|
-
assert browser.modern?
|
|
55
53
|
assert_equal "4.0", browser.full_version
|
|
56
54
|
assert_equal "4", browser.version
|
|
57
55
|
end
|
|
@@ -62,7 +60,6 @@ class BrowserTest < Minitest::Test
|
|
|
62
60
|
assert_equal "Internet Explorer", browser.name
|
|
63
61
|
assert browser.device.surface?
|
|
64
62
|
assert browser.ie?
|
|
65
|
-
assert browser.modern?
|
|
66
63
|
assert_equal "10.0", browser.full_version
|
|
67
64
|
assert_equal "10", browser.version
|
|
68
65
|
end
|
|
@@ -93,7 +90,6 @@ class BrowserTest < Minitest::Test
|
|
|
93
90
|
assert_equal "PhantomJS", browser.name
|
|
94
91
|
assert_equal :phantom_js, browser.id
|
|
95
92
|
assert browser.phantom_js?
|
|
96
|
-
assert browser.modern?
|
|
97
93
|
assert_equal "1.9.0", browser.full_version
|
|
98
94
|
assert_equal "1", browser.version
|
|
99
95
|
assert browser.phantom_js?(%w[>=1 <2])
|
|
@@ -110,14 +106,13 @@ class BrowserTest < Minitest::Test
|
|
|
110
106
|
refute browser.chrome?(">=65")
|
|
111
107
|
end
|
|
112
108
|
|
|
113
|
-
test "detects unknown
|
|
109
|
+
test "detects unknown browser" do
|
|
114
110
|
browser = Browser.new("Unknown")
|
|
115
|
-
assert_equal :generic, browser.id
|
|
116
|
-
end
|
|
117
111
|
|
|
118
|
-
|
|
119
|
-
browser
|
|
120
|
-
assert_equal
|
|
112
|
+
assert browser.unknown?
|
|
113
|
+
refute browser.known?
|
|
114
|
+
assert_equal :unknown_browser, browser.id
|
|
115
|
+
assert_equal "Unknown Browser", browser.name
|
|
121
116
|
end
|
|
122
117
|
|
|
123
118
|
test "returns empty language set for missing accept language" do
|
|
@@ -159,4 +154,36 @@ class BrowserTest < Minitest::Test
|
|
|
159
154
|
browser = Browser.new("Fancy new browser")
|
|
160
155
|
refute browser.known?
|
|
161
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
|
|
162
189
|
end
|