export var SquaremapTileLayer = L.TileLayer.extend({ // @method createTile(coords: Object, done?: Function): HTMLElement // Called only internally, overrides GridLayer's [`createTile()`](#gridlayer-createtile) // to return an `` HTML element with the appropriate image URL given `coords`. The `done` // callback is called when the tile has been loaded. createTile: function (coords, done) { var tile = document.createElement('img'); L.DomEvent.on(tile, 'load', () => { //Once image has loaded revoke the object URL as we don't need it anymore URL.revokeObjectURL(tile.src); this._tileOnLoad(done, tile) }); L.DomEvent.on(tile, 'error', L.Util.bind(this._tileOnError, this, done, tile)); if (this.options.crossOrigin || this.options.crossOrigin === '') { tile.crossOrigin = this.options.crossOrigin === true ? '' : this.options.crossOrigin; } tile.alt = ''; tile.setAttribute('role', 'presentation'); //Retrieve image via a fetch instead of just setting the src //This works around the fact that browsers usually don't make a request for an image that was previously loaded, //without resorting to changing the URL (which would break caching). fetch(this.getTileUrl(coords)) .then(res => { //Call leaflet's error handler if request fails for some reason if (!res.ok) { this._tileOnError(done, tile, null); return; } //Get image data and convert into object URL so it can be used as a src //Leaflet's onload listener will take it from here res.blob().then(blob => tile.src = URL.createObjectURL(blob)); }) .catch(() => this._tileOnError(done, tile, null)); return tile; } });