Merge pull request #5051 from fredj/remove_aborted_tiles

Handle aborted tiles in ol.TileQueue
This commit is contained in:
Frédéric Junod
2016-03-16 14:38:59 +01:00
4 changed files with 53 additions and 9 deletions
+2
View File
@@ -72,6 +72,8 @@ ol.ImageTile.prototype.disposeInternal = function() {
if (this.interimTile) { if (this.interimTile) {
this.interimTile.dispose(); this.interimTile.dispose();
} }
this.state = ol.TileState.ABORT;
this.changed();
goog.base(this, 'disposeInternal'); goog.base(this, 'disposeInternal');
}; };
+2 -1
View File
@@ -15,7 +15,8 @@ ol.TileState = {
LOADING: 1, LOADING: 1,
LOADED: 2, LOADED: 2,
ERROR: 3, ERROR: 3,
EMPTY: 4 EMPTY: 4,
ABORT: 5
}; };
+9 -5
View File
@@ -1,6 +1,7 @@
goog.provide('ol.TilePriorityFunction'); goog.provide('ol.TilePriorityFunction');
goog.provide('ol.TileQueue'); goog.provide('ol.TileQueue');
goog.require('goog.asserts');
goog.require('ol.events'); goog.require('ol.events');
goog.require('ol.events.EventType'); goog.require('ol.events.EventType');
goog.require('ol.Coordinate'); goog.require('ol.Coordinate');
@@ -56,7 +57,7 @@ ol.TileQueue = function(tilePriorityFunction, tileChangeCallback) {
/** /**
* @private * @private
* @type {Object.<string,boolean>} * @type {!Object.<string,boolean>}
*/ */
this.tilesLoadingKeys_ = {}; this.tilesLoadingKeys_ = {};
@@ -94,7 +95,7 @@ ol.TileQueue.prototype.handleTileChange = function(event) {
var tile = /** @type {ol.Tile} */ (event.target); var tile = /** @type {ol.Tile} */ (event.target);
var state = tile.getState(); var state = tile.getState();
if (state === ol.TileState.LOADED || state === ol.TileState.ERROR || if (state === ol.TileState.LOADED || state === ol.TileState.ERROR ||
state === ol.TileState.EMPTY) { state === ol.TileState.EMPTY || state === ol.TileState.ABORT) {
ol.events.unlisten(tile, ol.events.EventType.CHANGE, ol.events.unlisten(tile, ol.events.EventType.CHANGE,
this.handleTileChange, this); this.handleTileChange, this);
var tileKey = tile.getKey(); var tileKey = tile.getKey();
@@ -104,6 +105,7 @@ ol.TileQueue.prototype.handleTileChange = function(event) {
} }
this.tileChangeCallback_(); this.tileChangeCallback_();
} }
goog.asserts.assert(Object.keys(this.tilesLoadingKeys_).length === this.tilesLoading_);
}; };
@@ -113,15 +115,17 @@ ol.TileQueue.prototype.handleTileChange = function(event) {
*/ */
ol.TileQueue.prototype.loadMoreTiles = function(maxTotalLoading, maxNewLoads) { ol.TileQueue.prototype.loadMoreTiles = function(maxTotalLoading, maxNewLoads) {
var newLoads = 0; var newLoads = 0;
var tile; var tile, tileKey;
while (this.tilesLoading_ < maxTotalLoading && newLoads < maxNewLoads && while (this.tilesLoading_ < maxTotalLoading && newLoads < maxNewLoads &&
this.getCount() > 0) { this.getCount() > 0) {
tile = /** @type {ol.Tile} */ (this.dequeue()[0]); tile = /** @type {ol.Tile} */ (this.dequeue()[0]);
if (tile.getState() === ol.TileState.IDLE) { tileKey = tile.getKey();
this.tilesLoadingKeys_[tile.getKey()] = true; if (tile.getState() === ol.TileState.IDLE && !(tileKey in this.tilesLoadingKeys_)) {
this.tilesLoadingKeys_[tileKey] = true;
++this.tilesLoading_; ++this.tilesLoading_;
++newLoads; ++newLoads;
tile.load(); tile.load();
} }
goog.asserts.assert(Object.keys(this.tilesLoadingKeys_).length === this.tilesLoading_);
} }
}; };
+40 -3
View File
@@ -14,15 +14,16 @@ describe('ol.TileQueue', function() {
} }
var tileId = 0; var tileId = 0;
function createImageTile() { function createImageTile(opt_tileLoadFunction) {
++tileId; ++tileId;
var tileCoord = [tileId, tileId, tileId]; var tileCoord = [tileId, tileId, tileId];
var state = ol.TileState.IDLE; var state = ol.TileState.IDLE;
var src = 'data:image/gif;base64,R0lGODlhAQABAPAAAP8AAP///' + var src = 'data:image/gif;base64,R0lGODlhAQABAPAAAP8AAP///' +
'yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==#' + tileId; 'yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==#' + tileId;
return new ol.ImageTile(tileCoord, state, src, null, var tileLoadFunction = opt_tileLoadFunction ?
ol.source.Image.defaultImageLoadFunction); opt_tileLoadFunction : ol.source.Image.defaultImageLoadFunction;
return new ol.ImageTile(tileCoord, state, src, null, tileLoadFunction);
} }
describe('#loadMoreTiles()', function() { describe('#loadMoreTiles()', function() {
@@ -121,11 +122,47 @@ describe('ol.TileQueue', function() {
}); });
}); });
describe('tile change event', function() {
var noop = function() {};
it('abort queued tiles', function() {
var tq = new ol.TileQueue(noop, noop);
var tile = createImageTile();
expect(tile.hasListener(ol.events.EventType.CHANGE)).to.be(false);
tq.enqueue([tile]);
expect(tile.hasListener(ol.events.EventType.CHANGE)).to.be(true);
tile.dispose();
expect(tile.hasListener(ol.events.EventType.CHANGE)).to.be(false);
expect(tile.getState()).to.eql(ol.TileState.ABORT);
});
it('abort loading tiles', function() {
var tq = new ol.TileQueue(noop, noop);
var tile = createImageTile(noop);
tq.enqueue([tile]);
tq.loadMoreTiles(Infinity, Infinity);
expect(tq.getTilesLoading()).to.eql(1);
expect(tile.getState()).to.eql(ol.TileState.LOADING);
tile.dispose();
expect(tq.getTilesLoading()).to.eql(0);
expect(tile.hasListener(ol.events.EventType.CHANGE)).to.be(false);
expect(tile.getState()).to.eql(ol.TileState.ABORT);
});
});
}); });
goog.require('ol.ImageTile'); goog.require('ol.ImageTile');
goog.require('ol.Tile'); goog.require('ol.Tile');
goog.require('ol.TileState'); goog.require('ol.TileState');
goog.require('ol.TileQueue'); goog.require('ol.TileQueue');
goog.require('ol.events.EventType');
goog.require('ol.source.Image'); goog.require('ol.source.Image');
goog.require('ol.structs.PriorityQueue'); goog.require('ol.structs.PriorityQueue');