Skip to content

Commit fa4f685

Browse files
authored
Add Browser::Base#chromium_based?. (#527)
Close #523.
1 parent 5c51f18 commit fa4f685

25 files changed

+165
-126
lines changed

FUNDING.yml .github/FUNDING.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
# These are supported funding model platforms
2-
2+
---
33
github: [fnando]
4+
custom: ["https://paypal.me/nandovieira/🍕"]

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
- Add `Browser::Base#chromium_based?`.
6+
- Change how browser detection works to avoid re-instantiating classes.
7+
38
## 5.3.1
49

510
- Remove Stripe webhooks from bot list.

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ browser = Browser.new("Some User Agent", accept_language: "en-us")
2222
# General info
2323
browser.bot?
2424
browser.chrome?
25+
browser.chromium_based?
2526
browser.core_media?
2627
browser.duck_duck_go?
2728
browser.edge? # Newest MS browser

lib/browser/base.rb

+30-25
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,13 @@ def device
5959

6060
# Detect if browser is Microsoft Internet Explorer.
6161
def ie?(expected_version = nil)
62-
InternetExplorer.new(ua).match? &&
62+
instance_of?(InternetExplorer) &&
6363
detect_version?(full_version, expected_version)
6464
end
6565

6666
# Detect if browser is Microsoft Edge.
6767
def edge?(expected_version = nil)
68-
Edge.new(ua).match? && detect_version?(full_version, expected_version)
68+
instance_of?(Edge) && detect_version?(full_version, expected_version)
6969
end
7070

7171
def compatibility_view?
@@ -82,32 +82,32 @@ def msie_version
8282

8383
# Detect if browser is Instagram.
8484
def instagram?(expected_version = nil)
85-
Instagram.new(ua).match? &&
85+
instance_of?(Instagram) &&
8686
detect_version?(full_version, expected_version)
8787
end
8888

8989
# Detect if browser is Snapchat.
9090
def snapchat?(expected_version = nil)
91-
Snapchat.new(ua).match? &&
91+
instance_of?(Snapchat) &&
9292
detect_version?(full_version, expected_version)
9393
end
9494

9595
# Detect if browser if Facebook.
9696
def facebook?(expected_version = nil)
97-
Facebook.new(ua).match? &&
97+
instance_of?(Facebook) &&
9898
detect_version?(full_version, expected_version)
9999
end
100100

101101
# Detect if browser is Otter.
102102
def otter?(expected_version = nil)
103-
Otter.new(ua).match? &&
103+
instance_of?(Otter) &&
104104
detect_version?(full_version, expected_version)
105105
end
106106

107107
# Detect if browser is WebKit-based.
108108
def webkit?(expected_version = nil)
109109
ua.match?(/AppleWebKit/i) &&
110-
(!edge? || Edge.new(ua).chrome_based?) &&
110+
(!edge? || chromium_based?) &&
111111
detect_version?(webkit_full_version, expected_version)
112112
end
113113

@@ -124,13 +124,13 @@ def core_media?(expected_version = nil)
124124

125125
# Detect if browser is PhantomJS
126126
def phantom_js?(expected_version = nil)
127-
PhantomJS.new(ua).match? &&
127+
instance_of?(PhantomJS) &&
128128
detect_version?(full_version, expected_version)
129129
end
130130

131131
# Detect if browser is Safari.
132132
def safari?(expected_version = nil)
133-
Safari.new(ua).match? && detect_version?(full_version, expected_version)
133+
instance_of?(Safari) && detect_version?(full_version, expected_version)
134134
end
135135

136136
def safari_webapp_mode?
@@ -139,55 +139,55 @@ def safari_webapp_mode?
139139

140140
# Detect if browser is Firefox.
141141
def firefox?(expected_version = nil)
142-
Firefox.new(ua).match? && detect_version?(full_version, expected_version)
142+
instance_of?(Firefox) && detect_version?(full_version, expected_version)
143143
end
144144

145145
# Detect if browser is Chrome.
146146
def chrome?(expected_version = nil)
147-
Chrome.new(ua).match? && detect_version?(full_version, expected_version)
147+
instance_of?(Chrome) && detect_version?(full_version, expected_version)
148148
end
149149

150150
# Detect if browser is Opera.
151151
def opera?(expected_version = nil)
152-
Opera.new(ua).match? && detect_version?(full_version, expected_version)
152+
instance_of?(Opera) && detect_version?(full_version, expected_version)
153153
end
154154

155155
# Detect if browser is Sputnik.
156156
def sputnik?(expected_version = nil)
157-
Sputnik.new(ua).match? && detect_version?(full_version, expected_version)
157+
instance_of?(Sputnik) && detect_version?(full_version, expected_version)
158158
end
159159

160160
# Detect if browser is Yandex.
161161
def yandex?(expected_version = nil)
162-
Yandex.new(ua).match? && detect_version?(full_version, expected_version)
162+
instance_of?(Yandex) && detect_version?(full_version, expected_version)
163163
end
164164
alias yandex_browser? yandex?
165165

166166
# Detect if browser is UCBrowser.
167167
def uc_browser?(expected_version = nil)
168-
UCBrowser.new(ua).match? &&
168+
instance_of?(UCBrowser) &&
169169
detect_version?(full_version, expected_version)
170170
end
171171

172172
# Detect if browser is Nokia S40 Ovi Browser.
173173
def nokia?(expected_version = nil)
174-
Nokia.new(ua).match? && detect_version?(full_version, expected_version)
174+
instance_of?(Nokia) && detect_version?(full_version, expected_version)
175175
end
176176

