Merge pull request #486 from elemoine/486

OpenLayers.Control.SelectFeature - unselectAll is unsafe
This commit is contained in:
Éric Lemoine
2012-05-31 23:59:19 -07:00
2 changed files with 48 additions and 5 deletions

View File

@@ -300,14 +300,17 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
*/
unselectAll: function(options) {
// we'll want an option to supress notification here
var layers = this.layers || [this.layer];
var layer, feature;
for(var l=0; l<layers.length; ++l) {
var layers = this.layers || [this.layer],
layer, feature, l, numExcept;
for(l=0; l<layers.length; ++l) {
layer = layers[l];
for(var i=layer.selectedFeatures.length-1; i>=0; --i) {
feature = layer.selectedFeatures[i];
numExcept = 0;
while(layer.selectedFeatures.length > numExcept) {
feature = layer.selectedFeatures[numExcept];
if(!options || options.except != feature) {
this.unselect(feature);
} else {
++numExcept;
}
}
}

View File

@@ -558,6 +558,46 @@
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(2);
var layer = new OpenLayers.Layer.Vector();
var control = new OpenLayers.Control.SelectFeature(layer);
var feature1 = new OpenLayers.Feature.Vector();
feature1.id = 1;
var feature2 = new OpenLayers.Feature.Vector();
feature2.id = 2;
var feature3 = new OpenLayers.Feature.Vector();
feature3.id = 3;
var feature4 = new OpenLayers.Feature.Vector();
feature4.id = 4;
layer.addFeatures([feature1, feature2, feature3, feature4]);
control.select(feature1);
control.select(feature2);
control.select(feature3);
control.select(feature4);
layer.events.on({
featureunselected: function(e) {
// we change the selectedFeatures array while
// unselectAll is iterating over that array.
if(feature2.layer) {
layer.removeFeatures([feature2]);
}
}
});
control.unselectAll({except: feature3});
t.eq(layer.selectedFeatures.length, 1,
'unselectAll unselected all but one');
t.eq(layer.selectedFeatures[0].id, 3,
'the remaining selected features is the one expected');
}
</script>
</head>