From 20150cb9d4aaadb4cc03ed9318f993d5930908ec Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Sat, 20 Apr 2013 15:17:53 -0700 Subject: [PATCH] Avoid retaining a graph reference The supersurface event bindings retained a reference to the initial graph, preventing it being GC'd after a save operation. --- js/id/renderer/map.js | 2 ++ js/id/svg/labels.js | 27 ++++++++++++++------------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/js/id/renderer/map.js b/js/id/renderer/map.js index ff50ee19a..897fd330d 100644 --- a/js/id/renderer/map.js +++ b/js/id/renderer/map.js @@ -54,6 +54,8 @@ iD.Map = function(context) { map.surface = surface; map.layersurface = layergroup; + labels.supersurface(supersurface); + supersurface .call(tail); } diff --git a/js/id/svg/labels.js b/js/id/svg/labels.js index 25b0fab73..771fe9a2a 100644 --- a/js/id/svg/labels.js +++ b/js/id/svg/labels.js @@ -271,26 +271,15 @@ iD.svg.Labels = function(projection, context) { var rtree = new RTree(), rectangles = {}, lang = 'name:' + iD.detect().locale.toLowerCase().split('-')[0], - supersurface, mousePosition, cacheDimensions; + mousePosition, cacheDimensions; - return function drawLabels(surface, graph, entities, filter, dimensions, fullRedraw) { + function labels(surface, graph, entities, filter, dimensions, fullRedraw) { if (!mousePosition || dimensions.join(',') !== cacheDimensions) { mousePosition = iD.util.fastMouse(surface.node().parentNode); cacheDimensions = dimensions.join(','); } - if (!supersurface) { - supersurface = d3.select(surface.node().parentNode) - .on('mousemove.hidelabels', hideOnMouseover) - .on('mousedown.hidelabels', function() { - supersurface.on('mousemove.hidelabels', null); - }) - .on('mouseup.hidelabels', function() { - supersurface.on('mousemove.hidelabels', hideOnMouseover); - }); - } - var hidePoints = !surface.select('.node.point').node(); var labelable = [], i, k, entity; @@ -457,6 +446,18 @@ iD.svg.Labels = function(projection, context) { areas = drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area), areaHalos = drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area), areaIcons = drawAreaIcons(label, labelled.area, filter, 'arealabel-icon', positions.area); + } + + labels.supersurface = function(supersurface) { + supersurface + .on('mousemove.hidelabels', hideOnMouseover) + .on('mousedown.hidelabels', function () { + supersurface.on('mousemove.hidelabels', null); + }) + .on('mouseup.hidelabels', function () { + supersurface.on('mousemove.hidelabels', hideOnMouseover); + }); }; + return labels; };