177177
# Detect if browser is MicroMessenger.
178178
def micro_messenger?(expected_version = nil)
179-
MicroMessenger.new(ua).match? &&
179+
instance_of?(MicroMessenger) &&
180180
detect_version?(full_version, expected_version)
181181
end
182182

183183
alias wechat? micro_messenger?
184184

185185
def weibo?(expected_version = nil)
186-
Weibo.new(ua).match? && detect_version?(full_version, expected_version)
186+
instance_of?(Weibo) && detect_version?(full_version, expected_version)
187187
end
188188

189189
def alipay?(expected_version = nil)
190-
Alipay.new(ua).match? && detect_version?(full_version, expected_version)
190+
instance_of?(Alipay) && detect_version?(full_version, expected_version)
191191
end
192192

193193
# Detect if browser is Opera Mini.
@@ -210,29 +210,29 @@ def samsung_browser?(expected_version = nil)
210210

211211
# Detect if browser is Huawei.
212212
def huawei_browser?(expected_version = nil)
213-
HuaweiBrowser.new(ua).match? &&
213+
instance_of?(HuaweiBrowser) &&
214214
detect_version?(full_version, expected_version)
215215
end
216216

217217
# Detect if browser is Xiaomi Miui.
218218
def miui_browser?(expected_version = nil)
219-
MiuiBrowser.new(ua).match? &&
219+
instance_of?(MiuiBrowser) &&
220220
detect_version?(full_version, expected_version)
221221
end
222222

223223
# Detect if browser is Maxthon.
224224
def maxthon?(expected_version = nil)
225-
Maxthon.new(ua).match? && detect_version?(full_version, expected_version)
225+
instance_of?(Maxthon) && detect_version?(full_version, expected_version)
226226
end
227227

228228
# Detect if browser is QQ.
229229
def qq?(expected_version = nil)
230-
QQ.new(ua).match? && detect_version?(full_version, expected_version)
230+
instance_of?(QQ) && detect_version?(full_version, expected_version)
231231
end
232232

233233
# Detect if browser is Sougou.
234234
def sougou_browser?(expected_version = nil)
235-
SougouBrowser.new(ua).match? &&
235+
instance_of?(SougouBrowser) &&
236236
detect_version?(full_version, expected_version)
237237
end
238238

@@ -241,6 +241,11 @@ def google_search_app?(expected_version = nil)
241241
ua.include?("GSA") && detect_version?(full_version, expected_version)
242242
end
243243

244+
# Detect if browser is Chromium-based.
245+
def chromium_based?
246+
false
247+
end
248+
244249
def webkit_full_version
245250
ua[%r{AppleWebKit/([\d.]+)}, 1] || "0.0"
246251
end
@@ -260,7 +265,7 @@ def proxy?
260265

261266
# Detect if the browser is Electron.
262267
def electron?(expected_version = nil)
263-
Electron.new(ua).match? && detect_version?(full_version, expected_version)
268+
instance_of?(Electron) && detect_version?(full_version, expected_version)
264269
end
265270

266271
private def validate_size(subject, input)

lib/browser/browser.rb

+4-3
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,9 @@ def self.matchers
101101
end
102102

103103
def self.new(user_agent, **kwargs)
104-
matchers
105-
.map {|klass| klass.new(user_agent || EMPTY_STRING, **kwargs) }
106-
.find(&:match?)
104+
matchers.each do |matcher_class|
105+
matcher = matcher_class.new(user_agent || EMPTY_STRING, **kwargs)
106+
return matcher if matcher.match?
107+
end
107108
end
108109
end

lib/browser/chrome.rb

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ def full_version
1919
"0.0"
2020
end
2121

22+
def chromium_based?
23+
true
24+
end
25+
2226
def match?
2327
ua.match?(/Chrome|CriOS/) &&
2428
!ua.match?(/PhantomJS|FxiOS|ArchiveBot/) &&

lib/browser/edge.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def match?
1818
ua.match?(%r{((?:Edge|Edg|EdgiOS|EdgA)/[\d.]+|Trident/8)})
1919
end
2020

21-
def chrome_based?
21+
def chromium_based?
2222
match? && ua.match?(/\bEdg\b/)
2323
end
2424
end

test/browser_test.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class BrowserTest < Minitest::Test
88
assert_equal "Safari", browser.ua
99
end
1010

11-
test "don't fail with nil user agent" do
11+
test "does not fail with nil user agent" do
1212
browser = Browser.new(nil)
1313
refute browser.known?
1414
end
@@ -25,7 +25,7 @@ class BrowserTest < Minitest::Test
2525
Safari
2626
UCBrowser
2727
].each do |ua|
28-
test "don't fail when have no version info (#{ua})" do
28+
test "does not fail when have no version info (#{ua})" do
2929
browser = Browser.new(ua)
3030
assert_equal "0", browser.version
3131
assert_equal "0.0", browser.full_version

test/test_helper.rb

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
# frozen_string_literal: true
22

33
require "simplecov"
4-
SimpleCov.start
4+
SimpleCov.start do
5+
add_filter %r{/test/}
6+
end
57

68
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
79
require "bundler/setup"

test/unit/android_app_test.rb

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
class AndroidAppTest < Minitest::Test
66
let(:browser) { Browser.new(Browser["ANDROID_WEBVIEW"]) }
77

8-
test "detect as android" do
8+
test "detects as android" do
99
assert browser.platform.android?
1010
end
1111

12-
test "detect as webview" do
12+
test "detects as webview" do
1313
assert browser.platform.android_webview?
1414
end
1515

16-
test "non-webviews do not detect as webview" do
16+
test "does not detect non-webviews as webview" do
1717
%w[
1818
ANDROID_CUPCAKE
1919
ANDROID_DONUT

0 commit comments

Comments
 (0)