diff --git a/CHANGELOG.md b/CHANGELOG.md index d7852748..862e26f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,8 @@ - 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 +- Add Mail Master mail app for iOS & Android detection - Add Miui Browser detection. - Add `Browser::Base#qq?`. - Fix QQ detection. diff --git a/lib/browser/base.rb b/lib/browser/base.rb index 157689b5..ac71025f 100644 --- a/lib/browser/base.rb +++ b/lib/browser/base.rb @@ -236,6 +236,12 @@ def sougou_browser?(expected_version = nil) detect_version?(full_version, expected_version) end + # Detect if browser is NetEase Mail Master. + 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.include?("GSA") && detect_version?(full_version, expected_version) diff --git a/lib/browser/browser.rb b/lib/browser/browser.rb index adb84274..21c3cf39 100644 --- a/lib/browser/browser.rb +++ b/lib/browser/browser.rb @@ -92,6 +92,7 @@ def self.matchers HuaweiBrowser, # must be placed before Chrome and Safari MiuiBrowser, # must be placed before Chrome and Safari Maxthon, # must be placed before Chrome and Safari + MailMaster, # must be placed before Chrome and Safari SougouBrowser, # 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 4b8410f3..9720101b 100644 --- a/lib/browser/chrome.rb +++ b/lib/browser/chrome.rb @@ -35,6 +35,7 @@ def match? !huawei_browser? && !miui_browser? && !maxthon? && + !mail_master? && !qq? && !sougou_browser? && !google_search_app? 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 ee15c1e7..ee5164b5 100644 --- a/lib/browser/safari.rb +++ b/lib/browser/safari.rb @@ -30,6 +30,7 @@ def match? !yandex? && !sputnik? && !maxthon? && + !mail_master? && !qq? && !alipay? && !sougou_browser? && diff --git a/test/ua.yml b/test/ua.yml index 3c9e54d9..ac899b81 100644 --- a/test/ua.yml +++ b/test/ua.yml @@ -172,3 +172,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