From c1abe4a550166d211d9f75d5963d6190250e6a6f Mon Sep 17 00:00:00 2001 From: oterral Date: Fri, 19 May 2017 15:57:59 +0200 Subject: [PATCH] Force state of error tiles when usInterimTilesOnError is false --- src/ol/imagetile.js | 9 +++++++++ src/ol/renderer/canvas/tilelayer.js | 4 ++++ src/ol/tile.js | 7 +++++++ src/ol/vectorimagetile.js | 9 --------- src/ol/vectortile.js | 9 --------- test/spec/ol/imagetile.test.js | 19 +++++++++++++++++++ 6 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/ol/imagetile.js b/src/ol/imagetile.js index a474374a01..424856e5fd 100644 --- a/src/ol/imagetile.js +++ b/src/ol/imagetile.js @@ -94,6 +94,7 @@ ol.ImageTile.prototype.getKey = function() { */ ol.ImageTile.prototype.handleImageError_ = function() { this.state = ol.TileState.ERROR; + this.image_ = ol.ImageTile.blankImage; this.unlistenImage_(); this.changed(); }; @@ -143,3 +144,11 @@ ol.ImageTile.prototype.unlistenImage_ = function() { this.imageListenerKeys_.forEach(ol.events.unlistenByKey); this.imageListenerKeys_ = null; }; + + +/** + * A blank image. + * @type {Image} + */ +ol.ImageTile.blankImage = new Image(); +ol.ImageTile.blankImage.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'; diff --git a/src/ol/renderer/canvas/tilelayer.js b/src/ol/renderer/canvas/tilelayer.js index 100ec2fcd1..3690c00107 100644 --- a/src/ol/renderer/canvas/tilelayer.js +++ b/src/ol/renderer/canvas/tilelayer.js @@ -144,6 +144,10 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame = function(frameState, layer for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) { tile = tileSource.getTile(z, x, y, pixelRatio, projection); + // When useInterimTilesOnError is false, we consider the error tile as loaded. + if (tile.getState() == ol.TileState.ERROR && !this.getLayer().getUseInterimTilesOnError()) { + tile.setState(ol.TileState.LOADED); + } if (!this.isDrawableTile_(tile)) { tile = tile.getInterimTile(); } diff --git a/src/ol/tile.js b/src/ol/tile.js index 4d1628bea4..9a1bfe7e84 100644 --- a/src/ol/tile.js +++ b/src/ol/tile.js @@ -145,6 +145,13 @@ ol.Tile.prototype.getState = function() { return this.state; }; +/** + * @param {ol.TileState} state State. + */ +ol.Tile.prototype.setState = function(state) { + this.state = state; + this.changed(); +}; /** * Load the image or retry if loading previously failed. diff --git a/src/ol/vectorimagetile.js b/src/ol/vectorimagetile.js index 7ac49ab936..7a3371d3df 100644 --- a/src/ol/vectorimagetile.js +++ b/src/ol/vectorimagetile.js @@ -243,15 +243,6 @@ ol.VectorImageTile.prototype.load = function() { }; -/** - * @param {ol.TileState} tileState Tile state. - */ -ol.VectorImageTile.prototype.setState = function(tileState) { - this.state = tileState; - this.changed(); -}; - - /** * Sets the loader for a tile. * @param {ol.VectorTile} tile Vector tile. diff --git a/src/ol/vectortile.js b/src/ol/vectortile.js index 11fa1f8f05..4976e90156 100644 --- a/src/ol/vectortile.js +++ b/src/ol/vectortile.js @@ -161,15 +161,6 @@ ol.VectorTile.prototype.setReplayGroup = function(key, replayGroup) { }; -/** - * @param {ol.TileState} tileState Tile state. - */ -ol.VectorTile.prototype.setState = function(tileState) { - this.state = tileState; - this.changed(); -}; - - /** * Set the feature loader for reading this tile's features. * @param {ol.FeatureLoader} loader Feature loader. diff --git a/test/spec/ol/imagetile.test.js b/test/spec/ol/imagetile.test.js index 1a73392c50..6b6bdb5ce3 100644 --- a/test/spec/ol/imagetile.test.js +++ b/test/spec/ol/imagetile.test.js @@ -61,6 +61,25 @@ describe('ol.ImageTile', function() { tile.load(); }); + it('loads an empty image on error ', function(done) { + var tileCoord = [0, 0, 0]; + var state = ol.TileState.IDLE; + var src = 'spec/ol/data/osm-0-0-99.png'; + var tileLoadFunction = ol.source.Image.defaultImageLoadFunction; + var tile = new ol.ImageTile(tileCoord, state, src, null, tileLoadFunction); + + ol.events.listen(tile, ol.events.EventType.CHANGE, function(event) { + var state = tile.getState(); + if (state == ol.TileState.ERROR) { + expect(state).to.be(ol.TileState.ERROR); + expect(tile.image_).to.be(ol.ImageTile.blankImage); + done(); + } + }); + + tile.load(); + }); + }); });