browser 4.2.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -1
  3. data/FUNDING.yml +3 -0
  4. data/README.md +96 -47
  5. data/bots.yml +1 -1
  6. data/lib/browser/base.rb +53 -2
  7. data/lib/browser/browser.rb +22 -2
  8. data/lib/browser/chrome.rb +7 -1
  9. data/lib/browser/device.rb +2 -2
  10. data/lib/browser/device/unknown.rb +1 -1
  11. data/lib/browser/google_search_app.rb +21 -0
  12. data/lib/browser/huawei_browser.rb +21 -0
  13. data/lib/browser/maxthon.rb +21 -0
  14. data/lib/browser/miui_browser.rb +21 -0
  15. data/lib/browser/platform.rb +4 -4
  16. data/lib/browser/platform/ios.rb +1 -1
  17. data/lib/browser/platform/mac.rb +1 -1
  18. data/lib/browser/platform/{other.rb → unknown.rb} +3 -3
  19. data/lib/browser/platform/windows.rb +1 -1
  20. data/lib/browser/safari.rb +9 -1
  21. data/lib/browser/sougou_browser.rb +24 -0
  22. data/lib/browser/{generic.rb → unknown.rb} +3 -3
  23. data/lib/browser/version.rb +1 -1
  24. data/test/browser_test.rb +23 -6
  25. data/test/ua.yml +12 -4
  26. data/test/unit/adobe_air_test.rb +1 -1
  27. data/test/unit/alipay_test.rb +6 -0
  28. data/test/unit/console_test.rb +2 -2
  29. data/test/unit/device_test.rb +2 -2
  30. data/test/unit/duck_duck_go_test.rb +2 -0
  31. data/test/unit/google_search_app_test.rb +54 -0
  32. data/test/unit/huawei_browser_test.rb +25 -0
  33. data/test/unit/maxthon_test.rb +25 -0
  34. data/test/unit/meta_test.rb +9 -0
  35. data/test/unit/miui_browser_test.rb +25 -0
  36. data/test/unit/opera_test.rb +1 -0
  37. data/test/unit/platform_test.rb +6 -6
  38. data/test/unit/qq_test.rb +12 -0
  39. data/test/unit/safari_test.rb +12 -7
  40. data/test/unit/sougou_browser_test.rb +41 -0
  41. metadata +23 -7
@@ -15,7 +15,7 @@ require_relative "firefox"
15
15
  require_relative "edge"
16
16
  require_relative "opera"
17
17
  require_relative "blackberry"
18
- require_relative "generic"
18
+ require_relative "unknown"
19
19
  require_relative "phantom_js"
20
20
  require_relative "uc_browser"
21
21
  require_relative "nokia"
@@ -32,6 +32,11 @@ require_relative "sputnik"
32
32
  require_relative "snapchat"
33
33
  require_relative "duck_duck_go"
34
34
  require_relative "samsung_browser"
35
+ require_relative "huawei_browser"
36
+ require_relative "miui_browser"
37
+ require_relative "maxthon"
38
+ require_relative "sougou_browser"
39
+ require_relative "google_search_app"
35
40
 
36
41
  require_relative "bot"
37
42
  require_relative "bot/empty_user_agent_matcher"
@@ -46,10 +51,20 @@ require_relative "meta"
46
51
  module Browser
47
52
  EMPTY_STRING = ""
48
53
 
54
+ Error = Class.new(StandardError)
55
+
49
56
  def self.root
50
57
  @root ||= Pathname.new(File.expand_path("../..", __dir__))
51
58
  end
52
59
 
60
+ class << self
61
+ attr_accessor :user_agent_size_limit
62
+ attr_accessor :accept_language_size_limit
63
+ end
64
+
65
+ self.user_agent_size_limit = 512
66
+ self.accept_language_size_limit = 256
67
+
53
68
  # Hold the list of browser matchers.
54
69
  # Order is important.
55
70
  def self.matchers
@@ -75,9 +90,14 @@ module Browser
75
90
  Sputnik, # must be placed before Chrome and Safari
76
91
  DuckDuckGo, # must be placed before Chrome and Safari
