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 });