browser 2.5.2 → 5.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE.md +1 -1
  3. data/.github/workflows/tests.yml +57 -0
  4. data/.gitignore +1 -0
  5. data/.prettierignore +1 -0
  6. data/.rubocop.yml +22 -107
  7. data/CHANGELOG.md +192 -11
  8. data/FUNDING.yml +3 -0
  9. data/Gemfile +2 -0
  10. data/README.md +139 -89
  11. data/Rakefile +11 -3
  12. data/bot_exceptions.yml +2 -0
  13. data/bots.yml +302 -247
  14. data/browser.gemspec +12 -7
  15. data/gemfiles/rails6_0.gemfile +6 -0
  16. data/gemfiles/rails6_1.gemfile +6 -0
  17. data/lib/browser/accept_language.rb +12 -9
  18. data/lib/browser/action_controller.rb +1 -3
  19. data/lib/browser/aliases.rb +5 -5
  20. data/lib/browser/alipay.rb +2 -2
  21. data/lib/browser/base.rb +101 -19
  22. data/lib/browser/blackberry.rb +3 -3
  23. data/lib/browser/bot/empty_user_agent_matcher.rb +11 -0
  24. data/lib/browser/bot/keyword_matcher.rb +11 -0
  25. data/lib/browser/bot/known_bots_matcher.rb +11 -0
  26. data/lib/browser/bot.rb +39 -27
  27. data/lib/browser/browser.rb +65 -54
  28. data/lib/browser/chrome.rb +18 -5
  29. data/lib/browser/detect_version.rb +5 -5
  30. data/lib/browser/device/android.rb +20 -0
  31. data/lib/browser/device/blackberry_playbook.rb +1 -1
  32. data/lib/browser/device/ipad.rb +1 -1
  33. data/lib/browser/device/iphone.rb +1 -1
  34. data/lib/browser/device/ipod_touch.rb +1 -1
  35. data/lib/browser/device/kindle.rb +1 -1
  36. data/lib/browser/device/kindle_fire.rb +1 -1
  37. data/lib/browser/device/playstation3.rb +1 -1
  38. data/lib/browser/device/playstation4.rb +1 -1
  39. data/lib/browser/device/psp.rb +1 -1
  40. data/lib/browser/device/psvita.rb +1 -1
  41. data/lib/browser/device/samsung.rb +33 -0
  42. data/lib/browser/device/surface.rb +2 -4
  43. data/lib/browser/device/switch.rb +19 -0
  44. data/lib/browser/device/tv.rb +1 -1
  45. data/lib/browser/device/unknown.rb +1 -1
  46. data/lib/browser/device/wii.rb +1 -1
  47. data/lib/browser/device/wiiu.rb +1 -1
  48. data/lib/browser/device/xbox_360.rb +1 -1
  49. data/lib/browser/device/xbox_one.rb +1 -1
  50. data/lib/browser/device.rb +47 -30
  51. data/lib/browser/duck_duck_go.rb +22 -0
  52. data/lib/browser/edge.rb +6 -2
  53. data/lib/browser/electron.rb +2 -2
  54. data/lib/browser/facebook.rb +4 -2
  55. data/lib/browser/firefox.rb +2 -2
  56. data/lib/browser/google_search_app.rb +21 -0
  57. data/lib/browser/huawei_browser.rb +21 -0
  58. data/lib/browser/instagram.rb +21 -0
  59. data/lib/browser/internet_explorer.rb +9 -10
  60. data/lib/browser/maxthon.rb +21 -0
  61. data/lib/browser/meta/base.rb +0 -1
  62. data/lib/browser/meta/generic_browser.rb +1 -3
  63. data/lib/browser/meta.rb +12 -13
  64. data/lib/browser/micro_messenger.rb +2 -2
  65. data/lib/browser/middleware/context/additions.rb +1 -1
  66. data/lib/browser/middleware.rb +4 -3
  67. data/lib/browser/miui_browser.rb +21 -0
  68. data/lib/browser/nokia.rb +2 -2
  69. data/lib/browser/opera.rb +2 -2
  70. data/lib/browser/otter.rb +2 -2
  71. data/lib/browser/phantom_js.rb +2 -2
  72. data/lib/browser/platform/adobe_air.rb +2 -2
  73. data/lib/browser/platform/android.rb +1 -1
  74. data/lib/browser/platform/base.rb +3 -2
  75. data/lib/browser/platform/blackberry.rb +2 -2
  76. data/lib/browser/platform/chrome_os.rb +1 -1
  77. data/lib/browser/platform/firefox_os.rb +1 -1
  78. data/lib/browser/platform/ios.rb +17 -4
  79. data/lib/browser/platform/kai_os.rb +23 -0
  80. data/lib/browser/platform/linux.rb +1 -1
  81. data/lib/browser/platform/mac.rb +5 -3
  82. data/lib/browser/platform/{other.rb → unknown.rb} +3 -3
  83. data/lib/browser/platform/windows.rb +2 -2
  84. data/lib/browser/platform/windows_mobile.rb +1 -1
  85. data/lib/browser/platform/windows_phone.rb +1 -1
  86. data/lib/browser/platform.rb +37 -28
  87. data/lib/browser/qq.rb +5 -5
  88. data/lib/browser/rails.rb +11 -5
  89. data/lib/browser/safari.rb +19 -4
  90. data/lib/browser/samsung_browser.rb +21 -0
  91. data/lib/browser/snapchat.rb +21 -0
  92. data/lib/browser/sougou_browser.rb +24 -0
  93. data/lib/browser/sputnik.rb +21 -0
  94. data/lib/browser/uc_browser.rb +2 -2
  95. data/lib/browser/{generic.rb → unknown.rb} +6 -8
  96. data/lib/browser/version.rb +1 -1
  97. data/lib/browser/weibo.rb +2 -2
  98. data/lib/browser/yandex.rb +21 -0
  99. data/lib/browser.rb +2 -2
  100. data/samsung.yml +138 -0
  101. data/search_engines.yml +2 -2
  102. data/test/browser_test.rb +42 -10
  103. data/test/rails_test.rb +10 -0
  104. data/test/sample_app.rb +14 -0
  105. data/test/test_helper.rb +9 -1
  106. data/test/ua.yml +147 -109
  107. data/test/ua_bots.yml +98 -45
  108. data/test/ua_search_engines.yml +7 -6
  109. data/test/unit/accept_language_test.rb +24 -0
  110. data/test/unit/adobe_air_test.rb +1 -1
  111. data/test/unit/alipay_test.rb +6 -0
  112. data/test/unit/blackberry_test.rb +0 -6
  113. data/test/unit/bots_test.rb +37 -27
  114. data/test/unit/chrome_test.rb +8 -19
  115. data/test/unit/console_test.rb +2 -2
  116. data/test/unit/device_test.rb +60 -3
  117. data/test/unit/duck_duck_go_test.rb +37 -0
  118. data/test/unit/edge_test.rb +49 -5
  119. data/test/unit/facebook_test.rb +20 -0
  120. data/test/unit/firefox_test.rb +0 -3
  121. data/test/unit/google_search_app_test.rb +54 -0
  122. data/test/unit/huawei_browser_test.rb +25 -0
  123. data/test/unit/instagram_test.rb +30 -0
  124. data/test/unit/internet_explorer_test.rb +0 -12
  125. data/test/unit/ios_test.rb +7 -5
  126. data/test/unit/kai_os_test.rb +31 -0
  127. data/test/unit/kindle_test.rb +0 -2
  128. data/test/unit/maxthon_test.rb +25 -0
  129. data/test/unit/meta_test.rb +10 -2
  130. data/test/unit/micro_messenger_test.rb +21 -6
  131. data/test/unit/miui_browser_test.rb +25 -0
  132. data/test/unit/opera_test.rb +1 -2
  133. data/test/unit/platform_test.rb +34 -8
  134. data/test/unit/qq_test.rb +12 -0
  135. data/test/unit/safari_test.rb +12 -7
  136. data/test/unit/samsung_browser_test.rb +23 -0
  137. data/test/unit/snapchat_test.rb +40 -0
  138. data/test/unit/sougou_browser_test.rb +41 -0
  139. data/test/unit/sputnik_test.rb +22 -0
  140. data/test/unit/yandex_test.rb +37 -0
  141. metadata +83 -26
  142. data/.bundle/config +0 -2
  143. data/.travis.yml +0 -16
  144. data/bin/rake +0 -17
  145. data/gemfiles/rails4.gemfile +0 -4
  146. 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
