diff --git a/src/ol/renderer/maprenderer.js b/src/ol/renderer/maprenderer.js index b65f32ad7a..4966aba9b6 100644 --- a/src/ol/renderer/maprenderer.js +++ b/src/ol/renderer/maprenderer.js @@ -170,9 +170,11 @@ ol.renderer.Map.prototype.forEachFeatureAtCoordinate = (ol.layer.Layer.visibleAtResolution(layerState, viewResolution) && layerFilter.call(thisArg2, layer))) { var layerRenderer = this.getLayerRenderer(layer); - result = layerRenderer.forEachFeatureAtCoordinate( - layer.getSource().getWrapX() ? translatedCoordinate : coordinate, - frameState, callback, thisArg); + if (!goog.isNull(layer.getSource())) { + result = layerRenderer.forEachFeatureAtCoordinate( + layer.getSource().getWrapX() ? translatedCoordinate : coordinate, + frameState, callback, thisArg); + } if (result) { return result; } diff --git a/test/spec/ol/renderer/canvas/canvasmaprenderer.test.js b/test/spec/ol/renderer/canvas/canvasmaprenderer.test.js index 361edf127a..5943961f16 100644 --- a/test/spec/ol/renderer/canvas/canvasmaprenderer.test.js +++ b/test/spec/ol/renderer/canvas/canvasmaprenderer.test.js @@ -58,12 +58,21 @@ describe('ol.renderer.canvas.Map', function() { it('filters managed layers', function() { map.addLayer(layer); map.renderSync(); - cb = sinon.spy(); + var cb = sinon.spy(); map.forEachFeatureAtPixel(map.getPixelFromCoordinate([0, 0]), cb, null, function() { return false; }); expect(cb).to.not.be.called(); }); + it('doesn\'t fail with layer with no source', function() { + map.addLayer(new ol.layer.Tile()); + map.renderSync(); + expect(function() { + map.forEachFeatureAtPixel(map.getPixelFromCoordinate([0, 0]), + function() {}); + }).to.not.throwException(); + }); + }); describe('#renderFrame()', function() { @@ -92,6 +101,7 @@ goog.require('ol.Feature'); goog.require('ol.Map'); goog.require('ol.View'); goog.require('ol.geom.Point'); +goog.require('ol.layer.Tile'); goog.require('ol.layer.Vector'); goog.require('ol.renderer.canvas.Layer'); goog.require('ol.renderer.canvas.Map');