From a4b668f12b66b4526274a050197d7cbd31a372dd Mon Sep 17 00:00:00 2001 From: itsalongstory Date: Sat, 20 Jun 2020 02:51:28 +0800 Subject: [PATCH 1/6] Add Maxthon detection, close #468 (#469) --- CHANGELOG.md | 1 + lib/browser/base.rb | 4 ++++ lib/browser/browser.rb | 2 ++ lib/browser/chrome.rb | 3 ++- lib/browser/maxthon.rb | 21 +++++++++++++++++++++ lib/browser/safari.rb | 3 ++- test/ua.yml | 1 + test/unit/maxthon_test.rb | 25 +++++++++++++++++++++++++ 8 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 lib/browser/maxthon.rb create mode 100644 test/unit/maxthon_test.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index 84079b23..dd3c8aca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - All the changes above affect how `browser.meta` is composed - Add method `Browser::Base#unknown?` - Fix issue with `Browser::Base#safari?` matching full version +- Add Maxthon detection ## 4.2.0 diff --git a/lib/browser/base.rb b/lib/browser/base.rb index 3183300b..b73932ce 100644 --- a/lib/browser/base.rb +++ b/lib/browser/base.rb @@ -197,6 +197,10 @@ def samsung_browser?(expected_version = nil) ua =~ /SamsungBrowser/ && detect_version?(full_version, expected_version) end + def maxthon?(expected_version = nil) + Maxthon.new(ua).match? && detect_version?(full_version, expected_version) + end + def webkit_full_version ua[%r{AppleWebKit/([\d.]+)}, 1] || "0.0" end diff --git a/lib/browser/browser.rb b/lib/browser/browser.rb index fd9e7379..2c3db300 100644 --- a/lib/browser/browser.rb +++ b/lib/browser/browser.rb @@ -32,6 +32,7 @@ require_relative "snapchat" require_relative "duck_duck_go" require_relative "samsung_browser" +require_relative "maxthon" require_relative "bot" require_relative "bot/empty_user_agent_matcher" @@ -75,6 +76,7 @@ def self.matchers Sputnik, # must be placed before Chrome and Safari DuckDuckGo, # must be placed before Chrome and Safari SamsungBrowser, # must be placed before Chrome and Safari + Maxthon, # must be placed before Chrome and Safari Chrome, Safari, Unknown diff --git a/lib/browser/chrome.rb b/lib/browser/chrome.rb index fd57f520..06f3e3f7 100644 --- a/lib/browser/chrome.rb +++ b/lib/browser/chrome.rb @@ -27,7 +27,8 @@ def match? !duck_duck_go? && !yandex? && !sputnik? && - !samsung_browser? + !samsung_browser? && + !maxthon? end end end diff --git a/lib/browser/maxthon.rb b/lib/browser/maxthon.rb new file mode 100644 index 00000000..4b3aba44 --- /dev/null +++ b/lib/browser/maxthon.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Browser + class Maxthon < Base + def id + :maxthon + end + + def name + "Maxthon" + end + + def full_version + ua[%r{(?:Maxthon)/([\d.]+)}i, 1] || "0.0" + end + + def match? + ua =~ /Maxthon/i + end + end +end diff --git a/lib/browser/safari.rb b/lib/browser/safari.rb index de578ebb..523d916d 100644 --- a/lib/browser/safari.rb +++ b/lib/browser/safari.rb @@ -25,7 +25,8 @@ def match? !samsung_browser? && !duck_duck_go? && !yandex? && - !sputnik? + !sputnik? && + !maxthon? end end end diff --git a/test/ua.yml b/test/ua.yml index e578ade2..be81cd67 100644 --- a/test/ua.yml +++ b/test/ua.yml @@ -114,6 +114,7 @@ QQ_BROWSER_ANDROID: "Mozilla/5.0 (Linux; Android 5.1.1; SM-N9108V Build/LMY47X) 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" 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" 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" +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" QUICKTIME: "QuickTime/7.6.8 (qtver=7.6.8;os=Windows NT 5.1Service Pack 3)" 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" 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" diff --git a/test/unit/maxthon_test.rb b/test/unit/maxthon_test.rb new file mode 100644 index 00000000..403d67bd --- /dev/null +++ b/test/unit/maxthon_test.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require "test_helper" + +class MaxthonTest < Minitest::Test + test "detects Maxthon" do + browser = Browser.new(Browser["MAXTHON"]) + assert browser.maxthon? + refute browser.safari? + refute browser.chrome? + assert_equal "Maxthon", browser.name + assert_equal :maxthon, browser.id + end + + test "detects correct version" do + browser = Browser.new(Browser["MAXTHON"]) + assert_equal "5.3.8.2000", browser.full_version + assert_equal "5", browser.version + end + + test "detects version by range" do + browser = Browser.new(Browser["MAXTHON"]) + assert browser.maxthon?(%w[>=5 <6]) + end +end From 5f07b44444e72cf6cc0282cdf4d0c04221641f47 Mon Sep 17 00:00:00 2001 From: Milan Dobrota Date: Fri, 19 Jun 2020 14:59:55 -0400 Subject: [PATCH 2/6] Add Google Search App support (#470) --- CHANGELOG.md | 1 + lib/browser/base.rb | 5 +++ lib/browser/browser.rb | 2 ++ lib/browser/chrome.rb | 3 +- lib/browser/google_search_app.rb | 21 +++++++++++ lib/browser/safari.rb | 3 +- test/ua.yml | 3 ++ test/unit/google_search_app_test.rb | 54 +++++++++++++++++++++++++++++ 8 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 lib/browser/google_search_app.rb create mode 100644 test/unit/google_search_app_test.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index dd3c8aca..54577997 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ - Add method `Browser::Base#unknown?` - Fix issue with `Browser::Base#safari?` matching full version - Add Maxthon detection +- Add Google Search App detection ## 4.2.0 diff --git a/lib/browser/base.rb b/lib/browser/base.rb index b73932ce..9153466c 100644 --- a/lib/browser/base.rb +++ b/lib/browser/base.rb @@ -201,6 +201,11 @@ def maxthon?(expected_version = nil) Maxthon.new(ua).match? && detect_version?(full_version, expected_version) end + # Detect if browser is Google Search App + def google_search_app?(expected_version = nil) + ua =~ /GSA/ && detect_version?(full_version, expected_version) + end + def webkit_full_version ua[%r{AppleWebKit/([\d.]+)}, 1] || "0.0" end diff --git a/lib/browser/browser.rb b/lib/browser/browser.rb index 2c3db300..a93bf749 100644 --- a/lib/browser/browser.rb +++ b/lib/browser/browser.rb @@ -33,6 +33,7 @@ require_relative "duck_duck_go" require_relative "samsung_browser" require_relative "maxthon" +require_relative "google_search_app" require_relative "bot" require_relative "bot/empty_user_agent_matcher" @@ -77,6 +78,7 @@ def self.matchers DuckDuckGo, # must be placed before Chrome and Safari SamsungBrowser, # must be placed before Chrome and Safari Maxthon, # must be placed before Chrome and Safari + GoogleSearchApp, # must be placed before Chrome and Safari Chrome, Safari, Unknown diff --git a/lib/browser/chrome.rb b/lib/browser/chrome.rb index 06f3e3f7..14e620f6 100644 --- a/lib/browser/chrome.rb +++ b/lib/browser/chrome.rb @@ -28,7 +28,8 @@ def match? !yandex? && !sputnik? && !samsung_browser? && - !maxthon? + !maxthon? && + !google_search_app? end end end diff --git a/lib/browser/google_search_app.rb b/lib/browser/google_search_app.rb new file mode 100644 index 00000000..9ec92148 --- /dev/null +++ b/lib/browser/google_search_app.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Browser + class GoogleSearchApp < Chrome + def id + :google_search_app + end + + def name + "Google Search App" + end + + def full_version + ua[%r{GSA/([\d.]+\d)}, 1] || super + end + + def match? + ua =~ /GSA/ + end + end +end diff --git a/lib/browser/safari.rb b/lib/browser/safari.rb index 523d916d..1d8c25ea 100644 --- a/lib/browser/safari.rb +++ b/lib/browser/safari.rb @@ -26,7 +26,8 @@ def match? !duck_duck_go? && !yandex? && !sputnik? && - !maxthon? + !maxthon? && + !google_search_app? end end end diff --git a/test/ua.yml b/test/ua.yml index be81cd67..350b57e2 100644 --- a/test/ua.yml +++ b/test/ua.yml @@ -44,6 +44,9 @@ FIREFOX_IOS: "Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/ FIREFOX_MODERN: "Mozilla/5.0 (X11; Ubuntu; Linux armv7l; rv:17.0) Gecko/20100101 Firefox/17.0" FIREFOX_OS: "Mozilla/5.0 (Mobile; rv:18.0) Gecko/18.0 Firefox/18.0" FIREFOX_TABLET: "Mozilla/5.0 (Android; Tablet; rv:14.0) Gecko/14.0 Firefox/14.0" +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" +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" +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" IE10: "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; EIE10;ENUSMSN)" 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)" IE10_X64_WINX64: "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)" diff --git a/test/unit/google_search_app_test.rb b/test/unit/google_search_app_test.rb new file mode 100644 index 00000000..f0e56e5e --- /dev/null +++ b/test/unit/google_search_app_test.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +require "test_helper" + +class GoogleSearchAppTest < Minitest::Test + test "detects Google Search App (Android)" do + browser = Browser.new(Browser["GOOGLE_SEARCH_APP_ANDROID"]) + + assert browser.webkit? + assert browser.google_search_app? + assert browser.platform.android? + assert_equal :google_search_app, browser.id + assert_equal "11", browser.version + assert_equal "11.6.8.21", browser.full_version + assert_equal "Google Search App", browser.name + refute browser.chrome? + refute browser.safari? + end + + test "detects Google Search App (iPad)" do + browser = Browser.new(Browser["GOOGLE_SEARCH_APP_IPAD"]) + + assert browser.webkit? + assert browser.google_search_app? + assert browser.device.ipad? + assert browser.platform.ios? + assert_equal :google_search_app, browser.id + assert_equal "102", browser.version + assert_equal "102.0.304944559", browser.full_version + assert_equal "Google Search App", browser.name + refute browser.chrome? + refute browser.safari? + end + + test "detects Google Search App (iPhone)" do + browser = Browser.new(Browser["GOOGLE_SEARCH_APP_IPHONE"]) + + assert browser.webkit? + assert browser.google_search_app? + assert browser.device.iphone? + assert browser.platform.ios? + assert_equal :google_search_app, browser.id + assert_equal "105", browser.version + assert_equal "105.0.307913796", browser.full_version + assert_equal "Google Search App", browser.name + refute browser.chrome? + refute browser.safari? + end + + test "detects version by range (iPad)" do + browser = Browser.new(Browser["GOOGLE_SEARCH_APP_IPAD"]) + assert browser.google_search_app?(%w[>=102 <103]) + end +end From a4e966412205cb8d304ed4ad7af6e06adb675ab9 Mon Sep 17 00:00:00 2001 From: lichao Date: Mon, 22 Jun 2020 15:17:44 +0800 Subject: [PATCH 3/6] Add Mail Master mail app for iOS & Android detection, close #473 --- CHANGELOG.md | 1 + lib/browser/base.rb | 5 ++++ lib/browser/browser.rb | 2 ++ lib/browser/chrome.rb | 1 + lib/browser/mail_master.rb | 21 ++++++++++++++++ lib/browser/safari.rb | 1 + test/ua.yml | 2 ++ test/unit/mail_master_test.rb | 47 +++++++++++++++++++++++++++++++++++ 8 files changed, 80 insertions(+) create mode 100644 lib/browser/mail_master.rb create mode 100644 test/unit/mail_master_test.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index 54577997..df6a5b72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Fix issue with `Browser::Base#safari?` matching full version - Add Maxthon detection - Add Google Search App detection +- Add Mail Master mail app for iOS & Android detection ## 4.2.0 diff --git a/lib/browser/base.rb b/lib/browser/base.rb index 9153466c..7f728f63 100644 --- a/lib/browser/base.rb +++ b/lib/browser/base.rb @@ -201,6 +201,11 @@ def maxthon?(expected_version = nil) Maxthon.new(ua).match? && detect_version?(full_version, expected_version) end + def mail_master?(expected_version = nil) + MailMaster.new(ua).match? && + detect_version?(full_version, expected_version) + end + # Detect if browser is Google Search App def google_search_app?(expected_version = nil) ua =~ /GSA/ && detect_version?(full_version, expected_version) diff --git a/lib/browser/browser.rb b/lib/browser/browser.rb index a93bf749..1ed20c9f 100644 --- a/lib/browser/browser.rb +++ b/lib/browser/browser.rb @@ -33,6 +33,7 @@ require_relative "duck_duck_go" require_relative "samsung_browser" require_relative "maxthon" +require_relative "mail_master" require_relative "google_search_app" require_relative "bot" @@ -78,6 +79,7 @@ def self.matchers DuckDuckGo, # must be placed before Chrome and Safari SamsungBrowser, # must be placed before Chrome and Safari Maxthon, # must be placed before Chrome and Safari + MailMaster, # must be placed before Chrome and Safari GoogleSearchApp, # must be placed before Chrome and Safari Chrome, Safari, diff --git a/lib/browser/chrome.rb b/lib/browser/chrome.rb index 14e620f6..5bcb0fc7 100644 --- a/lib/browser/chrome.rb +++ b/lib/browser/chrome.rb @@ -29,6 +29,7 @@ def match? !sputnik? && !samsung_browser? && !maxthon? && + !mail_master? && !google_search_app? end end diff --git a/lib/browser/mail_master.rb b/lib/browser/mail_master.rb new file mode 100644 index 00000000..c574f3df --- /dev/null +++ b/lib/browser/mail_master.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Browser + class MailMaster < Base + def id + :mail_master + end + + def name + "Mail Master" + end + + def full_version + ua[%r{(?:MailMaster|MailMaster_Android_Mobile)/([\d.]+)}i, 1] || "0.0" + end + + def match? + ua =~ /MailMaster/i + end + end +end diff --git a/lib/browser/safari.rb b/lib/browser/safari.rb index 1d8c25ea..5513e916 100644 --- a/lib/browser/safari.rb +++ b/lib/browser/safari.rb @@ -27,6 +27,7 @@ def match? !yandex? && !sputnik? && !maxthon? && + !mail_master? && !google_search_app? end end diff --git a/test/ua.yml b/test/ua.yml index 350b57e2..52e48fc0 100644 --- a/test/ua.yml +++ b/test/ua.yml @@ -162,3 +162,5 @@ XBOXONE: "Mozilla/5.0 (Compatible; MSIE 10.0; Windows NT 6.2; Trident /6.0; Xbox XOOM: "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13" YANDEX_BROWSER_DESKTOP: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 YaBrowser/19.6.0.1583 Yowser/2.5 Safari/537.36" YANDEX_BROWSER_IOS: "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 YaBrowser/19.6.1.157.10 Mobile/15E148 Safari/605.1" +MAIL_MASTER_IOS: "Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MailMaster/6.22.4.1582" +MAIL_MASTER_ANDROID: "Mozilla/5.0 (Linux; Android 10; LIO-AL00 Build/HUAWEILIO-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Mobile Safari/537.36 MailMaster_Android_Mobile/6.22.1" diff --git a/test/unit/mail_master_test.rb b/test/unit/mail_master_test.rb new file mode 100644 index 00000000..e8a08d3a --- /dev/null +++ b/test/unit/mail_master_test.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require "test_helper" + +class MailMasterTest < Minitest::Test + test "detects MailMaster on iOS" do + browser = Browser.new(Browser["MAIL_MASTER_IOS"]) + assert browser.platform.ios?("13.4.1") + assert browser.mail_master? + refute browser.safari? + refute browser.chrome? + assert_equal "Mail Master", browser.name + assert_equal :mail_master, browser.id + end + + test "detects correct version on iOS" do + browser = Browser.new(Browser["MAIL_MASTER_IOS"]) + assert_equal "6.22.4.1582", browser.full_version + assert_equal "6", browser.version + end + + test "detects version by range on iOS" do + browser = Browser.new(Browser["MAIL_MASTER_IOS"]) + assert browser.mail_master?(%w[>=6 <7]) + end + + test "detects MailMaster on Android" do + browser = Browser.new(Browser["MAIL_MASTER_ANDROID"]) + assert browser.platform.android?(10) + assert browser.mail_master? + refute browser.safari? + refute browser.chrome? + assert_equal "Mail Master", browser.name + assert_equal :mail_master, browser.id + end + + test "detects correct version on Android" do + browser = Browser.new(Browser["MAIL_MASTER_ANDROID"]) + assert_equal "6.22.1", browser.full_version + assert_equal "6", browser.version + end + + test "detects version by range on Android" do + browser = Browser.new(Browser["MAIL_MASTER_ANDROID"]) + assert browser.mail_master?(%w[>=6 <7]) + end +end From 2bdeda81752280fdcf729795cd2ade859f7d018d Mon Sep 17 00:00:00 2001 From: itsalongstory Date: Wed, 8 Jul 2020 09:33:09 +0800 Subject: [PATCH 4/6] Add Huawei Browser detection, close #471 (#472) --- CHANGELOG.md | 1 + lib/browser/base.rb | 5 +++++ lib/browser/browser.rb | 2 ++ lib/browser/chrome.rb | 1 + lib/browser/huawei_browser.rb | 21 +++++++++++++++++++++ lib/browser/safari.rb | 1 + test/ua.yml | 1 + test/unit/huawei_browser_test.rb | 25 +++++++++++++++++++++++++ 8 files changed, 57 insertions(+) create mode 100644 lib/browser/huawei_browser.rb create mode 100644 test/unit/huawei_browser_test.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index 54577997..fd86b9f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Fix issue with `Browser::Base#safari?` matching full version - Add Maxthon detection - Add Google Search App detection +- Add Huawei Browser detection ## 4.2.0 diff --git a/lib/browser/base.rb b/lib/browser/base.rb index 9153466c..3c3ae52b 100644 --- a/lib/browser/base.rb +++ b/lib/browser/base.rb @@ -197,6 +197,11 @@ def samsung_browser?(expected_version = nil) ua =~ /SamsungBrowser/ && detect_version?(full_version, expected_version) end + def huawei_browser?(expected_version = nil) + HuaweiBrowser.new(ua).match? && + detect_version?(full_version, expected_version) + end + def maxthon?(expected_version = nil) Maxthon.new(ua).match? && detect_version?(full_version, expected_version) end diff --git a/lib/browser/browser.rb b/lib/browser/browser.rb index a93bf749..834060cb 100644 --- a/lib/browser/browser.rb +++ b/lib/browser/browser.rb @@ -32,6 +32,7 @@ require_relative "snapchat" require_relative "duck_duck_go" require_relative "samsung_browser" +require_relative "huawei_browser" require_relative "maxthon" require_relative "google_search_app" @@ -77,6 +78,7 @@ def self.matchers Sputnik, # must be placed before Chrome and Safari DuckDuckGo, # must be placed before Chrome and Safari SamsungBrowser, # must be placed before Chrome and Safari + HuaweiBrowser, # must be placed before Chrome and Safari Maxthon, # must be placed before Chrome and Safari GoogleSearchApp, # must be placed before Chrome and Safari Chrome, diff --git a/lib/browser/chrome.rb b/lib/browser/chrome.rb index 14e620f6..a896ac17 100644 --- a/lib/browser/chrome.rb +++ b/lib/browser/chrome.rb @@ -28,6 +28,7 @@ def match? !yandex? && !sputnik? && !samsung_browser? && + !huawei_browser? && !maxthon? && !google_search_app? end diff --git a/lib/browser/huawei_browser.rb b/lib/browser/huawei_browser.rb new file mode 100644 index 00000000..a48c5188 --- /dev/null +++ b/lib/browser/huawei_browser.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Browser + class HuaweiBrowser < Base + def id + :huawei_browser + end + + def name + "Huawei Browser" + end + + def full_version + ua[%r{(?:HuaweiBrowser)/([\d.]+)}i, 1] || "0.0" + end + + def match? + ua =~ /HuaweiBrowser/i + end + end +end diff --git a/lib/browser/safari.rb b/lib/browser/safari.rb index 1d8c25ea..819036aa 100644 --- a/lib/browser/safari.rb +++ b/lib/browser/safari.rb @@ -23,6 +23,7 @@ def match? !edge? && !chrome? && !samsung_browser? && + !huawei_browser? && !duck_duck_go? && !yandex? && !sputnik? && diff --git a/test/ua.yml b/test/ua.yml index 350b57e2..c3fdfcc0 100644 --- a/test/ua.yml +++ b/test/ua.yml @@ -132,6 +132,7 @@ SAFARI_IPHONE_WEBAPP_MODE: "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_2 like Mac O SAMSUNG: "Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; SAMSUNG-SGH-I497 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30" SAMSUNG_BROWSER: "Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-N960U) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/11.1 Chrome/75.0.3770.143 Mobile Safari/537.36" SAMSUNG_CHROME: "Mozilla/5.0 (Linux; Android 4.4.2; en-gb; SAMSUNG GT-I9195/I9195XXUCNEA Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36" +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" SMART_TV: "Mozilla/5.0 (SmartHub; SMART-TV; U; Linux/SmartTV) AppleWebKit/531.2+ (KHTML, like Gecko) WebBrowser/1.0 SmartTV Safari/531.2+" SNAPCHAT: Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Snapchat/10.69.5.72 (iPhone10,3; iOS 13.2.2; gzip) SNAPCHAT_EMPTY_STRING_VERSION: "Mozilla/5.0 (Linux; Android 9; SM-N960U Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.96 Mobile Safari/537.36Snapchat10.70.0.0 (SM-N960U; Android 9#N960USQS3CSJ2#28; gzip)" diff --git a/test/unit/huawei_browser_test.rb b/test/unit/huawei_browser_test.rb new file mode 100644 index 00000000..f4122559 --- /dev/null +++ b/test/unit/huawei_browser_test.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require "test_helper" + +class HuaweiBrowserTest < Minitest::Test + test "detects Huawei Browser" do + browser = Browser.new(Browser["HUAWEI_BROWSER"]) + assert browser.huawei_browser? + refute browser.safari? + refute browser.chrome? + assert_equal "Huawei Browser", browser.name + assert_equal :huawei_browser, browser.id + end + + test "detects correct version" do + browser = Browser.new(Browser["HUAWEI_BROWSER"]) + assert_equal "10.1.2.300", browser.full_version + assert_equal "10", browser.version + end + + test "detects version by range" do + browser = Browser.new(Browser["HUAWEI_BROWSER"]) + assert browser.huawei_browser?(%w[>=10 <11]) + end +end From 1877c930d78202e6499966e38f2c78046fc43a00 Mon Sep 17 00:00:00 2001 From: Nando Vieira Date: Tue, 7 Jul 2020 18:46:30 -0700 Subject: [PATCH 5/6] Ensure Duck Duck Go browser is not detected as a bot. (#477) --- CHANGELOG.md | 1 + bots.yml | 2 +- test/unit/duck_duck_go_test.rb | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd86b9f2..75cb46c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - Add Maxthon detection - Add Google Search App detection - Add Huawei Browser detection +- Fix Duck Duck Go browser that was being recognized as a bot. ## 4.2.0 diff --git a/bots.yml b/bots.yml index 81c35781..2a8d2ab1 100644 --- a/bots.yml +++ b/bots.yml @@ -63,7 +63,7 @@ domain re-animator bot: Domain Re-Animator Bot domainsbot: DomainsBot domaintunocrawler: DomainTuno dotbot: Dot Bot -duckduck: Duck Duck Go +duckduckbot: Duck Duck Go elb-healthchecker: AWS ELB HealthChecker embedly: Embedly eoaagent: EOAAgent diff --git a/test/unit/duck_duck_go_test.rb b/test/unit/duck_duck_go_test.rb index 64fda2e0..54d8a1be 100644 --- a/test/unit/duck_duck_go_test.rb +++ b/test/unit/duck_duck_go_test.rb @@ -9,6 +9,7 @@ class DuckDuckGoTest < Minitest::Test refute browser.safari? refute browser.chrome? assert browser.webkit? + refute browser.bot? assert_equal "DuckDuckGo", browser.name assert_equal :duckduckgo, browser.id end @@ -18,6 +19,7 @@ class DuckDuckGoTest < Minitest::Test assert browser.duck_duck_go? refute browser.safari? refute browser.chrome? + refute browser.bot? assert_equal "DuckDuckGo", browser.name assert_equal :duckduckgo, browser.id end From 4b922594e38df4ed0b360b0517f06fa619d08cd6 Mon Sep 17 00:00:00 2001 From: Nando Vieira Date: Tue, 7 Jul 2020 19:05:49 -0700 Subject: [PATCH 6/6] Add Miui Browser detection. (#478) Co-authored-by: lichao --- CHANGELOG.md | 1 + lib/browser/base.rb | 7 +++++++ lib/browser/browser.rb | 2 ++ lib/browser/chrome.rb | 1 + lib/browser/miui_browser.rb | 21 +++++++++++++++++++++ lib/browser/safari.rb | 1 + test/ua.yml | 13 +++++++------ test/unit/miui_browser_test.rb | 25 +++++++++++++++++++++++++ 8 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 lib/browser/miui_browser.rb create mode 100644 test/unit/miui_browser_test.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index 75cb46c2..6da472a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ - Add Google Search App detection - Add Huawei Browser detection - Fix Duck Duck Go browser that was being recognized as a bot. +- Add Miui Browser detection ## 4.2.0 diff --git a/lib/browser/base.rb b/lib/browser/base.rb index 3c3ae52b..38d9328e 100644 --- a/lib/browser/base.rb +++ b/lib/browser/base.rb @@ -197,11 +197,18 @@ def samsung_browser?(expected_version = nil) ua =~ /SamsungBrowser/ && detect_version?(full_version, expected_version) end + # Detect if browser is Huawei. def huawei_browser?(expected_version = nil) HuaweiBrowser.new(ua).match? && detect_version?(full_version, expected_version) end + # Detect if browser is Xiaomi Miui. + def miui_browser?(expected_version = nil) + MiuiBrowser.new(ua).match? && + detect_version?(full_version, expected_version) + end + def maxthon?(expected_version = nil) Maxthon.new(ua).match? && detect_version?(full_version, expected_version) end diff --git a/lib/browser/browser.rb b/lib/browser/browser.rb index 834060cb..ffae3dbd 100644 --- a/lib/browser/browser.rb +++ b/lib/browser/browser.rb @@ -33,6 +33,7 @@ require_relative "duck_duck_go" require_relative "samsung_browser" require_relative "huawei_browser" +require_relative "miui_browser" require_relative "maxthon" require_relative "google_search_app" @@ -79,6 +80,7 @@ def self.matchers DuckDuckGo, # must be placed before Chrome and Safari SamsungBrowser, # must be placed before Chrome and Safari HuaweiBrowser, # must be placed before Chrome and Safari + MiuiBrowser, # must be placed before Chrome and Safari Maxthon, # must be placed before Chrome and Safari GoogleSearchApp, # must be placed before Chrome and Safari Chrome, diff --git a/lib/browser/chrome.rb b/lib/browser/chrome.rb index a896ac17..5223f67c 100644 --- a/lib/browser/chrome.rb +++ b/lib/browser/chrome.rb @@ -29,6 +29,7 @@ def match? !sputnik? && !samsung_browser? && !huawei_browser? && + !miui_browser? && !maxthon? && !google_search_app? end diff --git a/lib/browser/miui_browser.rb b/lib/browser/miui_browser.rb new file mode 100644 index 00000000..99ded2d6 --- /dev/null +++ b/lib/browser/miui_browser.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Browser + class MiuiBrowser < Base + def id + :miui_browser + end + + def name + "Miui Browser" + end + + def full_version + ua[%r{MiuiBrowser/([\d.]+)}, 1] || "0.0" + end + + def match? + ua =~ /MiuiBrowser/ + end + end +end diff --git a/lib/browser/safari.rb b/lib/browser/safari.rb index 819036aa..50d09b76 100644 --- a/lib/browser/safari.rb +++ b/lib/browser/safari.rb @@ -24,6 +24,7 @@ def match? !chrome? && !samsung_browser? && !huawei_browser? && + !miui_browser? && !duck_duck_go? && !yandex? && !sputnik? && diff --git a/test/ua.yml b/test/ua.yml index c3fdfcc0..7bea2ce3 100644 --- a/test/ua.yml +++ b/test/ua.yml @@ -32,8 +32,8 @@ CHROME: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/53 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." COREMEDIA: "Apple Mac OS X v10.6.4 CoreMedia v1.0.0.10F569" CUSTOM_APP: "Our App 0.0.1 (Linux; Android 4.0.3; HTC Ruby Build/IML74K; en_CA)" -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" 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" +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" 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" 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] 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;]" @@ -47,6 +47,7 @@ FIREFOX_TABLET: "Mozilla/5.0 (Android; Tablet; rv:14.0) Gecko/14.0 Firefox/14.0" 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" 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" 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" +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" IE10: "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; EIE10;ENUSMSN)" 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)" IE10_X64_WINX64: "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)" @@ -84,16 +85,18 @@ KINDLE_FIRE_HD_MOBILE: "Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/ LUMIA800: "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; XBLWP7; ZuneWP7" 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" 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" -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" +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" 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" +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" MIDP: MIDP-2.0 +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" 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" 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" +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" 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" 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)" -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" 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" -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" +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" 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" 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" 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" @@ -117,7 +120,6 @@ QQ_BROWSER_ANDROID: "Mozilla/5.0 (Linux; Android 5.1.1; SM-N9108V Build/LMY47X) 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" 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" 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" -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" QUICKTIME: "QuickTime/7.6.8 (qtver=7.6.8;os=Windows NT 5.1Service Pack 3)" 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" 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" @@ -132,7 +134,6 @@ SAFARI_IPHONE_WEBAPP_MODE: "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_2 like Mac O SAMSUNG: "Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; SAMSUNG-SGH-I497 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30" SAMSUNG_BROWSER: "Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-N960U) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/11.1 Chrome/75.0.3770.143 Mobile Safari/537.36" SAMSUNG_CHROME: "Mozilla/5.0 (Linux; Android 4.4.2; en-gb; SAMSUNG GT-I9195/I9195XXUCNEA Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36" -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" SMART_TV: "Mozilla/5.0 (SmartHub; SMART-TV; U; Linux/SmartTV) AppleWebKit/531.2+ (KHTML, like Gecko) WebBrowser/1.0 SmartTV Safari/531.2+" SNAPCHAT: Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Snapchat/10.69.5.72 (iPhone10,3; iOS 13.2.2; gzip) SNAPCHAT_EMPTY_STRING_VERSION: "Mozilla/5.0 (Linux; Android 9; SM-N960U Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.96 Mobile Safari/537.36Snapchat10.70.0.0 (SM-N960U; Android 9#N960USQS3CSJ2#28; gzip)" diff --git a/test/unit/miui_browser_test.rb b/test/unit/miui_browser_test.rb new file mode 100644 index 00000000..038d40f2 --- /dev/null +++ b/test/unit/miui_browser_test.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require "test_helper" + +class MiuiBrowserTest < Minitest::Test + test "detects Miui Browser" do + browser = Browser.new(Browser["MIUI_BROWSER"]) + assert browser.miui_browser? + refute browser.safari? + refute browser.chrome? + assert_equal "Miui Browser", browser.name + assert_equal :miui_browser, browser.id + end + + test "detects correct version" do + browser = Browser.new(Browser["MIUI_BROWSER"]) + assert_equal "12.3.3", browser.full_version + assert_equal "12", browser.version + end + + test "detects version by range" do + browser = Browser.new(Browser["MIUI_BROWSER"]) + assert browser.miui_browser?(%w[>=12 <13]) + end +end