diff --git a/src/parser-browsers.js b/src/parser-browsers.js index a6567e1..a6dd494 100644 --- a/src/parser-browsers.js +++ b/src/parser-browsers.js @@ -761,11 +761,29 @@ const browsersList = [ }, }, { - test: [/vivaldi/i], - describe(ua) { + test(parser) { + // Check Client Hints brands for Vivaldi + if (parser.hasBrand('Vivaldi')) { + return true; + } + // Fall back to UA string detection + return parser.test(/vivaldi/i); + }, + describe(ua, parser) { const browser = { name: 'Vivaldi', }; + + // Try Client Hints brand version first + if (parser) { + const hintsVersion = parser.getBrandVersion('Vivaldi'); + if (hintsVersion) { + browser.version = hintsVersion; + return browser; + } + } + + // Fall back to UA string version const version = Utils.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i, ua); if (version) { diff --git a/test/acceptance/useragentstrings.yml b/test/acceptance/useragentstrings.yml index a36a875..6f76be4 100644 --- a/test/acceptance/useragentstrings.yml +++ b/test/acceptance/useragentstrings.yml @@ -2595,6 +2595,21 @@ type: "desktop" engine: name: "Blink" + - + ua: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 Vivaldi/7.8.3925.66" + spec: + browser: + name: "Vivaldi" + version: "7.8.3925.66" + os: + name: "macOS" + version: "10.15.7" + versionName: "Catalina" + platform: + type: "desktop" + vendor: "Apple" + engine: + name: "Blink" Generic: - ua: "Generic/2.15 libww" diff --git a/test/unit/parser.js b/test/unit/parser.js index 46d7e25..a9bfb79 100644 --- a/test/unit/parser.js +++ b/test/unit/parser.js @@ -419,3 +419,33 @@ test('Parser.getBrandVersion returns version for Brave', (t) => { const p = new Parser(BRAVE_UA, false, BRAVE_HINTS); t.is(p.getBrandVersion('Brave'), '144'); }); + +const VIVALDI_HINTS = { + brands: [ + { brand: 'Vivaldi', version: '7.1' }, + { brand: 'Chromium', version: '134' }, + { brand: 'Not_A Brand', version: '24' }, + ], + mobile: false, + platform: 'Windows', + platformVersion: '15.0.0', +}; + +const VIVALDI_UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'; + +test('Parser detects Vivaldi from client hints brands', (t) => { + const p = new Parser(VIVALDI_UA, false, VIVALDI_HINTS); + t.is(p.getBrowserName(), 'Vivaldi'); + t.is(p.getBrowserVersion(), '7.1'); +}); + +test('Parser.hasBrand detects Vivaldi', (t) => { + const p = new Parser(VIVALDI_UA, false, VIVALDI_HINTS); + t.true(p.hasBrand('Vivaldi')); + t.true(p.hasBrand('vivaldi')); +}); + +test('Parser.getBrandVersion returns version for Vivaldi', (t) => { + const p = new Parser(VIVALDI_UA, false, VIVALDI_HINTS); + t.is(p.getBrandVersion('Vivaldi'), '7.1'); +});