77
92
  SamsungBrowser, # must be placed before Chrome and Safari
93
+ HuaweiBrowser, # must be placed before Chrome and Safari
94
+ MiuiBrowser, # must be placed before Chrome and Safari
95
+ Maxthon, # must be placed before Chrome and Safari
96
+ SougouBrowser, # must be placed before Chrome and Safari
97
+ GoogleSearchApp, # must be placed before Chrome and Safari
78
98
  Chrome,
79
99
  Safari,
80
- Generic
100
+ Unknown
81
101
  ]
82
102
  end
83
103
 
@@ -27,7 +27,13 @@ module Browser
27
27
  !duck_duck_go? &&
28
28
  !yandex? &&
29
29
  !sputnik? &&
30
- !samsung_browser?
30
+ !samsung_browser? &&
31
+ !huawei_browser? &&
32
+ !miui_browser? &&
33
+ !maxthon? &&
34
+ !qq? &&
35
+ !sougou_browser? &&
36
+ !google_search_app?
31
37
  end
32
38
  end
33
39
  end
@@ -88,7 +88,7 @@ module Browser
88
88
  end
89
89
 
90
90
  def unknown?
91
- id == :unknown
91
+ id == :unknown_device
92
92
  end
93
93
 
94
94
  def ipod_touch?
@@ -197,7 +197,7 @@ module Browser
197
197
  psp? ||
198
198
  /zunewp7/i.match(ua) ||
199
199
  %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) ||
200
- %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])
200
+ %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])
201
201
  end
202
202
  # rubocop:enable Layout/LineLength
203
203
 
@@ -4,7 +4,7 @@ module Browser
4
4
  class Device
5
5
  class Unknown < Base
6
6
  def id
7
- :unknown
7
+ :unknown_device
8
8
  end
9
9
 
10
10
  def name
@@ -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 =~ /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 =~ /HuaweiBrowser/i
19
+ end
20
+ end
21
+ 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 =~ /Maxthon/i
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class MiuiBrowser < Base
5
+ def id
6
+ :miui_browser
7
+ end
8
+
9
+ def name
10
+ "Miui Browser"
11
+ end
12
+
13
+ def full_version
14
+ ua[%r{MiuiBrowser/([\d.]+)}, 1] || "0.0"
15
+ end
16
+
17
+ def match?
18
+ ua =~ /MiuiBrowser/
19
+ end
20
+ end
21
+ end
@@ -10,7 +10,7 @@ require_relative "platform/windows_mobile"
10
10
  require_relative "platform/firefox_os"
11
11
  require_relative "platform/blackberry"
12
12
  require_relative "platform/android"
13
- require_relative "platform/other"
13
+ require_relative "platform/unknown"
14
14
  require_relative "platform/chrome_os"
15
15
  require_relative "platform/adobe_air"
16
16
 
@@ -35,7 +35,7 @@ module Browser
35
35
  FirefoxOS,
36
36
  Windows,
37
37
  Linux,
38
- Other
38
+ Unknown
39
39
  ]
40
40
  end
41
41
 
@@ -61,8 +61,8 @@ module Browser
61
61
  id == :android && detect_version?(version, expected_version)
62
62
  end
63
63
 
64
- def other?
65
- id == :other
64
+ def unknown?
65
+ id == :unknown_platform
66
66
  end
67
67
 
68
68
  def linux?
@@ -5,7 +5,7 @@ module Browser
5
5
  class IOS < Base
6
6
  MATCHER = /(iPhone|iPad|iPod)/.freeze
7
7
  VERSION_MATCHER =
8
- /OS ((?<major>\d+)_(?<minor>\d+)_?(?<patch>\d+)?)/.freeze
8
+ /OS (?<major>\d+)_(?<minor>\d+)_?(?<patch>\d+)?/.freeze
9
9
 
10
10
  def version
11
11
  matches = VERSION_MATCHER.match(ua)
@@ -4,7 +4,7 @@ module Browser
4
4
  class Platform
5
5
  class Mac < Base
6
6
  def version
7
- (ua[/Mac OS X\s*([0-9_\.]+)?/, 1] || "0").tr("_", ".")
7
+ (ua[/Mac OS X\s*([0-9_.]+)?/, 1] || "0").tr("_", ".")
8
8
  end