@@ -12,7 +12,7 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- ua =~ /PlayBook.*?RIM Tablet/
15
+ ua.match?(/PlayBook.*?RIM Tablet/)
16
16
  end
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- ua =~ /iPad/
15
+ ua.include?("iPad")
16
16
  end
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- ua =~ /iPhone/
15
+ ua.include?("iPhone")
16
16
  end
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- ua =~ /iPod/
15
+ ua.include?("iPod")
16
16
  end
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- ua =~ /Kindle/
15
+ ua.include?("Kindle")
16
16
  end
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- ua =~ /Kindle Fire|KFTT/
15
+ ua.match?(/Kindle Fire|KFTT/)
16
16
  end
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- ua =~ /PLAYSTATION 3/i
15
+ ua.match?(/PLAYSTATION 3/i)
16
16
  end
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- ua =~ /PLAYSTATION 4/i
15
+ ua.match?(/PLAYSTATION 4/i)
16
16
  end
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- ua =~ /PlayStation Portable/
15
+ ua.include?("PlayStation Portable")
16
16
  end
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- ua =~ /Playstation Vita/
15
+ ua.match?("Playstation Vita")
16
16
  end
17
17
  end
18
18
  end
@@ -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
@@ -12,12 +12,10 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- platform.windows_rt? && ua =~ /Touch/
15
+ platform.windows_rt? && ua.include?("Touch")
16
16
  end
17
17
 
18
- private
19
-
20
- def platform
18
+ private def platform
21
19
  @platform ||= Platform.new(ua)
22
20
  end
