diff --git a/lib/OpenLayers/Handler/Feature.js b/lib/OpenLayers/Handler/Feature.js index 0d6305bcbf..c51f655c20 100644 --- a/lib/OpenLayers/Handler/Feature.js +++ b/lib/OpenLayers/Handler/Feature.js @@ -223,7 +223,7 @@ OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, { var previouslyIn = !!(this.feature); // previously in a feature var click = (type == "click" || type == "dblclick"); this.feature = this.layer.getFeatureFromEvent(evt); - if(this.feature) { + if(this.feature && this.feature.layer) { var inNew = (this.feature != this.lastFeature); if(this.geometryTypeMatches(this.feature)) { // in to a feature @@ -251,7 +251,8 @@ OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, { this.feature = null; } } else { - if(previouslyIn || (click && this.lastFeature)) { + if(this.lastFeature && this.lastFeature.layer && + (previouslyIn || click)) { this.triggerCallback(type, 'out', [this.lastFeature]); } } diff --git a/tests/Control/DragFeature.html b/tests/Control/DragFeature.html index e2feddd566..1768c6a61c 100644 --- a/tests/Control/DragFeature.html +++ b/tests/Control/DragFeature.html @@ -83,12 +83,14 @@ "drag handler is not active before over a feature"); // simulate a mouseover on a feature + var feature = new OpenLayers.Feature.Vector(); + feature.layer = layer; layer.getFeatureFromEvent = function(evt) { - return "foo"; + return feature; } 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"); t.ok(control.handlers.drag.active, "drag handler activated when over a feature"); @@ -105,14 +107,16 @@ control.activate(); // simulate a mouseover on a feature + var feature = new OpenLayers.Feature.Vector(); + feature.layer = layer; layer.getFeatureFromEvent = function(evt) { - return "foo"; + return feature; } map.events.triggerEvent("mousemove", {type: "mousemove"}); // simulate a mousedown on a feature - control.onStart = function(feature, pixel) { - t.eq(feature, "foo", "onStart called with the correct feature"); + control.onStart = function(feat, pixel) { + t.eq(feat.id, feature.id, "onStart called with the correct feature"); t.eq(pixel, "bar", "onStart called with the correct pixel"); } map.events.triggerEvent("mousedown", {xy: "bar", which: 1, type: "mousemove"}); @@ -144,6 +148,7 @@ t.eq(y, -4, "move called with -dy * res"); }; var feature = new OpenLayers.Feature.Vector(geom); + feature.layer = layer; feature.uid = uid; return feature; }; @@ -176,8 +181,10 @@ control.activate(); // simulate a mouseover on a feature + var feature = new OpenLayers.Feature.Vector(); + feature.layer = layer; layer.getFeatureFromEvent = function(evt) { - return "foo"; + return feature; } map.events.triggerEvent("mousemove", {type: "mousemove"}); t.eq(control.over, true, @@ -221,14 +228,16 @@ // simulate a mouseover on a feature + var feature = new OpenLayers.Feature.Vector(); + feature.layer = layer; layer.getFeatureFromEvent = function() { - return "foo"; + return feature; }; map.events.triggerEvent("mousemove", {type: "mousemove"}); - t.eq(control.feature, "foo", + t.eq(control.feature.id, feature.id, "feature is set on mouse over"); control.doneDragging(); - t.eq(control.feature, "foo", + t.eq(control.feature.id, feature.id, "feature sticks around after doneDragging is called."); } @@ -245,11 +254,13 @@ // simulate a mouseover on a feature + var feature = new OpenLayers.Feature.Vector(); + feature.layer = layer; layer.getFeatureFromEvent = function() { - return "foo"; + return feature; }; map.events.triggerEvent("mousemove", {type: "mousemove"}); - t.eq(control.feature, "foo", + t.eq(control.feature.id, feature.id, "feature is set on mouse over"); // simulate a mouseout on a feature diff --git a/tests/Handler/Feature.html b/tests/Handler/Feature.html index 4ef4414f52..cc16028483 100644 --- a/tests/Handler/Feature.html +++ b/tests/Handler/Feature.html @@ -291,6 +291,32 @@ // 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"); + } +