diff --git a/src/constants.js b/src/constants.js index 32f6441..49c90de 100644 --- a/src/constants.js +++ b/src/constants.js @@ -29,6 +29,7 @@ export const BROWSER_ALIASES_MAP = { 'Internet Explorer': 'ie', InternetArchiveCrawler: 'internetarchivecrawler', 'K-Meleon': 'k_meleon', + Ladybird: 'ladybird', LibreWolf: 'librewolf', Linespider: 'linespider', Maxthon: 'maxthon', @@ -103,6 +104,7 @@ export const BROWSER_MAP = { ie: 'Internet Explorer', internetarchivecrawler: 'InternetArchiveCrawler', k_meleon: 'K-Meleon', + ladybird: 'Ladybird', librewolf: 'LibreWolf', linespider: 'Linespider', maxthon: 'Maxthon', @@ -175,6 +177,7 @@ export const ENGINE_MAP = { Blink: 'Blink', EdgeHTML: 'EdgeHTML', Gecko: 'Gecko', + LibWeb: 'LibWeb', Presto: 'Presto', Trident: 'Trident', WebKit: 'WebKit', diff --git a/src/parser-browsers.js b/src/parser-browsers.js index e917faa..568c2de 100644 --- a/src/parser-browsers.js +++ b/src/parser-browsers.js @@ -1122,6 +1122,22 @@ const browsersList = [ return browser; }, }, + /* Ladybird */ + { + test: [/ladybird/i], + describe(ua) { + const browser = { + name: 'Ladybird', + }; + const version = Utils.getFirstMatch(/ladybird\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, { test: [/chrome|crios|crmo/i], describe(ua) { diff --git a/src/parser-engines.js b/src/parser-engines.js index d46d0e5..7d9fbdd 100644 --- a/src/parser-engines.js +++ b/src/parser-engines.js @@ -30,6 +30,18 @@ export default [ }, }, + /* LibWeb */ + { + test(parser) { + return parser.getBrowserName(true) === 'ladybird'; + }, + describe() { + return { + name: ENGINE_MAP.LibWeb, + }; + }, + }, + /* Trident */ { test: [/trident/i], diff --git a/src/parser.js b/src/parser.js index ff8a522..3398031 100644 --- a/src/parser.js +++ b/src/parser.js @@ -68,7 +68,8 @@ class Parser { * like `"iPhone"` or `"Kindle Fire HD 7"` * @property {Object} engine * @property {String|undefined} [engine.name] - * Can be any of this: `WebKit`, `Blink`, `Gecko`, `Trident`, `Presto`, `EdgeHTML` + * Can be any of this: `WebKit`, `Blink`, `Gecko`, `Trident`, `Presto`, `EdgeHTML`, + * `LibWeb` * @property {String|undefined} [engine.version] String version of the engine */ this.parsedResult = {}; diff --git a/test/acceptance/useragentstrings.yml b/test/acceptance/useragentstrings.yml index 0f4dc85..474519f 100644 --- a/test/acceptance/useragentstrings.yml +++ b/test/acceptance/useragentstrings.yml @@ -3478,6 +3478,22 @@ engine: name: "WebKit" version: "537.42" + Ladybird: + - + ua: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Ladybird/1.0 Chrome/146.0.0.0 AppleWebKit/537.36 Safari/537.36" + spec: + browser: + name: "Ladybird" + version: "1.0" + os: + name: "macOS" + version: "10.15.7" + versionName: "Catalina" + platform: + type: "desktop" + vendor: "Apple" + engine: + name: "LibWeb" SlimerJS: - ua: "Mozilla/5.0 (X11; Linux x86_64; rv:21.0) Gecko/20100101 SlimerJS/0.7" diff --git a/test/unit/parser.js b/test/unit/parser.js index a9bfb79..415ff4b 100644 --- a/test/unit/parser.js +++ b/test/unit/parser.js @@ -75,6 +75,14 @@ test('Parser.getEngineName gives a lower-cased name of the engine', (t) => { t.is(parser.getEngineName(true), 'blink'); }); +test('Parser prioritizes browser-specific engines over generic UA tokens', (t) => { + const ladybirdUA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Ladybird/1.0 Gecko/20100101 Chrome/146.0.0.0 AppleWebKit/537.36 Safari/537.36'; + const ladybirdParser = new Parser(ladybirdUA); + + t.is(ladybirdParser.getBrowserName(), 'Ladybird'); + t.is(ladybirdParser.getEngineName(), 'LibWeb'); +}); + test('Skip parsing shouldn\'t parse', (t) => { t.deepEqual((new Parser(UA, true)).getResult(), {}); });