From d97f330e61e64e757943bb219051030778ee0474 Mon Sep 17 00:00:00 2001 From: Peter Rushforth Date: Tue, 29 Jul 2025 16:03:29 -0400 Subject: [PATCH 1/2] Get rid of MapLayer.pgrocessFeatures / _mapmlvectors approach Fix tile clean up in MapTileLayer esp for CBMTILE s Add calculatePosition function to be shared by map-extent, -tile, -feature to determine zIndex positioning in parent based on how Leaflet layers are created and shared among sibling elements in a sequence Add red/green/blue-tile.png Add setZIndex function to MapFeatureLayer, MapTileLayer, copied from MapExtentLayer. Update MapFeatureLayer, MapExtentLayer, MapTileLayer initialize constructors to set the zIndex if there's an option present for it Replace map-extent way of setting zIndex to use map-extent.position Adapt calculatePosition to working within either shadow root or light DOM add map-tile tests make map-tile attributes row,col,zoom immutable; add tests for that Fix a few small issues with map-tile attributes Clean up map-feature connectedCallback (remove unused bind) Add timeouts to decrease flakiness Replace page screenshots with viewer screenshots When you remove the src attribute from a layer, it's now empty, and should NOT be disabled. Remove test dependency on external services If this is the last feature or tile to be removed from a static layer context, i.e. as child of a , the container for the MapFeatureLayer or the MapTileLayer should be removed from the layer rendered dom; includes basic tests of this for both types of static content. Add code+test to ensure that TemplatedFeaturesOrTilesLayer.js does not allow dynamic content loaded by a to contain a map-extent Update map-feature.disconnectedCallback to clean up when it's the last feature in a MapFeatureLayer being disconnected, make it remove the (_container) element created by the renderer. Because Renderer inherits from Layer, we can run its remove() method to do this. Because `disabled` is an observed attribute on , purge the shadowRoot contents when the link is disabled. Add test for count when panning and zooming the map to prevent regressions hopefully. Keep count of logged messages by map-layer.getProjection(), limit to 1 Change playwright config which was causing problems locally, will hopefully not affect CI Make nodeName dep on returning all CAPS equal by map-tile, map-feature Remove unused method parameter --- playwright.config.js | 6 +- src/layer.js | 61 +- src/map-extent.js | 18 +- src/map-feature.js | 158 +++-- src/map-link.js | 4 +- src/map-tile.js | 120 ++-- .../layers/calculatePosition.js | 88 +++ src/mapml/features/geometry.js | 6 +- src/mapml/handlers/QueryHandler.js | 4 +- src/mapml/layers/FeatureLayer.js | 540 ------------------ src/mapml/layers/MapExtentLayer.js | 6 +- src/mapml/layers/MapFeatureLayer.js | 158 +++-- src/mapml/layers/MapLayer.js | 101 ++-- src/mapml/layers/MapTileLayer.js | 97 +++- .../layers/TemplatedFeaturesOrTilesLayer.js | 13 +- src/mapml/layers/TemplatedTileLayer.js | 4 +- .../api/matchMedia/map-bounding-box.test.js | 6 +- .../core/featureIndexOverlayResults.test.js | 2 +- test/e2e/core/layerAttributes.test.js | 17 +- test/e2e/core/layerContextMenu.test.js | 2 +- test/e2e/core/mismatchedLayerWithMap.test.js | 40 +- test/e2e/data/tiles/blue-tile.png | Bin 0 -> 3537 bytes .../tiles/cbmt/features-tiles-extents.mapml | 69 +++ test/e2e/data/tiles/green-tile.png | Bin 0 -> 3515 bytes test/e2e/data/tiles/red-tile.png | Bin 0 -> 3543 bytes .../elements/layer-/layer-dash-src.test.js | 4 +- .../map-extent-checked-ordering.test.js | 9 +- .../map-extent-in-shadow-root.test.js | 1 + .../map-feature/map-feature-rendering.test.js | 59 ++ .../elements/map-feature/static-features.html | 68 +++ test/e2e/elements/map-layer/layer-src.test.js | 3 +- .../map-layer/map-layer-media.test.js | 5 +- .../elements/map-link/map-link-api.test.js | 1 + .../elements/map-link/map-link-media.test.js | 1 + .../after-adding-tile-linux.png | Bin 0 -> 19745 bytes .../after-src-change-linux.png | Bin 0 -> 19988 bytes .../after-tile-removal-linux.png | Bin 0 -> 18468 bytes .../baseline-before-adding-linux.png | Bin 0 -> 19745 bytes .../before-src-change-linux.png | Bin 0 -> 19745 bytes .../before-tile-removal-linux.png | Bin 0 -> 19745 bytes .../map-tile-row-col-zoom-immutable.test.js | 106 ++++ test/e2e/elements/map-tile/map-tile-test.html | 49 ++ test/e2e/elements/map-tile/map-tile.test.js | 364 ++++++++++++ .../after-adding-tile-linux.png | Bin 0 -> 19716 bytes .../after-src-change-linux.png | Bin 0 -> 19963 bytes .../after-tile-removal-linux.png | Bin 0 -> 18504 bytes .../baseline-before-adding-linux.png | Bin 0 -> 19716 bytes .../before-src-change-linux.png | Bin 0 -> 19716 bytes .../before-tile-removal-linux.png | Bin 0 -> 19716 bytes .../e2e/elements/map-tile/test-immutable.html | 16 + .../elements/map/map-in-shadow-root.test.js | 5 + test/e2e/layers/featureLayer.test.js | 15 + .../mixedLayer-zindex-rendering.test.js | 178 ++++++ .../mixedLayer-baseline-linux.png | Bin 0 -> 17676 bytes .../mixedLayer-blue-checked-linux.png | Bin 0 -> 28902 bytes .../mixedLayer-dom-reordered-linux.png | Bin 0 -> 17676 bytes .../mixedLayer-features-baseline-linux.png | Bin 0 -> 17676 bytes .../mixedLayer-hierarchy-validation-linux.png | Bin 0 -> 17676 bytes .../mixedLayer-red-unchecked-linux.png | Bin 0 -> 17705 bytes test/e2e/layers/mixedLayer.html | 123 ++++ test/e2e/layers/multipleExtents.test.js | 8 +- test/e2e/layers/renderer.html | 23 + .../layers/templatedFeaturesCleanup.test.js | 44 ++ test/e2e/layers/templatedFeaturesOrTiles.html | 19 + .../templatedFeaturesOrTilesLayer.test.js | 34 ++ test/server.js | 5 + 66 files changed, 1791 insertions(+), 869 deletions(-) create mode 100644 src/mapml/elementSupport/layers/calculatePosition.js delete mode 100644 src/mapml/layers/FeatureLayer.js create mode 100755 test/e2e/data/tiles/blue-tile.png create mode 100644 test/e2e/data/tiles/cbmt/features-tiles-extents.mapml create mode 100755 test/e2e/data/tiles/green-tile.png create mode 100755 test/e2e/data/tiles/red-tile.png create mode 100644 test/e2e/elements/map-feature/static-features.html create mode 100644 test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/after-adding-tile-linux.png create mode 100644 test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/after-src-change-linux.png create mode 100644 test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/after-tile-removal-linux.png create mode 100644 test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/baseline-before-adding-linux.png create mode 100644 test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/before-src-change-linux.png create mode 100644 test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/before-tile-removal-linux.png create mode 100644 test/e2e/elements/map-tile/map-tile-row-col-zoom-immutable.test.js create mode 100644 test/e2e/elements/map-tile/map-tile-test.html create mode 100644 test/e2e/elements/map-tile/map-tile.test.js create mode 100644 test/e2e/elements/map-tile/map-tile.test.js-snapshots/after-adding-tile-linux.png create mode 100644 test/e2e/elements/map-tile/map-tile.test.js-snapshots/after-src-change-linux.png create mode 100644 test/e2e/elements/map-tile/map-tile.test.js-snapshots/after-tile-removal-linux.png create mode 100644 test/e2e/elements/map-tile/map-tile.test.js-snapshots/baseline-before-adding-linux.png create mode 100644 test/e2e/elements/map-tile/map-tile.test.js-snapshots/before-src-change-linux.png create mode 100644 test/e2e/elements/map-tile/map-tile.test.js-snapshots/before-tile-removal-linux.png create mode 100644 test/e2e/elements/map-tile/test-immutable.html create mode 100644 test/e2e/layers/mixedLayer-zindex-rendering.test.js create mode 100644 test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-baseline-linux.png create mode 100644 test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-blue-checked-linux.png create mode 100644 test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-dom-reordered-linux.png create mode 100644 test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-features-baseline-linux.png create mode 100644 test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-hierarchy-validation-linux.png create mode 100644 test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-red-unchecked-linux.png create mode 100644 test/e2e/layers/mixedLayer.html create mode 100644 test/e2e/layers/renderer.html create mode 100644 test/e2e/layers/templatedFeaturesCleanup.test.js create mode 100644 test/e2e/layers/templatedFeaturesOrTiles.html create mode 100644 test/e2e/layers/templatedFeaturesOrTilesLayer.test.js diff --git a/playwright.config.js b/playwright.config.js index 0d739b668..355c0f4c5 100644 --- a/playwright.config.js +++ b/playwright.config.js @@ -5,8 +5,10 @@ export default defineConfig({ testDir: './test/e2e', webServer: { command: 'node test/server.js', - port: 30001, - timeout: 10000 +// port: 30001, // this causes a 2 min pause on my machine as of Sept 2025 +// url: 'http://localhost:30001/', //also causes a 2 min pause + timeout: 10000, + reuseExistingServer: true }, use: { headless: true, diff --git a/src/layer.js b/src/layer.js index 6c1e3ed11..c46275181 100644 --- a/src/layer.js +++ b/src/layer.js @@ -3,6 +3,7 @@ import { setOptions, DomUtil, bounds, point } from 'leaflet'; import { Util } from './mapml/utils/Util.js'; import { MapLayer, mapLayer } from './mapml/layers/MapLayer.js'; import { MapTileLayer } from './mapml/layers/MapTileLayer.js'; +import { MapFeatureLayer } from './mapml/layers/MapFeatureLayer.js'; import { createLayerControlHTML } from './mapml/elementSupport/layers/createLayerControlForLayer.js'; export class BaseLayerElement extends HTMLElement { @@ -176,6 +177,8 @@ export class BaseLayerElement extends HTMLElement { // the initial value of this._opacity should be set as opacity attribute value, if exists, or the default value 1.0 this._opacity = this.opacity || 1.0; this.attachShadow({ mode: 'open' }); + // by keeping track of console.log, we can avoid overwhelming the console + this.loggedMessages = new Set(); } disconnectedCallback() { // if the map-layer node is removed from the dom, the layer should be @@ -458,29 +461,20 @@ export class BaseLayerElement extends HTMLElement { Array.from(mapml.querySelectorAll('map-extent[units]')) ) || projection; } else { - console.log( - `A projection was not assigned to the '${mapml.label}' Layer. Please specify a projection for that layer using a map-meta element. See more here - https://maps4html.org/web-map-doc/docs/elements/meta/` - ); + const message = `A projection was not assigned to the '${mapml.label}' Layer. \nPlease specify a projection for that layer using a map-meta element. \nSee more here - https://maps4html.org/web-map-doc/docs/elements/meta/`; + if (!this.loggedMessages.has(message)) { + console.log(message); + this.loggedMessages.add(message); + } } return projection; } /* - * Runs the effects of the mutation observer, which is to add map-features' and - * map-extents' leaflet layer implementations to the appropriate container in - * the map-layer._layer: either as a sub-layer directly in the LayerGroup - * (MapLayer._layer) or as a sub-layer in the MapLayer._mapmlvectors - * FeatureGroup + * Runs the effects of the mutation observer for child elements of map-layer. + * This method primarily handles extent recalculation and other + * child element processing. */ _runMutationObserver(elementsGroup) { - const _addFeatureToMapMLVectors = (feature) => { - this.whenReady().then(() => { - // the layer extent must change as features are added, this.extent - // property only recalculates the bounds and zoomBounds when .bounds - // doesn't exist, so delete it to ensure that the extent is reset - delete this._layer.bounds; - feature.addFeature(this._layer._mapmlvectors); - }); - }; const _addStylesheetLink = (mapLink) => { this.whenReady().then(() => { this._layer.renderStyles(mapLink); @@ -493,8 +487,6 @@ export class BaseLayerElement extends HTMLElement { }; const _addExtentElement = (mapExtent) => { this.whenReady().then(() => { - // see comment regarding features / extent. Same thing applies to - // map-extent delete this._layer.bounds; this._validateDisabled(); }); @@ -512,9 +504,6 @@ export class BaseLayerElement extends HTMLElement { for (let i = 0; i < elementsGroup.length; ++i) { let element = elementsGroup[i]; switch (element.nodeName) { - case 'MAP-FEATURE': - _addFeatureToMapMLVectors(element); - break; case 'MAP-LINK': if (element.link && !element.link.isConnected) _addStylesheetLink(element); @@ -596,17 +585,15 @@ export class BaseLayerElement extends HTMLElement { mapprojection: proj, opacity: window.getComputedStyle(this).opacity }); - // make sure the Leaflet layer has a reference to the map - this._layer._map = this.parentNode._map; if (this.checked) { - this._layer.addTo(this._layer._map); + this._layer.addTo(this.parentNode._map); + // toggle the this.disabled attribute depending on whether the layer + // is: same prj as map, within view/zoom of map } + this.parentNode._map.on('moveend layeradd', this._validateDisabled, this); this._layer.on('add remove', this._validateDisabled, this); - // toggle the this.disabled attribute depending on whether the layer - // is: same prj as map, within view/zoom of map - this._layer._map.on('moveend layeradd', this._validateDisabled, this); if (this.parentNode._layerControl) this._layerControl = this.parentNode._layerControl; @@ -647,6 +634,19 @@ export class BaseLayerElement extends HTMLElement { return { totalCount, disabledCount }; }; + const countFeatureLayers = () => { + let totalCount = 0; + let disabledCount = 0; + + this._layer.eachLayer((layer) => { + if (layer instanceof MapFeatureLayer) { + totalCount++; + if (!layer.isVisible()) disabledCount++; + } + }); + + return { totalCount, disabledCount }; + }; // setTimeout is necessary to make the validateDisabled happen later than the moveend operations etc., // to ensure that the validated result is correct setTimeout(() => { @@ -687,8 +687,9 @@ export class BaseLayerElement extends HTMLElement { } } else if (type === '_mapmlvectors') { // inline / static features - totalExtentCount++; - if (!layer[type].isVisible()) disabledExtentCount++; + const featureLayerCounts = countFeatureLayers(); + totalExtentCount += featureLayerCounts.totalCount; + disabledExtentCount += featureLayerCounts.disabledCount; } else { // inline tiles const tileLayerCounts = countTileLayers(); diff --git a/src/map-extent.js b/src/map-extent.js index 1941c4ad5..ed66e2d8b 100644 --- a/src/map-extent.js +++ b/src/map-extent.js @@ -3,6 +3,7 @@ import { bounds as Lbounds, point as Lpoint } from 'leaflet'; import { Util } from './mapml/utils/Util.js'; import { mapExtentLayer } from './mapml/layers/MapExtentLayer.js'; import { createLayerControlExtentHTML } from './mapml/elementSupport/extents/createLayerControlForExtent.js'; +import { calculatePosition } from './mapml/elementSupport/layers/calculatePosition.js'; /* global M */ export class HTMLExtentElement extends HTMLElement { @@ -77,6 +78,9 @@ export class HTMLExtentElement extends HTMLElement { ? getExtent(this) : getCalculatedExtent(this); } + get position() { + return calculatePosition(this); + } getOuterHTML() { let tempElement = this.cloneNode(true); @@ -266,11 +270,7 @@ export class HTMLExtentElement extends HTMLElement { this._extentLayer = mapExtentLayer({ opacity: this.opacity, crs: M[this.units], - extentZIndex: Array.from( - this.parentLayer.src - ? this.parentLayer.shadowRoot.querySelectorAll(':host > map-extent') - : this.parentLayer.querySelectorAll(':scope > map-extent') - ).indexOf(this), + zIndex: this.position, extentEl: this }); // this._layerControlHTML is the fieldset for the extent in the LayerControl @@ -434,13 +434,7 @@ export class HTMLExtentElement extends HTMLElement { if (this.checked && !this.disabled && this.parentLayer._layer) { // can be added to MapLayer LayerGroup no matter map-layer is checked or not this._extentLayer.addTo(this.parentLayer._layer); - this._extentLayer.setZIndex( - Array.from( - this.parentLayer.src - ? this.parentLayer.shadowRoot.querySelectorAll(':host > map-extent') - : this.parentLayer.querySelectorAll(':scope > map-extent') - ).indexOf(this) - ); + this._extentLayer.setZIndex(this.position); } else { this.parentLayer._layer?.removeLayer(this._extentLayer); } diff --git a/src/map-feature.js b/src/map-feature.js index 338c05769..4752005ec 100644 --- a/src/map-feature.js +++ b/src/map-feature.js @@ -1,9 +1,10 @@ import { bounds, point, extend } from 'leaflet'; -import { featureLayer } from './mapml/layers/FeatureLayer.js'; +import { MapFeatureLayer } from './mapml/layers/MapFeatureLayer.js'; import { featureRenderer } from './mapml/features/featureRenderer.js'; import { Util } from './mapml/utils/Util.js'; import proj4 from 'proj4'; +import { calculatePosition } from './mapml/elementSupport/layers/calculatePosition.js'; export class HTMLFeatureElement extends HTMLElement { static get observedAttributes() { @@ -11,7 +12,7 @@ export class HTMLFeatureElement extends HTMLElement { } /* jshint ignore:start */ - #hasConnected; + #hasConnected; // prevents attributeChangedCallback before connectedCallback /* jshint ignore:end */ get zoom() { // for templated or queried features ** native zoom is only used for zoomTo() ** @@ -138,6 +139,9 @@ export class HTMLFeatureElement extends HTMLElement { return this._getFeatureExtent(); } } + get position() { + return calculatePosition(this); + } getMapEl() { return Util.getClosest(this, 'mapml-viewer,map[is=web-map]'); } @@ -172,9 +176,9 @@ export class HTMLFeatureElement extends HTMLElement { // used for fallback zoom getter for static features this._initialZoom = this.getMapEl().zoom; this._parentEl = - this.parentNode.nodeName.toUpperCase() === 'MAP-LAYER' || - this.parentNode.nodeName.toUpperCase() === 'LAYER-' || - this.parentNode.nodeName.toUpperCase() === 'MAP-LINK' + this.parentNode.nodeName === 'MAP-LAYER' || + this.parentNode.nodeName === 'LAYER-' || + this.parentNode.nodeName === 'MAP-LINK' ? this.parentNode : this.parentNode.host; if ( @@ -182,7 +186,11 @@ export class HTMLFeatureElement extends HTMLElement { this._parentEl.parentElement?.hasAttribute('data-moving') ) return; - if (this._parentEl.nodeName === 'MAP-LINK') { + if ( + this._parentEl.nodeName === 'MAP-LAYER' || + this._parentEl.nodeName === 'LAYER-' || + this._parentEl.nodeName === 'MAP-LINK' + ) { this._createOrGetFeatureLayer(); } // use observer to monitor the changes in mapFeature's subtree @@ -215,6 +223,17 @@ export class HTMLFeatureElement extends HTMLElement { this._observer.disconnect(); if (this._featureLayer) { this.removeFeature(this._featureLayer); + // If this was the last feature in the layer, clean up the layer + if (this._featureLayer.getLayers().length === 0) { + if (this._featureLayer.options.renderer) { + // since this is the last reference to the MapFeatureLayer, we need to also + // manually remove the shared renderer + this._featureLayer.options.renderer.remove(); + } + this._featureLayer.remove(); + this._featureLayer = null; + delete this._featureLayer; + } } } @@ -292,65 +311,80 @@ export class HTMLFeatureElement extends HTMLElement { return this.previousElementSibling; } _createOrGetFeatureLayer() { - if (this.isFirst() && this._parentEl._templatedLayer) { - const parentElement = this._parentEl; - - let map = parentElement.getMapEl()._map; - - // Create a new FeatureLayer - this._featureLayer = featureLayer(null, { - // pass the vector layer a renderer of its own, otherwise leaflet - // puts everything into the overlayPane - renderer: featureRenderer(), - // pass the vector layer the container for the parent into which - // it will append its own container for rendering into - pane: parentElement._templatedLayer.getContainer(), - // the bounds will be static, fixed, constant for the lifetime of the layer - layerBounds: parentElement.getBounds(), - zoomBounds: this._getZoomBounds(), - projection: map.options.projection, - mapEl: parentElement.getMapEl(), - onEachFeature: function (properties, geometry) { - if (properties) { - const popupOptions = { - autoClose: false, - autoPan: true, - maxHeight: map.getSize().y * 0.5 - 50, - maxWidth: map.getSize().x * 0.7, - minWidth: 165 - }; - var c = document.createElement('div'); - c.classList.add('mapml-popup-content'); - c.insertAdjacentHTML('afterbegin', properties.innerHTML); - geometry.bindPopup(c, popupOptions); + // Wait for parent layer to be ready before proceeding + this._parentEl + .whenReady() + .then(() => { + // Detect parent context and get the appropriate layer container + const isMapLink = this._parentEl.nodeName === 'MAP-LINK'; + const parentLayer = isMapLink + ? this._parentEl._templatedLayer + : this._parentEl._layer; + + if (this.isFirst() && parentLayer) { + const parentElement = this._parentEl; + + let map = parentElement.getMapEl()._map; + + this._featureLayer = new MapFeatureLayer(null, { + // pass the vector layer a renderer of its own, otherwise leaflet + // puts everything into the overlayPane + // with this feature creating its own MapFeatureLayer for each + // sub-sequence of features, it means that there may be > 1 + // container (one per renderer) in the pane... + renderer: featureRenderer(), + // pass the vector layer the container for the parent into which + // it will append its own container for rendering into + pane: parentLayer.getContainer(), + // the bounds will be static, fixed, constant for the lifetime of a (templated) layer + ...(isMapLink && parentElement.getBounds() + ? { layerBounds: parentElement.getBounds() } + : {}), + ...(isMapLink ? { zoomBounds: this._getZoomBounds() } : {}), + ...(isMapLink ? {} : { _leafletLayer: parentElement._layer }), + zIndex: this.position, + projection: map.options.projection, + mapEl: parentElement.getMapEl(), + onEachFeature: function (properties, geometry) { + if (properties) { + const popupOptions = { + autoClose: false, + autoPan: true, + maxHeight: map.getSize().y * 0.5 - 50, + maxWidth: map.getSize().x * 0.7, + minWidth: 165 + }; + var c = document.createElement('div'); + c.classList.add('mapml-popup-content'); + c.insertAdjacentHTML('afterbegin', properties.innerHTML); + geometry.bindPopup(c, popupOptions); + } + } + }); + // this is used by DebugOverlay testing "multipleExtents.test.js + // but do we really need or want each feature to have the bounds of the + // map link? tbd + extend(this._featureLayer.options, { + _leafletLayer: Object.assign(this._featureLayer, { + _layerEl: this.getLayerEl() + }) + }); + + this.addFeature(this._featureLayer); + + // add MapFeatureLayer to appropriate parent layer + parentLayer.addLayer(this._featureLayer); + } else { + // get the previous feature's layer + this._featureLayer = this.getPrevious()?._featureLayer; + if (this._featureLayer) { + this.addFeature(this._featureLayer); } } + }) + .catch((error) => { + console.log('Error waiting for parent layer to be ready:', error); }); - // this is used by DebugOverlay testing "multipleExtents.test.js - // but do we really need or want each feature to have the bounds of the - // map link? tbd - extend(this._featureLayer.options, { - _leafletLayer: Object.assign(this._featureLayer, { - _layerEl: this.getLayerEl() - }) - }); - - this.addFeature(this._featureLayer); - - // add featureLayer to TemplatedFeaturesOrTilesLayer of the parentElement - if ( - parentElement._templatedLayer && - parentElement._templatedLayer.addLayer - ) { - parentElement._templatedLayer.addLayer(this._featureLayer); - } - } else { - // get the previous feature's layer - this._featureLayer = this.getPrevious()?._featureLayer; - if (this._featureLayer) { - this.addFeature(this._featureLayer); - } - } } _setUpEvents() { ['click', 'focus', 'blur', 'keyup', 'keydown'].forEach((name) => { diff --git a/src/map-link.js b/src/map-link.js index 83ed24ba7..8107c80be 100644 --- a/src/map-link.js +++ b/src/map-link.js @@ -343,6 +343,7 @@ export class HTMLLinkElement extends HTMLElement { ) { this.parentExtent._extentLayer.removeLayer(this._templatedLayer); delete this._templatedLayer; + this.shadowRoot.innerHTML = ''; this.getLayerEl()._validateDisabled(); } break; @@ -559,8 +560,7 @@ export class HTMLLinkElement extends HTMLElement { zIndex: this.zIndex, pane: this.parentExtent._extentLayer.getContainer(), linkEl: this, - projection: this.mapEl._map.options.projection, - renderer: this.mapEl._map.options.renderer + projection: this.mapEl._map.options.projection }).addTo(this.parentExtent._extentLayer); } else if (this.rel === 'query') { if (!this.shadowRoot) { diff --git a/src/map-tile.js b/src/map-tile.js index 5dca12045..884c771d3 100644 --- a/src/map-tile.js +++ b/src/map-tile.js @@ -2,6 +2,7 @@ import { bounds as Lbounds, point as Lpoint } from 'leaflet'; import { Util } from './mapml/utils/Util.js'; import { mapTileLayer } from './mapml/layers/MapTileLayer.js'; +import { calculatePosition } from './mapml/elementSupport/layers/calculatePosition.js'; /* global M */ @@ -10,53 +11,48 @@ export class HTMLTileElement extends HTMLElement { return ['row', 'col', 'zoom', 'src']; } /* jshint ignore:start */ - #hasConnected; + #hasConnected; // prevents attributeChangedCallback before connectedCallback + #initialRow; + #initialCol; + #initialZoom; /* jshint ignore:end */ get row() { - return +(this.hasAttribute('row') ? this.getAttribute('row') : 0); + /* jshint ignore:start */ + return this.#hasConnected ? +this.#initialRow : +this.getAttribute('row'); + /* jshint ignore:end */ } set row(val) { + /* jshint ignore:start */ + if (this.#hasConnected) return; // Ignore after connection + /* jshint ignore:end */ var parsedVal = parseInt(val, 10); if (!isNaN(parsedVal)) { this.setAttribute('row', parsedVal); } } get col() { - return +(this.hasAttribute('col') ? this.getAttribute('col') : 0); + /* jshint ignore:start */ + return this.#hasConnected ? +this.#initialCol : +this.getAttribute('col'); + /* jshint ignore:end */ } set col(val) { + /* jshint ignore:start */ + if (this.#hasConnected) return; // Ignore after connection + /* jshint ignore:end */ var parsedVal = parseInt(val, 10); if (!isNaN(parsedVal)) { this.setAttribute('col', parsedVal); } } get zoom() { - // for templated or queried features ** native zoom is only used for zoomTo() ** - let meta = {}, - metaEl = this.getMeta('zoom'); - if (metaEl) - meta = Util._metaContentToObject(metaEl.getAttribute('content')); - if (this._parentElement.nodeName === 'MAP-LINK') { - // nativeZoom = zoom attribute || (sd.map-meta zoom 'value' || 'max') || this._initialZoom - return +(this.hasAttribute('zoom') - ? this.getAttribute('zoom') - : meta.value - ? meta.value - : meta.max - ? meta.max - : this._initialZoom); - } else { - // for "static" features - // nativeZoom zoom attribute || this._initialZoom - // NOTE we don't use map-meta here, because the map-meta is the minimum - // zoom bounds for the layer, and is extended by additional features - // if added / removed during layer lifetime - return +(this.hasAttribute('zoom') - ? this.getAttribute('zoom') - : this._initialZoom); - } + /* jshint ignore:start */ + return this.#hasConnected ? +this.#initialZoom : +this.getAttribute('zoom'); + /* jshint ignore:end */ } set zoom(val) { + /* jshint ignore:start */ + if (this.#hasConnected) return; // Ignore after connection + /* jshint ignore:end */ var parsedVal = parseInt(val, 10); if (!isNaN(parsedVal) && parsedVal >= 0 && parsedVal <= 25) { this.setAttribute('zoom', parsedVal); @@ -76,28 +72,57 @@ export class HTMLTileElement extends HTMLElement { } return this._extent; } + get position() { + return calculatePosition(this); + } constructor() { // Always call super first in constructor super(); } + getAttribute(name) { + if (this.#hasConnected /* jshint ignore:line */) { + switch (name) { + case 'row': + return String(this.#initialRow); /* jshint ignore:line */ + case 'col': + return String(this.#initialCol); /* jshint ignore:line */ + case 'zoom': + return String(this.#initialZoom); /* jshint ignore:line */ + } + } + return super.getAttribute(name); + } + setAttribute(name, value) { + if (this.#hasConnected /* jshint ignore:line */) { + switch (name) { + case 'row': + case 'col': + case 'zoom': + return; + } + } + super.setAttribute(name, value); + } async connectedCallback() { // initialization is done in connectedCallback, attribute initialization // calls (which happen first) are effectively ignored, so we should be able // to rely on them being all correctly set by this time e.g. zoom, row, col // all now have a value that together identify this tiled bit of space + // row,col,zoom can't / shouldn't change /* jshint ignore:start */ + this.#initialZoom = this.hasAttribute('zoom') + ? +this.getAttribute('zoom') + : this.getMapEl().zoom; + this.#initialRow = this.hasAttribute('row') ? +this.getAttribute('row') : 0; + this.#initialCol = this.hasAttribute('col') ? +this.getAttribute('col') : 0; this.#hasConnected = true; /* jshint ignore:end */ - // set the initial zoom of the map when features connected - // used for fallback zoom getter for static features - // ~copied from map-feature.js - this._initialZoom = this.getMapEl().zoom; // Get parent element to determine how to handle the tile // Need to handle shadow DOM correctly like map-feature does - this._parentElement = - this.parentNode.nodeName.toUpperCase() === 'MAP-LAYER' || - this.parentNode.nodeName.toUpperCase() === 'LAYER-' || - this.parentNode.nodeName.toUpperCase() === 'MAP-LINK' + this._parentEl = + this.parentNode.nodeName === 'MAP-LAYER' || + this.parentNode.nodeName === 'LAYER-' || + this.parentNode.nodeName === 'MAP-LINK' ? this.parentNode : this.parentNode.host; @@ -116,6 +141,7 @@ export class HTMLTileElement extends HTMLElement { // If this was the last tile in the layer, clean up the layer if (this._tileLayer._mapTiles && this._tileLayer._mapTiles.length === 0) { + this._tileLayer.remove(); this._tileLayer = null; delete this._tileLayer; } @@ -166,10 +192,11 @@ export class HTMLTileElement extends HTMLElement { attributeChangedCallback(name, oldValue, newValue) { if (this.#hasConnected /* jshint ignore:line */) { switch (name) { - case 'src': case 'row': case 'col': case 'zoom': + break; + case 'src': if (oldValue !== newValue) { // If we've already calculated an extent, recalculate it if (this._extent) { @@ -178,7 +205,7 @@ export class HTMLTileElement extends HTMLElement { // If this tile is connected to a tile layer, update it if (this._tileLayer) { - // Remove and re-add to update the tile's position + // For src changes, normal removal works since coordinates haven't changed this._tileLayer.removeMapTile(this); this._tileLayer.addMapTile(this); } @@ -191,24 +218,24 @@ export class HTMLTileElement extends HTMLElement { getMeta(metaName) { let name = metaName.toLowerCase(); if (name !== 'cs' && name !== 'zoom' && name !== 'projection') return; - let sdMeta = this._parentElement.shadowRoot.querySelector( + let sdMeta = this._parentEl.shadowRoot.querySelector( `map-meta[name=${name}][content]` ); - if (this._parentElement.nodeName === 'MAP-LINK') { + if (this._parentEl.nodeName === 'MAP-LINK') { // sd.map-meta || map-extent meta || layer meta - return sdMeta || this._parentElement.parentElement.getMeta(metaName); + return sdMeta || this._parentEl.parentElement.getMeta(metaName); } else { - return this._parentElement.src - ? this._parentElement.shadowRoot.querySelector( + return this._parentEl.src + ? this._parentEl.shadowRoot.querySelector( `map-meta[name=${name}][content]` ) - : this._parentElement.querySelector(`map-meta[name=${name}][content]`); + : this._parentEl.querySelector(`map-meta[name=${name}][content]`); } } async _createOrGetTileLayer() { - await this._parentElement.whenReady(); + await this._parentEl.whenReady(); if (this.isFirst()) { - const parentElement = this._parentElement; + const parentElement = this._parentEl; // Create a new MapTileLayer this._tileLayer = mapTileLayer({ @@ -217,7 +244,8 @@ export class HTMLTileElement extends HTMLElement { // used by map-link and map-layer, both have containers pane: parentElement._templatedLayer?.getContainer() || - parentElement._layer.getContainer() + parentElement._layer.getContainer(), + zIndex: this.position }); this._tileLayer.addMapTile(this); diff --git a/src/mapml/elementSupport/layers/calculatePosition.js b/src/mapml/elementSupport/layers/calculatePosition.js new file mode 100644 index 000000000..d8dfb60a1 --- /dev/null +++ b/src/mapml/elementSupport/layers/calculatePosition.js @@ -0,0 +1,88 @@ +/** + * Calculate the sequence position for map elements based on their position in a + * sequence of target elements (map-tile, map-feature, map-extent). + * - map-extent: Each element gets its own unique position (each is its own MapExtentLayer) + * - map-tile/map-feature: Adjacent elements of same type share the same position (they share a MapTileLayer/MapFeatureLayer) + * - used to set the zIndex for the LayerGroup's _container (rendering). + * + * @param {HTMLElement} element - The element to calculate position for (map-tile, map-extent, or map-feature) + * @returns {number} The position of this element's LayerGroup + */ +export function calculatePosition(element) { + const tagName = element.tagName.toLowerCase(); + const validTags = ['map-tile', 'map-extent', 'map-feature']; + + // Validate element type + if (!validTags.includes(tagName)) { + console.warn(`calculatePosition: Invalid element type ${tagName}`); + return 0; + } + + // Get parent - could be Element or ShadowRoot + const parent = element.parentNode; + if (!parent) return 1; + + // Get children - works for both Element and ShadowRoot + // For ShadowRoot, we need to filter to get only element nodes + const children = + parent.children || + Array.from(parent.childNodes).filter( + (node) => node.nodeType === Node.ELEMENT_NODE + ); + + if (!children || children.length === 0) return 1; + + let position = 0; + let lastTag = null; + let foundTarget = false; + + // Iterate through all child elements + for (const child of children) { + // Skip non-element nodes (shouldn't happen with .children, but safe for childNodes) + if (child.nodeType !== Node.ELEMENT_NODE) continue; + + const childTag = child.tagName.toLowerCase(); + + // Skip non-map elements + if (!validTags.includes(childTag)) continue; + + // Check if we've reached our target element + if (child === element) { + foundTarget = true; + + // map-extent always needs a new z-index + if (childTag === 'map-extent') { + position++; + return position; + } + + // For map-tile and map-feature: + // If this element continues a sequence of the same type, return the current z-index + if (lastTag === childTag) { + return position; + } + + // This element starts a new layer group + position++; + return position; + } + + // Before reaching target, count layer group transitions + if (!foundTarget) { + if (childTag === 'map-extent') { + // Each map-extent increments z-index + position++; + } else if (lastTag !== null && lastTag !== childTag) { + // Transition between different types (excluding map-extent) + position++; + } else if (lastTag === null) { + // First valid element starts at z-index 1 + position = 1; + } + + lastTag = childTag; + } + } + // Element not found (shouldn't happen in normal usage) + return 0; +} diff --git a/src/mapml/features/geometry.js b/src/mapml/features/geometry.js index f433b5a33..c92a7e406 100644 --- a/src/mapml/features/geometry.js +++ b/src/mapml/features/geometry.js @@ -1,4 +1,4 @@ -import { FeatureGroup, LayerGroup, DomUtil, DomEvent, bounds } from 'leaflet'; +import { FeatureGroup, DomUtil, DomEvent, bounds } from 'leaflet'; import { Path, path } from './path.js'; @@ -15,7 +15,7 @@ export var Geometry = FeatureGroup.extend({ options ); - LayerGroup.prototype.initialize.call(this, layers, options); + FeatureGroup.prototype.initialize.call(this, layers, options); this._featureEl = this.options.mapmlFeature; this.layerBounds = options.layerBounds; @@ -55,7 +55,7 @@ export var Geometry = FeatureGroup.extend({ }, onAdd: function (map) { - LayerGroup.prototype.onAdd.call(this, map); + FeatureGroup.prototype.onAdd.call(this, map); this.updateInteraction(); }, diff --git a/src/mapml/handlers/QueryHandler.js b/src/mapml/handlers/QueryHandler.js index 0e12ef14e..c5d77a782 100644 --- a/src/mapml/handlers/QueryHandler.js +++ b/src/mapml/handlers/QueryHandler.js @@ -6,7 +6,7 @@ import { Bounds, Util as LeafletUtil } from 'leaflet'; -import { featureLayer } from '../layers/FeatureLayer.js'; +import { MapFeatureLayer } from '../layers/MapFeatureLayer.js'; import { featureRenderer } from '../features/featureRenderer.js'; export var QueryHandler = Handler.extend({ @@ -324,7 +324,7 @@ export var QueryHandler = Handler.extend({ function displayFeaturesPopup(features, loc) { if (features.length === 0) return; - let f = featureLayer(features, { + let f = new MapFeatureLayer(features, { // pass the vector layer a renderer of its own, otherwise leaflet // puts everything into the overlayPane renderer: featureRenderer(), diff --git a/src/mapml/layers/FeatureLayer.js b/src/mapml/layers/FeatureLayer.js deleted file mode 100644 index 5d72cac8f..000000000 --- a/src/mapml/layers/FeatureLayer.js +++ /dev/null @@ -1,540 +0,0 @@ -import { - FeatureGroup, - DomUtil, - bounds, - SVG, - Util as LeafletUtil, - Browser -} from 'leaflet'; -import { Util } from '../utils/Util.js'; -import { path } from '../features/path.js'; -import { geometry } from '../features/geometry.js'; - -export var FeatureLayer = FeatureGroup.extend({ - /* - * M.MapML turns any MapML feature data into a Leaflet layer. Based on L.GeoJSON. - * - * Used by MapLayer to create _mapmlvectors property, used to render features - */ - initialize: function (mapml, options) { - /* - mapml: - 1. for query: an array of map-feature elements that it fetches - 2. for static templated feature: null - 3. for non-templated feature: map-layer (with no src) or mapml file (with src) - */ - FeatureGroup.prototype.initialize.call(this, null, options); - // this.options.static is false ONLY for tiled vector features - // this._staticFeature is ONLY true when not used by TemplatedFeaturesLayer - // this.options.query true when created by QueryHandler.js - - if (!this.options.tiles) { - // not a tiled vector layer - this._container = null; - if (this.options.query) { - this._container = DomUtil.create( - 'div', - 'leaflet-layer', - this.options.pane - ); - DomUtil.addClass( - this._container, - 'leaflet-pane mapml-vector-container' - ); - } else if (this.options._leafletLayer) { - this._container = DomUtil.create( - 'div', - 'leaflet-layer', - this.options.pane - ); - DomUtil.addClass( - this._container, - 'leaflet-pane mapml-vector-container' - ); - } else { - // if the current featureLayer is a sublayer of templatedFeatureLayer, - // append directly to the templated feature container (passed in as options.pane) - this._container = this.options.pane; - DomUtil.addClass( - this._container, - 'leaflet-pane mapml-vector-container' - ); - } - this.options.renderer.options.pane = this._container; - } - if (this.options.query) { - this._queryFeatures = mapml.features ? mapml.features : mapml; - } else if (!mapml) { - // use this.options._leafletLayer to distinguish the featureLayer constructed for initialization and for templated features / tiles - if (this.options._leafletLayer) { - // this._staticFeature should be set to true to make sure the _getEvents works properly - this._features = {}; - this._staticFeature = true; - } - } - }, - - isVisible: function () { - let map = this.options.mapEl._map; - // if query, isVisible is unconditionally true - if (this.options.query) return true; - // if the featureLayer is for static features, i.e. it is the mapmlvector layer, - // if it is empty, isVisible = false - // this._staticFeature: flag to determine if the featureLayer is used by static features only - // this._features: check if the current static featureLayer is empty - // (Object.keys(this._features).length === 0 => this._features is an empty object) - else if (this._staticFeature && Object.keys(this._features).length === 0) { - return false; - } else { - let mapZoom = map.getZoom(), - zoomBounds = this.zoomBounds || this.options.zoomBounds, - layerBounds = this.layerBounds || this.options.layerBounds, - withinZoom = zoomBounds - ? mapZoom <= zoomBounds.maxZoom && mapZoom >= zoomBounds.minZoom - : false; - return ( - withinZoom && - this._layers && - layerBounds && - layerBounds.overlaps( - Util.pixelToPCRSBounds( - map.getPixelBounds(), - mapZoom, - map.options.projection - ) - ) - ); - } - }, - - onAdd: function (map) { - this._map = map; - FeatureGroup.prototype.onAdd.call(this, map); - if (this._staticFeature) { - this._validateRendering(); - } - if (this._queryFeatures) { - map.on('featurepagination', this.showPaginationFeature, this); - } - }, - addLayer: function (layerToAdd) { - FeatureGroup.prototype.addLayer.call(this, layerToAdd); - if (!this.options.layerBounds) { - this.layerBounds = this.layerBounds - ? this.layerBounds.extend(layerToAdd.layerBounds) - : bounds(layerToAdd.layerBounds.min, layerToAdd.layerBounds.max); - - if (this.zoomBounds) { - if (layerToAdd.zoomBounds.minZoom < this.zoomBounds.minZoom) - this.zoomBounds.minZoom = layerToAdd.zoomBounds.minZoom; - if (layerToAdd.zoomBounds.maxZoom > this.zoomBounds.maxZoom) - this.zoomBounds.maxZoom = layerToAdd.zoomBounds.maxZoom; - if (layerToAdd.zoomBounds.minNativeZoom < this.zoomBounds.minNativeZoom) - this.zoomBounds.minNativeZoom = layerToAdd.zoomBounds.minNativeZoom; - if (layerToAdd.zoomBounds.maxNativeZoom > this.zoomBounds.maxNativeZoom) - this.zoomBounds.maxNativeZoom = layerToAdd.zoomBounds.maxNativeZoom; - } else { - this.zoomBounds = layerToAdd.zoomBounds; - } - } - if (this._staticFeature) { - // TODO: validate the use the feature.zoom which is new (was in createGeometry) - let featureZoom = layerToAdd.options.mapmlFeature.zoom; - if (featureZoom in this._features) { - this._features[featureZoom].push(layerToAdd); - } else { - this._features[featureZoom] = [layerToAdd]; - } - // hide/display features based on the their zoom limits - this._validateRendering(); - } - return this; - }, - addRendering: function (featureToAdd) { - FeatureGroup.prototype.addLayer.call(this, featureToAdd); - }, - onRemove: function (map) { - if (this._queryFeatures) { - map.off('featurepagination', this.showPaginationFeature, this); - delete this._queryFeatures; - DomUtil.remove(this._container); - } - FeatureGroup.prototype.onRemove.call(this, map); - this._map.featureIndex.cleanIndex(); - }, - - removeLayer: function (featureToRemove) { - FeatureGroup.prototype.removeLayer.call(this, featureToRemove); - if (!this.options.layerBounds) { - delete this.layerBounds; - // this ensures that the .extent gets recalculated if needed - delete this.options._leafletLayer.bounds; - delete this.zoomBounds; - // this ensures that the .extent gets recalculated if needed - delete this.options._leafletLayer.zoomBounds; - delete this._layers[featureToRemove._leaflet_id]; - this._removeFromFeaturesList(featureToRemove); - // iterate through all remaining layers - let layerBounds, zoomBounds; - let layerIds = Object.keys(this._layers); - // re-calculate the layerBounds and zoomBounds for the whole layer when - // a feature is permanently removed from the overall layer - // bug alert: it's necessary to create a new bounds object to initialize - // this.layerBounds, to avoid changing the layerBounds of the first geometry - // added to this layer - for (let id of layerIds) { - let layer = this._layers[id]; - if (layerBounds) { - layerBounds.extend(layer.layerBounds); - } else { - layerBounds = bounds(layer.layerBounds.min, layer.layerBounds.max); - } - if (zoomBounds) { - if (layer.zoomBounds.minZoom < zoomBounds.minZoom) - zoomBounds.minZoom = layer.zoomBounds.minZoom; - if (layer.zoomBounds.maxZoom > zoomBounds.maxZoom) - zoomBounds.maxZoom = layer.zoomBounds.maxZoom; - if (layer.zoomBounds.minNativeZoom < zoomBounds.minNativeZoom) - zoomBounds.minNativeZoom = layer.zoomBounds.minNativeZoom; - if (layer.zoomBounds.maxNativeZoom > zoomBounds.maxNativeZoom) - zoomBounds.maxNativeZoom = layer.zoomBounds.maxNativeZoom; - } else { - zoomBounds = {}; - zoomBounds.minZoom = layer.zoomBounds.minZoom; - zoomBounds.maxZoom = layer.zoomBounds.maxZoom; - zoomBounds.minNativeZoom = layer.zoomBounds.minNativeZoom; - zoomBounds.maxNativeZoom = layer.zoomBounds.maxNativeZoom; - } - } - // If the last feature is removed, we should remove the .layerBounds and - // .zoomBounds properties, so that the FeatureLayer may be ignored - if (layerBounds) { - this.layerBounds = layerBounds; - } else { - delete this.layerBounds; - } - if (zoomBounds) { - this.zoomBounds = zoomBounds; - } else { - delete this.zoomBounds; - delete this.options.zoomBounds; - } - } - return this; - }, - /** - * Remove the geomtry rendering (an svg g/ M.Geomtry) from the L.FeatureGroup - * _layers array, so that it's not visible on the map, but still contributes - * to the bounds and zoom limits of the FeatureLayer. - * - * @param {type} featureToRemove - * @returns {undefined} - */ - removeRendering: function (featureToRemove) { - FeatureGroup.prototype.removeLayer.call(this, featureToRemove); - }, - _removeFromFeaturesList: function (feature) { - for (let zoom in this._features) - for (let i = 0; i < this._features[zoom].length; ++i) { - let feature = this._features[zoom][i]; - if (feature._leaflet_id === feature._leaflet_id) { - this._features[zoom].splice(i, 1); - break; - } - } - }, - getEvents: function () { - if (this._staticFeature) { - return { - moveend: this._handleMoveEnd, - zoomend: this._handleZoomEnd - }; - } - return {}; - }, - - // for query - showPaginationFeature: function (e) { - if (this.options.query && this._queryFeatures[e.i]) { - let feature = this._queryFeatures[e.i]; - feature._linkEl.shadowRoot.replaceChildren(); - this.clearLayers(); - // append all map-meta from mapml document - if (feature.meta) { - for (let i = 0; i < feature.meta.length; i++) { - feature._linkEl.shadowRoot.appendChild(feature.meta[i]); - } - } - feature._linkEl.shadowRoot.appendChild(feature); - feature.addFeature(this); - e.popup._navigationBar.querySelector('p').innerText = - e.i + 1 + '/' + this.options._leafletLayer._totalFeatureCount; - e.popup._content - .querySelector('iframe') - .setAttribute('sandbox', 'allow-same-origin allow-forms'); - e.popup._content.querySelector('iframe').srcdoc = - feature.querySelector('map-properties').innerHTML; - // "zoom to here" link need to be re-set for every pagination - this._map.fire('attachZoomLink', { i: e.i, currFeature: feature }); - this._map.once( - 'popupclose', - function (e) { - this.shadowRoot.innerHTML = ''; - }, - feature._linkEl - ); - } - }, - - _handleMoveEnd: function () { - this._removeCSS(); - }, - - _handleZoomEnd: function (e) { - // handle zoom end gets called twice for every zoom, this condition makes it go through once only. - if (this.zoomBounds) { - this._validateRendering(); - } - }, - /* - * _validateRendering prunes the features currently in the _features hashmap (created - * by us). _features categorizes features by zoom, and is used to remove or add - * features from the map based on the map-feature min/max getters. It also - * maintains the _map.featureIndex property, which is used to control the tab - * order for interactive (static) features currently rendered on the map. - * @private - * */ - _validateRendering: function () { - // since features are removed and re-added by zoom level, need to clean the feature index before re-adding - if (this._map) this._map.featureIndex.cleanIndex(); - let map = this._map || this.options._leafletLayer._map; - // it's important that we not try to validate rendering if the FeatureLayer - // isn't actually being rendered (i.e. on the map. the _map property can't - // be used because once it's assigned (by onAdd, above) it's never unassigned. - if (!map.hasLayer(this)) return; - if (this._features) { - for (let zoom in this._features) { - for (let k = 0; k < this._features[zoom].length; k++) { - let geometry = this._features[zoom][k], - renderable = geometry._checkRender( - map.getZoom(), - this.zoomBounds.minZoom, - this.zoomBounds.maxZoom - ); - if (!renderable) { - // insert a placeholder in the dom rendering for the geometry - // so that it retains its layering order when it is next rendered - let placeholder = document.createElement('span'); - placeholder.id = geometry._leaflet_id; - // geometry.defaultOptions.group is the rendered svg g element in sd - geometry.defaultOptions.group.insertAdjacentElement( - 'beforebegin', - placeholder - ); - // removing the rendering without removing the feature from the feature list - this.removeRendering(geometry); - } else if ( - // checking for _map so we do not enter this code block during the connectedCallBack of the map-feature - !map.hasLayer(geometry) && - !geometry._map - ) { - this.addRendering(geometry); - // update the layerbounds - let placeholder = - geometry.defaultOptions.group.parentNode.querySelector( - `span[id="${geometry._leaflet_id}"]` - ); - placeholder.replaceWith(geometry.defaultOptions.group); - } - } - } - } - }, - - _setZoomTransform: function (center, clampZoom) { - var scale = this._map.getZoomScale(this._map.getZoom(), clampZoom), - translate = center - .multiplyBy(scale) - .subtract(this._map._getNewPixelOrigin(center, this._map.getZoom())) - .round(); - - if (Browser.any3d) { - DomUtil.setTransform(this._layers[clampZoom], translate, scale); - } else { - DomUtil.setPosition(this._layers[clampZoom], translate); - } - }, - - /** - * Render a as a Leaflet layer that can be added to a map or - * LayerGroup as required. Kind of a "factory" method. - * - * Uses this.options, so if you need to, you can construct a FeatureLayer - * with options set as required - * - * @param feature - a element - * @param {String} fallbackCS - "gcrs" | "pcrs" - * @param {String} tileZoom - the zoom of the map at which the coordinates will exist - * - * @returns Geometry, which is an L.FeatureGroup - * @public - */ - createGeometry: function (feature, fallbackCS, tileZoom) { - // was let options = this.options, but that was causing unwanted side-effects - // because we were adding .layerBounds and .zoomBounds to it before passing - // to _createGeometry, which meant that FeatureLayer was sprouting - // options.layerBounds and .zoomBounds when it should not have those props - let options = Object.assign({}, this.options); - - if (options.filter && !options.filter(feature)) { - return; - } - - if (feature.classList.length) { - options.className = feature.classList.value; - } - // tileZoom is only used when the map-feature is discarded i.e. for rendering - // vector tiles' feature geometries in bulk (in this case only the geomtry - // is rendered on a tile-shaped FeatureLayer - let zoom = feature.zoom ?? tileZoom, - title = feature.querySelector('map-featurecaption'); - title = title - ? title.innerHTML - : this.options.mapEl.locale.dfFeatureCaption; - - if (feature.querySelector('map-properties')) { - options.properties = document.createElement('div'); - options.properties.classList.add('mapml-popup-content'); - options.properties.insertAdjacentHTML( - 'afterbegin', - feature.querySelector('map-properties').innerHTML - ); - } - let cs = - feature.getElementsByTagName('map-geometry')[0]?.getAttribute('cs') ?? - fallbackCS; - // options.layerBounds and options.zoomBounds are set by TemplatedTileLayer._createFeatures - // each geometry needs bounds so that it can be a good community member of this._layers - if (this._staticFeature || this.options.query) { - options.layerBounds = Util.extentToBounds(feature.extent, 'PCRS'); - options.zoomBounds = feature.extent.zoom; - } - let geom = this._geometryToLayer(feature, options, cs, +zoom, title); - if (geom && Object.keys(geom._layers).length !== 0) { - // if the layer is being used as a query handler output, it will have - // a color option set. Otherwise, copy classes from the feature - if (!geom.options.color && feature.hasAttribute('class')) { - geom.options.className = feature.getAttribute('class'); - } - geom.defaultOptions = geom.options; - this.resetStyle(geom); - - if (options.onEachFeature) { - geom.bindTooltip(title, { interactive: true, sticky: true }); - } - if (feature.tagName.toUpperCase() === 'MAP-FEATURE') { - feature._groupEl = geom.options.group; - } - return geom; - } - }, - - resetStyle: function (layer) { - var style = this.options.style; - if (style) { - // reset any custom styles - LeafletUtil.extend(layer.options, layer.defaultOptions); - this._setLayerStyle(layer, style); - } - }, - - setStyle: function (style) { - this.eachLayer(function (layer) { - this._setLayerStyle(layer, style); - }, this); - }, - - _setLayerStyle: function (layer, style) { - if (typeof style === 'function') { - style = style(layer.feature); - } - if (layer.setStyle) { - layer.setStyle(style); - } - }, - _removeCSS: function () { - let toDelete = this._container.querySelectorAll( - 'link[rel=stylesheet],style' - ); - for (let i = 0; i < toDelete.length; i++) { - this._container.removeChild(toDelete[i]); - } - }, - _geometryToLayer: function (feature, vectorOptions, cs, zoom, title) { - let geom = feature.getElementsByTagName('map-geometry')[0], - group = [], - groupOptions = {}, - svgGroup = SVG.create('g'), - copyOptions = Object.assign({}, vectorOptions); - svgGroup._featureEl = feature; // rendered has a reference to map-feature - if (geom) { - for (let geo of geom.querySelectorAll( - 'map-polygon, map-linestring, map-multilinestring, map-point, map-multipoint' - )) { - group.push( - path( - geo, - Object.assign(copyOptions, { - nativeCS: cs, - nativeZoom: zoom, - projection: this.options.projection, - featureID: feature.id, - group: svgGroup, - wrappers: this._getGeometryParents(geo.parentElement), - featureLayer: this, - _leafletLayer: this.options._leafletLayer - }) - ) - ); - } - let groupOptions = { - group: svgGroup, - mapmlFeature: feature, - featureID: feature.id, - accessibleTitle: title, - onEachFeature: vectorOptions.onEachFeature, - properties: vectorOptions.properties, - _leafletLayer: this.options._leafletLayer, - layerBounds: vectorOptions.layerBounds, - zoomBounds: vectorOptions.zoomBounds - }, - collections = - geom.querySelector('map-multipolygon') || - geom.querySelector('map-geometrycollection'); - if (collections) - groupOptions.wrappers = this._getGeometryParents( - collections.parentElement - ); - return geometry(group, groupOptions); - } - }, - - _getGeometryParents: function (subType, elems = []) { - if (subType && subType.tagName.toUpperCase() !== 'MAP-GEOMETRY') { - if ( - subType.tagName.toUpperCase() === 'MAP-MULTIPOLYGON' || - subType.tagName.toUpperCase() === 'MAP-GEOMETRYCOLLECTION' - ) - return this._getGeometryParents(subType.parentElement, elems); - return this._getGeometryParents( - subType.parentElement, - elems.concat([subType]) - ); - } else { - return elems; - } - } -}); -export var featureLayer = function (mapml, options) { - return new FeatureLayer(mapml, options); -}; diff --git a/src/mapml/layers/MapExtentLayer.js b/src/mapml/layers/MapExtentLayer.js index 64881063b..bf57a50e2 100644 --- a/src/mapml/layers/MapExtentLayer.js +++ b/src/mapml/layers/MapExtentLayer.js @@ -36,6 +36,7 @@ export var MapExtentLayer = LayerGroup.extend({ this._container = DomUtil.create('div', 'leaflet-layer'); this._extentEl = this.options.extentEl; this.changeOpacity(this.options.opacity); + this.setZIndex(options.zIndex); // Add class to the container DomUtil.addClass(this._container, 'mapml-extentlayer-container'); }, @@ -60,11 +61,6 @@ export var MapExtentLayer = LayerGroup.extend({ layer.redraw(); }); }, - //addTo: function(map) { - //for(let i = 0; i < this._templates.length; i++){ - // this._templates[0].layer.addTo(map); - //} - //}, setZIndex: function (zIndex) { this.options.zIndex = zIndex; this._updateZIndex(); diff --git a/src/mapml/layers/MapFeatureLayer.js b/src/mapml/layers/MapFeatureLayer.js index a37e7b0f1..1169ac1b6 100644 --- a/src/mapml/layers/MapFeatureLayer.js +++ b/src/mapml/layers/MapFeatureLayer.js @@ -35,70 +35,117 @@ export var MapFeatureLayer = FeatureGroup.extend({ /* mapml: 1. for query: an array of map-feature elements that it fetches - 2. for static templated feature: null - 3. for non-templated feature: map-layer (with no src) or mapml file (with src) + 2. for static: null (features manage themselves via connectedCallback) + 3. for templated: null (created by TemplatedFeaturesOrTilesLayer) + 4. for tiled: null (vector tiles) */ FeatureGroup.prototype.initialize.call(this, null, options); - // this.options.static is false ONLY for tiled vector features - // this._staticFeature is ONLY true when not used by TemplatedFeaturesLayer - // this.options.query true when created by QueryHandler.js - if (!this.options.tiles) { - // not a tiled vector layer - this._container = null; - if (this.options.query) { - this._container = DomUtil.create( - 'div', - 'leaflet-layer', - this.options.pane - ); - DomUtil.addClass( - this._container, - 'leaflet-pane mapml-vector-container' - ); - } else if (this.options._leafletLayer) { - this._container = DomUtil.create( - 'div', - 'leaflet-layer', - this.options.pane - ); - DomUtil.addClass( - this._container, - 'leaflet-pane mapml-vector-container' - ); - } else { - // if the current featureLayer is a sublayer of templatedFeatureLayer, - // append directly to the templated feature container (passed in as options.pane) - this._container = this.options.pane; - DomUtil.addClass( - this._container, - 'leaflet-pane mapml-vector-container' - ); - } - this.options.renderer.options.pane = this._container; + // Determine context once + this._context = this._determineContext(options); + + // Set up based on context + this._setupContainer(); + this._setupFeatures(mapml); + }, + + /** + * Determines the context for this MapFeatureLayer based on options + * @param {Object} options - Layer options + * @returns {string} - 'query', 'tiled', 'static', or 'templated' + */ + _determineContext: function (options) { + if (options.query) return 'query'; + if (options.tiles) return 'tiled'; + if (options._leafletLayer) return 'static'; + return 'templated'; + }, + + /** + * Sets up the container based on the determined context + */ + _setupContainer: function () { + if (this._context === 'tiled') { + // Tiled vector features don't need container setup + return; + } + + if (this._context === 'query' || this._context === 'static') { + // Query and static contexts create their own container + this._container = DomUtil.create( + 'div', + 'leaflet-layer', + this.options.pane + ); + DomUtil.addClass(this._container, 'leaflet-pane mapml-vector-container'); + } else { + // Templated context uses provided container directly + this._container = this.options.pane; + DomUtil.addClass(this._container, 'leaflet-pane mapml-vector-container'); + } + if (this.options.zIndex) { + this._container.style.zIndex = this.options.zIndex; } - if (this.options.query) { - this._queryFeatures = mapml.features ? mapml.features : mapml; - } else if (!mapml) { - // use this.options._leafletLayer to distinguish the featureLayer constructed for initialization and for templated features / tiles - if (this.options._leafletLayer) { - // this._staticFeature should be set to true to make sure the _getEvents works properly + + this.options.renderer.options.pane = this._container; + }, + + /** + * Sets up feature management based on the determined context + * @param {*} mapml - The mapml data + */ + _setupFeatures: function (mapml) { + switch (this._context) { + case 'query': + this._queryFeatures = mapml.features ? mapml.features : mapml; + break; + case 'static': this._features = {}; - this._staticFeature = true; - } + break; + case 'templated': + // Features are added dynamically by TemplatedFeaturesOrTilesLayer + break; + case 'tiled': + // Tiled features are managed differently + break; } }, + /** + * Public getter for external code that needs to check if this is a static feature layer + * @returns {boolean} + */ + get _staticFeature() { + return this._context === 'static'; + }, + setZIndex: function (zIndex) { + this.options.zIndex = zIndex; + this._updateZIndex(); + + return this; + }, + _updateZIndex: function () { + if ( + this._container && + this.options.zIndex !== undefined && + this.options.zIndex !== null + ) { + this._container.style.zIndex = this.options.zIndex; + } + }, isVisible: function () { let map = this.options.mapEl._map; // if query, isVisible is unconditionally true if (this.options.query) return true; // if the featureLayer is for static features, i.e. it is the mapmlvector layer, // if it is empty, isVisible = false - // this._staticFeature: flag to determine if the featureLayer is used by static features only + // For static context: check if the featureLayer is empty // this._features: check if the current static featureLayer is empty // (Object.keys(this._features).length === 0 => this._features is an empty object) - else if (this._staticFeature && Object.keys(this._features).length === 0) { + else if ( + this._context === 'static' && + Object.keys(this._features).length === 0 + ) { return false; } else { let mapZoom = map.getZoom(), @@ -125,7 +172,7 @@ export var MapFeatureLayer = FeatureGroup.extend({ onAdd: function (map) { this._map = map; FeatureGroup.prototype.onAdd.call(this, map); - if (this._staticFeature) { + if (this._context === 'static') { this._validateRendering(); } if (this._queryFeatures) { @@ -152,7 +199,7 @@ export var MapFeatureLayer = FeatureGroup.extend({ this.zoomBounds = layerToAdd.zoomBounds; } } - if (this._staticFeature) { + if (this._context === 'static') { // TODO: validate the use the feature.zoom which is new (was in createGeometry) let featureZoom = layerToAdd.options.mapmlFeature.zoom; if (featureZoom in this._features) { @@ -174,6 +221,9 @@ export var MapFeatureLayer = FeatureGroup.extend({ delete this._queryFeatures; DomUtil.remove(this._container); } + if (this._context === 'static') { + DomUtil.remove(this._container); + } FeatureGroup.prototype.onRemove.call(this, map); this._map.featureIndex.cleanIndex(); }, @@ -259,7 +309,7 @@ export var MapFeatureLayer = FeatureGroup.extend({ } }, getEvents: function () { - if (this._staticFeature) { + if (this._context === 'static') { return { moveend: this._handleMoveEnd, zoomend: this._handleZoomEnd @@ -322,7 +372,9 @@ export var MapFeatureLayer = FeatureGroup.extend({ _validateRendering: function () { // since features are removed and re-added by zoom level, need to clean the feature index before re-adding if (this._map) this._map.featureIndex.cleanIndex(); - let map = this._map || this.options._leafletLayer._map; + let map = this._map || this.options._leafletLayer?._map; + // Guard against case where neither this._map nor _leafletLayer._map is available yet + if (!map) return; // it's important that we not try to validate rendering if the FeatureLayer // isn't actually being rendered (i.e. on the map. the _map property can't // be used because once it's assigned (by onAdd, above) it's never unassigned. @@ -430,7 +482,7 @@ export var MapFeatureLayer = FeatureGroup.extend({ fallbackCS; // options.layerBounds and options.zoomBounds are set by TemplatedTileLayer._createFeatures // each geometry needs bounds so that it can be a good community member of this._layers - if (this._staticFeature || this.options.query) { + if (this._context === 'static' || this.options.query) { options.layerBounds = Util.extentToBounds(feature.extent, 'PCRS'); options.zoomBounds = feature.extent.zoom; } diff --git a/src/mapml/layers/MapLayer.js b/src/mapml/layers/MapLayer.js index 2b428b037..0fbefba99 100644 --- a/src/mapml/layers/MapLayer.js +++ b/src/mapml/layers/MapLayer.js @@ -8,7 +8,7 @@ import { latLngBounds } from 'leaflet'; import { Util } from '../utils/Util.js'; -import { featureLayer } from './FeatureLayer.js'; +import { MapFeatureLayer } from './MapFeatureLayer.js'; import { MapTileLayer } from './MapTileLayer.js'; import { featureRenderer } from '../features/featureRenderer.js'; import { renderStyles } from '../elementSupport/layers/renderStyles.js'; @@ -131,7 +131,7 @@ export var MapLayer = LayerGroup.extend({ } if (type === '_extentLayer' && mapExtents.length) { for (let i = 0; i < mapExtents.length; i++) { - if (mapExtents[i]._extentLayer.bounds) { + if (mapExtents[i]._extentLayer?.bounds) { let mapExtentLayer = mapExtents[i]._extentLayer; if (!bnds) { bnds = bounds( @@ -165,34 +165,38 @@ export var MapLayer = LayerGroup.extend({ } } } else if (type === '_mapmlvectors') { - if (this[type].layerBounds) { - if (!bnds) { - bnds = this[type].layerBounds; - } else { - bnds.extend(this[type].layerBounds); + // Iterate through individual MapFeatureLayer instances in the LayerGroup + this.eachLayer(function (layer) { + // Check if this is a MapFeatureLayer + if (layer instanceof MapFeatureLayer && layer.layerBounds) { + if (!bnds) { + bnds = layer.layerBounds; + } else { + bnds.extend(layer.layerBounds); + } } - } - if (this[type].zoomBounds) { - if (!zoomBounds) { - zoomBounds = this[type].zoomBounds; - } else { - // Extend layer zoombounds - zoomMax = Math.max(zoomMax, this[type].zoomBounds.maxZoom); - zoomMin = Math.min(zoomMin, this[type].zoomBounds.minZoom); - maxNativeZoom = Math.max( - maxNativeZoom, - this[type].zoomBounds.maxNativeZoom - ); - minNativeZoom = Math.min( - minNativeZoom, - this[type].zoomBounds.minNativeZoom - ); - zoomBounds.minZoom = zoomMin; - zoomBounds.maxZoom = zoomMax; - zoomBounds.minNativeZoom = minNativeZoom; - zoomBounds.maxNativeZoom = maxNativeZoom; + if (layer instanceof MapFeatureLayer && layer.zoomBounds) { + if (!zoomBounds) { + zoomBounds = layer.zoomBounds; + } else { + // Extend layer zoombounds + zoomMax = Math.max(zoomMax, layer.zoomBounds.maxZoom); + zoomMin = Math.min(zoomMin, layer.zoomBounds.minZoom); + maxNativeZoom = Math.max( + maxNativeZoom, + layer.zoomBounds.maxNativeZoom + ); + minNativeZoom = Math.min( + minNativeZoom, + layer.zoomBounds.minNativeZoom + ); + zoomBounds.minZoom = zoomMin; + zoomBounds.maxZoom = zoomMax; + zoomBounds.minNativeZoom = minNativeZoom; + zoomBounds.maxNativeZoom = maxNativeZoom; + } } - } + }); } else { // inline tiles this.eachLayer((layer) => { @@ -276,53 +280,12 @@ export var MapLayer = LayerGroup.extend({ mapml = this._content; parseLicenseAndLegend(); setLayerTitle(); - processFeatures(); // update controls if needed based on mapml-viewer controls/controlslist attribute if (layer._layerEl.parentElement) { // if layer does not have a parent Element, do not need to set Controls layer._layerEl.parentElement._toggleControls(); } // local functions - // determine if, where there's no match of the current layer's projection - // and that of the map, if there is a linked alternate text/mapml - // resource that matches the map's projection - function processFeatures() { - let native = Util.getNativeVariables(layer._content); - layer._mapmlvectors = featureLayer(null, { - // pass the vector layer a renderer of its own, otherwise leaflet - // puts everything into the overlayPane - renderer: featureRenderer(), - // pass the vector layer the container for the parent into which - // it will append its own container for rendering into - pane: layer._container, - opacity: layer.options.opacity, - projection: layer.options.projection, - // by NOT passing options.extent, we are asking the FeatureLayer - // to dynamically update its .layerBounds property as features are - // added or removed from it - native: native, - // each owned child layer gets a reference to the root layer - _leafletLayer: layer, - mapEl: layer._layerEl.parentElement, - onEachFeature: function (properties, geometry) { - // need to parse as HTML to preserve semantics and styles - if (properties) { - const map = layer._map; - const popupOptions = { - autoClose: false, - autoPan: true, - maxHeight: map.getSize().y * 0.5 - 50, - maxWidth: map.getSize().x * 0.7, - minWidth: 165 - }; - var c = document.createElement('div'); - c.classList.add('mapml-popup-content'); - c.insertAdjacentHTML('afterbegin', properties.innerHTML); - geometry.bindPopup(c, popupOptions); - } - } - }).addTo(layer); - } function setLayerTitle() { if (mapml.querySelector('map-title')) { layer._title = mapml.querySelector('map-title').textContent.trim(); diff --git a/src/mapml/layers/MapTileLayer.js b/src/mapml/layers/MapTileLayer.js index d1bcb98d3..2e05f7ce3 100644 --- a/src/mapml/layers/MapTileLayer.js +++ b/src/mapml/layers/MapTileLayer.js @@ -31,12 +31,25 @@ export var MapTileLayer = GridLayer.extend({ this._pendingTiles = {}; this._buildTileMap(); this._container = DomUtil.create('div', 'leaflet-layer'); + if (options.zIndex) { + this._container.style.zIndex = options.zIndex; + } DomUtil.addClass(this._container, 'mapml-static-tile-container'); // Store bounds for visibility checks // this.layerBounds = this._computeLayerBounds(); // this.zoomBounds = this._computeZoomBounds(); }, + getEvents: function () { + const events = GridLayer.prototype.getEvents + ? GridLayer.prototype.getEvents.call(this) + : {}; + + // Add our custom zoom change handler + events.zoomend = this._handleZoomChange; + + return events; + }, onAdd: function (map) { this.options.pane.appendChild(this._container); // Call the parent method @@ -45,9 +58,41 @@ export var MapTileLayer = GridLayer.extend({ onRemove: function (map) { // Clean up pending tiles this._pendingTiles = {}; + // remove _container from the dom, but don't delete it DomUtil.remove(this._container); }, + setZIndex: function (zIndex) { + this.options.zIndex = zIndex; + this._updateZIndex(); + + return this; + }, + _updateZIndex: function () { + if ( + this._container && + this.options.zIndex !== undefined && + this.options.zIndex !== null + ) { + this._container.style.zIndex = this.options.zIndex; + } + }, + _handleZoomChange: function () { + // this is necessary for CBMTILE in particular, I think because + // Leaflet relies on Web Mercator powers of 2 inter-zoom tile relations + // to calculate what tiles to clean up/remove. CBMTILE doesn't have that + // relationship between zoom levels /tiles. + // + // Force removal of all tiles that don't match current zoom + const currentZoom = this._map.getZoom(); + + for (const key in this._tiles) { + const coords = this._keyToTileCoords(key); + if (coords.z !== currentZoom) { + this._removeTile(key); + } + } + }, /** * Adds a map-tile element to the layer * @param {HTMLTileElement} mapTile - The map-tile element to add @@ -57,7 +102,9 @@ export var MapTileLayer = GridLayer.extend({ this._mapTiles.push(mapTile); this._addToTileMap(mapTile); this._updateBounds(); - // this.redraw(); + if (this._map) { + this.redraw(); + } } }, @@ -71,7 +118,32 @@ export var MapTileLayer = GridLayer.extend({ this._mapTiles.splice(index, 1); this._removeFromTileMap(mapTile); this._updateBounds(); - // this.redraw(); + if (this._map) { + this.redraw(); + } + } + }, + + /** + * Removes a map-tile element from the layer using specific coordinates + * Used when tile coordinates have changed and we need to remove based on old coordinates + * @param {HTMLTileElement} mapTile - The map-tile element to remove + * @param {Object} coords - The coordinates to use for removal {col, row, zoom} + */ + removeMapTileAt: function (mapTile, coords) { + const index = this._mapTiles.indexOf(mapTile); + if (index !== -1) { + this._mapTiles.splice(index, 1); + this._removeFromTileMapAt(coords); + // Clean up bidirectional links using current tile reference + if (mapTile._tileDiv) { + mapTile._tileDiv._mapTile = null; + mapTile._tileDiv = null; + } + this._updateBounds(); + if (this._map) { + this.redraw(); + } } }, @@ -226,6 +298,27 @@ export var MapTileLayer = GridLayer.extend({ const tileKey = `${mapTile.col}:${mapTile.row}:${mapTile.zoom}`; delete this._tileMap[tileKey]; + // Clean up bidirectional links + if (mapTile._tileDiv) { + mapTile._tileDiv._mapTile = null; + mapTile._tileDiv = null; + } + + // Also remove from pending tiles if it exists there + if (this._pendingTiles && this._pendingTiles[tileKey]) { + delete this._pendingTiles[tileKey]; + } + }, + + /** + * Removes a tile from the tile map using specific coordinates + * @param {Object} coords - The coordinates {col, row, zoom} + * @private + */ + _removeFromTileMapAt: function (coords) { + const tileKey = `${coords.col}:${coords.row}:${coords.zoom}`; + delete this._tileMap[tileKey]; + // Also remove from pending tiles if it exists there if (this._pendingTiles && this._pendingTiles[tileKey]) { delete this._pendingTiles[tileKey]; diff --git a/src/mapml/layers/TemplatedFeaturesOrTilesLayer.js b/src/mapml/layers/TemplatedFeaturesOrTilesLayer.js index a71a5aa53..85e5fc87d 100644 --- a/src/mapml/layers/TemplatedFeaturesOrTilesLayer.js +++ b/src/mapml/layers/TemplatedFeaturesOrTilesLayer.js @@ -7,7 +7,6 @@ import { } from 'leaflet'; import { Util } from '../utils/Util.js'; import { mapTileLayer } from './MapTileLayer.js'; -import { featureLayer } from './FeatureLayer.js'; import { renderStyles } from '../elementSupport/layers/renderStyles.js'; /** @@ -208,7 +207,17 @@ export var TemplatedFeaturesOrTilesLayer = LayerGroup.extend({ let parser = new DOMParser(); mapml = parser.parseFromString(text, 'application/xml'); let frag = document.createDocumentFragment(); - let elements = mapml.querySelectorAll('map-head > *, map-body > *'); + const legalContentQuery = ` + map-head > map-link, + map-body > map-link, + map-head > map-meta, + map-body > map-meta, + map-head > map-style, + map-body > map-style, + map-tile, + map-feature + `.trim(); // excludes map-extent + let elements = mapml.querySelectorAll(legalContentQuery); for (let i = 0; i < elements.length; i++) { frag.appendChild(elements[i]); } diff --git a/src/mapml/layers/TemplatedTileLayer.js b/src/mapml/layers/TemplatedTileLayer.js index fc53dd92c..6df6bbe25 100644 --- a/src/mapml/layers/TemplatedTileLayer.js +++ b/src/mapml/layers/TemplatedTileLayer.js @@ -14,7 +14,7 @@ import { } from 'leaflet'; import { Util } from '../utils/Util.js'; -import { featureLayer } from '../layers/FeatureLayer.js'; +import { MapFeatureLayer } from './MapFeatureLayer.js'; import { FeatureRenderer } from '../features/featureRenderer.js'; export var TemplatedTileLayer = TileLayer.extend({ @@ -264,7 +264,7 @@ export var TemplatedTileLayer = TileLayer.extend({ xOffset = coords.x * tileSize, yOffset = coords.y * tileSize; - let tileFeatures = featureLayer(null, { + let tileFeatures = new MapFeatureLayer(null, { projection: this._map.options.projection, tiles: true, layerBounds: this.extentBounds, diff --git a/test/e2e/api/matchMedia/map-bounding-box.test.js b/test/e2e/api/matchMedia/map-bounding-box.test.js index 106f840d5..2e6300346 100644 --- a/test/e2e/api/matchMedia/map-bounding-box.test.js +++ b/test/e2e/api/matchMedia/map-bounding-box.test.js @@ -8,7 +8,6 @@ test.describe('matchMedia map-bounding-box tests', () => { page = context.pages().find((page) => page.url() === 'about:blank') || (await context.newPage()); - page = await context.newPage(); await page.goto('map-bounding-box.html'); }); @@ -29,13 +28,13 @@ test.describe('matchMedia map-bounding-box tests', () => { // the test query layer should be hidden as map-zoom is no longer less than 14 await zoomOut.click(); - await page.waitForTimeout(250); + await page.waitForTimeout(500); await zoomIn.click(); await expect(layer).toHaveAttribute('hidden'); // the layer should be shown as we zoom out again await zoomOut.click(); - await page.waitForTimeout(250); + await page.waitForTimeout(500); await expect(layer).not.toHaveAttribute('hidden'); // move the map so that the layer is out of the map's extent @@ -43,6 +42,7 @@ test.describe('matchMedia map-bounding-box tests', () => { const map = document.querySelector('mapml-viewer'); map.zoomTo(0, 0, 13); }); + await page.waitForTimeout(500); await expect(layer).toHaveAttribute('hidden'); // move the map back so that the layer is within of the map's extent diff --git a/test/e2e/core/featureIndexOverlayResults.test.js b/test/e2e/core/featureIndexOverlayResults.test.js index f4c138cc5..c6042aed7 100644 --- a/test/e2e/core/featureIndexOverlayResults.test.js +++ b/test/e2e/core/featureIndexOverlayResults.test.js @@ -4,7 +4,7 @@ test.describe('Feature Index Overlay results test', () => { let page; let context; test.beforeAll(async () => { - context = await chromium.launchPersistentContext('', { slowMo: 500 }); + context = await chromium.launchPersistentContext('', { slowMo: 1000 }); page = context.pages().find((page) => page.url() === 'about:blank') || (await context.newPage()); diff --git a/test/e2e/core/layerAttributes.test.js b/test/e2e/core/layerAttributes.test.js index c780537fc..a6e614c47 100644 --- a/test/e2e/core/layerAttributes.test.js +++ b/test/e2e/core/layerAttributes.test.js @@ -85,17 +85,12 @@ test.describe('Playwright Checked Attribute Tests', () => { test.describe('Disabled attributes test', () => { test('Setting disabled, attribute reset on update/move', async () => { - await page.$eval('body > mapml-viewer > map-layer', (layer) => - layer.setAttribute('disabled', '') - ); - - await page.$eval('body > mapml-viewer', (map) => map.zoomTo(47, -92, 0)); - - let disabled = await page.$eval( - 'body > mapml-viewer > map-layer', - (layer) => layer.hasAttribute('disabled', '') - ); - expect(disabled).toEqual(false); + const layer = page.getByTestId('testlayer'); + await layer.evaluate((l) => l.setAttribute('disabled', '')); + const viewer = page.getByTestId('testviewer'); + await viewer.evaluate((map) => map.zoomTo(47, -92, 0)); + await page.waitForTimeout(500); + await expect(layer).not.toHaveAttribute('disabled'); }); }); diff --git a/test/e2e/core/layerContextMenu.test.js b/test/e2e/core/layerContextMenu.test.js index 103dab3b7..f9da9d53d 100644 --- a/test/e2e/core/layerContextMenu.test.js +++ b/test/e2e/core/layerContextMenu.test.js @@ -23,7 +23,7 @@ test.describe('Playwright Layer Context Menu Tests', () => { const cbmtLayer = await page.getByText('CBMT - INLINE'); cbmtLayer.click({ button: 'right' }); - await page.waitForTimeout(200); + await page.waitForTimeout(500); const aHandle = await page.evaluateHandle(() => document.querySelector('mapml-viewer') ); diff --git a/test/e2e/core/mismatchedLayerWithMap.test.js b/test/e2e/core/mismatchedLayerWithMap.test.js index 8b40eab9a..8c4ab7403 100644 --- a/test/e2e/core/mismatchedLayerWithMap.test.js +++ b/test/e2e/core/mismatchedLayerWithMap.test.js @@ -29,9 +29,23 @@ test.describe('Playwright Mismatched Layers Test', () => { - - - + + + + + + + `); @@ -65,9 +79,23 @@ test.describe('Playwright Mismatched Layers Test', () => { - - - + + + + + + + `); diff --git a/test/e2e/data/tiles/blue-tile.png b/test/e2e/data/tiles/blue-tile.png new file mode 100755 index 0000000000000000000000000000000000000000..26139f3f1fe4dbec1dc36a86878fe2743b2b0d86 GIT binary patch literal 3537 zcmZ9PdpK0<8oAkM*qYTkre+-rIM1R))VXO;dfX zIsib^+lv|i0E7)8fK$O<2ct{F6tkEBnmZ_eYcz^YkZ`x%ZU8*sYRE#BvAJ55*N-s( z=)@`>s4vVU0V9QZQ{DcN5Ip{2S83o;6On}0W*z+U^a)&_U0G<_T4WHt?i4eWx$a|& z;aS}aDi`caOgZh<)FQXE;swl#)ZR(beTx3&$*MZFZ z_bXO_09xCpT3Mwo;4Ef+d^_{TH{x2yEcz8CG6&!v=ZN*iN@QWO4oICL@{g?nHM`h8~v{r2wB5B?_oM%8(WH=wS|ImCnp}%ew$37l+7- z`eOhUL^Z#YdaPJN8DJo%PLe5y@KkWWSt3o(2RI7o6o<-Q1_Oiu7Qb$0hB_!>JH4O8 zzi*=OciMTfZnr|%ElC)49kNzPn-C&D$`F%+N>r>rp@`hyWdTt%*9hIP%sEF8xnkEF*m8 zDxpoQIu-+N<3&m4j3QL`*T-a(CPi-jc7}W}MMi?lt1we7Of70-8>Xfx!NJ!FG749r z)?;VFZ?IIT{Q(PYrWLf2vRp}~OhJ3H9-}oY)bi|%_zmCclMQn-Y88xY>%O$I)~zU{ z7u`iRf8j9G(!EnskL?g%*}3r8jVVdyLzo<^y&(uX8Y=sJ8Y7}z#FanoFl+QGab?vf z6~Q^&P=aeSm8+F_Y}OP zuwMf@mWHcOm&|*DZVJo@k?q5?tvTratp2rdiyi@&COO~%7RfMk6Z10;rBemk!bt?W zpNgw~CCxVlRd~pO$lr?yEGQxR;`kiU>4|&^kp<&{{x)+#y(2` zg&_)IzZx;1DIR&h!!1to(PMULl3ym`nrOS&^_^ALXn#8Syev5JliuunKdVeb-@4S& zub>ng(>Dg!CQOxGN|H|9SX>z9b=*7fxcxxnvs?S_?!QrRW}@arbIxzgjM=fk*+v_F zsj4<4*khDT^5FPe;$5oJlhdO4u?~qHq2B zqPlEV&Ee|gg@=pdkNewME6XJ=(gCGM46(4g=gj1@k^+`|;l(61s~X1L9@G?KxMJ z65UgEDlbX$N?(<)^MIl-$)`Ur327_dZT9%*&+iTRw}=cfKwsd1zwLhmxne$PFx4C1 ze>;-D95)m<@u6nSkX3x~vPz=}i$&C(R|_-dCfyDuYzgtwq-*XUF5xi)up*TQ_s(~P z^KKt{8rSjsS3i}`nGW{!laxfI3pFvcW{v3+b<0chL9V3dYyBJYaz^AekzfDabV8J4 z+%bGTJ4i{GYQ?6$KDkV1E_@mbOX|qa`mxUnJ#7_K{tugHGpz&R77fD-Q+3*9L9^Z) zhHi&B>Ro58dh8Q#xV6IR4ezbBb%l&P_T9HRLf4K8@Sm z`|Ql)q~4X^zT0)8`Gb4kHfo=6m&@bYy)85LRkb2^GAS{hH#+HH+cUM>+kEqM0kE53 zT%MmkW4__%er>F|MmW@K2b}8&<5iy{if#VCjSX?KoVV|Lsrmo46gxpXZ!cI2ylYsr z>l2f2^Ve@F!W*$b?2Ye4PSr*vj`%1y1n5Zxe!}vT*`riDO%3@eSLS zcOrMqfOS;i+)ktxJ0GuV`M;GnG3beIAmXqrZgj%F9KMTvw`DqT*x0$bML4NN7|8~m zg-&<_zH#x=1>B4~SUfCa;xQ&_VwAun1Y##|P_ZPY@X5`mkr@n2q)vW9T~7tmQR ztuuq~;n`KOszmX8V=PNI6}tuuvs|q|Og7PI?w1;iA z#D0bZTM9U|NnU-0q)jRG06wv*T4Js);aD~pv6XL@NdM&y#-ggc@~mO!axn`@vD+0m9A1?hC< zOUA$&YIH|DFJX6k+S@L^bGm2Y8(=GszDnwc%>*%^ZIj$?YMbAB8}Q_>82?Ki^9lNK zdj9(W(Y4qNR#q+)R7|$)G!^YKfNXbMxxU;OmL${QpmNLwv19;uY2JJQFBZk7le806 z(V$2n*YSy%A}(VmD+#3UJVFT#_TVb3_ZQU8xqMoKJ?i%H3)jL&MY`nUdmP5%vjj*aU{60#|A;W`8_;;W11JruUhxZ}dY+j{nbdghm5)afVvn4k- z6FkX2n7<$NendVd=tOZOH;+J+0ax&ZZ!V^N?<0CLjFV~tv8n|%`puFCT3Eqg9~-3% zFsztx$f5=o&}*0`NWlm#+2?UmmV%(9>vJH=2zm^)EDsvE+U_mHRcl~`ZngWG4$#!p zBaPhe4k1RT{$c_j7PfH&2_&-+2dr#SjnT*l7ezX$aXxtuh|n2~aN`?!yi*M$d}uk< z&>D!Yfc^4oh+u=3S&I!Qb_L-q0f|N!ApxOw{S6xOWrqR*Ir#L95mQfNh-RYez#pHo zA7R~9ec5{IUR@yi6ze!y>kmqcGcX>5$?P=;POSlLmP22(&xLje*Wt1hx*t32;qh;4 z1~p2GcxMC-xe;CQ`n?vSgUTaV7gPTg%Ry7X+T?LSHodl+t0LIUd@Dyk_!!>nn!}bp zlbo`#>ICy!Nshle75CnoxgI>JbQP<%wv%C9tVL*nkQ!1RCj--S5lf51VB3;XqHRQt p3s#JV%&@kb-&8!S?zOK#1>gTVy|;y8g8ha8Zx3H;xqHaj{{UEc7z6+S literal 0 HcmV?d00001 diff --git a/test/e2e/data/tiles/cbmt/features-tiles-extents.mapml b/test/e2e/data/tiles/cbmt/features-tiles-extents.mapml new file mode 100644 index 000000000..8c862c1af --- /dev/null +++ b/test/e2e/data/tiles/cbmt/features-tiles-extents.mapml @@ -0,0 +1,69 @@ + + + map-feature, map-tile, map-extent + + + + + + +

