package.src.util.webp_supported.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of mapbox-gl Show documentation
Show all versions of mapbox-gl Show documentation
A WebGL interactive maps library
The newest version!
// @flow strict
import window from './window';
const exported = {
supported: false,
testSupport
};
export default exported;
let glForTesting;
let webpCheckComplete = false;
let webpImgTest;
let webpImgTestOnloadComplete = false;
if (window.document) {
webpImgTest = window.document.createElement('img');
webpImgTest.onload = function() {
if (glForTesting) testWebpTextureUpload(glForTesting);
glForTesting = null;
webpImgTestOnloadComplete = true;
};
webpImgTest.onerror = function() {
webpCheckComplete = true;
glForTesting = null;
};
webpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=';
}
function testSupport(gl: WebGLRenderingContext) {
if (webpCheckComplete || !webpImgTest) return;
// HTMLImageElement.complete is set when an image is done loading it's source
// regardless of whether the load was successful or not.
// It's possible for an error to set HTMLImageElement.complete to true which would trigger
// testWebpTextureUpload and mistakenly set exported.supported to true in browsers which don't support webp
// To avoid this, we set a flag in the image's onload handler and only call testWebpTextureUpload
// after a successful image load event.
if (webpImgTestOnloadComplete) {
testWebpTextureUpload(gl);
} else {
glForTesting = gl;
}
}
function testWebpTextureUpload(gl: WebGLRenderingContext) {
// Edge 18 supports WebP but not uploading a WebP image to a gl texture
// Test support for this before allowing WebP images.
// https://github.com/mapbox/mapbox-gl-js/issues/7671
const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
try {
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, webpImgTest);
// The error does not get triggered in Edge if the context is lost
if (gl.isContextLost()) return;
exported.supported = true;
} catch (e) {
// Catch "Unspecified Error." in Edge 18.
}
gl.deleteTexture(texture);
webpCheckComplete = true;
}