23
21
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class Switch < Base
6
+ def id
7
+ :switch
8
+ end
9
+
10
+ def name
11
+ "Nintendo Switch"
12
+ end
13
+
14
+ def match?
15
+ ua.match?(/Nintendo Switch/i)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -12,7 +12,7 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- ua =~ /(tv|Android.*?ADT-1|Nexus Player)/i
15
+ ua.match?(/(\btv|Android.*?ADT-1|Nexus Player)/i)
16
16
  end
17
17
  end
18
18
  end
@@ -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
@@ -12,7 +12,7 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- ua =~ /Nintendo Wii/i
15
+ ua.match?(/Nintendo Wii/i)
16
16
  end
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- ua =~ /Nintendo WiiU/i
15
+ ua.match?(/Nintendo WiiU/i)
16
16
  end
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- ua =~ /Xbox/i
15
+ ua.match?(/Xbox/i)
16
16
  end
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module Browser
12
12
  end
13
13
 
14
14
  def match?
15
- ua =~ /Xbox One/i
15
+ ua.match?(/Xbox One/i)
16
16
  end
17
17
  end
18
18
  end
@@ -1,23 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "browser/device/base"
4
- require "browser/device/unknown"
5
- require "browser/device/ipad"
6
- require "browser/device/ipod_touch"
7
- require "browser/device/iphone"
8
- require "browser/device/playstation3"
9
- require "browser/device/playstation4"
10
- require "browser/device/psp"
11
- require "browser/device/psvita"
12
- require "browser/device/kindle"
13
- require "browser/device/kindle_fire"
14
- require "browser/device/wii"
15
- require "browser/device/wiiu"
16
- require "browser/device/blackberry_playbook"
17
- require "browser/device/surface"
18
- require "browser/device/tv"
19
- require "browser/device/xbox_one"
20
- require "browser/device/xbox_360"
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 == :unknown
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 =~ /Silk/
163
+ ua.include?("Silk")
153
164
  end
154
165
 
155
166
  # Detect if browser is running under Xbox.
156
167
  def xbox?
157
- ua =~ /Xbox/
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
- private
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 Metrics/LineLength
189
- def detect_mobile?
202
+ # rubocop:disable Layout/LineLength
203
+ private def detect_mobile?
190
204
  psp? ||
191
- /zunewp7/i.match(ua) ||
192
- /(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) ||
193
- /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])
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 Metrics/LineLength
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[Edge/([\d.]+)], 1] || super
14
+ ua[%r{(?:Edge|Edg|EdgiOS|EdgA)/([\d.]+)}, 1] || super
15
15
  end
16
16
 
17
17
  def match?
18
- ua =~ %r[(Edge/[\d.]+|Trident/8)]
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
@@ -11,12 +11,12 @@ module Browser
11
11
  end
12
12
 
13
13
  def full_version
14
- ua[%r[Electron/([\d.]+)], 1] ||
14
+ ua[%r{Electron/([\d.]+)}, 1] ||
15
15
  "0.0"
16
16
  end
17
17
 
18
18
  def match?
19
- ua =~ /Electron/
19
+ ua.include?("Electron")
20
20
  end
21
21
  end
22
22
  end
@@ -11,11 +11,13 @@ module Browser
11
11
  end
12
12
 
13
13
  def full_version
14
- ua[%r[FBAV/([\d.]+)], 1]
14
+ ua[%r{FBAV/([\d.]+)}, 1] ||
15
+ ua[%r{AppleWebKit/([\d.]+)}, 0] ||
16
+ "0.0"
15
17
  end
16
18
 
17
19
  def match?
18
- ua =~ /FBAV/
20
+ ua.match?(/FBAV|FBAN/)
19
21
  end
20
22
  end
21
23
  end
@@ -11,11 +11,11 @@ module Browser
11
11
  end
12
12
 
13
13
  def full_version
14
- ua[%r[(?:Firefox|FxiOS)/([\d.]+)], 1] || "0.0"
14
+ ua[%r{(?:Firefox|FxiOS)/([\d.]+)}, 1] || "0.0"
15
15
  end
16
16
 
17
17
  def match?
18
- ua =~ /Firefox|FxiOS/
18
+ ua.match?(/Firefox|FxiOS/)
19
19
  end
20
20
  end
21
21
  end
@@ -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.]+)}) && ($1 || $2)) ||
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[Trident/([0-9.]+)]) && $1
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 =~ /MSIE/ && ua !~ /Opera/
54
+ private def msie?
55
+ ua.include?("MSIE") && !ua.include?("Opera")
57
56
  end
58
57
 
59
- def modern_ie?
60
- ua =~ %r[Trident/.*?; rv:(.*?)]
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
@@ -10,7 +10,6 @@ module Browser
10
10
  IE,
11
11
  IOS,
12
12
  Mobile,
13
- Modern,
14
13
  Platform,
15
14
  Proxy,
16
15
  Safari,
@@ -7,9 +7,7 @@ module Browser
7
7
  "#{browser.id} #{browser.id}#{browser.version}" if generic?
8
8
  end
9
9
 
10
- private
11
-
12
- def generic?
10
+ private def generic?
13
11
  !browser.safari? && !browser.chrome?
14
12
  end
15
13
  end