Test

+
+ + + 257421 -3567196 -271745 1221771 -3896544 242811 -3183549 -2613313 + + +
+ + + +

Test

+
+ + + 2771 3106 2946 3113 2954 3210 2815 3192 + + +
+ + + +

Test Cube

+
+ + + 11 11 12 11 12 12 11 12 + + +
+ + + +

Alabama

+
+ + + -87.359296 35.00118 -85.606675 34.984749 -85.431413 34.124869 -85.184951 32.859696 -85.069935 32.580372 -84.960397 32.421541 -85.004212 32.322956 -84.889196 32.262709 -85.058981 32.13674 -85.053504 32.01077 -85.141136 31.840985 -85.042551 31.539753 -85.113751 31.27686 -85.004212 31.003013 -85.497137 30.997536 -87.600282 30.997536 -87.633143 30.86609 -87.408589 30.674397 -87.446927 30.510088 -87.37025 30.427934 -87.518128 30.280057 -87.655051 30.247195 -87.90699 30.411504 -87.934375 30.657966 -88.011052 30.685351 -88.10416 30.499135 -88.137022 30.318396 -88.394438 30.367688 -88.471115 31.895754 -88.241084 33.796253 -88.098683 34.891641 -88.202745 34.995703 -87.359296 35.00118 + + +
+ + + + + + + + + + + + + + + + + +
+
diff --git a/test/e2e/data/tiles/green-tile.png b/test/e2e/data/tiles/green-tile.png new file mode 100755 index 0000000000000000000000000000000000000000..43655a129c0240aa0db8f8a4db53f0addb06ff02 GIT binary patch literal 3515 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 literal 0 HcmV?d00001 diff --git a/test/e2e/data/tiles/red-tile.png b/test/e2e/data/tiles/red-tile.png new file mode 100755 index 0000000000000000000000000000000000000000..4dd6c3ef13907718cf083c093f8384dbbcd8a7f6 GIT binary patch literal 3543 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 literal 0 HcmV?d00001 diff --git a/test/e2e/elements/layer-/layer-dash-src.test.js b/test/e2e/elements/layer-/layer-dash-src.test.js index 8ed266014..d64cafc14 100644 --- a/test/e2e/elements/layer-/layer-dash-src.test.js +++ b/test/e2e/elements/layer-/layer-dash-src.test.js @@ -19,6 +19,7 @@ test.describe('layer- local/inline vs remote content/src tests', () => { const labelProperty = await layer.evaluate((l) => l.label); expect(labelProperty).toEqual('Canada Base Map - Transportation (CBMT)'); await layer.evaluate((layer) => layer.zoomTo()); + await page.waitForTimeout(500); let mapLocation = await viewer.evaluate((v) => ({ lat: v.lat, lon: v.lon, @@ -33,9 +34,8 @@ test.describe('layer- local/inline vs remote content/src tests', () => { ); // remove the src attribute - await layer.evaluate((layer) => layer.removeAttribute('src')); - expect(layer).toHaveAttribute('disabled'); + // layer is not disabled, though empty. Is that correct? Seems ok... // append the template map-extent to the local / inline content await page.evaluate(() => { diff --git a/test/e2e/elements/map-extent/map-extent-checked-ordering.test.js b/test/e2e/elements/map-extent/map-extent-checked-ordering.test.js index 906273623..835664664 100644 --- a/test/e2e/elements/map-extent/map-extent-checked-ordering.test.js +++ b/test/e2e/elements/map-extent/map-extent-checked-ordering.test.js @@ -41,12 +41,11 @@ The imagery layer draws on top of the states layer. let imageryZIndex = await ext1.evaluate((e) => { return +e._extentLayer._container.style.zIndex; }); - expect(imageryZIndex).toEqual(0); const ext2 = page.getByTestId('ext2'); let statesZIndex = await ext2.evaluate((e) => { return +e._extentLayer._container.style.zIndex; }); - expect(statesZIndex).toEqual(1); + expect(statesZIndex).toBeGreaterThan(imageryZIndex); // re-order them via the layer control const imageryFieldset = layerControl.getByRole('group', { name: 'Extent One' @@ -65,11 +64,10 @@ The imagery layer draws on top of the states layer. imageryZIndex = await ext1.evaluate((e) => { return +e._extentLayer._container.style.zIndex; }); - expect(imageryZIndex).toEqual(1); statesZIndex = await ext2.evaluate((e) => { return +e._extentLayer._container.style.zIndex; }); - expect(statesZIndex).toEqual(0); + expect(statesZIndex).toBeLessThan(imageryZIndex); await page.mouse.move(from.x, from.y); await page.mouse.down(); @@ -80,11 +78,10 @@ The imagery layer draws on top of the states layer. imageryZIndex = await ext1.evaluate((e) => { return +e._extentLayer._container.style.zIndex; }); - expect(imageryZIndex).toEqual(0); statesZIndex = await ext2.evaluate((e) => { return +e._extentLayer._container.style.zIndex; }); - expect(statesZIndex).toEqual(1); + expect(statesZIndex).toBeGreaterThan(imageryZIndex); // TO DO re-order them via the DOM (insertAdjacentHTML), // ensure that // a) render order/z-index is correct diff --git a/test/e2e/elements/map-extent/map-extent-in-shadow-root.test.js b/test/e2e/elements/map-extent/map-extent-in-shadow-root.test.js index 8989ba2f3..46806c9c6 100644 --- a/test/e2e/elements/map-extent/map-extent-in-shadow-root.test.js +++ b/test/e2e/elements/map-extent/map-extent-in-shadow-root.test.js @@ -11,6 +11,7 @@ test.describe('map-extent can be inside a shadow root or other custom element', await page.goto('map-extent-in-shadow-root.html'); }); test('map-extent getMapEl() works in shadow root', async () => { + await page.waitForTimeout(500); const viewer = page.getByTestId('viewer'); await expect(viewer).toBeTruthy(); const layer = viewer.getByTestId('test-layer'); diff --git a/test/e2e/elements/map-feature/map-feature-rendering.test.js b/test/e2e/elements/map-feature/map-feature-rendering.test.js index ae4f5cbde..1881b02ff 100644 --- a/test/e2e/elements/map-feature/map-feature-rendering.test.js +++ b/test/e2e/elements/map-feature/map-feature-rendering.test.js @@ -16,4 +16,63 @@ test.describe('map-feature rendering tests', () => { maxDiffPixels: 100 }); }); + test('removing a map-feature from DOM removes its rendering', async ({ + page + }) => { + await page.goto('static-features.html'); + // Wait for initial rendering + await page.waitForTimeout(1000); + const viewer = page.getByTestId('viewer'); + let nFeatures = await viewer.evaluate( + (v) => v.querySelectorAll('map-feature').length + ); + expect(nFeatures).toEqual(5); + const f = page.locator('map-feature').first(); + const rendered = await f.evaluate((f) => { + f._featureLayer._container.setAttribute( + 'data-testid', + 'test-feature-container' + ); + f._groupEl.setAttribute('data-testid', 'test-feature-rendering'); + return f._groupEl.isConnected; + }); + expect(rendered).toBe(true); + await expect(page.getByTestId('test-feature-rendering')).toHaveCount(1); + await expect(page.getByTestId('test-feature-container')).toHaveCount(1); + await f.evaluate((f) => f.remove()); + await expect(page.getByTestId('test-feature-rendering')).toHaveCount(0); + await expect( + page + .getByTestId('test-feature-container') + .locator('g[aria-label="Feature"]') + ).toHaveCount(4); + }); + + test('removing last map-feature in a sequence removes rendering container', async ({ + page + }) => { + await page.goto('static-features.html'); + // Wait for initial rendering + await page.waitForTimeout(1000); + const viewer = page.getByTestId('viewer'); + let nFeatures = await viewer.evaluate( + (v) => v.querySelectorAll('map-feature').length + ); + expect(nFeatures).toEqual(5); + const containerConnected = await viewer.evaluate((v) => { + v.querySelector('map-feature')._featureLayer._container.setAttribute( + 'data-testid', + 'test-feature-container' + ); + return v.querySelector('map-feature')._featureLayer._container + .isConnected; + }); + expect(containerConnected).toBe(true); + nFeatures = await viewer.evaluate((v) => { + v.querySelectorAll('map-feature').forEach((el) => el.remove()); + return v.querySelectorAll('map-feature').length; + }); + expect(nFeatures).toEqual(0); + await expect(page.getByTestId('test-feature-container')).toHaveCount(0); + }); }); diff --git a/test/e2e/elements/map-feature/static-features.html b/test/e2e/elements/map-feature/static-features.html new file mode 100644 index 000000000..e68877c54 --- /dev/null +++ b/test/e2e/elements/map-feature/static-features.html @@ -0,0 +1,68 @@ + + + + + static-features.html + + + + + + + + + + + + + + + + + col="10" row="10" + + + 10 10 11 10 11 11 10 11 10 10 + + + + col="10" row="11" + + + 10 11 10 12 11 12 11 11 10 11 + + + + col="9" row="11" + + + 9 11 9 12 10 12 10 11 9 11 + + + + col="9" row="10" + + + 9 10 9 11 10 11 10 10 9 10 + + + + col="11" row="11" + + + 11 11 11 12 12 12 12 11 11 11 + + + + + + + + + + + diff --git a/test/e2e/elements/map-layer/layer-src.test.js b/test/e2e/elements/map-layer/layer-src.test.js index f517f70d9..3ba2e9d92 100644 --- a/test/e2e/elements/map-layer/layer-src.test.js +++ b/test/e2e/elements/map-layer/layer-src.test.js @@ -33,9 +33,8 @@ test.describe('map-layer local/inline vs remote content/src tests', () => { ); // remove the src attribute - await layer.evaluate((layer) => layer.removeAttribute('src')); - expect(layer).toHaveAttribute('disabled'); + // empty layer is no longer disabled. Is that correct? I think so... // append the template map-extent to the local / inline content await page.evaluate(() => { diff --git a/test/e2e/elements/map-layer/map-layer-media.test.js b/test/e2e/elements/map-layer/map-layer-media.test.js index 29b785db5..43229c732 100644 --- a/test/e2e/elements/map-layer/map-layer-media.test.js +++ b/test/e2e/elements/map-layer/map-layer-media.test.js @@ -85,6 +85,9 @@ enabled and added to the layer control when mq removed`, async () => { test(`An invalid media query is the same as a non-matching media query`, async () => { const noInitialQueryLayer = page.getByTestId('no-initial-mq'); await noInitialQueryLayer.evaluate((l) => l.setAttribute('media', '(foo ')); - await expect(noInitialQueryLayer).toHaveAttribute('disabled', ''); + // Wait for the invalid media query to trigger the disabled attribute + await expect(noInitialQueryLayer).toHaveAttribute('disabled', '', { + timeout: 2000 + }); }); }); diff --git a/test/e2e/elements/map-link/map-link-api.test.js b/test/e2e/elements/map-link/map-link-api.test.js index 9f3b622fc..ac8d4b046 100644 --- a/test/e2e/elements/map-link/map-link-api.test.js +++ b/test/e2e/elements/map-link/map-link-api.test.js @@ -83,6 +83,7 @@ test.describe('map-link api tests', () => { ); }); test("map-links that shouldn't have an extent behave accordingly", async () => { + await page.waitForTimeout(500); // create a layer containing a { diff --git a/test/e2e/elements/map-link/map-link-media.test.js b/test/e2e/elements/map-link/map-link-media.test.js index e6e9b6ee8..43d78c4e1 100644 --- a/test/e2e/elements/map-link/map-link-media.test.js +++ b/test/e2e/elements/map-link/map-link-media.test.js @@ -20,6 +20,7 @@ test.describe('map-link media attribute', () => { }); test('map-link is disabled when media attribute does not match', async () => { + await page.waitForTimeout(500); // const map = page.locator('mapml-viewer'); const layer = page.locator('map-layer'); const mapLink = page.locator('map-link').first(); diff --git a/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/after-adding-tile-linux.png b/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/after-adding-tile-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..92dbe6198898750c8d9a9034e4c0058e5b27a1a4 GIT binary patch literal 19745 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 Q3_;H78lKA0zIyln0qSNn)c^nh literal 0 HcmV?d00001 diff --git a/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/after-src-change-linux.png b/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/after-src-change-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..1fcdf4c00bdb5b3ac2f867e1a4697e18567284b6 GIT binary patch literal 19988 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�R{G4|7;pOpvT;DfS>+6l_MFxR2xN>8B(O~(fcMt+TlF4t$UMH zG^nBly`Mj(f+X(^=1X$?^xi~D_FF&(!q&RG(~tz?(A+yP78{t*KdNVxP@OSU{?n&eq{5Oy_d1=Ffy_gOW%W?%Zv90nZT3m z4n(}>1|AlZ#wSsBOoNtkF2R3oPmf*WPh)`~9=>0qKd*&9;O3`)2&E`R!tdlefn>hH zoP#W*|JPc%tVy=p9~gV1Ns83qixpE?CJ=gEG{d;Cm?|mKE{pCK@1IigVjV*PV{hmX z+Nl*S2vfPw__22Sj|)qkL8(F-&-OM`!TM+WRNymJ+?`6>ilYz1l+Vj?O0r#mDr|{q zJR3G_V6&P&W&ynO*4~(|wN?8R19$oQAP{X@DX^8Whvoqk;_V6gzma*oImQQ*cZS?4 zzFW)+)B0i_nx#CzN!s7M?6a5|+qfB6KjZH?XoTy&`~ymy&jykYe!)tw6QHB5-FMpN zd73Vq=gr9-US$}2#&Jfuj2;|E{{#zT#q}nJ2iobk*E^=4Q#hab9fUBdIV-FsOv$W6 zM8$;Qhp@Ili|=P6G}VrKUb;tD`J1l2Ka?dj2jrs3o|q=KfwY9*7}e`@q#)HB6BdPz zyiD8AF{=0Ff_>%K+@mvz(y9B;6`-U*1SzY7T46d#$8zshfcQh)NBzL?#x*5=I(KYm zRTALRPp)kZn2Pu4I)BsQ#TgZB!Ew@M%jlD_^ah}0n7#XhGC#50*^Glb5%2)CnEnq_ zbqPPiTj~kAI()e8-V&Y(2474tPBk134bo|R0W99{j-mmYC;NDB3r<+c-(OQ{WE$dX zSx(ze0ri?pDSeW>#616XISmdVG{@ut+$Uuq*!T^37|vN~N`J_J=KQrq%Fy9(?!-_y zSG+MG<>=h|CPQYhQ^+UwHA6BkPSgbe=&+3R-il;(PgTVXA@^;fp~-?|M#(?iXfRFx4&k@lv z*%~V$EVPdr8Tu?pHx4aAinMo&FeUP&`k1P1B$mNTdZWNg8lPlhAqQ`G&v|eFnI73~ zjp@N703GyULYe9vWOYx>?gi7&J88plshyr8tGlYw0jC{k|I)y8wO>VCvtTY+=k$RS zBWJGMlx(CrU1B~%7CQyMQZk{GA$gcR^gAsVHsP4AmK%s`O{OE?kn)C2P4FXj=0sNa zy9VL%~jw5de`gpKv!GkF3mxkBT3_j1}R*g)hM3bDGcz+`_5Uqyyb zles5QQ6Cw1x_Qs)!}AmNu~-&6fW^YXVS8y;qR|W{ncWL``3X-mjI)xy5?Kt+4?qWB zR56^}V-E!+%YsRE_+$i=zr0}Ma+&~a6X(q}*xYg9%TOiuR5Lu^(*hGwCmIWo(jzcA z8sN_gAz(E${M*1*FNDyK)>r_^V!+EZ4OC2{lG*pt)@WpzIl7gUD!gm0>JO(y>}iH0F$4SZ>HTbBMV zdp0Zh|A=i);~-9XGGV(t)-UultjF`OHyO_DEaULc9*zF7Pr&r-WZsE}y_D4@h#S@% zL%RT(#-_wiOAs(EV4t!z(v9%~l$)(KKG4TY@Lr39k52pnyn~u34$b{bYfB0c^-CH3 zylXCFEDy|d##Rf2(9AMAc4P_qkOr1%6ajq62lwX>Yew-$1x7!*hBN`%Vqe2xFiT@SHwGjs!f%sLdF$nlB2@n|g~mJr&+*_$fIi z<;Pymf|%ONw~N3C=6mZ!#I?>(Y4Oj`GpEa8+o$`Y@hyy;64_uLGJOnlM*2f3unxqupNM1s z8XPM`$JV~Tbq8ibMO+a>@}nWN7PIXEcmqz7I!ww+@CF+HwQ#q96SMCLvce4LJuk`X zF0;QO(f!Z5Q*7?h4)mwzut)P?z%SjE&l2N>BpYmn=p6k7>rYPE#iJ7s_xB9SogRH- zfHXZ6Xk7ED8>;X=5AQ#f#djS;?g-gbCksE}Fub~v20yu&3tRm%>!eBJX#-2J`2B)| z+!Fv{7);}t^iV}Yb;t}*fij!9-sPspY&BgNmRcc1nVW*zt8}V;Q8<2^dH8^NkYBg00q_og~)$q-${8#5Y5KM&jXZPQKg5b~s;Nb@xMH%QQ1 z3Dz~g#N2Xfw>TDFMp)rASf(k1asP&eN0sZ z7OW9@_T@~2%Qy{hjQ30W9!%%FJErgmxZlfP&;wx;aM5iV9--A^7ewjXb1T4UdUf#z z<_C>GlaTb_j{@2>&Ip#^u49)Giexu%dzVh*O5u?|_~W=HCKEM2Ajn=!t^Rx*TUU4VQ}&?Vrz_prGR*a5P_8>1Ra|E~=3 z17eydNDjB6+hE~~=g$D^I6UMqJh71mUnH83!>J0ulUew{XqrMy5`~9Og`0zY_grPp z`5#H${nw{)81f9eU4$2UlwS@n^q9ktZ3DP*u=gAu!f|FHoAG(LlH?M+=TJ~|FO9a3 z<~Vbf1NEC0=4Qkr)TLJYf?EQhD z?9Ag4*o}hiSh_N|tyZ*}CWkeH4}AMFy@SfkX{wk<$XxjD<_=}}p1;wH_)a@61D0yR z&R*oic*9*YA=w?rS0L=0|JMmfLk#Fe5GXm z2g)koGpiR1sQE4fa_}jM=fLWj!^-sLf&XgFoD9f6!qw;X8&-tCf%Rr#e0O(uwa0mN zVD~l6#2f9JzD4n)*B%MKx>BriA3gcysov|;Mj*ujFA{0QGhsqNg|Ph6o}=q*e~XjB zW4DI6KC|m0`{zTsI6xj36g|6xl&yMkvYbP-wx$G(k>s#SHQH%|Bx4syOSOnb$Onr2 zgn)7x^7w{=9CtdG(?^EUp`qO-H#EI}3GLa(nV>&^-=GLog!^n3qbQpl>Otex{$0%U z#ZFMtfu@gc;%Rkmg#q`rdqc8O^Krs&N#WYsEHR^`2@)<~EQ>vfBY12Sw?n6UPEKDQ z%6gNyq_E+{B=X&30PM$S3Vfpox zS(yC80PXX&iuNl4xz{Dt=@z&~4AN%7H!LUV3R1JuD9biTA7TxDuiLEfT|jf?3chxW zA003*M&GVPTX}!scdMNxw~hrpu^#xR?&#fvmkRf5ra@JOXHEY8KLVlEg-_iW!kFfR zV#jVe;T1i2x(m6x8dF=mOTv$Ojb3gRKIhdTS6rYzOSkfD=5)33UKTD!19*Cl+ zlMfmRvkS^Xnt6R6piT|{4mLHVt@_#BiY5Hs>${4pmMF{J`8 z*13}(k$|lAok?V)%|29d5Dp$Xg$`;$qDbv{%J7HR(WKOpt><#II|J38($<1zRl&O( zBd&EWAgv5U4y3AKwUKqjH&9{Gu5_^|CSL=2Y*2OL;#!%)e^bGb#;GzLYiFetRsw3& zLEXv6nwkKRe?P9~`v91XjTK!hD=Q=JQ_q?_1ayshm-1hNpdj~p#chXy)l^>6@~}GU zd$pBSoi>Y$OJSYw%JT5o5J=3{IU9IB0utn+R_U`cE|=x9yowyHswi|BiC&S8YxcvR z4qIyyrmQ`#=(O>j!LLXX0s=_=>nlgb%hz%otZ%CME{5$+#k|3Ge$TEfa!l*(sk0|hrX;l2w(LPPzWIzeUXxg5YOxkZxp zet>)|on{cSXwq8x17ugzDAQti>Z%`!ir(6)9atT!Q&Ur0I_m^suIBaB-duW9X{F}( zO_W0vkg?3?>PU6zl<(@G8Anipuiwh3!oB4;rFWYfDBbO2=BuNncR?A;%-Z4~AxVm^ zl;&caklufueXEML*lnxj(i$18?5K7Qn(Hvm?d|Q~x-u879IdCHIhK+#^**a39U9OE z%{2hi(A8}QCUZ|H^rmEd*0udSH$aQFEoYsaoh?A?T{t^GoR$W?AH>=LQ0Ak>0$_u; zAp5+v(4+KVaIM$GU^`?HB=u|a+q18pFjJ>{2*6!^K(Rnm&UBms4YXUGfdLF0Z3IUh z$urCEFSZfZdIJ*7%R^-`Dzk5<4FII#A%F($0u7)!B$@Lt^wT_rb?rOjJ&nyRxlR0D znifl^2G*&6nUUj7NaM3kT#3WL_}B41gTiyvN7+@^j%_w#IbUUf&ajyT#pUq|XZl+? zb3$+f+2fYQ2xz|}q;4lTj0H3cmf_1uJAMGSQl)Hm+ji&DY-C7YC41oBQ&m+3-6|8zNVw;X zy}U@lzKy#bCx6{%GfklLoX6xBz$!%r1%RRut`wmcbF&*Z;)^K&-vXD6NpbcYdB<*v z?Boq4^rjMkx}q}X(UchaKLEaxDyq&PBdB*-08VX!um*<4CTO9L-g%iY+Euz?Lg+sTAtP8n8o^VAW}tg|&|zvCUB8^yEbMRh`I8BH1DkY|I)`+1 zaU8;~^i8ET>mNgg;6vyXIpMm+mr@Nx7ktF4qW}g_cOZsTfTFRgDpKu7Q^_AN1n~Xs zBjgS!tTnalE{NO(csjr`0BG&y{~l9o>nnn9RzA5Qqi=Yb3b!B~xuz`2v2Kqi?}@r8Z>69; zCj*3$e&%zlRrS<2B-s#rdtFuVbdPY|Dxo0+vgA5)DqyQa1*2(fZ?gc z5kj(8$4zYDHjlaGACt;ojF!`nK^U$;w~|qp{{ZRhB7Pd%s{;{S8s0RUt=a|&Nx{m_ zWKeIF0qPvZDhn1*`{@hHc{q)H;rcu~R$PEzH)eTP(R`1o5v(1KB%c6#09#`~nyg&?Y)ni95rQ^BEl zMaHkl-`=V?$z`l8WGU5w95S6^RTl@UmoG)SvWPl@Hf&zshP|jy2CfVAKOkfAn>76f z&2MLpfV#U%`0oNN!__cg5~$&TTNS!dvbFOWvcbRD9*t5#Ng@r{XpixLIV;d|3A#*2 z!Nr6I-$5-dr3Xpv8KJLC)wKm_NqC+;17X~rAGlw?T80KKYA+K5fumY%Q6&@R4q89A zoN(YGtK9_MmH@D}=D!14vTW4mlD%GLPQmSYVI{yjq%I^Mne=4w5cueQ3_vRS;*F*! z+g@G7SxoB-YK`>v_6`rL0(kL9l2Qa0sK|Ih01dsOVSYIBSQ>eBE--5D6SJ@-T$^%A z50*b`G^|MgIGyME47YHCa?o%t4b%?#y(dUJK1gW?Sr{KP$(2#>FJ>)G}9{J03sDMZraY@TQF6 zaO_bS9(`#8_ndKkPNVOpk;v+|*^ZtDjdyCR;0s(jL|t04Ce@ zR#wrg{BjasL=OlagT!kSgW3PQIk2Q>c;x1;BB(g!jL%2Yra%pyWOH2|F-c7-Y^_@_ z2sh=jG2KcXr@f01y7kfSGRrT($>5QZ@qW@lVDK)ZZq|6(v)mr8ZUw~`gU1^o&90k> ztg5S3cvM8*pC&a2%ke^Laxsoh?4qx(1kvqRmzM>G?)oCNKs$|y0W)MM&w56?-H@z5 z-)L&2zDXww@@un<@!J52^EwffJk1uX#X=_F&@8v9krjRXCqP-dL}UF$e8!s^V$#ph zY5MMBp z|L(@jfDIbNAK?1eFS^`d2AZcpS^urF0l43k^^7PpzYY6IX4z2HOFFdoplpUtqiTaj zJvPzcMUymE*uMc@Qpd5?6V$IZ6rGKBU^)1;20z-j7o)cG`JNvGO~Kr@-2ehSF2*QV zZ90v-g31_sw^?UEIT^NAJAhr)7Tz;t`89{6@52ABm25z7y&&jU1r4mHZpDsL(>CA*YuqjdNru3UgZZdmZ2St`s%}MI;{6-Ls%zM+(|NIs+3-Fdk%;^ zu;?!Ug@DOe&v+)Y7|;V^HMmv08GQNj^hl63x2}pSqIF-w^oT$DRW4|{JeO?#t@FyR=Lr!*T4t57XYR#eX5ME zS|WNhBvXpsC44kANzV_v)@V*3`?CB3H5R)_`W(If7rPsa=xE?lA+wM_a94Idfd=$d zApFCicmf2oU@#Q!zk*E={HI9ZKRqBCri5M4CxJ?RP@ba2VpBhth^Ntz8MEEV{00vO zml&W+are`UUszT?xXJRXI|OY>5;YRbRo*UbVBL9n{1R&u=y(xt_HYnTZJ!ylN@&;} zMXGOs8xFiu1N@l+Ymcuy+8Uo>&Vhz{cvAdVyl(Hd1{p(-w$< zwOK&fQr-+3c&8w!4~_pkgch8pF&V$xnnl8OwV;0Lb=D@KhN4HZJ`&;oyC8BGzO<0! zGUU?y{CrS0D3J(WzAJ1|;bhj0n&Lv!R`X@5No_fq65#19aSEQe`bH=EZ1mL5Ci-57 zCD&;!*7FCnzce0vz{!*(|JrDceTO0V$lhNC716dYE*?@uh{j%F5qHWs^yf48$FCDc zO5bdn%J3%Hxsgz5oEE3c>dvTXGoiVXf{f(LL!*7}&yG+Jw+ z0d8+)WSGw>-@Ld#fBU-GCjV@)+reW{%Sp^s!R8RX?f%4#B_xeL*0{3nIc&kvP8)wL zC2WnNZ|n}__r)RmveaTwd&?aOHluZ=0$F@P{Aq@`vO4o(Hd{!f$G=;xvDG5Kj2`Dn zTJ&ia?Wv`%nkj5MS|1N|!UnD&t*y!1-zw5@8dclf@#cQx=gsa07# zVVu0$#fd*xT~SBU{wN6*;eGyLwslUnna2Jn_#yf4RnRsJi9Ce<`|E#G;J+#G-xT=YhXS8%DB&jK VCm1R(0z(H~*12|}NXz!&{{gq|#l-*s literal 0 HcmV?d00001 diff --git a/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/after-tile-removal-linux.png b/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/after-tile-removal-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..dade413b91a2383e8747f366d97f8ea026933381 GIT binary patch literal 18468 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π2`%&!aQrzN_Z159&Er3@Dp)fau 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 Q6tr3=&K}QDzj*h50Q-Sy?EnA( literal 0 HcmV?d00001 diff --git a/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/baseline-before-adding-linux.png b/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/baseline-before-adding-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..92dbe6198898750c8d9a9034e4c0058e5b27a1a4 GIT binary patch literal 19745 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 Q3_;H78lKA0zIyln0qSNn)c^nh literal 0 HcmV?d00001 diff --git a/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/before-src-change-linux.png b/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/before-src-change-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..92dbe6198898750c8d9a9034e4c0058e5b27a1a4 GIT binary patch literal 19745 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 Q3_;H78lKA0zIyln0qSNn)c^nh literal 0 HcmV?d00001 diff --git a/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/before-tile-removal-linux.png b/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/before-tile-removal-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..92dbe6198898750c8d9a9034e4c0058e5b27a1a4 GIT binary patch literal 19745 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 Q3_;H78lKA0zIyln0qSNn)c^nh literal 0 HcmV?d00001 diff --git a/test/e2e/elements/map-tile/map-tile-row-col-zoom-immutable.test.js b/test/e2e/elements/map-tile/map-tile-row-col-zoom-immutable.test.js new file mode 100644 index 000000000..bd559239b --- /dev/null +++ b/test/e2e/elements/map-tile/map-tile-row-col-zoom-immutable.test.js @@ -0,0 +1,106 @@ +import { test, expect, chromium } from '@playwright/test'; + +test.describe('Map Tile Immutable Attributes Tests', () => { + let page; + let context; + + test.beforeAll(async function () { + context = await chromium.launchPersistentContext('', { slowMo: 500 }); + page = + context.pages().find((page) => page.url() === 'about:blank') || + (await context.newPage()); + await page.goto('http://localhost:30001/test-immutable.html'); + }); + + test('row, col, zoom attributes become immutable after initialization', async () => { + // Wait for element to be connected and initialized + await page.waitForTimeout(2000); + + // Get initial values + const initialValues = await page.evaluate(() => { + const tile = document.getElementById('test-tile'); + return { + row: tile.getAttribute('row'), + col: tile.getAttribute('col'), + zoom: tile.getAttribute('zoom') + }; + }); + + expect(initialValues.row).toBe('1'); + expect(initialValues.col).toBe('1'); + expect(initialValues.zoom).toBe('2'); + + // Try to change via setAttribute - should be reverted + await page.evaluate(() => { + const tile = document.getElementById('test-tile'); + tile.setAttribute('row', '5'); + tile.setAttribute('col', '6'); + tile.setAttribute('zoom', '3'); + }); + + // Check that values were reverted + const afterSetAttribute = await page.evaluate(() => { + const tile = document.getElementById('test-tile'); + return { + row: tile.getAttribute('row'), + col: tile.getAttribute('col'), + zoom: tile.getAttribute('zoom') + }; + }); + + expect(afterSetAttribute.row).toBe('1'); // Should remain unchanged + expect(afterSetAttribute.col).toBe('1'); // Should remain unchanged + expect(afterSetAttribute.zoom).toBe('2'); // Should remain unchanged + + // Try to change via property setters - should also fail + await page.evaluate(() => { + const tile = document.getElementById('test-tile'); + tile.row = 10; + tile.col = 11; + tile.zoom = 4; + }); + + const afterPropertySetters = await page.evaluate(() => { + const tile = document.getElementById('test-tile'); + return { + row: tile.getAttribute('row'), + col: tile.getAttribute('col'), + zoom: tile.getAttribute('zoom') + }; + }); + + expect(afterPropertySetters.row).toBe('1'); // Should remain unchanged + expect(afterPropertySetters.col).toBe('1'); // Should remain unchanged + expect(afterPropertySetters.zoom).toBe('2'); // Should remain unchanged + }); + + test('src attribute can still be changed after initialization', async () => { + // Wait for element to be connected + await page.waitForTimeout(1000); + + const initialSrc = await page.evaluate(() => { + const tile = document.getElementById('test-tile'); + return tile.getAttribute('src'); + }); + + // Change src attribute + const newSrc = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVR42mNkYPhfDwAChAGA6ej9MgAAAABJRU5ErkJggg=='; + await page.evaluate((src) => { + const tile = document.getElementById('test-tile'); + tile.setAttribute('src', src); + }, newSrc); + + const finalSrc = await page.evaluate(() => { + const tile = document.getElementById('test-tile'); + return tile.getAttribute('src'); + }); + + expect(finalSrc).toBe(newSrc); + expect(finalSrc).not.toBe(initialSrc); + }); + + test.afterAll(async () => { + await context.close(); + }); +}); diff --git a/test/e2e/elements/map-tile/map-tile-test.html b/test/e2e/elements/map-tile/map-tile-test.html new file mode 100644 index 000000000..63bcaa005 --- /dev/null +++ b/test/e2e/elements/map-tile/map-tile-test.html @@ -0,0 +1,49 @@ + + + + + map-tile-test.html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/e2e/elements/map-tile/map-tile.test.js b/test/e2e/elements/map-tile/map-tile.test.js new file mode 100644 index 000000000..3a9a366e9 --- /dev/null +++ b/test/e2e/elements/map-tile/map-tile.test.js @@ -0,0 +1,364 @@ +import { test, expect, chromium } from '@playwright/test'; + +test.describe('Map Tile Dynamic Updates Tests', () => { + let page; + let context; + + test.beforeAll(async function () { + context = await chromium.launchPersistentContext('', { slowMo: 500 }); + page = + context.pages().find((page) => page.url() === 'about:blank') || + (await context.newPage()); + await page.goto('map-tile-test.html'); + }); + + test('removing map-tile from DOM removes it from map rendering', async () => { + // Wait for initial rendering + await page.waitForTimeout(1000); + + // Debug: Check initial state + const debugInfo = await page.evaluate(() => { + const tiles = document.querySelectorAll('map-tile'); + const mapZoom = document.querySelector('mapml-viewer')._map.getZoom(); + + const tileInfo = Array.from(tiles).map((tile) => ({ + zoom: tile.getAttribute('zoom'), + row: tile.getAttribute('row'), + col: tile.getAttribute('col'), + hasDiv: tile._tileDiv !== undefined, + isVisible: tile._tileDiv + ? !tile._tileDiv.style.display || + tile._tileDiv.style.display !== 'none' + : false + })); + + return { + mapZoom, + totalTiles: tiles.length, + renderedTiles: tileInfo.filter((t) => t.hasDiv).length, + visibleTiles: tileInfo.filter((t) => t.isVisible).length, + tilesByZoom: tileInfo.reduce((acc, t) => { + acc[t.zoom] = (acc[t.zoom] || 0) + 1; + return acc; + }, {}), + renderedByZoom: tileInfo + .filter((t) => t.hasDiv) + .reduce((acc, t) => { + acc[t.zoom] = (acc[t.zoom] || 0) + 1; + return acc; + }, {}) + }; + }); + + expect(debugInfo.totalTiles).toBeGreaterThan(0); + + // Take screenshot before removal + const beforeScreenshot = await page.screenshot({ fullPage: false }); + expect(beforeScreenshot).toMatchSnapshot('before-tile-removal.png'); + + // Remove specific tiles that are currently at the map zoom level + const removedTiles = await page.evaluate(() => { + const mapZoom = document.querySelector('mapml-viewer')._map.getZoom(); + const tiles = document.querySelectorAll(`map-tile[zoom="${mapZoom}"]`); + const removed = []; + + // Remove first 3 tiles at current zoom level + for (let i = 0; i < Math.min(3, tiles.length); i++) { + removed.push({ + zoom: tiles[i].getAttribute('zoom'), + row: tiles[i].getAttribute('row'), + col: tiles[i].getAttribute('col'), + hadDiv: tiles[i]._tileDiv !== undefined + }); + tiles[i].remove(); + } + + return { + mapZoom, + removedCount: removed.length, + removed + }; + }); + + // Wait for redraw to complete + await page.waitForTimeout(1000); + + // Check final state + const finalDebugInfo = await page.evaluate(() => { + const tiles = document.querySelectorAll('map-tile'); + const mapZoom = document.querySelector('mapml-viewer')._map.getZoom(); + + const tileInfo = Array.from(tiles).map((tile) => ({ + zoom: tile.getAttribute('zoom'), + hasDiv: tile._tileDiv !== undefined + })); + + return { + totalTiles: tiles.length, + renderedTiles: tileInfo.filter((t) => t.hasDiv).length, + renderedAtCurrentZoom: tileInfo.filter( + (t) => t.hasDiv && t.zoom === mapZoom + ).length + }; + }); + + // Take screenshot after removal to show visual difference + const afterScreenshot = await page.screenshot({ fullPage: false }); + expect(afterScreenshot).toMatchSnapshot('after-tile-removal.png'); + + // The test should pass if we removed tiles successfully + expect(removedTiles.removedCount).toBeGreaterThan(0); + }); + + test('removing the last map-tile in a sequence removes MapTileLayer container', async () => { + // Reset by reloading the page + await page.reload(); + await page.waitForTimeout(1000); + + const viewer = page.getByTestId('viewer'); + let nTiles = await viewer.evaluate( + (v) => v.querySelectorAll('map-tile').length + ); + expect(nTiles).toEqual(15); + const containerConnected = await viewer.evaluate((v) => { + v.querySelector('map-tile')._tileLayer._container.setAttribute( + 'data-testid', + 'test-tile-container' + ); + return v.querySelector('map-tile')._tileLayer._container.isConnected; + }); + expect(containerConnected).toBe(true); + nTiles = await viewer.evaluate((v) => { + v.querySelectorAll('map-tile').forEach((el) => el.remove()); + return v.querySelectorAll('map-tile').length; + }); + expect(nTiles).toEqual(0); + await expect(page.getByTestId('test-tile-container')).toHaveCount(0); + }); + + test('adding map-tile to DOM renders it on map', async () => { + // Reset by reloading the page + await page.reload(); + await page.waitForTimeout(1000); + + // Take baseline screenshot + const baselineScreenshot = await page.screenshot({ fullPage: false }); + expect(baselineScreenshot).toMatchSnapshot('baseline-before-adding.png'); + + // Add a new map-tile element to DOM at a visible location + await page.evaluate(() => { + const layer = document.querySelector('map-layer'); + const newTile = document.createElement('map-tile'); + newTile.setAttribute('zoom', '2'); + newTile.setAttribute('row', '13'); + newTile.setAttribute('col', '12'); + newTile.setAttribute('src', 'tiles/green-tile.png'); + layer.appendChild(newTile); + }); + + // Wait for the tile to be processed and rendered + await page.waitForTimeout(1000); + + // Verify the new tile exists in DOM + const newTileExists = await page.evaluate(() => { + const newTile = document.querySelector('map-tile[row="13"][col="12"]'); + return newTile !== null; + }); + + expect(newTileExists).toBe(true); + + // Verify the new tile is part of a tile layer + const newTileInLayer = await page.evaluate(() => { + const newTile = document.querySelector('map-tile[row="13"][col="12"]'); + return newTile && newTile._tileLayer !== undefined; + }); + + expect(newTileInLayer).toBe(true); + + // Take screenshot after adding to show the tile was rendered + const afterAddingScreenshot = await page.screenshot({ fullPage: false }); + expect(afterAddingScreenshot).toMatchSnapshot('after-adding-tile.png'); + }); + + test('bidirectional links are properly cleaned up on removal', async () => { + // Reload to start fresh + await page.reload(); + await page.waitForTimeout(1000); + + // Get reference to a tile and its rendered div before removal + const tileInfo = await page.evaluate(() => { + const tile = document.querySelector('map-tile[zoom="2"]'); + if (!tile) return null; + + return { + hasTileDiv: tile._tileDiv !== undefined, + tileDivExists: tile._tileDiv ? true : false, + row: tile.getAttribute('row'), + col: tile.getAttribute('col'), + zoom: tile.getAttribute('zoom') + }; + }); + + expect(tileInfo).toBeTruthy(); + expect(tileInfo.hasTileDiv).toBe(true); + + // Remove the tile from DOM + await page.evaluate((info) => { + const tile = document.querySelector( + `map-tile[zoom="${info.zoom}"][row="${info.row}"][col="${info.col}"]` + ); + if (tile) { + tile.remove(); + } + }, tileInfo); + + // Wait for cleanup + await page.waitForTimeout(500); + + // Verify the tile is no longer in DOM + const tileStillExists = await page.evaluate((info) => { + const tile = document.querySelector( + `map-tile[zoom="${info.zoom}"][row="${info.row}"][col="${info.col}"]` + ); + return tile !== null; + }, tileInfo); + + expect(tileStillExists).toBe(false); + }); + + test('changing src attribute updates tile image', async () => { + // Reset by reloading the page + await page.reload(); + await page.waitForTimeout(1000); + + // Find a tile and get initial src + const initialState = await page.evaluate(() => { + const mapZoom = document.querySelector('mapml-viewer')._map.getZoom(); + const tile = document.querySelector(`map-tile[zoom="${mapZoom}"]`); + + if (!tile) return null; + + return { + row: tile.getAttribute('row'), + col: tile.getAttribute('col'), + zoom: tile.getAttribute('zoom'), + src: tile.getAttribute('src'), + hasDiv: tile._tileDiv !== undefined + }; + }); + + expect(initialState).toBeTruthy(); + expect(initialState.hasDiv).toBe(true); + + // Take screenshot before src change + const beforeScreenshot = await page.screenshot({ fullPage: false }); + expect(beforeScreenshot).toMatchSnapshot('before-src-change.png'); + + // Change the src attribute to a different color tile + const newSrc = initialState.src.includes('green') + ? 'tiles/red-tile.png' + : 'tiles/green-tile.png'; + + await page.evaluate( + (params) => { + const tile = document.querySelector( + `map-tile[zoom="${params.zoom}"][row="${params.row}"][col="${params.col}"]` + ); + tile.setAttribute('src', params.newSrc); + }, + { ...initialState, newSrc } + ); + + // Wait for image to load and update + await page.waitForTimeout(1500); + + // Verify the src changed and tile is still rendered + const finalState = await page.evaluate((params) => { + const tile = document.querySelector( + `map-tile[zoom="${params.zoom}"][row="${params.row}"][col="${params.col}"]` + ); + + return { + tileExists: tile !== null, + hasDiv: tile ? tile._tileDiv !== undefined : false, + src: tile ? tile.getAttribute('src') : null + }; + }, initialState); + + expect(finalState.tileExists).toBe(true); + expect(finalState.hasDiv).toBe(true); + expect(finalState.src).toBe(newSrc); + + // Take screenshot after src change + const afterScreenshot = await page.screenshot({ fullPage: false }); + expect(afterScreenshot).toMatchSnapshot('after-src-change.png'); + }); + + test('coordinate collision - last tile wins', async () => { + // Reset by reloading the page + await page.reload(); + await page.waitForTimeout(1000); + + // Create a new tile at a visible position first + await page.evaluate(() => { + const layer = document.querySelector('map-layer'); + const newTile = document.createElement('map-tile'); + newTile.setAttribute('zoom', '2'); + newTile.setAttribute('row', '10'); + newTile.setAttribute('col', '11'); + newTile.setAttribute('src', 'tiles/red-tile.png'); + newTile.id = 'test-tile-1'; + layer.appendChild(newTile); + }); + + await page.waitForTimeout(1000); + + // Verify first tile is rendered + const firstTileState = await page.evaluate(() => { + const tile = document.getElementById('test-tile-1'); + return { + hasDiv: tile._tileDiv !== undefined, + position: `${tile.col}:${tile.row}:${tile.zoom}` + }; + }); + + expect(firstTileState.hasDiv).toBe(true); + + // Add a second tile at the same position + await page.evaluate(() => { + const layer = document.querySelector('map-layer'); + const newTile = document.createElement('map-tile'); + newTile.setAttribute('zoom', '2'); + newTile.setAttribute('row', '10'); + newTile.setAttribute('col', '11'); + newTile.setAttribute('src', 'tiles/green-tile.png'); + newTile.id = 'test-tile-2'; + layer.appendChild(newTile); + }); + + await page.waitForTimeout(1000); + + // Check final state - second tile should win, first should lose _tileDiv + const finalState = await page.evaluate(() => { + const tile1 = document.getElementById('test-tile-1'); + const tile2 = document.getElementById('test-tile-2'); + + return { + tile1DivIsConnected: tile1._tileDiv.isConnected, + tile2DivIsConnected: tile2._tileDiv.isConnected, + tile1Src: tile1.getAttribute('src'), + tile2Src: tile2.getAttribute('src') + }; + }); + + // Last tile wins - tile2 should be rendered, tile1 should not + expect(finalState.tile2DivIsConnected).toBe(true); + expect(finalState.tile1DivIsConnected).toBe(false); + expect(finalState.tile1Src).toBe('tiles/red-tile.png'); + expect(finalState.tile2Src).toBe('tiles/green-tile.png'); + }); + + test.afterAll(async () => { + await context.close(); + }); +}); diff --git a/test/e2e/elements/map-tile/map-tile.test.js-snapshots/after-adding-tile-linux.png b/test/e2e/elements/map-tile/map-tile.test.js-snapshots/after-adding-tile-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..e4bb0a5f7fdc5850128172c3ebd1e295bad438fe GIT binary patch literal 19716 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�|y-2AFpl2?I-x^C! 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 + + + Test Map Tile Immutable Attributes + + + + + + + + + + + + diff --git a/test/e2e/elements/map/map-in-shadow-root.test.js b/test/e2e/elements/map/map-in-shadow-root.test.js index 77864e7bd..af5800247 100644 --- a/test/e2e/elements/map/map-in-shadow-root.test.js +++ b/test/e2e/elements/map/map-in-shadow-root.test.js @@ -18,6 +18,7 @@ test.describe('Playwright map[is=web-map] fullscreen tests', () => { await page.goto('map-in-shadow-root.html'); }); test('Fullscreen button makes shadow DOM map[is=web-map] element the fullscreen element', async () => { + await page.waitForTimeout(500); const map1 = page.getByTestId('map1'); const fullscreenButton = map1.getByTitle(/(View)|(Exit) Fullscreen/i); await fullscreenButton.click(); @@ -28,6 +29,10 @@ test.describe('Playwright map[is=web-map] fullscreen tests', () => { // the first mapml-viewer should be returned by document.fullscreen expect(fullscreenElement).toEqual('map1'); await fullscreenButton.click(); + // Wait for fullscreen to exit properly + await page.waitForFunction(() => !document.fullscreenElement, { + timeout: 2000 + }); fullscreenElement = await page.evaluate(`document.fullscreenElement`); expect(fullscreenElement).toBeFalsy(); diff --git a/test/e2e/layers/featureLayer.test.js b/test/e2e/layers/featureLayer.test.js index 9932b22de..31879bb7f 100644 --- a/test/e2e/layers/featureLayer.test.js +++ b/test/e2e/layers/featureLayer.test.js @@ -45,6 +45,21 @@ test.describe('Playwright featureLayer (Static Features) Layer Tests', () => { test('Loading in retrieved features', async () => { await page.waitForTimeout(350); + // Wait for the layer to be ready and SVG to be created + await page.waitForFunction( + () => { + const layer = document.querySelector('map-layer#US'); + return ( + layer && + layer._layer && + layer._layer._container && + layer._layer._container.querySelector('svg') && + layer._layer._container.querySelector('svg').firstChild + ); + }, + { timeout: 5000 } + ); + const features = await page.$eval( 'map-layer#US', (layer) => diff --git a/test/e2e/layers/mixedLayer-zindex-rendering.test.js b/test/e2e/layers/mixedLayer-zindex-rendering.test.js new file mode 100644 index 000000000..70fffff37 --- /dev/null +++ b/test/e2e/layers/mixedLayer-zindex-rendering.test.js @@ -0,0 +1,178 @@ +import { test, expect, chromium } from '@playwright/test'; + +test.describe('Mixed Layer Z-Index Rendering Tests', () => { + let page; + let context; + + test.beforeAll(async function () { + context = await chromium.launchPersistentContext('', { slowMo: 500 }); + page = + context.pages().find((page) => page.url() === 'about:blank') || + (await context.newPage()); + await page.goto('mixedLayer.html'); + }); + + test('baseline rendering - red map-extent over green inline tiles and features', async () => { + await page.waitForTimeout(500); + const viewer = page.getByTestId('viewer'); + + await expect(viewer).toHaveScreenshot('mixedLayer-baseline.png', { + maxDiffPixels: 50 + }); + + // Verify that the red map-extent is checked and rendering + const redExtent = await page.evaluate(() => { + const mapExtents = document.querySelectorAll('map-extent'); + return { + checked: mapExtents[0]?.checked, + label: mapExtents[0]?.getAttribute('label') + }; + }); + + expect(redExtent.checked).toBe(true); + expect(redExtent.label).toBe('map-extent red tiles'); + }); + + test('map-extent unchecked state shows underlying green tiles', async () => { + // Uncheck the red map-extent to reveal green inline tiles + await page.evaluate(() => { + const mapExtents = document.querySelectorAll('map-extent'); + if (mapExtents[0]) { + mapExtents[0].checked = false; + } + }); + await page.waitForTimeout(500); + const viewer = page.getByTestId('viewer'); + + await expect(viewer).toHaveScreenshot('mixedLayer-red-unchecked.png', { + maxDiffPixels: 50 + }); + + // Verify the red extent is now unchecked + const redExtentChecked = await page.evaluate(() => { + const mapExtents = document.querySelectorAll('map-extent'); + return mapExtents[0]?.checked; + }); + + expect(redExtentChecked).toBe(false); + }); + + test('blue map-extent renders over all other content when checked', async () => { + // Check the blue image map-extent + await page.evaluate(() => { + const mapExtents = document.querySelectorAll('map-extent'); + if (mapExtents[1]) { + mapExtents[1].checked = true; + } + }); + await page.waitForTimeout(500); + + const viewer = page.getByTestId('viewer'); + await expect(viewer).toHaveScreenshot('mixedLayer-blue-checked.png', { + maxDiffPixels: 50 + }); + + // Verify the blue extent is checked + const blueExtent = await page.evaluate(() => { + const mapExtents = document.querySelectorAll('map-extent'); + return { + checked: mapExtents[1]?.checked, + label: mapExtents[1]?.getAttribute('label') + }; + }); + + expect(blueExtent.checked).toBe(true); + expect(blueExtent.label).toBe('map-extent blue image'); + }); + + test('DOM order change affects z-index rendering', async () => { + // Reset to testable state + await page.evaluate(() => { + const mapExtents = document.querySelectorAll('map-extent'); + if (mapExtents[0]) mapExtents[0].checked = true; // red tiles + if (mapExtents[1]) mapExtents[1].checked = false; // blue image + }); + + // Move first map-extent after first map-feature to test DOM ordering impact + await page.evaluate(() => { + const mapExtents = document.querySelectorAll('map-extent'); + const mapFeatures = document.querySelectorAll('map-feature'); + + if (mapExtents[0] && mapFeatures[0]) { + const firstFeature = mapFeatures[0]; + const firstExtent = mapExtents[0]; + + // Insert the map-extent after the first map-feature + firstFeature.parentNode.insertBefore( + firstExtent, + firstFeature.nextSibling + ); + } + }); + await page.waitForTimeout(500); + const viewer = page.getByTestId('viewer'); + await expect(viewer).toHaveScreenshot('mixedLayer-dom-reordered.png', { + maxDiffPixels: 50 + }); + }); + + test('feature data maintains correct z-index order when layer is checked', async () => { + // Reset to baseline state + await page.reload(); + + // Wait for features to be loaded and rendered + await page.waitForTimeout(1000); + + // Verify features exist in DOM + const featuresCount = await page.evaluate(() => { + return document.querySelectorAll('map-feature').length; + }); + + // At least one feature should exist + expect(featuresCount).toBeGreaterThan(0); + + await page.waitForTimeout(500); + + const viewer = page.getByTestId('viewer'); + await expect(viewer).toHaveScreenshot('mixedLayer-features-baseline.png', { + maxDiffPixels: 50 + }); + }); + + test('z-index values follow correct hierarchy', async () => { + // Test that DOM elements exist and can be properly layered + const elementCounts = await page.evaluate(() => { + const mapExtents = Array.from(document.querySelectorAll('map-extent')); + const inlineTiles = Array.from( + document.querySelectorAll('map-tile') + ).filter((tile) => !tile.closest('map-extent')); + const mapFeatures = Array.from(document.querySelectorAll('map-feature')); + + return { + extentCount: mapExtents.length, + tileCount: inlineTiles.length, + featureCount: mapFeatures.length, + checkedExtents: mapExtents.filter((e) => e.checked).length + }; + }); + + // Validate that we have the expected elements + expect(elementCounts.extentCount).toBe(2); + expect(elementCounts.tileCount).toBeGreaterThan(0); + expect(elementCounts.featureCount).toBeGreaterThan(0); + expect(elementCounts.checkedExtents).toBeGreaterThan(0); + + await page.waitForTimeout(500); + const viewer = page.getByTestId('viewer'); + await expect(viewer).toHaveScreenshot( + 'mixedLayer-hierarchy-validation.png', + { + maxDiffPixels: 50 + } + ); + }); + + test.afterAll(async () => { + await context.close(); + }); +}); diff --git a/test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-baseline-linux.png b/test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-baseline-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..314f0192bab745878d1986e520409a29c391b11b GIT binary patch literal 17676 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 literal 0 HcmV?d00001 diff --git a/test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-blue-checked-linux.png b/test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-blue-checked-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..1153d219f2d9d3c3997362e7f806dbd882736bc9 GIT binary patch literal 28902 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 literal 0 HcmV?d00001 diff --git a/test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-dom-reordered-linux.png b/test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-dom-reordered-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..314f0192bab745878d1986e520409a29c391b11b GIT binary patch literal 17676 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 literal 0 HcmV?d00001 diff --git a/test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-features-baseline-linux.png b/test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-features-baseline-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..314f0192bab745878d1986e520409a29c391b11b GIT binary patch literal 17676 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 literal 0 HcmV?d00001 diff --git a/test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-hierarchy-validation-linux.png b/test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-hierarchy-validation-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..314f0192bab745878d1986e520409a29c391b11b GIT binary patch literal 17676 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 literal 0 HcmV?d00001 diff --git a/test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-red-unchecked-linux.png b/test/e2e/layers/mixedLayer-zindex-rendering.test.js-snapshots/mixedLayer-red-unchecked-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..fc53c2de6a28aab002f9ce955ffdc90f8d9cd9e6 GIT binary patch literal 17705 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 + + + + mixedLayer.html + + + + + + + + + + + + + + + + + + + col="10" row="10" + + + 10 10 11 10 11 11 10 11 10 10 + + + + col="10" row="11" + + + 10 11 10 12 11 12 11 11 10 11 + + + + col="9" row="11" + + + 9 11 9 12 10 12 10 11 9 11 + + + + col="9" row="10" + + + 9 10 9 11 10 11 10 10 9 10 + + + + col="11" row="11" + + + 11 11 11 12 12 12 12 11 11 11 + + + + + + + <-- figure out test z-index for the MapTileLayer --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Colorado + + + + -107.919731 41.003906 -105.728954 40.998429 -104.053011 41.003906 -102.053927 41.003906 + -102.053927 40.001626 -102.042974 36.994786 -103.001438 37.000263 -104.337812 36.994786 -106.868158 + 36.994786 -107.421329 37.000263 -109.042503 37.000263 -109.042503 38.166851 -109.058934 38.27639 + -109.053457 39.125316 -109.04798 40.998429 -107.919731 41.003906 + + + + + + + + + + + diff --git a/test/e2e/layers/multipleExtents.test.js b/test/e2e/layers/multipleExtents.test.js index c0d0acb8a..ab5d25879 100644 --- a/test/e2e/layers/multipleExtents.test.js +++ b/test/e2e/layers/multipleExtents.test.js @@ -149,11 +149,11 @@ test.describe('Adding and Removing Multiple Extents', () => { (extents) => extents.length ); cbmt = await page.$eval( - "div.mapml-extentlayer-container[style='opacity: 0.5; z-index: 0;'] > div", + "div.mapml-extentlayer-container[style='opacity: 0.5; z-index: 1;'] > div", (div) => div.className ); const alabama = await page.$eval( - "div.mapml-extentlayer-container[style='opacity: 0.5; z-index: 1;'] > div", + "div.mapml-extentlayer-container[style='opacity: 0.5; z-index: 2;'] > div", (div) => div.className ); const layerOpacity = await page.$eval( @@ -203,11 +203,11 @@ test.describe('Adding and Removing Multiple Extents', () => { // turn the Multiple Extents layer on await page.click("text='Multiple Extents'"); const cbmtClass = await page.$eval( - "div.mapml-extentlayer-container[style='opacity: 0.5; z-index: 0;'] > div", + "div.mapml-extentlayer-container[style='opacity: 0.5; z-index: 1;'] > div", (div) => div.className ); const alabamaClass = await page.$eval( - "div.mapml-extentlayer-container[style='opacity: 0.5; z-index: 1;'] > div", + "div.mapml-extentlayer-container[style='opacity: 0.5; z-index: 2;'] > div", (div) => div.className ); const layer = page.getByTestId('multiple-extents'); diff --git a/test/e2e/layers/renderer.html b/test/e2e/layers/renderer.html new file mode 100644 index 000000000..8894104b9 --- /dev/null +++ b/test/e2e/layers/renderer.html @@ -0,0 +1,23 @@ + + + + renderer.html + + + + + + + + + + + + + + + + + + + diff --git a/test/e2e/layers/templatedFeaturesCleanup.test.js b/test/e2e/layers/templatedFeaturesCleanup.test.js new file mode 100644 index 000000000..b7f5e6094 --- /dev/null +++ b/test/e2e/layers/templatedFeaturesCleanup.test.js @@ -0,0 +1,44 @@ +import { test, expect, chromium } from '@playwright/test'; + +test.describe('Templated features cleanup test', () => { + let page; + let context; + test.beforeAll(async function () { + context = await chromium.launchPersistentContext(''); + page = + context.pages().find((page) => page.url() === 'about:blank') || + (await context.newPage()); + await page.goto('renderer.html'); + }); + + test.afterAll(async function () { + await context.close(); + }); + + test('Templated renderer cleans up after itself', async () => { + await page.waitForTimeout(1000); + const link = page.getByTestId('test-link'); + let svgCount = await link.evaluate( + (l) => l._templatedLayer._container.querySelectorAll('svg').length + ); + const viewer = page.getByTestId('map'); + await page.getByLabel('Zoom in').click(); + await page.getByLabel('Zoom in').click(); + await page.getByLabel('Zoom in').click(); + await page.getByLabel('Zoom in').click(); + await page.waitForTimeout(1000); + svgCount = await link.evaluate( + (l) => l._templatedLayer._container.querySelectorAll('svg').length + ); + expect(svgCount).toEqual(1); + await page.getByLabel('Interactive map').press('ArrowLeft'); + await page.getByLabel('Interactive map').press('ArrowLeft'); + await page.getByLabel('Interactive map').press('ArrowLeft'); + await page.getByLabel('Reload').click(); + await page.waitForTimeout(1000); + svgCount = await link.evaluate( + (l) => l._templatedLayer._container.querySelectorAll('svg').length + ); + expect(svgCount).toEqual(1); + }); +}); diff --git a/test/e2e/layers/templatedFeaturesOrTiles.html b/test/e2e/layers/templatedFeaturesOrTiles.html new file mode 100644 index 000000000..bec1d6514 --- /dev/null +++ b/test/e2e/layers/templatedFeaturesOrTiles.html @@ -0,0 +1,19 @@ + + + + templatedFeaturesOrTiles.html + + + + + + + + + + diff --git a/test/e2e/layers/templatedFeaturesOrTilesLayer.test.js b/test/e2e/layers/templatedFeaturesOrTilesLayer.test.js new file mode 100644 index 000000000..929152b4a --- /dev/null +++ b/test/e2e/layers/templatedFeaturesOrTilesLayer.test.js @@ -0,0 +1,34 @@ +import { test, expect, chromium } from '@playwright/test'; + +test.describe('Tests to confirm that content cannot be recursively loaded', () => { + let page; + let context; + test.beforeAll(async () => { + context = await chromium.launchPersistentContext('', { slowMo: 250 }); + page = await context.newPage(); + await page.goto('templatedFeaturesOrTiles.html'); + }); + + test.afterAll(async function () { + await context.close(); + }); + test('Contents of features-tiles-extents.mapml copied to map-layer shadow root', async () => { + await page.waitForTimeout(500); + const layer = page.getByTestId('test-layer'); + const featuresTilesAndExtentCopied = await layer.evaluate( + (l) => + l.shadowRoot.querySelectorAll('map-feature, map-tile, map-extent') + .length === 6 + ); + expect(featuresTilesAndExtentCopied).toBe(true); + }); + test('Contents of features-tiles-extents.mapml SELECTIVELY copied to map-link shadow root', async () => { + const mapLinks = await page.getByTestId('test-link').all(); + expect(mapLinks.length).toBe(1); + const mapLink = page.getByTestId('test-link'); + const featuresAndTilesCopied = await mapLink.evaluate( + (l) => l.shadowRoot.querySelectorAll('map-feature, map-tile').length === 5 + ); + expect(featuresAndTilesCopied).toBe(true); + }); +}); diff --git a/test/server.js b/test/server.js index 908875223..ac88c9478 100644 --- a/test/server.js +++ b/test/server.js @@ -24,6 +24,7 @@ app.use(express.static(path.join(__dirname, 'e2e/elements/map-a'))); app.use(express.static(path.join(__dirname, 'e2e/elements/map-input'))); app.use(express.static(path.join(__dirname, 'e2e/elements/map-link'))); app.use(express.static(path.join(__dirname, 'e2e/elements/map-style'))); +app.use(express.static(path.join(__dirname, 'e2e/elements/map-tile'))); app.use(express.static(path.join(__dirname, 'e2e/elements/map-layer'))); app.use(express.static(path.join(__dirname, 'e2e/elements/layer-'))); app.use(express.static(path.join(__dirname, 'e2e/api'))); @@ -171,6 +172,10 @@ app.use( '/data/cbmt/0', express.static(path.join(__dirname, 'e2e/data/tiles/cbmt/0')) ); +app.use( + '/data/cbmt/1', + express.static(path.join(__dirname, 'e2e/data/tiles/cbmt/1')) +); app.use( '/data/cbmt/2', express.static(path.join(__dirname, 'e2e/data/tiles/cbmt/2')) From 054ba10ce7fb120ae3d9f28d7753435d9edc7471 Mon Sep 17 00:00:00 2001 From: Peter Rushforth Date: Fri, 19 Sep 2025 17:24:44 -0400 Subject: [PATCH 2/2] Make w3c community groups icon local / don't bother w3c server --- Gruntfile.js | 15 +++++++++++++-- src/mapml/control/AttributionButton.js | 12 +++++++----- w3community.ico | Bin 0 -> 1150 bytes 3 files changed, 20 insertions(+), 7 deletions(-) create mode 100755 w3community.ico diff --git a/Gruntfile.js b/Gruntfile.js index 44d8b0aa6..9ad947a56 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -77,6 +77,13 @@ module.exports = function(grunt) { filter: 'isFile', src: ['*.png'], dest: 'dist/images/' + }, + { + expand: true, + flatten: true, + filter: 'isFile', + src: ['w3community.ico'], + dest: 'dist/images/' } ] }, @@ -86,8 +93,12 @@ module.exports = function(grunt) { expand: true, src: ['dist/*'], dest: '../experiments' - } - ] + }, + { + expand: true, + src: ['dist/images/*'], + dest: '../experiments' + } ] }, extension: { files: [ diff --git a/src/mapml/control/AttributionButton.js b/src/mapml/control/AttributionButton.js index 50eaf4431..0e6bb463c 100644 --- a/src/mapml/control/AttributionButton.js +++ b/src/mapml/control/AttributionButton.js @@ -1,10 +1,6 @@ import { Control, DomUtil, DomEvent, Map } from 'leaflet'; export var AttributionButton = Control.Attribution.extend({ - options: { - prefix: - 'W3C Community and Business Groups logo
Maps for HTML Community Group | Slava Ukraini Leaflet ' - }, _getLocale: function () { return this.options.mapEl && this.options.mapEl.locale ? this.options.mapEl.locale @@ -85,6 +81,12 @@ Map.addInitHook(function () { } }); -export var attributionButton = function (options) { +export var attributionButton = function (opts) { + /* jshint ignore:start */ + const w3icon = new URL('images/w3community.ico', import.meta.url).href; + /* jshint ignore:end */ + const options = Object.assign(opts, { + prefix: `W3C Community and Business Groups logo Maps for HTML Community Group | Slava Ukraini Leaflet ` + }); return new AttributionButton(options); }; diff --git a/w3community.ico b/w3community.ico new file mode 100755 index 0000000000000000000000000000000000000000..98ef68749e2e4e6fb6cc6479af03ad3b98bb09ba GIT binary patch literal 1150 zcmZ{keQZ-z7>9qW%Q{(TW<!mFWywe{cSN zb0I~*NTvxqeEOkwZM@6iNqs^4#rJcT<~M!MgCXnZQ6>++hfe~eqL1fkkCakCku2@M zcPu#+LY5V6p~{l>(52l!MMpoKTvWV17Mq@NB{!-k!qP}2y=94;mmTv$23cIew0N&F zc5F*OZ;^Zzj4GX}?dR6J3D)(cmRAo(cGEkk z!DqL9YIm}c)%~}UE1#*bm;nQkRa$TDsIfcNJTX5tHy3-7)dRLu2-r_!VZl@yN)Ysz z(kN<+ZtF26UN#$}<+4pzE;2V4Mgq)|S9UqB1^lVUn9H!K-i3L%8nb=@|_DPp!QyP_HcOXXAyT&EIl|ml2J;IO!g# zwko_AtJHDtn*zO#Grxt=-RVP9{Y|{_n){9T%J*JA_bW)@553y8M2BtAD%Gj3F@kJEf< zv-<)tCBF()7b({dCD!Ur_@6h8o{OXtD;5LSadrFk&j#-ORUCn|?NXh3Hncr^h&k!CJt{_2$fU=7Vbkt{c9=g02Oc z7UU_0cRgM-JGw8QJNnCp^TVxMO=FtXXMczsaOh^K{|H+{-TWMEzqcdnGuN$chW;SX zHnam`?MW1A22l9tae9t!6;z$Eo%2csbsuE@U;0z9|Izh7Uq}6plXWQ2oxbCXr+Xpd zj=qISd4GdLUrXH_=HD=n(Ow1Av;r(;tNx5arP*0fKZ) I=st{p0U