-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdetect_mac_gpu.htm
171 lines (145 loc) · 7.31 KB
/
detect_mac_gpu.htm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script language="javascript" type="text/javascript">
const CRLF = "<br />\n";
var canvas_find_gpu = document.createElement('canvas');
var gl_find_gpu;
var debugInfo_find_gpu;
var vendor_find_gpu;
var renderer_find_gpu; // Chrome may list itself as 'Google SwiftShader'
try {
gl_find_gpu = canvas_find_gpu.getContext('webgl') || canvas_find_gpu.getContext('experimental-webgl');
} catch (e) {
}
if (gl_find_gpu) {
debugInfo_find_gpu = gl_find_gpu.getExtension('WEBGL_debug_renderer_info');
vendor_find_gpu = gl_find_gpu.getParameter(debugInfo_find_gpu.UNMASKED_VENDOR_WEBGL);
renderer_find_gpu = gl_find_gpu.getParameter(debugInfo_find_gpu.UNMASKED_RENDERER_WEBGL);
navigator.gpu = renderer_find_gpu;
}
// add new items to navigator object
navigator.browser = '';
navigator.realVendor = navigator.vendor;
navigator.realPlatform = navigator.platform;
navigator.OSInfo = '';
// basic browser identification: order is important!!!
if (navigator.vendor.toLowerCase().indexOf('apple')!==-1)
navigator.browser = 'Safari'; // Apple Safari
else if (navigator.userAgent.toLowerCase().indexOf('firefox')!==-1)
navigator.browser = 'Firefox'; // Mozilla Firefox
else if (navigator.userAgent.toLowerCase().indexOf('silk')!==-1)
navigator.browser = 'Silk'; // Kindle Silk Browser
else if (typeof(window.opera)!='undefined' || navigator.userAgent.toLowerCase().indexOf('opera')!==-1 || navigator.userAgent.toLowerCase().indexOf('opr')!==-1)
navigator.browser = 'Opera'; // Opera (Chrome-ish)
else if (navigator.vendor.toLowerCase().indexOf('google')!==-1 && navigator.userAgent.toLowerCase().indexOf('edg/')!==-1)
navigator.browser = 'Edge'; // Chromium-Based MS Edge
else if (navigator.vendor.toLowerCase().indexOf('google')!==-1)
navigator.browser = 'Chrome'; // Google Chrome
else if (navigator.userAgent.toLowerCase().indexOf('msie')!==-1 || (navigator.userAgent.toLowerCase().indexOf('windows nt')!==-1 && navigator.userAgent.toLowerCase().indexOf('trident')!==-1))
navigator.browser = 'Explorer'; // MS Internet Explorer
else if (navigator.userAgent.toLowerCase().indexOf('edge')!==-1)
navigator.browser = 'Edge'; // MS Edge (MSHTML Version)
function id_mac_by_version(ver_num=0) // looking for x.y
{
var name = '';
if (parseInt(ver_num)<11)
{
switch(ver_num) // https://en.wikipedia.org/wiki/MacOS_version_history
{ // version 10.3 and below were PowerPC only, 10.6 and up dropped PowerPC support in favor of Intel
case 10.0: name = 'Cheetah'; break; // 2001 (Spring) // supported PowerPC
case 10.1: name = 'Puma'; break; // 2001 (Fall) // supported PowerPC
case 10.2: name = 'Jaguar'; break; // 2002 // supported PowerPC
// 10.3 and up detected by browser code below, the above versions are listed here for information purposes only
case 10.3: name = 'Panther'; break; // 2003 // supported PowerPC
case 10.4: name = 'Tiger'; break; // 2004 // supported Intel and PowerPC
case 10.5: name = 'Leopard'; break; // 2007 // supported Intel and PowerPC
case 10.6: name = 'Snow Leopard'; break; // 2009 // supported Intel
case 10.7: name = 'Lion'; break; // 2011 // supported Intel
case 10.8: name = 'Mountain Lion'; break; // 2012 // supported Intel
case 10.9: name = 'Mavericks'; break; // 2013 // supported Intel
case 10.10: name = 'Yosemite'; break; // 2014 // supported Intel
case 10.11: name = 'El Capitan'; break; // 2015 // supported Intel
case 10.12: name = 'Sierra'; break; // 2016 // supported Intel
case 10.13: name = 'High High Sierra'; break; // 2017 // supported Intel
case 10.14: name = 'Mojave'; break; // 2018 // supported Intel
case 10.15: name = 'Catalina'; break; // 2019 // supported Intel (64-bit only)
default: break;
}
}
else if (parseInt(ver_num)==11) // version 11 disguises itself as 10.15 in some browsers, fix that later
{
name = 'Big Sur'; // 2020 // supported Intel (64-bit only) and M1: OS X 11 Required for for M1 Macs
}
return name;
}
if (navigator.gpu=='Apple M1') navigator.realPlatform = 'Macintosh M1';
switch (navigator.browser) // for those with missing or incorrect data
{
case 'Firefox': navigator.realVendor = 'Mozilla, Inc.'; break;
case 'Explorer': case 'Edge': navigator.realVendor = 'Microsoft, Inc.'; break;
default: break;
}
function detect_mac_version()
{
var uagent = navigator.userAgent;
var os_version = '';
var delim = '';
var ver_num = '';
if (uagent.indexOf('Mac OS X')!=-1) // covers versions of OS X from 10.3 and tested up to 10.16
{
if (uagent.indexOf('AppleWebKit/31')!=-1)
{
os_version = "OS X 10.3"; // OS X 10.3 Panther (older versions used webkit match) just included this one for example
}
else // versions newer than 10.3
{
var idx = uagent.indexOf('Mac OS X') + 9;
os_version = "OS X";
var tmp = uagent.substr(idx,8);
if (tmp.indexOf('_')!=-1) delim = '_';
else if (tmp.indexOf('.')!=-1) delim = '.';
if (delim) tmp_ver = tmp.split(delim);
if (tmp_ver) ver_num = parseFloat(parseInt(tmp_ver[0]) + '.' + parseInt(tmp_ver[1])); //navigator.realPlatform='Macintosh M1';
if (navigator.gpu=='Apple M1' && ver_num==10.15) ver_num = '11.x'; // fix where version 11 disguises itself as 10.15 in some browsers
os_version += ' ' + ver_num + ' ' + id_mac_by_version(ver_num);
}
}
return os_version;
}
navigator.OSInfo = detect_mac_version();
if (navigator.platform=='MacIntel' && navigator.OSInfo=='OS X 10.15 Catalina'
&& (navigator.browser=='Safari' || navigator.browser=='Firefox'))
{ navigator.OSInfo+=' / OS X 11.x Big Sur' }
</script>
</head>
<body>
<p>Mac (and others) testing</p>
<div id="output"></div>
<script language="javascript" type="text/javascript">
var txt = '';
txt+= "navigator.gpu: " + navigator.gpu + CRLF;
txt+= "navigator.userAgent: " + navigator.userAgent + CRLF;
txt+= "navigator.appVersion: " + navigator.appVersion + CRLF;
txt+= "navigator.appCodeName: " + navigator.appCodeName + CRLF;
txt+= "navigator.appName: " + navigator.appName + CRLF;
txt+= "navigator.vendor: " + navigator.vendor + CRLF;
txt+= "navigator.realVendor: " + navigator.realVendor + CRLF;
txt+= "navigator.platform: " + navigator.platform + CRLF;
txt+= "navigator.realPlatform: " + navigator.realPlatform + CRLF;
if (navigator.OSInfo) txt+= "navigator.OSInfo: " + navigator.OSInfo + CRLF;
txt+= "navigator.browser: " + navigator.browser + CRLF;
if (typeof(navigator.browser)=='undefined' && navigator.userAgent.toLowerCase().indexOf('firefox')!==-1) txt+='Browser: Firefox (with added security)';
document.getElementById('output').innerHTML = txt;
</script>
<P>Google Chrome, MS Edge for Mac, Opera all recognize Big Sur (11.2 at the time of this writing)<br>
Safari (tested on 12.1 & 14.03) and Firefox 87 mistaken OS X 11 (Big Sur) for OS X 10.5 (Catalina)<br>
If any browser sees an M1 Mac via GPU detection, this recognizes Big Sur as the true OS<br>
Intel Macs running Big Sur (using Safari or Firefox) do not recognize OS X 11 Big Sur due to a bad user agent string
</P>
<p>Google Chrome lists it's own GPU: 'Google SwiftShader' but the other browsers here appear to detect the M1 via the GPU value.</p>
<p>All of these browsers if run on an M1 Mac appear to detect Big Sur in this manner.</p>
</body>
</html>