From a4b668f12b66b4526274a050197d7cbd31a372dd Mon Sep 17 00:00:00 2001 From: itsalongstory Date: Sat, 20 Jun 2020 02:51:28 +0800 Subject: [PATCH 1/2] 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/2] 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