From e603b067151ca8088793a8451038716f7c14b08d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 29 May 2012 23:01:36 +0200 Subject: [PATCH] make SelectControl.unselectAll safer --- lib/OpenLayers/Control/SelectFeature.js | 8 +++++-- tests/Control/SelectFeature.html | 28 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/lib/OpenLayers/Control/SelectFeature.js b/lib/OpenLayers/Control/SelectFeature.js index e5129ce9fc..9d2064bfd7 100644 --- a/lib/OpenLayers/Control/SelectFeature.js +++ b/lib/OpenLayers/Control/SelectFeature.js @@ -306,8 +306,12 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, { layer = layers[l]; for(var i=layer.selectedFeatures.length-1; i>=0; --i) { feature = layer.selectedFeatures[i]; - if(!options || options.except != feature) { - this.unselect(feature); + // feature can be undefined here if an unselectfeature + // listeners has unselected or removed other features + if(feature) { + if(!options || options.except != feature) { + this.unselect(feature); + } } } } diff --git a/tests/Control/SelectFeature.html b/tests/Control/SelectFeature.html index 68e3031165..fbf47989f4 100644 --- a/tests/Control/SelectFeature.html +++ b/tests/Control/SelectFeature.html @@ -558,6 +558,34 @@ t.eq(layer1.renderer.getRenderLayerId(), layer1.id, "Root container moved correctly when control is destroyed and layers was an array parameter"); } + + function test_unselectAll(t) { + t.plan(1); + + var layer = new OpenLayers.Layer.Vector(); + + var control = new OpenLayers.Control.SelectFeature(layer); + + var feature1 = new OpenLayers.Feature.Vector(); + var feature2 = new OpenLayers.Feature.Vector(); + var feature3 = new OpenLayers.Feature.Vector(); + + layer.addFeatures([feature1, feature2, feature3]); + + control.select(feature1); + control.select(feature2); + control.select(feature3); + + layer.events.on({ + featureunselected: function(e) { + layer.removeFeatures([feature2]); + } + }); + + control.unselectAll(); + t.eq(layer.selectedFeatures.length, 0, + 'unselectAll unselects all features'); + }