From 57492109e0cb879e1d40166842e7525427386fe5 Mon Sep 17 00:00:00 2001 From: Ken Wilcox <37879461+Drkjr92@users.noreply.github.com> Date: Sun, 24 Mar 2024 00:33:42 -0400 Subject: [PATCH 1/9] Extend isTablet detection to include iPad and touch-enabled Macs --- src/utils/device.js | 11 ++++++++++- tests/utils/device.test.js | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/utils/device.js b/src/utils/device.js index 0e134a2947..1fceacdb3d 100644 --- a/src/utils/device.js +++ b/src/utils/device.js @@ -123,7 +123,16 @@ module.exports.isMobile = isMobile; */ function isTablet (mockUserAgent) { var userAgent = mockUserAgent || window.navigator.userAgent; - return /ipad|Nexus (7|9)|xoom|sch-i800|playbook|tablet|kindle/i.test(userAgent); + var platform = window.navigator.platform; + var maxTouchPoints = window.navigator.maxTouchPoints || 0; + + var isTabletUA = /ipad|Nexus (7|9)|xoom|sch-i800|playbook|tablet|kindle/i.test(userAgent); + + // Additional check for iPad or MacIntel with touch capabilities and not an MSStream device + var isTouchDevice = platform === 'iPad' || + (platform === 'MacIntel' && maxTouchPoints > 0 && !window.MSStream); + + return isTabletUA || isTouchDevice; } module.exports.isTablet = isTablet; diff --git a/tests/utils/device.test.js b/tests/utils/device.test.js index d13e849b19..2352c3c421 100644 --- a/tests/utils/device.test.js +++ b/tests/utils/device.test.js @@ -8,6 +8,20 @@ suite('isTablet', function () { assert.ok(device.isTablet(nexus7)); assert.ok(device.isTablet(nexus9)); }); + + test('is true for iPad', function () { + var iPadUserAgent = 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1'; + var platform = 'iPad'; + var maxTouchPoints = 5; // Assuming iPad has touch points + assert.ok(device.isTablet(iPadUserAgent, platform, maxTouchPoints)); + }); + + test('is true for MacIntel with touch capabilities', function () { + var macUserAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.2 Safari/605.1.15'; + var platform = 'MacIntel'; + var maxTouchPoints = 5; // Simulate a Mac with touch capabilities + assert.ok(device.isTablet(macUserAgent, platform, maxTouchPoints)); + }); }); suite('environment', function () { From 5319a958b60ad3ca2d08164eb1841c1cf749b38d Mon Sep 17 00:00:00 2001 From: Ken Wilcox <37879461+Drkjr92@users.noreply.github.com> Date: Sun, 24 Mar 2024 00:33:42 -0400 Subject: [PATCH 2/9] Extend isTablet detection to include iPad and touch-enabled Macs (fixes #5494) --- src/utils/device.js | 11 ++++++++++- tests/utils/device.test.js | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/utils/device.js b/src/utils/device.js index 0e134a2947..1fceacdb3d 100644 --- a/src/utils/device.js +++ b/src/utils/device.js @@ -123,7 +123,16 @@ module.exports.isMobile = isMobile; */ function isTablet (mockUserAgent) { var userAgent = mockUserAgent || window.navigator.userAgent; - return /ipad|Nexus (7|9)|xoom|sch-i800|playbook|tablet|kindle/i.test(userAgent); + var platform = window.navigator.platform; + var maxTouchPoints = window.navigator.maxTouchPoints || 0; + + var isTabletUA = /ipad|Nexus (7|9)|xoom|sch-i800|playbook|tablet|kindle/i.test(userAgent); + + // Additional check for iPad or MacIntel with touch capabilities and not an MSStream device + var isTouchDevice = platform === 'iPad' || + (platform === 'MacIntel' && maxTouchPoints > 0 && !window.MSStream); + + return isTabletUA || isTouchDevice; } module.exports.isTablet = isTablet; diff --git a/tests/utils/device.test.js b/tests/utils/device.test.js index d13e849b19..2352c3c421 100644 --- a/tests/utils/device.test.js +++ b/tests/utils/device.test.js @@ -8,6 +8,20 @@ suite('isTablet', function () { assert.ok(device.isTablet(nexus7)); assert.ok(device.isTablet(nexus9)); }); + + test('is true for iPad', function () { + var iPadUserAgent = 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1'; + var platform = 'iPad'; + var maxTouchPoints = 5; // Assuming iPad has touch points + assert.ok(device.isTablet(iPadUserAgent, platform, maxTouchPoints)); + }); + + test('is true for MacIntel with touch capabilities', function () { + var macUserAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.2 Safari/605.1.15'; + var platform = 'MacIntel'; + var maxTouchPoints = 5; // Simulate a Mac with touch capabilities + assert.ok(device.isTablet(macUserAgent, platform, maxTouchPoints)); + }); }); suite('environment', function () { From 3798ad369b8653a80396bc8473e1291825458f26 Mon Sep 17 00:00:00 2001 From: Ken Wilcox <37879461+Drkjr92@users.noreply.github.com> Date: Sun, 24 Mar 2024 13:20:03 -0400 Subject: [PATCH 3/9] split ipad check / add seperate test suite --- src/utils/device.js | 22 +++++++++++++++------- tests/utils/device.test.js | 15 ++++++++++++--- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/utils/device.js b/src/utils/device.js index 1fceacdb3d..86732ed5e2 100644 --- a/src/utils/device.js +++ b/src/utils/device.js @@ -123,19 +123,27 @@ module.exports.isMobile = isMobile; */ function isTablet (mockUserAgent) { var userAgent = mockUserAgent || window.navigator.userAgent; - var platform = window.navigator.platform; - var maxTouchPoints = window.navigator.maxTouchPoints || 0; - var isTabletUA = /ipad|Nexus (7|9)|xoom|sch-i800|playbook|tablet|kindle/i.test(userAgent); + var isTablet = /ipad|Nexus (7|9)|xoom|sch-i800|playbook|tablet|kindle/i.test(userAgent); // Additional check for iPad or MacIntel with touch capabilities and not an MSStream device - var isTouchDevice = platform === 'iPad' || - (platform === 'MacIntel' && maxTouchPoints > 0 && !window.MSStream); - - return isTabletUA || isTouchDevice; + return isTablet || isIpad(); } module.exports.isTablet = isTablet; +/** + * Detect ipad devices. + * @param {string} mockUserAgent - Allow passing a mock user agent for testing. + * @param {string} mockDevicePlatform - Allow passing a mock device platform for testing. + * @param {string} mockDeviceTouchPoints - Allow passing a mock device touch points for testing. +*/ +function isIpad (mockUserAgent, mockDevicePlatform, mockDeviceTouchPoints) { + var userAgent = mockUserAgent || window.navigator.userAgent; + var platform = mockDevicePlatform || window.navigator.platform; + var maxTouchPoints = mockDeviceTouchPoints || window.navigator.maxTouchPoints || 0; + + return platform === 'iPad' || (platform === 'MacIntel' && maxTouchPoints > 0 && /Macintosh|Intel|iPad/i.test(userAgent) && !window.MSStream); +} function isIOS () { return /iPad|iPhone|iPod/.test(window.navigator.platform); } diff --git a/tests/utils/device.test.js b/tests/utils/device.test.js index 2352c3c421..4b318e7fb5 100644 --- a/tests/utils/device.test.js +++ b/tests/utils/device.test.js @@ -8,19 +8,28 @@ suite('isTablet', function () { assert.ok(device.isTablet(nexus7)); assert.ok(device.isTablet(nexus9)); }); +}); +suite('isIpad', function () { test('is true for iPad', function () { var iPadUserAgent = 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1'; var platform = 'iPad'; - var maxTouchPoints = 5; // Assuming iPad has touch points + var maxTouchPoints = 5; assert.ok(device.isTablet(iPadUserAgent, platform, maxTouchPoints)); }); test('is true for MacIntel with touch capabilities', function () { var macUserAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.2 Safari/605.1.15'; var platform = 'MacIntel'; - var maxTouchPoints = 5; // Simulate a Mac with touch capabilities - assert.ok(device.isTablet(macUserAgent, platform, maxTouchPoints)); + var maxTouchPoints = 5; + assert.ok(device.isIpad(macUserAgent, platform, maxTouchPoints)); + }); + + test('is false for MacIntel with no touch capabilities', function () { + var macUserAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.2 Safari/605.1.15'; + var platform = 'MacIntel'; + var maxTouchPoints = 0; + assert.ok(device.isIpad(macUserAgent, platform, maxTouchPoints)); }); }); From 251b7d0cd401d32881c2163694684b220aad69c7 Mon Sep 17 00:00:00 2001 From: Ken Wilcox <37879461+Drkjr92@users.noreply.github.com> Date: Sun, 24 Mar 2024 13:26:50 -0400 Subject: [PATCH 4/9] export iPad function --- src/utils/device.js | 1 + tests/utils/device.test.js | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/utils/device.js b/src/utils/device.js index 86732ed5e2..f23ba1633a 100644 --- a/src/utils/device.js +++ b/src/utils/device.js @@ -144,6 +144,7 @@ function isIpad (mockUserAgent, mockDevicePlatform, mockDeviceTouchPoints) { return platform === 'iPad' || (platform === 'MacIntel' && maxTouchPoints > 0 && /Macintosh|Intel|iPad/i.test(userAgent) && !window.MSStream); } +module.exports.isIpad = isIpad; function isIOS () { return /iPad|iPhone|iPod/.test(window.navigator.platform); } diff --git a/tests/utils/device.test.js b/tests/utils/device.test.js index 4b318e7fb5..a06d7dee17 100644 --- a/tests/utils/device.test.js +++ b/tests/utils/device.test.js @@ -10,7 +10,7 @@ suite('isTablet', function () { }); }); -suite('isIpad', function () { +suite.only('isIpad', function () { test('is true for iPad', function () { var iPadUserAgent = 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1'; var platform = 'iPad'; @@ -29,7 +29,7 @@ suite('isIpad', function () { var macUserAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.2 Safari/605.1.15'; var platform = 'MacIntel'; var maxTouchPoints = 0; - assert.ok(device.isIpad(macUserAgent, platform, maxTouchPoints)); + assert.ok(!device.isIpad(macUserAgent, platform, maxTouchPoints)); }); }); From 425c08a2c006b3e545c7a70a9dfd5e8aaca3f70a Mon Sep 17 00:00:00 2001 From: Ken Wilcox <37879461+Drkjr92@users.noreply.github.com> Date: Sun, 24 Mar 2024 13:27:34 -0400 Subject: [PATCH 5/9] add spacing for linter --- src/utils/device.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils/device.js b/src/utils/device.js index f23ba1633a..98850e7367 100644 --- a/src/utils/device.js +++ b/src/utils/device.js @@ -145,6 +145,7 @@ function isIpad (mockUserAgent, mockDevicePlatform, mockDeviceTouchPoints) { return platform === 'iPad' || (platform === 'MacIntel' && maxTouchPoints > 0 && /Macintosh|Intel|iPad/i.test(userAgent) && !window.MSStream); } module.exports.isIpad = isIpad; + function isIOS () { return /iPad|iPhone|iPod/.test(window.navigator.platform); } From 98b5a116008dbb44bd934b912dae387d07f25c80 Mon Sep 17 00:00:00 2001 From: Ken Wilcox <37879461+Drkjr92@users.noreply.github.com> Date: Sun, 24 Mar 2024 13:28:25 -0400 Subject: [PATCH 6/9] remove only on suite test --- tests/utils/device.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/utils/device.test.js b/tests/utils/device.test.js index a06d7dee17..e2f017ec94 100644 --- a/tests/utils/device.test.js +++ b/tests/utils/device.test.js @@ -10,7 +10,7 @@ suite('isTablet', function () { }); }); -suite.only('isIpad', function () { +suite('isIpad', function () { test('is true for iPad', function () { var iPadUserAgent = 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1'; var platform = 'iPad'; From 8fbfdee373fc20a51f7ca732eda079f2b0f0e1f3 Mon Sep 17 00:00:00 2001 From: Ken Wilcox <37879461+Drkjr92@users.noreply.github.com> Date: Sun, 24 Mar 2024 13:44:53 -0400 Subject: [PATCH 7/9] format for temporary variable --- src/utils/device.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/device.js b/src/utils/device.js index 98850e7367..ef409c94d8 100644 --- a/src/utils/device.js +++ b/src/utils/device.js @@ -124,10 +124,10 @@ module.exports.isMobile = isMobile; function isTablet (mockUserAgent) { var userAgent = mockUserAgent || window.navigator.userAgent; - var isTablet = /ipad|Nexus (7|9)|xoom|sch-i800|playbook|tablet|kindle/i.test(userAgent); + var _isTablet = /ipad|Nexus (7|9)|xoom|sch-i800|playbook|tablet|kindle/i.test(userAgent); // Additional check for iPad or MacIntel with touch capabilities and not an MSStream device - return isTablet || isIpad(); + return _isTablet || isIpad(); } module.exports.isTablet = isTablet; From 207efc269333684d3dcc0ff3b491dfef961556a2 Mon Sep 17 00:00:00 2001 From: Ken Wilcox <37879461+Drkjr92@users.noreply.github.com> Date: Sun, 31 Mar 2024 17:47:19 -0400 Subject: [PATCH 8/9] move all ipad checks to appropriate method / update test call --- src/utils/device.js | 4 ++-- tests/utils/device.test.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils/device.js b/src/utils/device.js index ef409c94d8..e4f42be811 100644 --- a/src/utils/device.js +++ b/src/utils/device.js @@ -124,7 +124,7 @@ module.exports.isMobile = isMobile; function isTablet (mockUserAgent) { var userAgent = mockUserAgent || window.navigator.userAgent; - var _isTablet = /ipad|Nexus (7|9)|xoom|sch-i800|playbook|tablet|kindle/i.test(userAgent); + var _isTablet = /Nexus (7|9)|xoom|sch-i800|playbook|tablet|kindle/i.test(userAgent); // Additional check for iPad or MacIntel with touch capabilities and not an MSStream device return _isTablet || isIpad(); @@ -142,7 +142,7 @@ function isIpad (mockUserAgent, mockDevicePlatform, mockDeviceTouchPoints) { var platform = mockDevicePlatform || window.navigator.platform; var maxTouchPoints = mockDeviceTouchPoints || window.navigator.maxTouchPoints || 0; - return platform === 'iPad' || (platform === 'MacIntel' && maxTouchPoints > 0 && /Macintosh|Intel|iPad/i.test(userAgent) && !window.MSStream); + return ((platform === 'iPad' || platform === 'MacIntel') && maxTouchPoints > 0 && /Macintosh|Intel|iPad|ipad/i.test(userAgent) && !window.MSStream); } module.exports.isIpad = isIpad; diff --git a/tests/utils/device.test.js b/tests/utils/device.test.js index e2f017ec94..5c0b803cd2 100644 --- a/tests/utils/device.test.js +++ b/tests/utils/device.test.js @@ -15,7 +15,7 @@ suite('isIpad', function () { var iPadUserAgent = 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1'; var platform = 'iPad'; var maxTouchPoints = 5; - assert.ok(device.isTablet(iPadUserAgent, platform, maxTouchPoints)); + assert.ok(device.isIpad(iPadUserAgent, platform, maxTouchPoints)); }); test('is true for MacIntel with touch capabilities', function () { From a2e312e287998fdff1bd734869448bc94184d6f7 Mon Sep 17 00:00:00 2001 From: Ken Wilcox <37879461+Drkjr92@users.noreply.github.com> Date: Sun, 31 Mar 2024 17:50:04 -0400 Subject: [PATCH 9/9] remove underscore --- src/utils/device.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/device.js b/src/utils/device.js index e4f42be811..16f9e498f0 100644 --- a/src/utils/device.js +++ b/src/utils/device.js @@ -124,10 +124,10 @@ module.exports.isMobile = isMobile; function isTablet (mockUserAgent) { var userAgent = mockUserAgent || window.navigator.userAgent; - var _isTablet = /Nexus (7|9)|xoom|sch-i800|playbook|tablet|kindle/i.test(userAgent); + var isTablet = /Nexus (7|9)|xoom|sch-i800|playbook|tablet|kindle/i.test(userAgent); // Additional check for iPad or MacIntel with touch capabilities and not an MSStream device - return _isTablet || isIpad(); + return isTablet || isIpad(); } module.exports.isTablet = isTablet;