diff --git a/js/id/core/relation.js b/js/id/core/relation.js index bd1be9877..8b9d6ef9c 100644 --- a/js/id/core/relation.js +++ b/js/id/core/relation.js @@ -20,12 +20,15 @@ _.extend(iD.Relation.prototype, { type: 'relation', members: [], - extent: function(resolver) { + extent: function(resolver, memo) { return resolver.transient(this, 'extent', function() { + if (memo && memo[this.id]) return iD.geo.Extent(); + memo = memo || {}; + memo[this.id] = true; return this.members.reduce(function(extent, member) { member = resolver.hasEntity(member.id); if (member) { - return extent.extend(member.extent(resolver)); + return extent.extend(member.extent(resolver, memo)); } else { return extent; } diff --git a/test/spec/core/relation.js b/test/spec/core/relation.js index f0de2b1ad..451a53321 100644 --- a/test/spec/core/relation.js +++ b/test/spec/core/relation.js @@ -44,6 +44,12 @@ describe('iD.Relation', function () { expect(r.extent(graph)).to.eql([[0, 0], [0, 0]]) }); + + it("does not error on self-referencing relations", function () { + var r = iD.Relation(); + r = r.addMember({id: r.id}); + expect(r.extent(iD.Graph([r]))).to.eql(iD.geo.Extent()) + }); }); describe("#geometry", function () {