From b1973fcdf48ce7d4bbac7ce6da9dbc97a8ed9b87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 19 Aug 2015 14:16:48 +0200 Subject: [PATCH] Render map when layer.setMap(map) called --- src/ol/layer/layer.js | 7 +++- test/spec/ol/layer/layer.test.js | 67 ++++++++++++++++++++++---------- 2 files changed, 52 insertions(+), 22 deletions(-) diff --git a/src/ol/layer/layer.js b/src/ol/layer/layer.js index 2690dc4fa0..40e7052efd 100644 --- a/src/ol/layer/layer.js +++ b/src/ol/layer/layer.js @@ -161,8 +161,12 @@ ol.layer.Layer.prototype.handleSourcePropertyChange_ = function() { */ ol.layer.Layer.prototype.setMap = function(map) { goog.events.unlistenByKey(this.mapPrecomposeKey_); - this.changed(); + this.mapPrecomposeKey_ = null; + if (goog.isNull(map)) { + this.changed(); + } goog.events.unlistenByKey(this.mapRenderKey_); + this.mapRenderKey_ = null; if (!goog.isNull(map)) { this.mapPrecomposeKey_ = goog.events.listen( map, ol.render.EventType.PRECOMPOSE, function(evt) { @@ -173,6 +177,7 @@ ol.layer.Layer.prototype.setMap = function(map) { }, false, this); this.mapRenderKey_ = goog.events.listen( this, goog.events.EventType.CHANGE, map.render, false, map); + this.changed(); } }; diff --git a/test/spec/ol/layer/layer.test.js b/test/spec/ol/layer/layer.test.js index 3b0acfb108..72e1f12b84 100644 --- a/test/spec/ol/layer/layer.test.js +++ b/test/spec/ol/layer/layer.test.js @@ -578,30 +578,55 @@ describe('ol.layer.Layer', function() { }); - describe('As overlay', function() { + describe('#setMap (unmanaged layer)', function() { + var map; - it('overlays the layer on the map', function() { - var map = new ol.Map({}); - var layer = new ol.layer.Layer({ - map: map + beforeEach(function() { + map = new ol.Map({}); + }); + + describe('with map in constructor options', function() { + it('renders the layer', function() { + var layer = new ol.layer.Layer({ + map: map + }); + var frameState = { + layerStatesArray: [], + layerStates: {} + }; + map.dispatchEvent(new ol.render.Event('precompose', map, null, + frameState, null, null)); + expect(frameState.layerStatesArray.length).to.be(1); + var layerState = frameState.layerStatesArray[0]; + expect(layerState.layer).to.equal(layer); + expect(frameState.layerStates[goog.getUid(layer)]).to.equal(layerState); + }); + }); + + describe('setMap sequences', function() { + var mapRenderSpy; + + beforeEach(function() { + mapRenderSpy = sinon.spy(map, 'render'); + }); + + afterEach(function() { + mapRenderSpy.restore(); + }); + + it('requests a render frame', function() { + var layer = new ol.layer.Layer({}); + + layer.setMap(map); + expect(mapRenderSpy.callCount).to.be(1); + + layer.setMap(null); + expect(mapRenderSpy.callCount).to.be(2); + + layer.setMap(map); + expect(mapRenderSpy.callCount).to.be(3); }); - var frameState = { - layerStatesArray: [], - layerStates: {} - }; - map.dispatchEvent(new ol.render.Event('precompose', map, null, - frameState, null, null)); - expect(frameState.layerStatesArray.length).to.be(1); - var layerState = frameState.layerStatesArray[0]; - expect(layerState.layer).to.equal(layer); - expect(frameState.layerStates[goog.getUid(layer)]).to.equal(layerState); - frameState.layerStatesArray = []; - frameState.layerStates = {}; - layer.setMap(null); - map.dispatchEvent(new ol.render.Event('precompose', map, null, - frameState, null, null)); - expect(frameState.layerStatesArray.length).to.be(0); }); });