UNPKG

mapbox-gl

Version:
102 lines (93 loc) 3.25 kB
'use strict'; const window = require('./window'); class AJAXError extends Error { constructor(message, status) { super(message); this.status = status; } } exports.getJSON = function(url, callback) { const xhr = new window.XMLHttpRequest(); xhr.open('GET', url, true); xhr.setRequestHeader('Accept', 'application/json'); xhr.onerror = function(e) { callback(e); }; xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300 && xhr.response) { let data; try { data = JSON.parse(xhr.response); } catch (err) { return callback(err); } callback(null, data); } else { callback(new AJAXError(xhr.statusText, xhr.status)); } }; xhr.send(); return xhr; }; exports.getArrayBuffer = function(url, callback) { const xhr = new window.XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'arraybuffer'; xhr.onerror = function(e) { callback(e); }; xhr.onload = function() { if (xhr.response.byteLength === 0 && xhr.status === 200) { return callback(new Error('http status 200 returned without content.')); } if (xhr.status >= 200 && xhr.status < 300 && xhr.response) { callback(null, { data: xhr.response, cacheControl: xhr.getResponseHeader('Cache-Control'), expires: xhr.getResponseHeader('Expires') }); } else { callback(new AJAXError(xhr.statusText, xhr.status)); } }; xhr.send(); return xhr; }; function sameOrigin(url) { const a = window.document.createElement('a'); a.href = url; return a.protocol === window.document.location.protocol && a.host === window.document.location.host; } const transparentPngUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII='; exports.getImage = function(url, callback) { // request the image with XHR to work around caching issues // see https://github.com/mapbox/mapbox-gl-js/issues/1470 return exports.getArrayBuffer(url, (err, imgData) => { if (err) return callback(err); const img = new window.Image(); const URL = window.URL || window.webkitURL; img.onload = () => { callback(null, img); URL.revokeObjectURL(img.src); }; const blob = new window.Blob([new Uint8Array(imgData.data)], { type: 'image/png' }); img.cacheControl = imgData.cacheControl; img.expires = imgData.expires; img.src = imgData.data.byteLength ? URL.createObjectURL(blob) : transparentPngUrl; }); }; exports.getVideo = function(urls, callback) { const video = window.document.createElement('video'); video.onloadstart = function() { callback(null, video); }; for (let i = 0; i < urls.length; i++) { const s = window.document.createElement('source'); if (!sameOrigin(urls[i])) { video.crossOrigin = 'Anonymous'; } s.src = urls[i]; video.appendChild(s); } return video; };