browser 2.5.2 → 5.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- 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 +22 -107
- data/CHANGELOG.md +192 -11
- data/FUNDING.yml +3 -0
- data/Gemfile +2 -0
- data/README.md +139 -89
- data/Rakefile +11 -3
- data/bot_exceptions.yml +2 -0
- data/bots.yml +302 -247
- data/browser.gemspec +12 -7
- data/gemfiles/rails6_0.gemfile +6 -0
- data/gemfiles/rails6_1.gemfile +6 -0
- data/lib/browser/accept_language.rb +12 -9
- data/lib/browser/action_controller.rb +1 -3
- data/lib/browser/aliases.rb +5 -5
- data/lib/browser/alipay.rb +2 -2
- data/lib/browser/base.rb +101 -19
- data/lib/browser/blackberry.rb +3 -3
- 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 +39 -27
- data/lib/browser/browser.rb +65 -54
- data/lib/browser/chrome.rb +18 -5
- data/lib/browser/detect_version.rb +5 -5
- data/lib/browser/device/android.rb +20 -0
- 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 +2 -4
- data/lib/browser/device/switch.rb +19 -0
- 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 +47 -30
- data/lib/browser/duck_duck_go.rb +22 -0
- data/lib/browser/edge.rb +6 -2
- data/lib/browser/electron.rb +2 -2
- data/lib/browser/facebook.rb +4 -2
- data/lib/browser/firefox.rb +2 -2
- data/lib/browser/google_search_app.rb +21 -0
- data/lib/browser/huawei_browser.rb +21 -0
- data/lib/browser/instagram.rb +21 -0
- data/lib/browser/internet_explorer.rb +9 -10
- data/lib/browser/maxthon.rb +21 -0
- data/lib/browser/meta/base.rb +0 -1
- data/lib/browser/meta/generic_browser.rb +1 -3
- data/lib/browser/meta.rb +12 -13
- data/lib/browser/micro_messenger.rb +2 -2
- data/lib/browser/middleware/context/additions.rb +1 -1
- data/lib/browser/middleware.rb +4 -3
- data/lib/browser/miui_browser.rb +21 -0
- data/lib/browser/nokia.rb +2 -2
- data/lib/browser/opera.rb +2 -2
- data/lib/browser/otter.rb +2 -2
- data/lib/browser/phantom_js.rb +2 -2
- data/lib/browser/platform/adobe_air.rb +2 -2
- data/lib/browser/platform/android.rb +1 -1
- data/lib/browser/platform/base.rb +3 -2
- data/lib/browser/platform/blackberry.rb +2 -2
- data/lib/browser/platform/chrome_os.rb +1 -1
- data/lib/browser/platform/firefox_os.rb +1 -1
- data/lib/browser/platform/ios.rb +17 -4
- 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 +5 -5
- data/lib/browser/rails.rb +11 -5
- data/lib/browser/safari.rb +19 -4
- data/lib/browser/samsung_browser.rb +21 -0
- data/lib/browser/snapchat.rb +21 -0
- data/lib/browser/sougou_browser.rb +24 -0
- data/lib/browser/sputnik.rb +21 -0
- data/lib/browser/uc_browser.rb +2 -2
- data/lib/browser/{generic.rb → unknown.rb} +6 -8
- data/lib/browser/version.rb +1 -1
- data/lib/browser/weibo.rb +2 -2
- data/lib/browser/yandex.rb +21 -0
- data/lib/browser.rb +2 -2
- data/samsung.yml +138 -0
- data/search_engines.yml +2 -2
- data/test/browser_test.rb +42 -10
- data/test/rails_test.rb +10 -0
- data/test/sample_app.rb +14 -0
- data/test/test_helper.rb +9 -1
- data/test/ua.yml +147 -109
- data/test/ua_bots.yml +98 -45
- data/test/ua_search_engines.yml +7 -6
- data/test/unit/accept_language_test.rb +24 -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 +37 -27
- data/test/unit/chrome_test.rb +8 -19
- data/test/unit/console_test.rb +2 -2
- data/test/unit/device_test.rb +60 -3
- data/test/unit/duck_duck_go_test.rb +37 -0
- data/test/unit/edge_test.rb +49 -5
- data/test/unit/facebook_test.rb +20 -0
- 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/instagram_test.rb +30 -0
- data/test/unit/internet_explorer_test.rb +0 -12
- data/test/unit/ios_test.rb +7 -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 +34 -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/snapchat_test.rb +40 -0
- data/test/unit/sougou_browser_test.rb +41 -0
- data/test/unit/sputnik_test.rb +22 -0
- data/test/unit/yandex_test.rb +37 -0
- metadata +83 -26
- data/.bundle/config +0 -2
- data/.travis.yml +0 -16
- data/bin/rake +0 -17
- data/gemfiles/rails4.gemfile +0 -4
- data/lib/browser/meta/modern.rb +0 -11
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Browser
|
4
|
+
class Device
|
5
|
+
class Android < Base
|
6
|
+
def id
|
7
|
+
:unknown
|
8
|
+
end
|
9
|
+
|
10
|
+
def name
|
11
|
+
ua[/\(Linux.*?; Android.*?; ([-_a-z0-9 ]+) Build[^)]+\)/i, 1] ||
|
12
|
+
"Unknown"
|
13
|
+
end
|
14
|
+
|
15
|
+
def match?
|
16
|
+
ua.include?("Android")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/browser/device/ipad.rb
CHANGED
data/lib/browser/device/psp.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Browser
|
4
|
+
class Device
|
5
|
+
class Samsung < Base
|
6
|
+
REGEX = /\(Linux.*?; Android.*?; (SAMSUNG )?(SM-[A-Z0-9]+).*?\)/i.freeze
|
7
|
+
|
8
|
+
def self.names
|
9
|
+
@names ||= YAML.load_file(Browser.root.join("samsung.yml").to_s)
|
10
|
+
end
|
11
|
+
|
12
|
+
def id
|
13
|
+
:samsung
|
14
|
+
end
|
15
|
+
|
16
|
+
def name
|
17
|
+
"Samsung #{self.class.names[code] || code}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def code
|
21
|
+
matches && matches[2]
|
22
|
+
end
|
23
|
+
|
24
|
+
def matches
|
25
|
+
@matches ||= ua.match(REGEX)
|
26
|
+
end
|
27
|
+
|
28
|
+
def match?
|
29
|
+
!!matches
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/browser/device/tv.rb
CHANGED
data/lib/browser/device/wii.rb
CHANGED
data/lib/browser/device/wiiu.rb
CHANGED
data/lib/browser/device.rb
CHANGED
@@ -1,23 +1,26 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
3
|
+
require_relative "device/base"
|
4
|
+
require_relative "device/android"
|
5
|
+
require_relative "device/unknown"
|
6
|
+
require_relative "device/ipad"
|
7
|
+
require_relative "device/ipod_touch"
|
8
|
+
require_relative "device/iphone"
|
9
|
+
require_relative "device/playstation3"
|
10
|
+
require_relative "device/playstation4"
|
11
|
+
require_relative "device/psp"
|
12
|
+
require_relative "device/psvita"
|
13
|
+
require_relative "device/kindle"
|
14
|
+
require_relative "device/kindle_fire"
|
15
|
+
require_relative "device/wii"
|
16
|
+
require_relative "device/wiiu"
|
17
|
+
require_relative "device/blackberry_playbook"
|
18
|
+
require_relative "device/surface"
|
19
|
+
require_relative "device/switch"
|
20
|
+
require_relative "device/tv"
|
21
|
+
require_relative "device/xbox_one"
|
22
|
+
require_relative "device/xbox_360"
|
23
|
+
require_relative "device/samsung"
|
21
24
|
|
22
25
|
module Browser
|
23
26
|
class Device
|
@@ -27,6 +30,7 @@ module Browser
|
|
27
30
|
# Order is important.
|
28
31
|
def self.matchers
|
29
32
|
@matchers ||= [
|
33
|
+
Samsung,
|
30
34
|
XboxOne,
|
31
35
|
Xbox360,
|
32
36
|
Surface,
|
@@ -34,6 +38,7 @@ module Browser
|
|
34
38
|
BlackBerryPlaybook,
|
35
39
|
WiiU,
|
36
40
|
Wii,
|
41
|
+
Switch,
|
37
42
|
KindleFire,
|
38
43
|
Kindle,
|
39
44
|
PlayStation4,
|
@@ -43,6 +48,7 @@ module Browser
|
|
43
48
|
Ipad,
|
44
49
|
Iphone,
|
45
50
|
IpodTouch,
|
51
|
+
Android,
|
46
52
|
Unknown
|
47
53
|
]
|
48
54
|
end
|
@@ -84,7 +90,7 @@ module Browser
|
|
84
90
|
end
|
85
91
|
|
86
92
|
def unknown?
|
87
|
-
id == :
|
93
|
+
id == :unknown_device
|
88
94
|
end
|
89
95
|
|
90
96
|
def ipod_touch?
|
@@ -134,6 +140,11 @@ module Browser
|
|
134
140
|
end
|
135
141
|
alias_method :wiiu?, :nintendo_wiiu?
|
136
142
|
|
143
|
+
def nintendo_switch?
|
144
|
+
id == :switch
|
145
|
+
end
|
146
|
+
alias_method :switch?, :nintendo_switch?
|
147
|
+
|
137
148
|
def blackberry_playbook?
|
138
149
|
id == :playbook
|
139
150
|
end
|
@@ -149,12 +160,12 @@ module Browser
|
|
149
160
|
|
150
161
|
# Detect if browser is Silk.
|
151
162
|
def silk?
|
152
|
-
ua
|
163
|
+
ua.include?("Silk")
|
153
164
|
end
|
154
165
|
|
155
166
|
# Detect if browser is running under Xbox.
|
156
167
|
def xbox?
|
157
|
-
ua
|
168
|
+
ua.include?("Xbox")
|
158
169
|
end
|
159
170
|
|
160
171
|
# Detect if browser is running under Xbox 360.
|
@@ -174,7 +185,7 @@ module Browser
|
|
174
185
|
|
175
186
|
# Detect if browser is Nintendo.
|
176
187
|
def nintendo?
|
177
|
-
wii? || wiiu?
|
188
|
+
wii? || wiiu? || switch?
|
178
189
|
end
|
179
190
|
|
180
191
|
# Detect if browser is console (currently Xbox, PlayStation, or Nintendo).
|
@@ -182,20 +193,26 @@ module Browser
|
|
182
193
|
xbox? || playstation? || nintendo?
|
183
194
|
end
|
184
195
|
|
185
|
-
|
196
|
+
# Detect if device is a Samsung.
|
197
|
+
def samsung?
|
198
|
+
id == :samsung
|
199
|
+
end
|
186
200
|
|
187
201
|
# Regex taken from http://detectmobilebrowsers.com
|
188
|
-
# rubocop:disable
|
189
|
-
def detect_mobile?
|
202
|
+
# rubocop:disable Layout/LineLength
|
203
|
+
private def detect_mobile?
|
190
204
|
psp? ||
|
191
|
-
|
192
|
-
|
193
|
-
|
205
|
+
/zunewp7/i.match?(ua) ||
|
206
|
+
%r{(android|bb\d+|meego).+mobile|avantgo|bada/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino}i.match(ua) ||
|
207
|
+
%r{1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-}i.match?(ua[0..3])
|
194
208
|
end
|
195
|
-
# rubocop:enable
|
209
|
+
# rubocop:enable Layout/LineLength
|
196
210
|
|
197
|
-
def platform
|
211
|
+
private def platform
|
198
212
|
@platform ||= Platform.new(ua)
|
199
213
|
end
|
214
|
+
|
215
|
+
private :subject
|
216
|
+
private :ua
|
200
217
|
end
|
201
218
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Browser
|
4
|
+
class DuckDuckGo < Base
|
5
|
+
def id
|
6
|
+
:duckduckgo
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
"DuckDuckGo"
|
11
|
+
end
|
12
|
+
|
13
|
+
def full_version
|
14
|
+
ua[%r{DuckDuckGo/([\d.]+)}, 1] ||
|
15
|
+
"0.0"
|
16
|
+
end
|
17
|
+
|
18
|
+
def match?
|
19
|
+
ua.include?("DuckDuckGo")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/browser/edge.rb
CHANGED
@@ -11,11 +11,15 @@ module Browser
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def full_version
|
14
|
-
ua[%r
|
14
|
+
ua[%r{(?:Edge|Edg|EdgiOS|EdgA)/([\d.]+)}, 1] || super
|
15
15
|
end
|
16
16
|
|
17
17
|
def match?
|
18
|
-
ua
|
18
|
+
ua.match?(%r{((?:Edge|Edg|EdgiOS|EdgA)/[\d.]+|Trident/8)})
|
19
|
+
end
|
20
|
+
|
21
|
+
def chrome_based?
|
22
|
+
match? && ua.match?(/\bEdg\b/)
|
19
23
|
end
|
20
24
|
end
|
21
25
|
end
|
data/lib/browser/electron.rb
CHANGED
data/lib/browser/facebook.rb
CHANGED
data/lib/browser/firefox.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Browser
|
4
|
+
class GoogleSearchApp < Chrome
|
5
|
+
def id
|
6
|
+
:google_search_app
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
"Google Search App"
|
11
|
+
end
|
12
|
+
|
13
|
+
def full_version
|
14
|
+
ua[%r{GSA/([\d.]+\d)}, 1] || super
|
15
|
+
end
|
16
|
+
|
17
|
+
def match?
|
18
|
+
ua.include?("GSA")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Browser
|
4
|
+
class HuaweiBrowser < Base
|
5
|
+
def id
|
6
|
+
:huawei_browser
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
"Huawei Browser"
|
11
|
+
end
|
12
|
+
|
13
|
+
def full_version
|
14
|
+
ua[%r{(?:HuaweiBrowser)/([\d.]+)}i, 1] || "0.0"
|
15
|
+
end
|
16
|
+
|
17
|
+
def match?
|
18
|
+
ua.match?(/HuaweiBrowser/i)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Browser
|
4
|
+
class Instagram < Base
|
5
|
+
def id
|
6
|
+
:instagram
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
"Instagram"
|
11
|
+
end
|
12
|
+
|
13
|
+
def full_version
|
14
|
+
ua[%r{Instagram[ /]([\d.]+)}, 1] || "0.0"
|
15
|
+
end
|
16
|
+
|
17
|
+
def match?
|
18
|
+
ua.include?("Instagram")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -24,7 +24,8 @@ module Browser
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def msie_full_version
|
27
|
-
(ua.match(%r{MSIE ([\d.]+)|Trident/.*?; rv:([\d.]+)}) &&
|
27
|
+
(ua.match(%r{MSIE ([\d.]+)|Trident/.*?; rv:([\d.]+)}) &&
|
28
|
+
(Regexp.last_match(1) || Regexp.last_match(2))) ||
|
28
29
|
"0.0"
|
29
30
|
end
|
30
31
|
|
@@ -41,23 +42,21 @@ module Browser
|
|
41
42
|
trident_version && msie_version.to_i < (trident_version.to_i + 4)
|
42
43
|
end
|
43
44
|
|
44
|
-
private
|
45
|
-
|
46
|
-
def ie_version
|
45
|
+
private def ie_version
|
47
46
|
TRIDENT_MAPPING[trident_version] || msie_version
|
48
47
|
end
|
49
48
|
|
50
49
|
# Return the trident version.
|
51
|
-
def trident_version
|
52
|
-
ua.match(%r
|
50
|
+
private def trident_version
|
51
|
+
ua.match(%r{Trident/([0-9.]+)}) && Regexp.last_match(1)
|
53
52
|
end
|
54
53
|
|
55
|
-
def msie?
|
56
|
-
ua
|
54
|
+
private def msie?
|
55
|
+
ua.include?("MSIE") && !ua.include?("Opera")
|
57
56
|
end
|
58
57
|
|
59
|
-
def modern_ie?
|
60
|
-
ua
|
58
|
+
private def modern_ie?
|
59
|
+
ua.match?(%r{Trident/.*?; rv:(.*?)})
|
61
60
|
end
|
62
61
|
end
|
63
62
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Browser
|
4
|
+
class Maxthon < Base
|
5
|
+
def id
|
6
|
+
:maxthon
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
"Maxthon"
|
11
|
+
end
|
12
|
+
|
13
|
+
def full_version
|
14
|
+
ua[%r{(?:Maxthon)/([\d.]+)}i, 1] || "0.0"
|
15
|
+
end
|
16
|
+
|
17
|
+
def match?
|
18
|
+
ua.match?(/Maxthon/i)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/browser/meta/base.rb
CHANGED