The feature handler should not handle destroyed features. Or any features without a layer for that matter. r=elemoine (closes #1806)
git-svn-id: http://svn.openlayers.org/trunk/openlayers@8284 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -223,7 +223,7 @@ OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, {
|
|||||||
var previouslyIn = !!(this.feature); // previously in a feature
|
var previouslyIn = !!(this.feature); // previously in a feature
|
||||||
var click = (type == "click" || type == "dblclick");
|
var click = (type == "click" || type == "dblclick");
|
||||||
this.feature = this.layer.getFeatureFromEvent(evt);
|
this.feature = this.layer.getFeatureFromEvent(evt);
|
||||||
if(this.feature) {
|
if(this.feature && this.feature.layer) {
|
||||||
var inNew = (this.feature != this.lastFeature);
|
var inNew = (this.feature != this.lastFeature);
|
||||||
if(this.geometryTypeMatches(this.feature)) {
|
if(this.geometryTypeMatches(this.feature)) {
|
||||||
// in to a feature
|
// in to a feature
|
||||||
@@ -251,7 +251,8 @@ OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, {
|
|||||||
this.feature = null;
|
this.feature = null;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(previouslyIn || (click && this.lastFeature)) {
|
if(this.lastFeature && this.lastFeature.layer &&
|
||||||
|
(previouslyIn || click)) {
|
||||||
this.triggerCallback(type, 'out', [this.lastFeature]);
|
this.triggerCallback(type, 'out', [this.lastFeature]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,12 +83,14 @@
|
|||||||
"drag handler is not active before over a feature");
|
"drag handler is not active before over a feature");
|
||||||
|
|
||||||
// simulate a mouseover on a feature
|
// simulate a mouseover on a feature
|
||||||
|
var feature = new OpenLayers.Feature.Vector();
|
||||||
|
feature.layer = layer;
|
||||||
layer.getFeatureFromEvent = function(evt) {
|
layer.getFeatureFromEvent = function(evt) {
|
||||||
return "foo";
|
return feature;
|
||||||
}
|
}
|
||||||
map.events.triggerEvent("mousemove", {type: "mousemove"});
|
map.events.triggerEvent("mousemove", {type: "mousemove"});
|
||||||
|
|
||||||
t.eq(control.feature, "foo",
|
t.eq(control.feature.id, feature.id,
|
||||||
"control gets the proper feature from the feature handler");
|
"control gets the proper feature from the feature handler");
|
||||||
t.ok(control.handlers.drag.active,
|
t.ok(control.handlers.drag.active,
|
||||||
"drag handler activated when over a feature");
|
"drag handler activated when over a feature");
|
||||||
@@ -105,14 +107,16 @@
|
|||||||
control.activate();
|
control.activate();
|
||||||
|
|
||||||
// simulate a mouseover on a feature
|
// simulate a mouseover on a feature
|
||||||
|
var feature = new OpenLayers.Feature.Vector();
|
||||||
|
feature.layer = layer;
|
||||||
layer.getFeatureFromEvent = function(evt) {
|
layer.getFeatureFromEvent = function(evt) {
|
||||||
return "foo";
|
return feature;
|
||||||
}
|
}
|
||||||
map.events.triggerEvent("mousemove", {type: "mousemove"});
|
map.events.triggerEvent("mousemove", {type: "mousemove"});
|
||||||
|
|
||||||
// simulate a mousedown on a feature
|
// simulate a mousedown on a feature
|
||||||
control.onStart = function(feature, pixel) {
|
control.onStart = function(feat, pixel) {
|
||||||
t.eq(feature, "foo", "onStart called with the correct feature");
|
t.eq(feat.id, feature.id, "onStart called with the correct feature");
|
||||||
t.eq(pixel, "bar", "onStart called with the correct pixel");
|
t.eq(pixel, "bar", "onStart called with the correct pixel");
|
||||||
}
|
}
|
||||||
map.events.triggerEvent("mousedown", {xy: "bar", which: 1, type: "mousemove"});
|
map.events.triggerEvent("mousedown", {xy: "bar", which: 1, type: "mousemove"});
|
||||||
@@ -144,6 +148,7 @@
|
|||||||
t.eq(y, -4, "move called with -dy * res");
|
t.eq(y, -4, "move called with -dy * res");
|
||||||
};
|
};
|
||||||
var feature = new OpenLayers.Feature.Vector(geom);
|
var feature = new OpenLayers.Feature.Vector(geom);
|
||||||
|
feature.layer = layer;
|
||||||
feature.uid = uid;
|
feature.uid = uid;
|
||||||
return feature;
|
return feature;
|
||||||
};
|
};
|
||||||
@@ -176,8 +181,10 @@
|
|||||||
control.activate();
|
control.activate();
|
||||||
|
|
||||||
// simulate a mouseover on a feature
|
// simulate a mouseover on a feature
|
||||||
|
var feature = new OpenLayers.Feature.Vector();
|
||||||
|
feature.layer = layer;
|
||||||
layer.getFeatureFromEvent = function(evt) {
|
layer.getFeatureFromEvent = function(evt) {
|
||||||
return "foo";
|
return feature;
|
||||||
}
|
}
|
||||||
map.events.triggerEvent("mousemove", {type: "mousemove"});
|
map.events.triggerEvent("mousemove", {type: "mousemove"});
|
||||||
t.eq(control.over, true,
|
t.eq(control.over, true,
|
||||||
@@ -221,14 +228,16 @@
|
|||||||
|
|
||||||
|
|
||||||
// simulate a mouseover on a feature
|
// simulate a mouseover on a feature
|
||||||
|
var feature = new OpenLayers.Feature.Vector();
|
||||||
|
feature.layer = layer;
|
||||||
layer.getFeatureFromEvent = function() {
|
layer.getFeatureFromEvent = function() {
|
||||||
return "foo";
|
return feature;
|
||||||
};
|
};
|
||||||
map.events.triggerEvent("mousemove", {type: "mousemove"});
|
map.events.triggerEvent("mousemove", {type: "mousemove"});
|
||||||
t.eq(control.feature, "foo",
|
t.eq(control.feature.id, feature.id,
|
||||||
"feature is set on mouse over");
|
"feature is set on mouse over");
|
||||||
control.doneDragging();
|
control.doneDragging();
|
||||||
t.eq(control.feature, "foo",
|
t.eq(control.feature.id, feature.id,
|
||||||
"feature sticks around after doneDragging is called.");
|
"feature sticks around after doneDragging is called.");
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -245,11 +254,13 @@
|
|||||||
|
|
||||||
|
|
||||||
// simulate a mouseover on a feature
|
// simulate a mouseover on a feature
|
||||||
|
var feature = new OpenLayers.Feature.Vector();
|
||||||
|
feature.layer = layer;
|
||||||
layer.getFeatureFromEvent = function() {
|
layer.getFeatureFromEvent = function() {
|
||||||
return "foo";
|
return feature;
|
||||||
};
|
};
|
||||||
map.events.triggerEvent("mousemove", {type: "mousemove"});
|
map.events.triggerEvent("mousemove", {type: "mousemove"});
|
||||||
t.eq(control.feature, "foo",
|
t.eq(control.feature.id, feature.id,
|
||||||
"feature is set on mouse over");
|
"feature is set on mouse over");
|
||||||
|
|
||||||
// simulate a mouseout on a feature
|
// simulate a mouseout on a feature
|
||||||
|
|||||||
@@ -291,6 +291,32 @@
|
|||||||
// 3 tests total
|
// 3 tests total
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function test_destroyed_feature(t) {
|
||||||
|
t.plan(2);
|
||||||
|
var map = new OpenLayers.Map('map');
|
||||||
|
var control = new OpenLayers.Control();
|
||||||
|
map.addControl(control);
|
||||||
|
var layer = new OpenLayers.Layer();
|
||||||
|
layer.removeFeatures = function() {};
|
||||||
|
var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,0));
|
||||||
|
feature.layer = layer;
|
||||||
|
layer.getFeatureFromEvent = function(evt) {return feature};
|
||||||
|
map.addLayer(layer);
|
||||||
|
var handler = new OpenLayers.Handler.Feature(control, layer);
|
||||||
|
handler.activate();
|
||||||
|
var count = 0;
|
||||||
|
handler.callback = function(type, featurelist) {
|
||||||
|
++count;
|
||||||
|
t.eq(featurelist[0].id, feature.id, type + ": correct feature sent to callback");
|
||||||
|
}
|
||||||
|
handler.handle({type: "click"});
|
||||||
|
|
||||||
|
// now destroy the feature and confirm that the callback is not called again
|
||||||
|
feature.destroy();
|
||||||
|
handler.handle({type: "click"});
|
||||||
|
t.eq(count, 1, "callback not called after destroy");
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
Reference in New Issue
Block a user