diff --git a/lib/OpenLayers/Renderer/Elements.js b/lib/OpenLayers/Renderer/Elements.js index 4fc0a3d760..52a6ac3a08 100644 --- a/lib/OpenLayers/Renderer/Elements.js +++ b/lib/OpenLayers/Renderer/Elements.js @@ -509,10 +509,13 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, { }; rendered = false; + var removeBackground = false; if (style.display != "none") { if (style.backgroundGraphic) { this.redrawBackgroundNode(geometry.id, geometry, style, featureId); + } else { + removeBackground = true; } rendered = this.redrawNode(geometry.id, geometry, style, featureId); @@ -521,12 +524,18 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, { var node = document.getElementById(geometry.id); if (node) { if (node._style.backgroundGraphic) { - node.parentNode.removeChild(document.getElementById( - geometry.id + this.BACKGROUND_ID_SUFFIX)); + removeBackground = true; } node.parentNode.removeChild(node); } } + if (removeBackground) { + var node = document.getElementById( + geometry.id + this.BACKGROUND_ID_SUFFIX); + if (node) { + node.parentNode.removeChild(node); + } + } return rendered; }, diff --git a/tests/Renderer/Elements.html b/tests/Renderer/Elements.html index 2111a59a83..a5c5c2c014 100644 --- a/tests/Renderer/Elements.html +++ b/tests/Renderer/Elements.html @@ -561,6 +561,61 @@ tearDown(); } + function test_Elements_drawGeometry_3(t) { + t.plan(2); + + setUp(); + + var r = create_renderer(); + + var element = document.createElement("div"); + r.vectorRoot = element; + + r.nodeFactory = function(id, type) { + return document.createElement("div"); + }; + var g_Node = null; + var b_Node = null; + r.drawGeometryNode = function(node, geometry, style) { + g_Node = node; + return {node: node, complete: true}; + }; + r.redrawBackgroundNode = function(id, geometry, style, featureId) { + b_Node = r.nodeFactory(); + b_Node.id = "foo_background"; + element.appendChild(b_Node); + }; + + r.getNodeType = function(geometry, style) { + return "div"; + }; + var geometry = { + id: 'foo', + CLASS_NAME: 'bar', + getBounds: function() {return {bottom: 0}} + }; + var style = {'backgroundGraphic': 'foo'}; + var featureId = 'dude'; + r.drawGeometry(geometry, style, featureId); + t.ok(b_Node.parentNode == element, "redrawBackgroundNode appended background node"); + + var returnNode = function(id) { + return id == "foo_background" ? b_Node : g_Node; + } + + var _getElement = document.getElementById; + document.getElementById = returnNode; + OpenLayers.Util.getElement = returnNode; + + style = {}; + r.drawGeometry(geometry, style, featureId); + t.ok(b_Node.parentNode != element, "background node correctly removed") + + document.getElementById = _getElement; + + tearDown(); + } +