9
9
 
10
10
  def name
@@ -2,17 +2,17 @@
2
2
 
3
3
  module Browser
4
4
  class Platform
5
- class Other < Base
5
+ class Unknown < Base
6
6
  def version
7
7
  "0"
8
8
  end
9
9
 
10
10
  def name
11
- "Other"
11
+ "Unknown"
12
12
  end
13
13
 
14
14
  def id
15
- :other
15
+ :unknown_platform
16
16
  end
17
17
 
18
18
  def match?
@@ -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_\.]+)?/, 1] || "0"
7
+ ua[/Windows NT\s*([0-9_.]+)?/, 1] || "0"
8
8
  end
9
9
 
10
10
  def name
@@ -22,10 +22,18 @@ module Browser
22
22
  ua !~ /PhantomJS|FxiOS/ &&
23
23
  !edge? &&
24
24
  !chrome? &&
25
+ !opera? &&
25
26
  !samsung_browser? &&
27
+ !huawei_browser? &&
28
+ !miui_browser? &&
26
29
  !duck_duck_go? &&
27
30
  !yandex? &&
28
- !sputnik?
31
+ !sputnik? &&
32
+ !maxthon? &&
33
+ !qq? &&
34
+ !alipay? &&
35
+ !sougou_browser? &&
36
+ !google_search_app?
29
37
  end
30
38
  end
31
39
  end
@@ -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 =~ /SogouMobileBrowser/i || ua =~ / SE /
22
+ end
23
+ end
24
+ end
@@ -1,18 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Browser
4
- class Generic < Base
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
- :generic
11
+ :unknown_browser
12
12
  end
13
13
 
14
14
  def name
15
- infer_name || "Generic Browser"
15
+ infer_name || "Unknown Browser"
16
16
  end
17
17
 
18
18
  def full_version
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Browser
4
- VERSION = "4.2.0"
4
+ VERSION = "5.0.0"
5
5
  end
@@ -106,14 +106,13 @@ class BrowserTest < Minitest::Test
106
106
  refute browser.chrome?(">=65")
107
107
  end
108
108
 
109
- test "detects unknown id" do
109
+ test "detects unknown browser" do
110
110
  browser = Browser.new("Unknown")
111
- assert_equal :generic, browser.id
112
- end
113
111
 
114
- test "detects unknown name" do
115
- browser = Browser.new("Unknown")
116
- assert_equal "Generic Browser", browser.name
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,22 @@ 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 512 bytes" do
159
+ message = "user_agent cannot be larger than 512 bytes; actual size is " \
160
+ "513 bytes"
161
+
162
+ assert_raises(Browser::Error, message) do
163
+ Browser.new("a" * 513)
164
+ end
165
+ end
166
+
167
+ test "rejects accept language larger than 256 bytes" do
168
+ message = "accept_language cannot be larger than 256 bytes; actual size " \
169
+ "is 257 bytes"
170
+
171
+ assert_raises(Browser::Error, message) do
172
+ Browser.new("Chrome", accept_language: "a" * 257)
173
+ end
174
+ end
158
175
  end
@@ -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)"
@@ -81,16 +85,18 @@ KINDLE_FIRE_HD_MOBILE: "Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/
81
85
  LUMIA800: "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; XBLWP7; ZuneWP7"
82
86
  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
87
  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
- 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"
88
+ 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
89
  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"
90
+ 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
91
  MIDP: MIDP-2.0
92
+ 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
93
  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
94
  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"
95
+ 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
96
  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
97
  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
98
  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
- 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"
99
+ 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
100
  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
101
  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
102
  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"
@@ -114,6 +120,8 @@ QQ_BROWSER_ANDROID: "Mozilla/5.0 (Linux; Android 5.1.1; SM-N9108V Build/LMY47X)
114
120
  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
121
  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
122
  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"
123
+ 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"
124
+ 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
125
  QUICKTIME: "QuickTime/7.6.8 (qtver=7.6.8;os=Windows NT 5.1Service Pack 3)"
118
126
  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
127
  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"
@@ -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