Skip to content

Commit ef0d09a

Browse files
authored
fix: final fix device detector (#30546)
1 parent e8c8f75 commit ef0d09a

File tree

2 files changed

+29
-11
lines changed

2 files changed

+29
-11
lines changed

packages/devextreme/js/core/devices.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ const UA_PARSERS = {
6868
const navigator = getNavigator();
6969
const isIpadOs = /Macintosh/i.test(userAgent) && navigator?.maxTouchPoints > 2;
7070
const isAppleDevice = /ip(hone|od|ad)/i.test(userAgent);
71-
7271
if(!isAppleDevice && !isIpadOs) {
7372
return null;
7473
}
@@ -78,9 +77,9 @@ const UA_PARSERS = {
7877
const version = matches ? [parseInt(matches[1], 10), parseInt(matches[2], 10), parseInt(matches[3] || 0, 10)] : [];
7978
const isIPhone4 = (window.screen.height === (960 / 2));
8079
const grade = isIPhone4 ? 'B' : 'A';
81-
80+
const isDesktopMode = /Macintosh/i.test(userAgent) && !/Mobile/i.test(userAgent);
8281
return {
83-
deviceType: isPhone ? 'phone' : 'tablet',
82+
deviceType: isDesktopMode ? 'desktop' : isPhone ? 'phone' : 'tablet',
8483
platform: 'ios',
8584
version,
8685
grade

packages/devextreme/testing/tests/DevExpress.core/devices.tests.js

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,21 @@ const userAgents = {
2222
chrome: 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/98.0.4758.85 Mobile/15E148 Safari/604.1',
2323
firefox: 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/115.0 Mobile/15E148 Safari/605.1.15',
2424
},
25+
iphone_16: {
26+
safari: 'Mozilla/5.0 (iPhone; CPU iPhone OS 19_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1',
27+
safari_desktop_mode: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15',
28+
chrome: 'Mozilla/5.0 (iPhone; CPU iPhone OS 19_0_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/138.0.7204.119 Mobile/15E148 Safari/604.1',
29+
firefox: 'Mozilla/5.0 (iPhone; CPU iPhone OS 19_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/140.3 Mobile/15E148 Safari/605.1.15',
30+
},
2531
ipad_10: 'Mozilla/5.0 (iPad; CPU OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1',
2632
ipad_16: {
27-
safari: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5.1 Safari/605.1.15',
33+
safari: 'Mozilla/5.0 (iPad; CPU OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5.1 Mobile/15E148 Safari/604.1', // Expected: "tablet" Result: "desktop"
2834
chrome: 'Mozilla/5.0 (iPad; CPU OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/114.0.5735.124 Mobile/15E148 Safari/604.1',
29-
firefox: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15',
35+
firefox: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15', // Expected: "tablet" Result: "desktop"
36+
},
37+
ipad_17: {
38+
safari: 'Mozilla/5.0 (iPad; CPU OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1',
39+
safari_desktop_mode: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15',
3040
},
3141
android_9: 'Mozilla/5.0 (Linux; Android 9; Mi A2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.143 Mobile Safari/537.36',
3242
android_tablet_7_1_1: 'Mozilla/5.0 (Linux; Android 7.1.1; SM-T555 Build/NMF26X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.158 Safari/537.36',
@@ -48,17 +58,25 @@ QUnit.module('devices', {
4858

4959
[
5060
// iphone
51-
['iphone 12', userAgents.iphone_12, 'ios', '12.3.1', 'phone', null],
52-
['iphone 14 safari', userAgents.iphone_14.safari, 'ios', '16.5.1', 'phone', null],
53-
['iphone 14 chrome', userAgents.iphone_14.chrome, 'ios', '16.5.0', 'phone', null],
54-
['iphone 14 firefox', userAgents.iphone_14.firefox, 'ios', '16.5.1', 'phone', null],
61+
['iphone 12', userAgents.iphone_12, 'ios', '12.3.1', 'phone', { maxTouchPoints: 5 }],
62+
63+
['iphone 14 safari', userAgents.iphone_14.safari, 'ios', '16.5.1', 'phone', { maxTouchPoints: 5 }],
64+
['iphone 14 chrome', userAgents.iphone_14.chrome, 'ios', '16.5.0', 'phone', { maxTouchPoints: 5 }],
65+
['iphone 14 firefox', userAgents.iphone_14.firefox, 'ios', '16.5.1', 'phone', { maxTouchPoints: 5 }],
66+
67+
['iphone 16 safari', userAgents.iphone_16.safari, 'ios', '19.0.0', 'phone', { maxTouchPoints: 5 }],
68+
['iphone 16 safari with desktop mode', userAgents.iphone_16.safari_desktop_mode, 'ios', '10.15.7', 'desktop', { maxTouchPoints: 5 }],
69+
['iphone 16 chrome', userAgents.iphone_16.chrome, 'ios', '19.0.0', 'phone', { maxTouchPoints: 5 }],
70+
['iphone 16 firefox', userAgents.iphone_16.firefox, 'ios', '19.0.0', 'phone', { maxTouchPoints: 5 }],
5571
// android phone
5672
['android phone 9', userAgents.android_9, 'android', '9.0.0', 'phone', null],
5773
// ipad
5874
['ipad 10', userAgents.ipad_10, 'ios', '10.3.3', 'tablet', { maxTouchPoints: 5 }],
59-
['ipad 16 safari', userAgents.ipad_16.safari, 'ios', '10.15.7', 'tablet', { maxTouchPoints: 5 }],
75+
['ipad 16 safari', userAgents.ipad_16.safari, 'ios', '16.5.0', 'tablet', { maxTouchPoints: 5 }],
6076
['ipad 16 chrome', userAgents.ipad_16.chrome, 'ios', '16.5.0', 'tablet', { maxTouchPoints: 5 }],
61-
['ipad 16 firefox', userAgents.ipad_16.firefox, 'ios', '10.15.7', 'tablet', { maxTouchPoints: 5 }],
77+
['ipad 16 firefox', userAgents.ipad_16.firefox, 'ios', '10.15.7', 'desktop', { maxTouchPoints: 5 }],
78+
['ipad 17 safari', userAgents.ipad_17.safari, 'ios', '17.5.0', 'tablet', { maxTouchPoints: 5 }],
79+
['ipad 17 with desktop mode', userAgents.ipad_17.safari_desktop_mode, 'ios', '10.15.7', 'desktop', { maxTouchPoints: 5 }],
6280
// android tablet
6381
['android tablet 7.1.1', userAgents.android_tablet_7_1_1, 'android', '7.1.1', 'tablet', null],
6482
// others
@@ -77,6 +95,7 @@ QUnit.module('devices', {
7795
setWindow({ navigator: navigatorMock }, true);
7896
}
7997

98+
devices._currentDevice = undefined;
8099
const device = fromUA(userAgent);
81100
assert.equal(device.platform, platform, 'correct platform');
82101
assert.equal(device.version.join('.') || null, version, 'correct version');

0 commit comments

Comments
 (0)