Adding destroy method, as suggested by @bartvde

This commit is contained in:
ahocevar
2012-11-29 15:33:49 -06:00
parent 80fa251649
commit 9609bb1449
2 changed files with 63 additions and 5 deletions

View File

@@ -170,11 +170,25 @@ OpenLayers.TileManager = OpenLayers.Class({
var layer = evt.layer;
if (layer instanceof OpenLayers.Layer.Grid) {
this.clearTileQueue({object: layer});
layer.events.un({
addtile: this.addTile,
retile: this.clearTileQueue,
scope: this
});
if (layer.events) {
layer.events.un({
addtile: this.addTile,
retile: this.clearTileQueue,
scope: this
});
}
if (layer.grid) {
var i, j, tile;
for (i=layer.grid.length-1; i>=0; --i) {
for (j=layer.grid[i].length-1; j>=0; --j) {
tile = layer.grid[i][j];
this.unloadTile({object: tile});
if (tile.url) {
this.manageTileCache({object: tile});
}
}
}
}
}
},
@@ -322,6 +336,31 @@ OpenLayers.TileManager = OpenLayers.Class({
this.tileQueue.splice(i, 1);
}
}
},
destroy: function() {
window.clearTimeout(this.tileQueueId);
var map = this.map;
if (map.layers) {
for (var i=0, ii=map.layers.length; i<ii; ++i) {
this.removeLayer({layer: map.layers[i]});
}
}
if (map.events) {
map.events.un({
move: this.move,
zoomend: this.zoomEnd,
addlayer: this.addLayer,
removelayer: this.removeLayer,
scope: this
});
}
this.map = null;
this.tileQueue = null;
if (this.tileCache !== OpenLayers.TileManager.prototype.tileCache) {
this.tileCache = null;
this.tileCacheIndex = null;
}
}
});

View File

@@ -19,6 +19,25 @@
t.ok(tileManager.tileQueue.length, "Tiles queued from added layer");
map.destroy();
t.eq(tileManager.tileQueue.length, 0, "Tiles unqueued when map is destroyed");
tileManager.destroy();
}
function test_destroy(t) {
t.plan(3);
var map = new OpenLayers.Map('map');
var layer = new OpenLayers.Layer.WMS('WMS', '../img/blank.gif');
map.addLayer(layer);
map.setCenter([16, 48], 9);
var numTileListeners = (layer.grid[0][0].events.listeners.reload || []).length;
var numLayerListeners = (layer.events.listeners.retile || []).length;
var numMapListeners = (map.events.listeners.removelayer || []).length;
var tileManager = new OpenLayers.TileManager({map: map});
tileManager.destroy();
t.eq(layer.grid[0][0].events.listeners.reload.length, numTileListeners, "no listener on tile after destroy");
t.eq(layer.events.listeners.retile.length, numLayerListeners, "no listeners on layer after destroy");
t.eq(map.events.listeners.removelayer.length, numMapListeners, "no listeners on map after destroy");
map.destroy();
}
function test_manageTileCache(t) {