diff --git a/web/client/components/map/openlayers/__tests__/Layer-test.jsx b/web/client/components/map/openlayers/__tests__/Layer-test.jsx
index 9e706f233c..ca019d1e06 100644
--- a/web/client/components/map/openlayers/__tests__/Layer-test.jsx
+++ b/web/client/components/map/openlayers/__tests__/Layer-test.jsx
@@ -357,6 +357,40 @@ describe('Openlayers layer', () => {
}, 200);
});
});
+ it('render wms singleTile layer with error does not request a spurious "null" url', (done) => {
+ mockAxios.onGet().reply(r => {
+ expect(r.url.indexOf('SAMPLE_URL') >= 0 ).toBeTruthy();
+ return [200, "\n" +
+ "\n" +
+ " \n" +
+ " msWFSGetFeature(): WFS server error. Invalid GetFeature Request\n" +
+ " \n" +
+ ""];
+ });
+ const options = {
+ type: 'wms',
+ visibility: true,
+ singleTile: true,
+ url: 'SAMPLE_URL',
+ name: 'osm:vector_tile'
+ };
+ const layer = ReactDOM.render(, document.getElementById("container"));
+ expect(layer.layer.getSource()).toBeTruthy();
+ layer.layer.getSource().on('imageloaderror', (e) => {
+ setTimeout(() => {
+ // the error handler must not set img.src = null, which the DOM coerces
+ // to the literal string "null" and resolves into a spurious request
+ const img = e.image.getImage();
+ expect(img.getAttribute('src') === 'null' || (img.src || '').endsWith('/null')).toBe(false);
+ done();
+ }, 200);
+ });
+ });
it('creates a tiled wms layer for openlayers map with long url', (done) => {
let options = {
"type": "wms",
diff --git a/web/client/components/map/openlayers/plugins/WMSLayer.js b/web/client/components/map/openlayers/plugins/WMSLayer.js
index d44ea44aa3..7519abee93 100644
--- a/web/client/components/map/openlayers/plugins/WMSLayer.js
+++ b/web/client/components/map/openlayers/plugins/WMSLayer.js
@@ -96,8 +96,7 @@ const loadFunction = (options, headers) => function(image, src) {
throw new Error(response.dataText);
}
}).catch(errorMessage => {
- image.getImage().src = null; // needed to trigger the MS imageloaderror event in Map.onLayerError
- image.setState(3); // set error state for tile and removed from the queue to prevent reloading loops
+ image.setState(3); // set error state for tile; this alone fires the source's tileloaderror/imageloaderror (state-based, no DOM event needed) and removes it from the queue to prevent reloading loops
failTiles.add(src); // indexing fail url tile to prevent reloading loops
console.error(errorMessage); // show ogc exception in console for debugging
});