Improve device.type detection using client hints "form-factor" data

This commit is contained in:
Faisal Salman 2023-08-20 13:41:03 +07:00
parent d168b75a3a
commit 2046b77ede
2 changed files with 34 additions and 0 deletions

View File

@ -43,6 +43,7 @@
USER_AGENT = 'user-agent',
UA_MAX_LENGTH = 350,
BRANDS = 'brands',
FORMFACTOR = 'formFactor',
FULLVERLIST = 'fullVersionList',
PLATFORM = 'platform',
PLATFORMVER = 'platformVersion',
@ -51,6 +52,7 @@
CH_HEADER_FULL_VER_LIST = CH_HEADER + '-full-version-list',
CH_HEADER_ARCH = CH_HEADER + '-arch',
CH_HEADER_BITNESS = CH_HEADER + '-' + BITNESS,
CH_HEADER_FORM_FACTOR = CH_HEADER + '-form-factor',
CH_HEADER_MOBILE = CH_HEADER + '-' + MOBILE,
CH_HEADER_MODEL = CH_HEADER + '-' + MODEL,
CH_HEADER_PLATFORM = CH_HEADER + '-' + PLATFORM,
@ -256,6 +258,15 @@
'8.1' : 'NT 6.3',
'10' : ['NT 6.4', 'NT 10.0'],
'RT' : 'ARM'
},
formFactorMap = {
'embedded' : 'Automotive',
'mobile' : 'Mobile',
'tablet' : 'Tablet',
'smarttv' : 'TV',
'wearable' : ['VR', 'XR'],
'?' : 'Unknown'
};
//////////////
@ -930,6 +941,7 @@
[PLATFORM, stripQuotes(uach[CH_HEADER_PLATFORM])],
[PLATFORMVER, stripQuotes(uach[CH_HEADER_PLATFORM_VER])],
[ARCHITECTURE, stripQuotes(uach[CH_HEADER_ARCH])],
[FORMFACTOR, stripQuotes(uach[CH_HEADER_FORM_FACTOR])],
[BITNESS, stripQuotes(uach[CH_HEADER_BITNESS])]
]);
} else {
@ -1044,6 +1056,9 @@
if (uaCH[MODEL]) {
this.set(MODEL, uaCH[MODEL]);
}
if (uaCH[FORMFACTOR]) {
this.set(TYPE, strMapper(uaCH[FORMFACTOR], formFactorMap));
}
break;
case UA_OS:
var osName = uaCH[PLATFORM];

View File

@ -462,4 +462,23 @@ describe('Map UA-CH headers', function () {
assert.strictEqual(ua.device.is("tablet"), false);
});
});
it('Can detect form-factor from client-hints', function () {
const FFVR = {
'sec-ch-ua-form-factor' : 'VR'
};
const FFUnknown = {
'sec-ch-ua-form-factor' : 'Unknown'
};
UAParser(FFVR).withClientHints().then(function (ua) {
assert.strictEqual(ua.device.type, 'wearable');
});
UAParser(FFUnknown).withClientHints().then(function (ua) {
assert.strictEqual(ua.device.type, undefined);
});
});
});