diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5cdbf5c4..91302ed2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,5 @@ # This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions +# For more information see: https://github.com/marketplace/actions/setup-node-js-environment name: CI @@ -11,18 +11,15 @@ on: jobs: build: - runs-on: ubuntu-latest - strategy: matrix: - node-version: [14.x, 16.x, 18.x] + node-version: [16.x, 18.x, 20.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} # cache: 'npm' diff --git a/package.json b/package.json index b0d0d1a3..1f73caa8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "uap-core", "description": "The regex file necessary to build language ports of Browserscope's user agent parser.", - "version": "0.16.0", + "version": "0.18.0", "maintainers": [ { "name": "Tobie Langel", @@ -25,7 +25,7 @@ } ], "devDependencies": { - "mocha": "^9.2.2", + "mocha": "^10.2.0", "safe-regex": "^2.1.1", "uap-ref-impl": "git+https://github.com/ua-parser/uap-ref-impl#master", "yamlparser": "^0.0.2" diff --git a/regexes.yaml b/regexes.yaml index 51f8ca86..c362e262 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -78,6 +78,9 @@ user_agent_parsers: # 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34' - regex: '(PingdomTMS)/(\d+)\.(\d+)\.(\d+)' family_replacement: 'PingdomBot' + # 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/61.0.3163.100 Chrome/61.0.3163.100 Safari/537.36 PingdomPageSpeed/1.0 (pingbot/2.0; +http://www.pingdom.com/)' + - regex: '(PingdomPageSpeed)/(\d+)\.(\d+)' + family_replacement: 'PingdomBot' # PTST / WebPageTest.org crawlers - regex: ' (PTST)/(\d+)(?:\.(\d+)|)$' @@ -214,14 +217,14 @@ user_agent_parsers: family_replacement: 'Twitter' # Phantom app - - regex: 'Mozilla.{1,200}Mobile.{1,100}(Phantom\/ios|android).(\d+)\.(\d+)\.(\d+)' + - regex: 'Mozilla.{1,200}Mobile.{1,100}(Phantom\/ios|Phantom\/android).(\d+)\.(\d+)\.(\d+)' family_replacement: 'Phantom' - # aspiegel.com spider (owned by Huawei) - - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot' + # aspiegel.com spider (owned by Huawei, later called PetalBot) + - regex: 'Mozilla.{1,100}Mobile.{1,100}(AspiegelBot|PetalBot)' family_replacement: 'Spider' - - regex: 'AspiegelBot' + - regex: 'AspiegelBot|PetalBot' family_replacement: 'Spider' # Basilisk @@ -375,6 +378,29 @@ user_agent_parsers: - regex: '(Nintendo 3DS)' family_replacement: 'NetFront NX' + # Huawei Browser, should go before Safari and Chrome Mobile + - regex: '(HuaweiBrowser)/(\d+)\.(\d+)\.(\d+)\.\d+' + family_replacement: 'Huawei Browser' + + # AVG + - regex: '(AVG)/(\d+)\.(\d+)\.(\d+)\.\d+' + family_replacement: 'AVG' + + # Avast + - regex: '(AvastSecureBrowser|Avast)/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Avast Secure Browser' + + # Instabridge + - regex: '(Instabridge)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)' + + # Aloha Browser + - regex: '(AlohaBrowser)/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)' + family_replacement: 'Aloha Browser' + + # Brave Browser https://brave.com/ , should go before Safari and Chrome Mobile + - regex: '((?:B|b)rave(?:\sChrome)?)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)' + family_replacement: 'Brave' + # Amazon Silk, should go before Safari and Chrome Mobile - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+)|)' family_replacement: 'Amazon Silk' @@ -385,9 +411,13 @@ user_agent_parsers: # Edge Mobile - regex: 'Windows Phone .{0,200}(Edge)/(\d+)\.(\d+)' family_replacement: 'Edge Mobile' - - regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)' + - regex: '(EdgiOS|EdgA)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)' family_replacement: 'Edge Mobile' + # Oculus Browser, should go before Samsung Internet + - regex: '(OculusBrowser)/(\d+)\.(\d+).0.0(?:\.([0-9\-]+)|)' + family_replacement: 'Oculus Browser' + # Samsung Internet (based on Chrome, but lacking some features) - regex: '(SamsungBrowser)/(\d+)\.(\d+)' family_replacement: 'Samsung Internet' @@ -447,13 +477,25 @@ user_agent_parsers: family_replacement: 'QQ Browser' # DuckDuckGo - - regex: 'Mobile.{0,200}(DuckDuckGo)/(\d+)' + - regex: 'Mozilla.{1,200}Mobile.{1,100}(DuckDuckGo)/(\d+)' family_replacement: 'DuckDuckGo Mobile' + - regex: 'Mozilla.{1,200}(DuckDuckGo)/(\d+)' + family_replacement: 'DuckDuckGo' + - regex: 'Mozilla.{1,200}Mobile.{1,100}(Ddg)/(\d+)(?:\.(\d+)|)' + family_replacement: 'DuckDuckGo Mobile' + - regex: 'Mozilla.{1,200}(Ddg)/(\d+)(?:\.(\d+)|)' + family_replacement: 'DuckDuckGo' # Tenta Browser - regex: '(Tenta/)(\d+)\.(\d+)\.(\d+)' family_replacement: 'Tenta Browser' + # Ecosia on iOS / Android + - regex: '(Ecosia) ios@(\d+)\.(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Ecosia iOS' + - regex: '(Ecosia) android@(\d+)\.(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Ecosia Android' + # Chrome Mobile - regex: 'Version/.{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)' family_replacement: 'Chrome Mobile WebView' @@ -461,7 +503,7 @@ user_agent_parsers: family_replacement: 'Chrome Mobile WebView' - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)' family_replacement: 'Chrome Mobile' - - regex: '(CriOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)' + - regex: '(CriOS)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)' family_replacement: 'Chrome Mobile iOS' - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)' family_replacement: 'Chrome Mobile' @@ -493,6 +535,8 @@ user_agent_parsers: # Yandex Browser - regex: '(YaBrowser)/(\d+)\.(\d+)\.(\d+)' family_replacement: 'Yandex Browser' + - regex: '(YaSearchBrowser)/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Yandex Browser' # Mail.ru Amigo/Internet Browser (Chromium-based) - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).{0,100} MRCHROME' @@ -597,18 +641,14 @@ user_agent_parsers: - regex: 'Superhuman' family_replacement: 'Superhuman' - # Vivaldi uses "Vivaldi" - - regex: '(Vivaldi)/(\d+)\.(\d+)\.(\d+)' + # Vivaldi + - regex: '(Vivaldi)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)' # Edge/major_version.minor_version # Edge with chromium Edg/major_version.minor_version.patch.minor_patch - regex: '(Edge?)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)' family_replacement: 'Edge' - # Brave Browser https://brave.com/ - - regex: '(brave)/(\d+)\.(\d+)\.(\d+) Chrome' - family_replacement: 'Brave' - # Iron Browser ~since version 50 - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]{0,100} Iron[^/]' family_replacement: 'Iron' @@ -925,7 +965,7 @@ user_agent_parsers: # AFTER THE EDGE CASES ABOVE! # AFTER IE11 # BEFORE all other IE - - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)' + - regex: '(Firefox)/(\d+)\.(\d+)(?:\.(\d+)|$)' - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)' @@ -965,7 +1005,9 @@ user_agent_parsers: - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)' family_replacement: 'Python aiohttp' - - regex: '(Java)[/ ]?\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)' + - regex: '(Java)[/ ]?\d{1}\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)' + + - regex: '(Java)[/ ]?(\d+)\.(\d+)\.(\d+)' # minio-go (https://github.com/minio/minio-go) - regex: '(minio-go)/v(\d+)\.(\d+)\.(\d+)' @@ -1017,10 +1059,12 @@ user_agent_parsers: # HTTrack crawler - regex: '\b(HTTrack) (\d+)\.(\d+)(?:[\.\-](\d+)|)' - # SerenityOS (https://serenityos.org) - # https://github.com/SerenityOS/serenity/blob/2e1bbcb0faeae92d7595b8e0b022a8cdcecca07e/Userland/Libraries/LibWeb/Loader/ResourceLoader.h#L27 - - regex: 'SerenityOS' - family_replacement: 'SerenityOS Browser' + # Ladybird Browser (https://ladybird.dev) + # https://github.com/SerenityOS/serenity/blob/6a662e0d43810c1dbd56fbf0c123f258aa1d694e/Userland/Libraries/LibWeb/Loader/ResourceLoader.h#L64 + - regex: '(Ladybird)\/(\d+)\.(\d+)' + + # MullvadBrowser (https://mullvad.net/en/browser) + - regex: '(MullvadBrowser)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)' os_parsers: ########## @@ -1081,8 +1125,8 @@ os_parsers: # generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year - regex: 'HbbTV/\d+\.\d+\.\d+ \(.{0,30}; ?([a-zA-Z]+) ?;.{0,30}(201[1-9]).{0,30}\)' - # aspiegel.com spider (owned by Huawei) - - regex: 'AspiegelBot' + # aspiegel.com spider (owned by Huawei, later renamed PetalBot) + - regex: 'AspiegelBot|PetalBot' os_replacement: 'Other' ########## @@ -1149,6 +1193,12 @@ os_parsers: - regex: '(android)\s(?:mobile\/)(\d+)(?:\.(\d+)(?:\.(\d+)|)|)' os_replacement: 'Android' + ########## + # Meta Quest + ########## + - regex: 'Quest' + os_replacement: 'Android' + ########## # Kindle Android ########## @@ -1599,6 +1649,29 @@ os_parsers: - regex: 'CFNetwork/.{0,100} Darwin/(21)\.\d+' os_replacement: 'iOS' os_v1_replacement: '15' + - regex: 'CFNetwork/.{0,100} Darwin/22\.0\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '16' + os_v2_replacement: '0' + - regex: 'CFNetwork/.{0,100} Darwin/22\.1\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '16' + os_v2_replacement: '1' + - regex: 'CFNetwork/.{0,100} Darwin/22\.2\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '16' + os_v2_replacement: '2' + - regex: 'CFNetwork/.{0,100} Darwin/22\.3\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '16' + os_v2_replacement: '3' + - regex: 'CFNetwork/.{0,100} Darwin/22\.4\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '16' + os_v2_replacement: '4' + - regex: 'CFNetwork/.{0,100} Darwin/(22)\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '16' - regex: 'CFNetwork/.{0,100} Darwin/' os_replacement: 'iOS' @@ -1827,11 +1900,11 @@ device_parsers: brand_replacement: 'Spider' # aspiegel.com spider (owned by Huawei) - - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot' + - regex: 'Mozilla.{1,100}Mobile.{1,100}(AspiegelBot|PetalBot)' device_replacement: 'Spider' brand_replacement: 'Spider' model_replacement: 'Smartphone' - - regex: 'Mozilla.{0,200}AspiegelBot' + - regex: 'Mozilla.{0,200}(AspiegelBot|PetalBot)' device_replacement: 'Spider' brand_replacement: 'Spider' model_replacement: 'Desktop' @@ -3544,6 +3617,30 @@ device_parsers: brand_replacement: 'Meizu' model_replacement: '$1' + ######### + # Meta + # @ref: https://www.meta.com + ######### + - regex: 'Quest 3' + device_replacement: 'Quest' + brand_replacement: 'Meta' + model_replacement: 'Quest 3' + + - regex: 'Quest 2' + device_replacement: 'Quest' + brand_replacement: 'Meta' + model_replacement: 'Quest 2' + + - regex: 'Quest Pro' + device_replacement: 'Quest' + brand_replacement: 'Meta' + model_replacement: 'Quest Pro' + + - regex: 'Quest' + device_replacement: 'Quest' + brand_replacement: 'Meta' + model_replacement: 'Quest' + ######### # Micromax # @ref: http://www.micromaxinfo.com @@ -5553,7 +5650,7 @@ device_parsers: device_replacement: 'Motorola$2' brand_replacement: 'Motorola' model_replacement: '$2' - + ########## # nintendo @@ -5562,7 +5659,7 @@ device_parsers: device_replacement: 'Nintendo Wii U' brand_replacement: 'Nintendo' model_replacement: 'Wii U' - - regex: 'Nintendo (DS|3DS|DSi|Wii);' + - regex: 'Nintendo (Switch|DS|3DS|DSi|Wii);' device_replacement: 'Nintendo $1' brand_replacement: 'Nintendo' model_replacement: '$1' diff --git a/test_resources/firefox_user_agent_strings.yaml b/test_resources/firefox_user_agent_strings.yaml index 391a8138..f8a1c884 100644 --- a/test_resources/firefox_user_agent_strings.yaml +++ b/test_resources/firefox_user_agent_strings.yaml @@ -1234,6 +1234,12 @@ test_cases: minor: '0' patch: '1' + - user_agent_string: 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:104.0) Gecko/20100101 Firefox/104.0' + family: 'Firefox' + major: '104' + minor: '0' + patch: + - user_agent_string: 'Mozilla/5.0 (X11; Linux armv7l; rv:2.1.1) Gecko/ Firefox/5.0.1' family: 'Firefox' major: '5' diff --git a/tests/test_device.yaml b/tests/test_device.yaml index bb43f59b..6e058b30 100644 --- a/tests/test_device.yaml +++ b/tests/test_device.yaml @@ -145,6 +145,26 @@ test_cases: brand: 'Apple' model: 'iPod' + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; Quest) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/26.2.0.0.10 SamsungBrowser/4.0 Chrome/110.0.5481.192 VR Safari/537.36' + family: 'Quest' + brand: 'Meta' + model: 'Quest' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; Quest 2) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/26.2.0.0.10 SamsungBrowser/4.0 Chrome/110.0.5481.192 VR Safari/537.36' + family: 'Quest' + brand: 'Meta' + model: 'Quest 2' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; Quest 3) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/26.2.0.0.10 Chrome/110.0.5481.192 VR Safari/537.36' + family: 'Quest' + brand: 'Meta' + model: 'Quest 3' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; Quest Pro) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/26.2.0.0.10 Chrome/110.0.5481.192 VR Safari/537.36' + family: 'Quest' + brand: 'Meta' + model: 'Quest Pro' + - user_agent_string: 'Mozilla/4.0 (compatible; Linux 2.6.10) NetFront/3.3 Kindle/1.0 (screen 600x800)' family: 'Kindle' brand: 'Amazon' @@ -42590,6 +42610,11 @@ test_cases: brand: 'Nintendo' model: 'Wii' + - user_agent_string: 'Mozilla/5.0 (Nintendo Switch; WifiWebAuthApplet) AppleWebKit/609.4 (KHTML, like Gecko) NF/6.0.2.23.6 NintendoBrowser/5.1.0.23620' + family: 'Nintendo Switch' + brand: 'Nintendo' + model: 'Switch' + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 5.0 kitkat; en-US; Nokia-1100 Build/GINGERBREAD) AppleWebKit/534.31 (KHTML, like Gecko) UCBrowser/9.3.0.321 U3/0.8.0 Mobile Safari/534.31' family: 'Nokia-1100' brand: 'Nokia' @@ -80444,6 +80469,16 @@ test_cases: brand: 'Spider' model: 'Desktop' + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; PetalBot;+https://webmaster.petalsearch.com/site/petalbot)' + family: 'Spider' + brand: 'Spider' + model: 'Smartphone' + + - user_agent_string: 'Mozilla/5.0 (compatible;PetalBot;+https://webmaster.petalsearch.com/site/petalbot)' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; AspiegelBot)' family: 'Spider' brand: 'Spider' diff --git a/tests/test_os.yaml b/tests/test_os.yaml index ad1a823e..630c5f8d 100644 --- a/tests/test_os.yaml +++ b/tests/test_os.yaml @@ -28,6 +28,13 @@ test_cases: patch: '2' patch_minor: + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; Quest 2) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/26.2.0.0.10 SamsungBrowser/4.0 Chrome/110.0.5481.192 VR Safari/537.36' + family: 'Android' + major: + minor: + patch: + patch_minor: + - user_agent_string: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true' family: 'Android' major: @@ -2418,6 +2425,41 @@ test_cases: patch: patch_minor: + - user_agent_string: 'App/0 CFNetwork/1390 Darwin/22.0.0' + family: 'iOS' + major: '16' + minor: '0' + patch: + patch_minor: + + - user_agent_string: 'App/0 CFNetwork/1399 Darwin/22.1.0' + family: 'iOS' + major: '16' + minor: '1' + patch: + patch_minor: + + - user_agent_string: 'App/0 CFNetwork/1402 Darwin/22.2.0' + family: 'iOS' + major: '16' + minor: '2' + patch: + patch_minor: + + - user_agent_string: 'App/0 CFNetwork/1404.0.5 Darwin/22.3.0' + family: 'iOS' + major: '16' + minor: '3' + patch: + patch_minor: + + - user_agent_string: 'App/0 CFNetwork/1406.0.4 Darwin/22.4.0' + family: 'iOS' + major: '16' + minor: '4' + patch: + patch_minor: + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU 7_0_6 like Mac OS X; en_GB) AppleWebKit (KHTML, like Gecko) Mobile [OKMagazine/4.0.1 (iOS/7.0.6)] [LiteApps]' family: 'iOS' major: '7' @@ -3175,7 +3217,7 @@ test_cases: patch: patch_minor: - - user_agent_string: 'Mozilla/4.0 (SerenityOS; x86_64) LibWeb+LibJS (Not KHTML, nor Gecko) LibWeb' + - user_agent_string: 'Mozilla/5.0 (SerenityOS; x86_64) LibWeb+LibJS/1.0 Ladybird/1.0' family: 'SerenityOS' major: minor: diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index 6a2e7012..ac9ca4db 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -83,6 +83,12 @@ test_cases: minor: '5' patch: '1' + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; Quest 2) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/26.2.0.0.10 SamsungBrowser/4.0 Chrome/110.0.5481.192 VR Safari/537.36' + family: 'Oculus Browser' + major: '26' + minor: '2' + patch: '10' + - user_agent_string: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true' family: 'Amazon Silk' major: '1' @@ -184,12 +190,14 @@ test_cases: major: '6' minor: '13' patch: '13719' + patch_minor: '201' - user_agent_string: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; QQBrowser/7.6.21433.400)' family: 'QQ Browser' major: '7' minor: '6' patch: '21433' + patch_minor: '400' - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; MI 2S Build/JRO03L) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.0 Mobile Safari/537.36' family: 'QQ Browser Mobile' @@ -298,6 +306,7 @@ test_cases: major: '68' minor: '0' patch: '3440' + patch_minor: '85' - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.2; Nexus 5X Build/N2G47W; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36' family: 'Chrome Mobile WebView' @@ -551,6 +560,12 @@ test_cases: minor: '0' patch: '25' + - user_agent_string: 'Java/17.0.6' + family: 'Java' + major: '17' + minor: '0' + patch: '6' + - user_agent_string: 'Mozilla/5.0 (Linux; U; en-US) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) Version/4.0 Kindle/3.0 (screen 600x800; rotate)' family: 'Kindle' major: '3' @@ -748,6 +763,7 @@ test_cases: major: '7' minor: '4' patch: '1' + patch_minor: '14' - user_agent_string: 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13' family: 'Nokia Browser' @@ -910,12 +926,14 @@ test_cases: major: '2' minor: '2' patch: '0' + patch_minor: '0' - user_agent_string: 'Mozilla/5.0 (Series40; NokiaX2-05/08.35; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/2.0.2.68.14' family: 'Ovi Browser' major: '2' minor: '0' patch: '2' + patch_minor: '68' - user_agent_string: 'Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20110407 Firefox/4.0.3 PaleMoon/4.0.3' family: 'Pale Moon' @@ -959,6 +977,12 @@ test_cases: minor: '8' patch: '5' + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/61.0.3163.100 Chrome/61.0.3163.100 Safari/537.36 PingdomPageSpeed/1.0 (pingbot/2.0; +http://www.pingdom.com/)' + family: 'PingdomBot' + major: '1' + minor: '0' + patch: + - user_agent_string: 'NewRelicPinger/1.0 (1025794)' family: 'NewRelicPingerBot' major: '1' @@ -1180,24 +1204,28 @@ test_cases: major: '0' minor: '9' patch: '1' + patch_minor: '679' - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Whale/0.9.5.0 Mobile Safari/537.36' family: 'Whale' major: '0' minor: '9' patch: '5' + patch_minor: '0' - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.2; Nexus 6P Build/WHALE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.220 Whale/1.3.50.3 Mobile Safari/537.36 sidebar webpanel' family: 'Whale' major: '1' minor: '3' patch: '50' + patch_minor: '3' - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.2; Nexus 6P Build/WHALE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.220 Whale/1.3.50.3 Mobile Safari/537.36' family: 'Whale' major: '1' minor: '3' patch: '50' + patch_minor: '3' - user_agent_string: 'J2ME/UCWEB7.0.3.45/139/7682' family: 'UC Browser' @@ -1307,6 +1335,30 @@ test_cases: minor: '5' patch: '1104' + - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0.1; GT-I9505 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 YaBrowser/16.2.1.1239.00 Mobile Safari/537.36' + family: 'Yandex Browser' + major: '16' + minor: '2' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.771 YaBrowser/23.11.2.771 Yowser/2.5 Safari/537.36' + family: 'Yandex Browser' + major: '23' + minor: '11' + patch: '2' + + - user_agent_string: 'Mozilla/5.0 (Linux; arm; Android 10; M2006C3MNG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 YaApp_Android/23.36.1 YaSearchBrowser/23.36.1 BroPP/1.0 SA/3 Mobile Safari/537.36' + family: 'Yandex Browser' + major: '23' + minor: '36' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Linux; arm_64; Android 13; 23053RN02Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.98 YaBrowser/23.11.5.98.00 SA/3 Mobile Safari/537.36' + family: 'Yandex Browser' + major: '23' + minor: '11' + patch: '5' + - user_agent_string: 'Mozilla/5.0 YottaaMonitor;' family: 'YottaaMonitor' major: @@ -1367,6 +1419,24 @@ test_cases: minor: '0' patch: '83' + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.105 Safari/537.36 Vivaldi/1.0.162.9' + family: 'Vivaldi' + major: '1' + minor: '0' + patch: '162' + + - user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Vivaldi/114' + family: 'Vivaldi' + major: '114' + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Vivaldi/3.7' + family: 'Vivaldi' + major: '3' + minor: '7' + patch: + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.9600' family: 'Edge' major: '12' @@ -1462,7 +1532,7 @@ test_cases: major: '2' minor: '2' patch: '0' - patch_minor: + patch_minor: '0' - user_agent_string: 'iRAPP/1.16.0 NokiaN95_8GB/31.0.015; Series60/3.1 Profile/MIDP-2.0 Configuration/CLDC-1.' family: 'iRAPP' @@ -6738,7 +6808,7 @@ test_cases: major: '194' minor: '0' patch: '0' - patch_minor: '38' + patch_minor: - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_4 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B350 [Pinterest/iOS]' family: 'Pinterest' @@ -6937,6 +7007,7 @@ test_cases: major: '44' minor: '5' patch: '0' + patch_minor: '10' - user_agent_string: 'Mozilla/5.0 (iPad; CPU OS 12_5_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 EdgiOS/46.3.26 Mobile/15E148 Safari/605.1.15' family: 'Edge Mobile' @@ -6949,6 +7020,7 @@ test_cases: major: '42' minor: '0' patch: '0' + patch_minor: '2057' - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) brave/0.7.11 Chrome/47.0.2526.110 Brave/0.36.5 Safari/537.36' family: 'Brave' @@ -6956,17 +7028,49 @@ test_cases: minor: '7' patch: '11' - - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) brave/0.7.12 Chrome/47.0.2526.110 Brave/0.36.7 Safari/537.36 ' + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) brave/0.7.12 Chrome/47.0.2526.110 Brave/0.36.7 Safari/537.36' family: 'Brave' major: '0' minor: '7' patch: '12' - - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) brave/0.7.10 Chrome/47.0.2526.110 Brave/0.36.5 Safari/537.36' + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Brave Chrome/80.0.3987.87 Safari/537.36' family: 'Brave' - major: '0' - minor: '7' - patch: '10' + major: '80' + minor: '0' + patch: '3987' + patch_minor: '87' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 12; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.4577.63 Brave/117.1.4577.63 Mobile Safari/537.36' + family: 'Brave' + major: '117' + minor: '1' + patch: '4577' + patch_minor: '63' + + - user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36 Brave/101' + family: 'Brave' + major: '101' + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Brave/537.36' + family: 'Brave' + major: '537' + minor: '36' + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Mobile Safari/537.36 Brave/1.40.128' + family: 'Brave' + major: '1' + minor: '40' + patch: '128' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.4472.124 Safari/537.3 brave/5035' + family: 'Brave' + major: '5035' + minor: + patch: - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome Safari/537.36' family: 'HeadlessChrome' @@ -7082,12 +7186,6 @@ test_cases: minor: patch: - - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0.1; GT-I9505 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 YaBrowser/16.2.1.1239.00 Mobile Safari/537.36' - family: 'Yandex Browser' - major: '16' - minor: '2' - patch: '1' - - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.2; SM-G800F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 MobileIron/1.6.0 Mobile Safari/537.36' family: 'MobileIron' major: '1' @@ -7099,12 +7197,14 @@ test_cases: major: '14' minor: '43' patch: '343' + patch_minor: '17' - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Z831 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.94 Mobile Crosswalk/11.45.2454.20160425 Mobile Safari/537.36' family: 'Crosswalk' major: '11' minor: '45' patch: '2454' + patch_minor: '20160425' - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Mobile/15A372 Safari Line/7.12.0' family: 'LINE' @@ -7871,7 +7971,6 @@ test_cases: major: '3' minor: '3' patch: '11' - patch_minor: '0' - user_agent_string: 'Boto/2.48.0 Python/2.7.14 Linux/4.2.0-41-generic' family: 'Boto' @@ -8047,6 +8146,7 @@ test_cases: major: '4' minor: '2' patch: '2' + patch_minor: '38484' - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0_2 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) GSA/36.0.169645775 Mobile/15A421 Safari/604.1' family: 'Google' @@ -8151,6 +8251,7 @@ test_cases: major: '10' minor: '29' patch: '1' + patch_minor: '0' - user_agent_string: 'OgScrper/1.0.0' family: 'OgScrper' @@ -8388,6 +8489,18 @@ test_cases: minor: patch: + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1 Ddg/17.2' + family: 'DuckDuckGo Mobile' + major: '17' + minor: '2' + patch: + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15 Ddg/17.2' + family: 'DuckDuckGo' + major: '17' + minor: '2' + patch: + - user_agent_string: 'Mozilla/5.0 [en] (X11, U; OpenVAS-VT 8.0.9)' family: 'OpenVAS Scanner' major: '8' @@ -8646,10 +8759,16 @@ test_cases: minor: '20' patch: '1' - - user_agent_string: 'Mozilla/4.0 (SerenityOS; x86_64) LibWeb+LibJS (Not KHTML, nor Gecko) LibWeb' - family: 'SerenityOS Browser' - major: - minor: + - user_agent_string: 'Mozilla/5.0 (Linux; x86_64) LibWeb+LibJS/1.0 Ladybird/1.0' + family: 'Ladybird' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; x86_64) Ladybird/1.0' + family: 'Ladybird' + major: '1' + minor: '0' patch: - user_agent_string: 'surveyon/2.7.6 Mobile (Android: 11; MODEL:CPH2127; PRODUCT:CPH2127T2; MANUFACTURER:OPPO;)' @@ -8675,3 +8794,103 @@ test_cases: major: '8' minor: '1' patch: '9' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Safari/605.1.15 (Ecosia ios@8.1.3.72)' + family: 'Ecosia iOS' + major: '8' + minor: '1' + patch: '3' + patch_minor: '72' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 9; Redmi 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Mobile Safari/537.36 (Ecosia android@101.0.4951.41)' + family: 'Ecosia Android' + major: '101' + minor: '0' + patch: '4951' + patch_minor: '41' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 MullvadBrowser/102.13.0' + family: 'MullvadBrowser' + major: '102' + minor: '13' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) EdgiOS/108 Version/13.0.3 Safari/605.1.15' + family: 'Edge Mobile' + major: '108' + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/102 Version/11.1.1 Safari/605.1.15' + family: 'Chrome Mobile iOS' + major: '102' + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 13; LGE-AN00; HMSCore 6.12.2.302) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.88 HuaweiBrowser/14.0.5.301 Mobile Safari/537.36' + family: 'Huawei Browser' + major: '14' + minor: '0' + patch: '5' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 AVG/121.0.0.0' + family: 'AVG' + major: '121' + minor: '0' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Avast/120.0.0.0' + family: 'Avast Secure Browser' + major: '120' + minor: '0' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.1.0; B43du7I2fV; U; in) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.5563.115 Mobile AvastSecureBrowser/7.5.2 Safari/537.36' + family: 'Avast Secure Browser' + major: '7' + minor: '5' + patch: '2' + + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 13; 0LpRiWjrpo; U; en) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.153 Mobile Avast/7.7.5 Safari/537.36' + family: 'Avast Secure Browser' + major: '7' + minor: '7' + patch: '5' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) AvastSecureBrowser/5.3.1 Mobile/15E148 Version/17.0 Safari/605.1.15' + family: 'Avast Secure Browser' + major: '5' + minor: '3' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 11; SM-A225M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/85.0.4183.127 Mobile Safari/537.36 Instabridge/22' + family: 'Instabridge' + major: '22' + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 11; SM-J400F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.127 Mobile Safari/537.36 Instabridge/21.9.0' + family: 'Instabridge' + major: '21' + minor: '9' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36 AlohaBrowser/5.6.1' + family: 'Aloha Browser' + major: '5' + minor: '6' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Version/17.2.1 Safari/605.1.15 AlohaBrowser/5.4.1' + family: 'Aloha Browser' + major: '5' + minor: '4' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 AlohaBrowser/1.3.0.0 Safari/537.36' + family: 'Aloha Browser' + major: '1' + minor: '3' + patch: '0' + patch_minor: '0'