diff --git a/lib/OpenLayers/Handler/Point.js b/lib/OpenLayers/Handler/Point.js index 3ddc0f8ac3..f428a3a2b2 100644 --- a/lib/OpenLayers/Handler/Point.js +++ b/lib/OpenLayers/Handler/Point.js @@ -114,8 +114,14 @@ OpenLayers.Handler.Point = OpenLayers.Class(OpenLayers.Handler, { if(this.drawing) { this.cancel(); } - this.map.removeLayer(this.layer, false); - this.layer.destroy(); + // If a layer's map property is set to null, it means that that layer + // isn't added to the map. Since we ourself added the layer to the map + // in activate(), we can assume that if this.layer.map is null it means + // that the layer has been destroyed (as a result of map.destroy() for + // example. + if (this.layer.map != null) { + this.layer.destroy(false); + } this.layer = null; return true; }, diff --git a/lib/OpenLayers/Handler/RegularPolygon.js b/lib/OpenLayers/Handler/RegularPolygon.js index 54060747e5..c5164d5931 100644 --- a/lib/OpenLayers/Handler/RegularPolygon.js +++ b/lib/OpenLayers/Handler/RegularPolygon.js @@ -164,11 +164,19 @@ OpenLayers.Handler.RegularPolygon = OpenLayers.Class(OpenLayers.Handler.Drag, { if(this.dragging) { this.cancel(); } - this.map.removeLayer(this.layer, false); - this.layer.destroy(); - if (this.feature) { - this.feature.destroy(); - } + // If a layer's map property is set to null, it means that that + // layer isn't added to the map. Since we ourself added the layer + // to the map in activate(), we can assume that if this.layer.map + // is null it means that the layer has been destroyed (as a result + // of map.destroy() for example. + if (this.layer.map != null) { + this.layer.destroy(false); + if (this.feature) { + this.feature.destroy(); + } + } + this.layer = null; + this.feature = null; deactivated = true; } return deactivated; diff --git a/tests/Handler/test_Point.html b/tests/Handler/test_Point.html index f3b7b846f7..57e9972b5f 100644 --- a/tests/Handler/test_Point.html +++ b/tests/Handler/test_Point.html @@ -43,6 +43,21 @@ "deactivate returns true if the handler was active already"); } + function test_Handler_Point_deactivation(t) { + t.plan(1); + var map = new OpenLayers.Map('map'); + var control = new OpenLayers.Control(); + map.addControl(control); + + var handler = new OpenLayers.Handler.Point(control, {foo: 'bar'}); + handler.activate(); + handler.layer.destroy(); + handler.deactivate(); + t.eq(handler.layer, null, + "deactivate doesn't throw an error if layer was" + + " previously destroyed"); + } + function test_Handler_Point_bounds(t) { t.plan(4); var map = new OpenLayers.Map('map'); diff --git a/tests/Handler/test_RegularPolygon.html b/tests/Handler/test_RegularPolygon.html index d0717a1007..db8f2f6e98 100644 --- a/tests/Handler/test_RegularPolygon.html +++ b/tests/Handler/test_RegularPolygon.html @@ -43,6 +43,21 @@ "deactivate returns true if the handler was active already"); } + function test_Handler_RegularPolygon_deactivation(t) { + t.plan(1); + var map = new OpenLayers.Map('map'); + var control = new OpenLayers.Control(); + map.addControl(control); + + var handler = new OpenLayers.Handler.RegularPolygon(control, {foo: 'bar'}); + handler.activate(); + handler.layer.destroy(); + handler.deactivate(); + t.eq(handler.layer, null, + "deactivate doesn't throw an error if layer was" + + " previously destroyed"); + } + function test_Handler_RegularPolygon_four_corners(t) { t.plan(7); var map = new OpenLayers.Map('map');