-
Notifications
You must be signed in to change notification settings - Fork 17
/
index.js
122 lines (101 loc) · 3.71 KB
/
index.js
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
'use strict';
exports.supported = isSupported;
exports.notSupportedReason = notSupportedReason;
/**
* Test whether the current browser supports Mapbox GL JS
* @param {Object} options
* @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false`
* if the performance of Mapbox GL JS would be dramatically worse than
* expected (i.e. a software renderer is would be used)
* @return {boolean}
*/
function isSupported(options) {
return !notSupportedReason(options);
}
function notSupportedReason(options) {
if (!isBrowser()) return 'not a browser';
if (!isWorkerSupported()) return 'insufficient worker support';
if (!isCanvasGetImageDataSupported()) return 'insufficient Canvas/getImageData support';
if (!isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat)) return 'insufficient WebGL2 support';
if (!isNotIE()) return 'insufficient ECMAScript 6 support';
}
function isBrowser() {
return typeof window !== 'undefined' && typeof document !== 'undefined';
}
function isWorkerSupported() {
if (!('Worker' in window && 'Blob' in window && 'URL' in window)) {
return false;
}
var blob = new Blob([''], { type: 'text/javascript' });
var workerURL = URL.createObjectURL(blob);
var supported;
var worker;
try {
worker = new Worker(workerURL);
supported = true;
} catch (e) {
supported = false;
}
if (worker) {
worker.terminate();
}
URL.revokeObjectURL(workerURL);
return supported;
}
// Some browsers or browser extensions block access to canvas data to prevent fingerprinting.
// Mapbox GL uses this API to load sprites and images in general.
function isCanvasGetImageDataSupported() {
var canvas = document.createElement('canvas');
canvas.width = canvas.height = 1;
var context = canvas.getContext('2d');
if (!context) {
return false;
}
var imageData = context.getImageData(0, 0, 1, 1);
return imageData && imageData.width === canvas.width;
}
var isWebGLSupportedCache = {};
function isWebGLSupportedCached(failIfMajorPerformanceCaveat) {
if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) {
isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat);
}
return isWebGLSupportedCache[failIfMajorPerformanceCaveat];
}
isSupported.webGLContextAttributes = {
antialias: false,
alpha: true,
stencil: true,
depth: true
};
function getWebGLContext(failIfMajorPerformanceCaveat) {
var canvas = document.createElement('canvas');
var attributes = Object.create(isSupported.webGLContextAttributes);
attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat;
return canvas.getContext('webgl2', attributes);
}
function isWebGLSupported(failIfMajorPerformanceCaveat) {
var gl = getWebGLContext(failIfMajorPerformanceCaveat);
if (!gl) {
return false;
}
// Try compiling a shader and get its compile status. Some browsers like Brave block this API
// to prevent fingerprinting. Unfortunately, this also means that Mapbox GL won't work.
var shader;
try {
shader = gl.createShader(gl.VERTEX_SHADER);
} catch (e) {
// some older browsers throw an exception that `createShader` is not defined
// so handle this separately from the case where browsers block `createShader`
// for security reasons
return false;
}
if (!shader || gl.isContextLost()) {
return false;
}
gl.shaderSource(shader, 'void main() {}');
gl.compileShader(shader);
return gl.getShaderParameter(shader, gl.COMPILE_STATUS) === true;
}
function isNotIE() {
return !document.documentMode;
}