From a9378427eddb7a49395be6556c448b95814352fc Mon Sep 17 00:00:00 2001 From: Faisal Salman Date: Sat, 21 Jun 2025 13:31:52 +0700 Subject: [PATCH] Improve Windows detection & recognize Windows CE & RT as separate OS variants --- src/enums/ua-parser-enums.d.ts | 2 + src/enums/ua-parser-enums.js | 2 + src/main/ua-parser.js | 39 ++-- test/data/ua/os/windows-ce.json | 20 ++ test/data/ua/os/windows-mobile.json | 18 ++ test/data/ua/os/windows-phone.json | 31 ++- test/data/ua/os/windows-rt.json | 20 ++ test/data/ua/os/windows.json | 290 ++++++++++++++++++++++++---- 8 files changed, 365 insertions(+), 57 deletions(-) create mode 100644 test/data/ua/os/windows-ce.json create mode 100644 test/data/ua/os/windows-rt.json diff --git a/src/enums/ua-parser-enums.d.ts b/src/enums/ua-parser-enums.d.ts index 2b2b466..97c760a 100644 --- a/src/enums/ua-parser-enums.d.ts +++ b/src/enums/ua-parser-enums.d.ts @@ -373,9 +373,11 @@ export const OS: Readonly<{ WATCHOS: "watchOS"; WEBOS: "WebOS"; WINDOWS: "Windows"; + WINDOWS_CE: "Windows CE"; WINDOWS_IOT: "Windows IoT"; WINDOWS_MOBILE: "Windows Mobile"; WINDOWS_PHONE: "Windows Phone"; + WINDOWS_RT: "Windows RT"; XBOX: "Xbox"; XUBUNTU: "Xubuntu"; ZENWALK: "Zenwalk"; diff --git a/src/enums/ua-parser-enums.js b/src/enums/ua-parser-enums.js index c4d869c..803970c 100644 --- a/src/enums/ua-parser-enums.js +++ b/src/enums/ua-parser-enums.js @@ -388,9 +388,11 @@ const OS = Object.freeze({ WATCHOS: 'watchOS', WEBOS: 'WebOS', WINDOWS: 'Windows', + WINDOWS_CE: 'Windows CE', WINDOWS_IOT: 'Windows IoT', WINDOWS_MOBILE: 'Windows Mobile', WINDOWS_PHONE: 'Windows Phone', + WINDOWS_RT: 'Windows RT', XBOX: 'Xbox', XUBUNTU: 'Xubuntu', ZENWALK: 'Zenwalk' diff --git a/src/main/ua-parser.js b/src/main/ua-parser.js index 69c4485..e23ebb5 100755 --- a/src/main/ua-parser.js +++ b/src/main/ua-parser.js @@ -299,17 +299,17 @@ ////////////// var windowsVersionMap = { - 'ME' : '4.90', - 'NT 3.11' : 'NT3.51', - 'NT 4.0' : 'NT4.0', - '2000' : 'NT 5.0', - 'XP' : ['NT 5.1', 'NT 5.2'], - 'Vista' : 'NT 6.0', - '7' : 'NT 6.1', - '8' : 'NT 6.2', - '8.1' : 'NT 6.3', - '10' : ['NT 6.4', 'NT 10.0'], - 'RT' : 'ARM' + 'ME' : '4.90', + 'NT 3.51': '3.51', + 'NT 4.0': '4.0', + '2000' : ['5.0', '5.01'], + 'XP' : ['5.1', '5.2'], + 'Vista' : '6.0', + '7' : '6.1', + '8' : '6.2', + '8.1' : '6.3', + '10' : ['6.4', '10.0'], + 'NT' : '' }, formFactorsMap = { @@ -946,14 +946,17 @@ os : [[ // Windows - /microsoft (windows) (7|vista|xp)/i // Windows + /(windows nt) (6\.[23]); arm/i // Windows RT + ], [[NAME, /N/, 'R'], [VERSION, strMapper, windowsVersionMap]], [ + /(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i, // Windows IoT/Mobile/Phone + // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11 + /(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|vista|xp)/i + ], [NAME, VERSION], [ + /windows nt ?([\d\.\)]*)(?!.+xbox)/i, + /\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i + ], [[VERSION, /(;|\))/g, '', strMapper, windowsVersionMap], [NAME, WINDOWS]], [ + /(windows ce)\/?([\d\.]*)/i // Windows CE ], [NAME, VERSION], [ - /(windows (?:phone(?: os)?|mobile|iot))[\/ ]?([\d\.\w ]*)/i // Windows Phone - ], [NAME, [VERSION, strMapper, windowsVersionMap]], [ - /windows nt 6\.2; (arm)/i, // Windows RT - /windows[\/ ]([ntce\d\. ]+\w)(?!.+xbox)/i, - /(?:win(?=3|9|n)|win 9x )([nt\d\.]+)/i - ], [[VERSION, strMapper, windowsVersionMap], [NAME, WINDOWS]], [ // iOS/macOS /[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS diff --git a/test/data/ua/os/windows-ce.json b/test/data/ua/os/windows-ce.json new file mode 100644 index 0000000..a28eb17 --- /dev/null +++ b/test/data/ua/os/windows-ce.json @@ -0,0 +1,20 @@ +[ + { + "desc" : "Windows CE", + "ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)", + "expect" : + { + "name" : "Windows CE", + "version" : "undefined" + } + }, + { + "desc" : "Windows CE", + "ua" : "Mozilla/4.0 (PDA; Windows CE/1.0.1) NetFront/3.0", + "expect" : + { + "name" : "Windows CE", + "version" : "1.0.1" + } + } +] \ No newline at end of file diff --git a/test/data/ua/os/windows-mobile.json b/test/data/ua/os/windows-mobile.json index 5baf78c..78df88b 100644 --- a/test/data/ua/os/windows-mobile.json +++ b/test/data/ua/os/windows-mobile.json @@ -16,5 +16,23 @@ "name" : "Windows Mobile", "version" : "undefined" } + }, + { + "desc" : "Windows Mobile", + "ua" : "Opera/9.7 (Windows Mobile; PPC; Opera Mobi/35166; U; en) Presto/2.2.1", + "expect" : + { + "name" : "Windows Mobile", + "version" : "undefined" + } + }, + { + "desc" : "Windows Mobile 6.1", + "ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11) 320x240; VZW; Motorola-Q9c; Windows Mobile 6.1 Standard", + "expect" : + { + "name" : "Windows Mobile", + "version" : "6.1" + } } ] \ No newline at end of file diff --git a/test/data/ua/os/windows-phone.json b/test/data/ua/os/windows-phone.json index a6a8b82..bf4bd0a 100644 --- a/test/data/ua/os/windows-phone.json +++ b/test/data/ua/os/windows-phone.json @@ -9,14 +9,32 @@ } }, { - "desc" : "Windows Phone OS", + "desc" : "Windows Phone 6.5", + "ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; HTC_Touch2_T3333; Windows Phone 6.5)", + "expect" : + { + "name" : "Windows Phone", + "version" : "6.5" + } + }, + { + "desc" : "Windows Phone 7.0", "ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; DELL; Venue Pro)", "expect" : { - "name" : "Windows Phone OS", + "name" : "Windows Phone", "version" : "7.0" } }, + { + "desc" : "Windows Phone 7.5", + "ua" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800)", + "expect" : + { + "name" : "Windows Phone", + "version" : "7.5" + } + }, { "desc" : "Windows Phone 8", "ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; HTC; Windows Phone 8X by HTC)", @@ -25,5 +43,14 @@ "name" : "Windows Phone", "version" : "8.0" } + }, + { + "desc" : "Windows Phone 8.1", + "ua" : "Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 635) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537", + "expect" : + { + "name" : "Windows Phone", + "version" : "8.1" + } } ] \ No newline at end of file diff --git a/test/data/ua/os/windows-rt.json b/test/data/ua/os/windows-rt.json new file mode 100644 index 0000000..8bee151 --- /dev/null +++ b/test/data/ua/os/windows-rt.json @@ -0,0 +1,20 @@ +[ + { + "desc" : "Windows RT 8", + "ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)", + "expect" : + { + "name" : "Windows RT", + "version" : "8" + } + }, + { + "desc" : "Windows RT 8.1", + "ua" : "Mozilla/5.0 (Windows NT 6.3; ARM; Trident/7.0; Touch; rv:11.0) like Gecko", + "expect" : + { + "name" : "Windows RT", + "version" : "8.1" + } + } +] \ No newline at end of file diff --git a/test/data/ua/os/windows.json b/test/data/ua/os/windows.json index 1173baf..f2f747d 100644 --- a/test/data/ua/os/windows.json +++ b/test/data/ua/os/windows.json @@ -1,4 +1,103 @@ [ + { + "desc" : "Windows 3.1", + "ua" : "NCSA_Mosaic/2.0 (Windows 3.1)", + "expect" : + { + "name" : "Windows", + "version" : "3.1" + } + }, + { + "desc" : "Windows 3.1", + "ua" : "Mozilla/1.22 (compatible; MSIE 2.0; Windows 3.1)", + "expect" : + { + "name" : "Windows", + "version" : "3.1" + } + }, + { + "desc" : "Windows NT", + "ua" : "Mozilla/4.51 [de] (WinNT; I)", + "expect" : + { + "name" : "Windows", + "version" : "NT" + } + }, + { + "desc" : "Windows NT 3.51", + "ua" : "Mozilla/4.0 (compatible; MSIE 4.0; Windows NT)", + "expect" : + { + "name" : "Windows", + "version" : "NT" + } + }, + { + "desc" : "Windows NT 3.51", + "ua" : "Mozilla/4.0 (compatible; MSIE 5.05; Windows NT 3.51)", + "expect" : + { + "name" : "Windows", + "version" : "NT 3.51" + } + }, + { + "desc" : "Windows NT 4.0", + "ua" : "Opera/8.41.(Windows NT 4.0; ts-ZA) Presto/2.9.178 Version/11.00", + "expect" : + { + "name" : "Windows", + "version" : "NT 4.0" + } + }, + { + "desc" : "Windows NT 4.0", + "ua" : "Mozilla/5.0 (Windows; U; WinNT4.0; de-DE; rv:1.7.5) Gecko/20041108 Firefox/52.7.4", + "expect" : + { + "name" : "Windows", + "version" : "NT 4.0" + } + }, + { + "desc" : "Netscape on Windows 95", + "ua" : "Mozilla/5.0 (Windows; U; Win95; de-DE; rv:0.9.2) Gecko/20010726 Netscape6/6.1", + "expect" : + { + "name" : "Windows", + "version" : "95" + } + }, + { + "desc" : "Windows 95", + "ua" : "Mozilla/3.0 (Win95)", + "expect" : + { + "name" : "Windows", + "version" : "95" + } + }, + { + "desc" : "Windows 95", + "ua" : "Mozilla/3.0 (compatible; Opera/3.0; Windows 95/NT4) 3.2", + "expect" : + { + "name" : "Windows", + "version" : "95" + } + }, + { + "desc" : "Windows 95", + "ua" : "Mozilla/4.0 (compatible; MSIE 5.0; Windows 95) Opera 6.02 [en]", + "expect" : + { + "name" : "Windows", + "version" : "95" + } + }, { "desc" : "Windows 95", "ua" : "Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)", @@ -17,6 +116,24 @@ "version" : "98" } }, + { + "desc" : "Firebird on Windows 98", + "ua" : "Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5) Gecko/20031007 Firebird/0.7", + "expect" : + { + "name" : "Windows", + "version" : "98" + } + }, + { + "desc" : "K-Meleon on Windows 98", + "ua" : "Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5) Gecko/20031016 K-Meleon/0.8.2", + "expect" : + { + "name" : "Windows", + "version" : "98" + } + }, { "desc" : "Windows ME", "ua" : "Mozilla/5.0 (Windows; U; Win 9x 4.90) Gecko/20020502 CS 2000 7.0/7.0", @@ -26,6 +143,51 @@ "version" : "ME" } }, + { + "desc" : "Opera on Windows ME", + "ua" : "Mozilla/4.0 (compatible; MSIE 5.0; Windows ME) Opera 5.12 [de]", + "expect" : + { + "name" : "Windows", + "version" : "ME" + } + }, + { + "desc" : "Netscape on Windows ME", + "ua" : "Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.8.1.8pre) Gecko/20071015 Firefox/2.0.0.7 Navigator/9.0", + "expect" : + { + "name" : "Windows", + "version" : "ME" + } + }, + { + "desc" : "Netscape on Windows 2000", + "ua" : "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.5) Gecko/20050519 Netscape/8.0.1", + "expect" : + { + "name" : "Windows", + "version" : "2000" + } + }, + { + "desc" : "Opera on Windows 2000", + "ua" : "Opera/6.05 (Windows 2000; U)", + "expect" : + { + "name" : "Windows", + "version" : "2000" + } + }, + { + "desc" : "Opera on Windows 2000", + "ua" : "Opera/9.69 (Windows NT 5.01; en-US) Presto/2.8.160 Version/10.00", + "expect" : + { + "name" : "Windows", + "version" : "2000" + } + }, { "desc" : "Windows 2000", "ua" : "Mozilla/3.0 (compatible; MSIE 3.0; Windows NT 5.0)", @@ -44,6 +206,15 @@ "version" : "XP" } }, + { + "desc" : "Windows XP", + "ua" : "Mozilla/5.0 (Windows XP; U) Opera 6.05 [de]", + "expect" : + { + "name" : "Windows", + "version" : "XP" + } + }, { "desc" : "Windows Vista", "ua" : "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; fr-FR)", @@ -62,6 +233,15 @@ "version" : "7" } }, + { + "desc" : "Windows 7", + "ua" : "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Evernote Windows/306387 (pt-PT, DDL); Windows/6.1.0 (Win32); Safari/537.36", + "expect" : + { + "name" : "Windows", + "version" : "7" + } + }, { "desc" : "Windows 7", "ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)", @@ -80,6 +260,15 @@ "version" : "8" } }, + { + "desc" : "Windows 8.1", + "ua" : "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:66.0.5) Gecko/20100101 Firefox/66.0.5", + "expect" : + { + "name" : "Windows", + "version" : "8.1" + } + }, { "desc" : "Windows 10", "ua" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0", @@ -108,48 +297,75 @@ } }, { - "desc" : "Windows RT", - "ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)", - "expect" : - { - "name" : "Windows", - "version" : "RT" - } - }, - { - "desc" : "Windows CE", - "ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)", - "expect" : - { - "name" : "Windows", - "version" : "CE" - } - }, - { - "desc" : "Windows NT on x86 or aarch64 CPU using Firefox", - "ua" : "Mozilla/5.0 (Windows NT x.y; rv:10.0) Gecko/20100101 Firefox/10.0", - "expect" : - { - "name" : "Windows", - "version" : "NT x" - } - }, - { - "desc" : "Windows NT on x64 CPU using Firefox", - "ua" : "Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0", - "expect" : - { - "name" : "Windows", - "version" : "NT x" - } - }, - { - "desc" : "iTunes Windows Vista", + "desc" : "iTunes on Windows Vista", "ua" : "iTunes/10.7 (Windows; Microsoft Windows Vista Home Premium Edition Service Pack 1 (Build 6001)) AppleWebKit/536.26.9", "expect" : { "name" : "Windows", "version" : "Vista" } + }, + { + "desc" : "iTunes on Windows 7", + "ua" : "iTunes/10.6.3 (Windows; Microsoft Windows 7 x64 Business Edition Service Pack 1 (Build 7601)) AppleWebKit/534.57.2", + "expect" : + { + "name" : "Windows", + "version" : "7" + } + }, + { + "desc" : "iTunes on Windows 8", + "ua" : "iTunes/12.1.1 (Windows; Microsoft Windows 8 x64 Business Edition (Build 9200)) AppleWebKit/7600.1017.9000.2", + "expect" : + { + "name" : "Windows", + "version" : "8" + } + }, + { + "desc" : "iTunes on Windows 8.1", + "ua" : "iTunes/12.4 (Windows; Microsoft Windows 8.1 x64 Business Edition (Build 9200); x64) AppleWebKit/7601.6016.1000.1", + "expect" : + { + "name" : "Windows", + "version" : "8.1" + } + }, + { + "desc" : "iTunes on Windows 10", + "ua" : "iTunes/12.9.1 (Windows; Microsoft Windows 10 x64 Professional Edition (Build 18362); x64) AppleWebKit/7606.2104.0.21", + "expect" : + { + "name" : "Windows", + "version" : "10" + } + }, + { + "desc" : "iTunes on Windows 10", + "ua" : "iTunes/12.6.3 (Windows; Microsoft Windows 10.0 x64 (Build 17763); x64) AppleWebKit/7604.1038.1006.6", + "expect" : + { + "name" : "Windows", + "version" : "10" + } + }, + { + "desc" : "iTunes on Windows 10 S", + "ua" : "iTunes/12.12 (Windows; Microsoft Windows 10 S x64; x64) AppleWebKit/7613.2007", + "expect" : + { + "name" : "Windows", + "version" : "10" + } + }, + { + "desc" : "iTunes on Windows 11", + "ua" : "iTunes/12.13 (Windows; Microsoft Windows 11 x64; x64) AppleWebKit/7613.2007", + "expect" : + { + "name" : "Windows", + "version" : "11" + } } ] \ No newline at end of file