Skip to content

Commit

Permalink
Permalink service should not add listeners on ol.layer.Group (#1045)
Browse files Browse the repository at this point in the history
  • Loading branch information
olivierSemet authored and fgravin committed Apr 19, 2016
1 parent 9a3869f commit cd610a1
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 56 deletions.
95 changes: 45 additions & 50 deletions contribs/gmf/src/services/permalink.js
Original file line number Diff line number Diff line change
Expand Up @@ -622,13 +622,7 @@ gmf.Permalink.prototype.initMergedLayer_ = function(layer, layerNames) {
gmf.Permalink.prototype.handleLayersAdd_ = function(evt) {
var layer = evt.element;
goog.asserts.assertInstanceof(layer, ol.layer.Base);
if (layer instanceof ol.layer.Group) {
layer.getLayers().forEach(function(l) {
this.registerLayer_(l, true);
}, this);
} else {
this.registerLayer_(layer, true);
}
this.registerLayer_(layer, true);
};


Expand All @@ -651,51 +645,52 @@ gmf.Permalink.prototype.handleLayersRemove_ = function(evt) {
*/
gmf.Permalink.prototype.registerLayer_ = function(layer, opt_init) {

var init = opt_init !== undefined ? opt_init : false;
var layerUid = goog.getUid(layer);

if (layer instanceof ol.layer.Group) {
layer.getLayers().forEach(function(layer) {
this.registerLayer_(layer, opt_init);
}, this)
}

var init = opt_init !== undefined ? opt_init : false;
var layerUid = goog.getUid(layer);

this.addListenerKey_(layerUid, ol.events.listen(layer,
} else {
this.addListenerKey_(layerUid, ol.events.listen(layer,
ol.Object.getChangeEventType(ol.layer.LayerProperty.VISIBLE),
this.handleLayerVisibleChange_, this));

var isMerged = layer.get('isMerged');
if (isMerged) {
goog.asserts.assert(
var isMerged = layer.get('isMerged');
if (isMerged) {
goog.asserts.assert(
layer instanceof ol.layer.Image ||
layer instanceof ol.layer.Tile);

var source = layer.getSource();
goog.asserts.assert(
var source = layer.getSource();
goog.asserts.assert(
source instanceof ol.source.ImageWMS ||
source instanceof ol.source.TileWMS);

var sourceUid = goog.getUid(source);
this.addListenerKey_(
var sourceUid = goog.getUid(source);
this.addListenerKey_(
sourceUid,
ol.events.listen(
source, ol.events.EventType.CHANGE,
this.handleWMSSourceChange_.bind(this, layer, source),
this));

if (!init) {
// if registering a layer after initialization, then we need to update
// the state manager properties using the current state of the layer.
// Emulating a source 'change' does the trick.
source.changed(); // forces `this.handleWMSSourceChange_` to be called
}
} else {
if (!init) {
// if registering a layer after initialization, then we need to update
// the state manager properties using the current state of the layer
this.updateLayerStateByVisibility_(layer);
source, ol.events.EventType.CHANGE,
this.handleWMSSourceChange_.bind(this, layer, source),
this));

if (!init) {
// if registering a layer after initialization, then we need to update
// the state manager properties using the current state of the layer.
// Emulating a source 'change' does the trick.
source.changed(); // forces `this.handleWMSSourceChange_` to be called
}
} else {
if (!init) {
// if registering a layer after initialization, then we need to update
// the state manager properties using the current state of the layer
this.updateLayerStateByVisibility_(layer);
}
}
}

};


Expand All @@ -705,30 +700,30 @@ gmf.Permalink.prototype.registerLayer_ = function(layer, opt_init) {
*/
gmf.Permalink.prototype.unregisterLayer_ = function(layer) {

if (layer instanceof ol.layer.Group) {
layer.getLayers().forEach(this.unregisterLayer_, this);
}

var layerUid = goog.getUid(layer);
this.initListenerKey_(layerUid); // clear event listeners

var isMerged = layer.get('isMerged');
if (isMerged) {
goog.asserts.assert(
if (layer instanceof ol.layer.Group) {
layer.getLayers().forEach(this.unregisterLayer_, this);
} else {
this.initListenerKey_(layerUid); // clear event listeners
var isMerged = layer.get('isMerged');
if (isMerged) {
goog.asserts.assert(
layer instanceof ol.layer.Image ||
layer instanceof ol.layer.Tile);

var source = layer.getSource();
goog.asserts.assert(
var source = layer.getSource();
goog.asserts.assert(
source instanceof ol.source.ImageWMS ||
source instanceof ol.source.TileWMS);

var sourceUid = goog.getUid(source);
this.initListenerKey_(sourceUid); // clear event listeners
}
var sourceUid = goog.getUid(source);
this.initListenerKey_(sourceUid); // clear event listeners
}

var param = this.getLayerStateParamFromLayer_(layer);
this.ngeoStateManager_.deleteParam(param);
var param = this.getLayerStateParamFromLayer_(layer);
this.ngeoStateManager_.deleteParam(param);
}
};


Expand Down
23 changes: 17 additions & 6 deletions contribs/gmf/test/spec/services/permalinkservice.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ goog.require('gmf');
goog.require('ngeo.LayerHelper');
goog.require('ol.Map');
goog.require('ol.Collection');
goog.require('ol.layer.Group');


describe('Permalink service', function() {
Expand Down Expand Up @@ -40,7 +41,7 @@ describe('Permalink service', function() {

}));

it('Should registerLayer/unregisterLayer recursively', function() {
it('Should registerLayer/unregisterLayer recursively but not ol.layer.Group', function() {
expect(PermalinkService).toBeDefined();
expect(Object.keys(PermalinkService.listenerKeys_).length).toBe(0);

Expand All @@ -53,14 +54,24 @@ describe('Permalink service', function() {
secondLevelGroup.getLayers().forEach(shouldHaveBeenUnRegistered);

function shouldHaveBeenRegistered(layer) {
var uid = goog.getUid(layer);
expect(PermalinkService.listenerKeys_[uid]).toBeDefined();
var uid = goog.getUid(layer),
listeners = PermalinkService.listenerKeys_[uid];
if (layer instanceof ol.layer.Group) {
expect(listeners).toBeUndefined();
} else {
expect(listeners).toBeDefined();
}
}

function shouldHaveBeenUnRegistered(layer) {
var uid = goog.getUid(layer);
expect(PermalinkService.listenerKeys_[uid].ol.length).toBe(0);
expect(PermalinkService.listenerKeys_[uid].goog.length).toBe(0);
var uid = goog.getUid(layer),
listeners = PermalinkService.listenerKeys_[uid];
if (layer instanceof ol.layer.Group) {
expect(listeners).toBeUndefined();
} else {
expect(PermalinkService.listenerKeys_[uid].ol.length).toBe(0);
expect(PermalinkService.listenerKeys_[uid].goog.length).toBe(0);
}
}

})
Expand Down

0 comments on commit cd610a1

Please sign in to comment.