From 06660b38e4b9b5974ea03e2077e11b64989fb11c Mon Sep 17 00:00:00 2001 From: Peter Rushforth Date: Tue, 29 Jul 2025 16:03:29 -0400 Subject: [PATCH 01/21] Update ToDo with prompt in progress. First stab at getting rid of processFeatures / _mapmlvectors approach Several test failures related to feature indexing and perhaps other stuff --- ToDo | 96 +++ index.html | 515 +++++++++--- notes | 83 ++ src/layer.js | 31 +- src/map-feature.js | 130 +-- src/mapml/handlers/QueryHandler.js | 4 +- src/mapml/layers/FeatureLayer.js | 540 ------------- src/mapml/layers/MapFeatureLayer.js | 139 ++-- src/mapml/layers/MapLayer.js | 99 +-- .../layers/TemplatedFeaturesOrTilesLayer.js | 1 - src/mapml/layers/TemplatedTileLayer.js | 4 +- test.fails | 745 ++++++++++++++++++ 12 files changed, 1527 insertions(+), 860 deletions(-) create mode 100644 ToDo create mode 100644 notes delete mode 100644 src/mapml/layers/FeatureLayer.js create mode 100644 test.fails diff --git a/ToDo b/ToDo new file mode 100644 index 000000000..f1f539473 --- /dev/null +++ b/ToDo @@ -0,0 +1,96 @@ +Take a look at the introductory doc comments in MapExtentLayer.js, MapTileLayer.js and +MapFeatureLayer.js which illustrate the expected custom elements model that will be +implemented by the target code state. + +Background + +In this branch, MapExtentLayer and MapTileLayer have been refactored to become member layers +in the MapLayer LayerGroup, although MapExtentLayer has some differences because it +implements the element which has the checked attribute controlling +how it is added or removed from the map, hence the map-extent._handleChange event handling +method which is tied to the checked attribute, and associated to the +representation of the in the layer control (as a "sub-layer"). +The MapExtentLayer is added/removed to/from the map-layer._layer (instance of +MapLayer) LayerGroup by the map-extent._handleChange method. This makes sense +because while the map-layer._layer may be on the map (added to the Leaflet map), +the map-extent._extentLayer may not be, due to the map-extent.checked (absent/false value) +attribute. In other words, the _extentLayer itself will or will not be a member of +the map-layer._layer._layers (LayerGroup) collection, according to the associated +.checked value. + +The MapTileLayer instance(s) associated to sequences of elements in the +content of the MapLayer is / are always members of the ._layer._layers +(LayerGroup instance), because the element isn't controlled by a checked +attribute, and individual s are rendered on demand according to their +row,column and zoom, due to being rendered "on demand" by the MapTileLayer (GridLayer) +internal tile management. The MapTileLayer in which a is a member is +always included in the ._layer._layers (MapLayer LayerGroup instance), +and therefore is on the map or not on the map according to the .checked value. + +The current objective is to refactor FeatureLayer as MapFeatureLayer, map-feature.js +and MapFeature.js to work in all the contexts that FeatureLayer currently works, +which are about four in number, discussed below (in preparation, FeatureLayer.js has been copied and name-only refactored to the MapFeatureLayer.js file, including the aforementioned +new header comment). + +The four contexts in which MapFeature currently works include: + + 1. "static" inline child elements of the light DOM node, + which are potentially siblings of and elements, (among others + but those are the elements that are renderable as Leaflet layers or parts of + Leaflet layers, OR "static" remote children fetched from the + and re-parented to the shadow root of . + 2. elements returned by elements that are part + of contents. The popups created by these features are tricky and + have popup navigation button controls in the popup content, created by code + in this repository. + 3. elements that are found in fetched text/mapml documents that are + fetched, rendered and removed as part of the map processing handled by + child and TemplatedFeaturesOrTilesLayer. + Typically such features have interactive behaviour (popups) and navigation buttons. + 4. elements that are fetched and rendered as part of the processing + of child . These features + are not interactive; they are rendered according to provided styles, + but they don't have popups, relying instead on query links per 2, above. + +In addition, FeatureLayer relies on src/features/featureRenderer.js, geometry.js and +path.js. I would like to simplify or eliminate these classes, but I don't understand them. +I will need to discuss any changes before doing them in order to understand the +impact of such changes. + +I want to apply a similar architecture to / MapFeatureLayer.js as +I have done to / MapTileLayer. and / MapExtentLayer.js, +but this step is more complex and has greater ramifications on testing especially, +because the rendering of features is done via the custom featureRenderer.js, path.js +and geometry.js (I believe), whereas tile rendering is well managed by the MapTileLayer +GridLayer subclass. + +Background about the numbered contexts above: + +1. "static" inline features. The code in the _initialize processFeatures function will be the first +code to be deleted. That code creates a single MapLayer._mapmlvectors member variable +but that is simplistic: each *set* of adjacent elements in the +inline or remote content should create a single MapFeatureLayer wherein the first +such creates the MapFeatureLayer (a Leaflet FeatureGroup), and +subsequent *adjacent* elements are added to that MapFeatureLayer +FeatureGroup by the connectedCallback chain, much as is already done +by the connectedCallback (in which case, the collection layer is a +MapTileLayer GridLayer). On the other hand, elements which add themselves +to the map-layer._layer LayerGroup aren't removed unless and until the +element itself is removed - these elements are what is currently +handled by MapLayer._initialize.processFeatures, so this is the first bit related +to MapFeatureLayer to get refactored. + +The implementation in layer.js also defines mutation observers which +watch the light DOM children or shadow root children (depending on presence / absence +of attribute). One of the tasks of mutation observer is to obtain +invoke _addFeatureToMapMLVectors for additions. While it may be a +good architecture to have _addFeatureToMapMLVectors invoked, its behaviour should +be limited to recalculating or ensuring that the .extent is recalculated +the next time it is requested, at least. I think that it's desirable that each + detect any previous sibling elements (in a sequence +of such features) and use / add itself that element's _layer MapFeatureLayer (FeatureGroup) +instance, in a similar (not identical) manner to how adds itself to its previous +sibling's MapTileLayer GridLayer. This behaviour is implemented by +when being added to the shadow root of a element, with the +TemplatedFeaturesOrTilesLayer being the analog of MapLayer in this case. + diff --git a/index.html b/index.html index 18f6bf4a3..09ba68352 100644 --- a/index.html +++ b/index.html @@ -5,39 +5,26 @@ index-map.html - - + + - + @@ -126,48 +49,384 @@ - + + + - - - All cuisines - African - Asian - Cajun - Indian - Italian - Mexican - - - - - - - - - - - - - - - - - - - - All cuisines - African - Asian - Cajun - Indian - Italian - Mexican - - - + + The Prescott + + + -75.7093517 45.4005727 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Property nameProperty value
addr_house379
addr_streePreston Street
amenityrestaurant
buildingretail
nameThe Prescott
websiteThe Prescott
+
+
+ + Banditos + + + -75.689609 45.405803 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Property nameProperty value
addr_house683
addr_streeBank Street
amenityrestaurant
buildingcommercial
nameBanditos
cuisinemexican
+
+
+ + Hareg Cafe & Variety + + + -75.69108408413759 45.407905135087496 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Property nameProperty value
amenityrestaurant
nameHareg Cafe & Variety
addr_streeBank Street
addr_house587
cuisineafrican
+
+
+ + Hung Sum Restaurant + + + -75.71543400037297 45.40819502909854 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Property nameProperty value
amenityrestaurant
nameHung Sum Restaurant
addr_streeSomerset Street West
addr_house939
cuisinechinese
+
+
+ + Phucket Royal + + + -75.70786179432208 45.410746385011166 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Property nameProperty value
amenityrestaurant
namePhucket Royal
addr_streeSomerset Street West
addr_house713
cuisinethai
+
+
+ + Sushi 88 + + + -75.70642921479893 45.41108327733854 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Property nameProperty value
amenityrestaurant
nameSushi 88
addr_streeSomerset Street West
addr_house690 B
cuisinesushi
website +
phone+1-613-233-3288
wheelchairno
addr_postcK1R 6P4
outdoor_seno
takeawayyes
deliveryno
internet_ano
+
+
+ + Big Daddy's + + + -75.6902755031953 45.41868067160079 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Property nameProperty value
amenityrestaurant
nameBig Daddy's
addr_streeCooper Street
addr_house180
cuisineseafood
+
+
+ + India Palace + + + -75.7019048 45.4191548 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Property nameProperty value
addr_house292
addr_streeAlbert Street
amenityrestaurant
buildingyes
nameIndia Palace
cuisineindian
websitehttps://www.indiapalace.ca
phone+1-613-234-5433
+
+
-
+ diff --git a/notes b/notes new file mode 100644 index 000000000..85056c671 --- /dev/null +++ b/notes @@ -0,0 +1,83 @@ +map-tile.js has a function _createOrGetTileLayer which either constructs a new +MapTileLayer or obtains a reference to it from a previous . + +- The map-tile.js has a property called _parentElement which refers to either +the map-link that is responsible for loading the tile, or the map-layer, taking +into account that the tile may be connected in a shadow root. That code is probably +duplicative of similar code in and should be de-duped if possible. + +Could a src/mapml/elementSupport/file.js be used to import common functions to +map-tile, map-feature etc i.e. getMapEl etc.? + +ANYWAY, if map-tile invokes the constructor of MapTileLayer during _createOrGetTileLayer, +it sets the options.pane to parentElement._templatedLayer.getContainer(). If we +want that to work for MapLayer equally, we would want to use MapLayer.getContainer(), +I think (DONE which needs to be implemented). THEN it invokes the (LayerGroup) addLayer(layer) +where layer is set to the constructed MapTileLayer. If the constructor is not +invoked (i.e. the map-tile is not the 1st in a sequence of map-tiles), the code +obtains the reference to the MapTileLayer and invokes addMapTile(this). + +map-feature.js has a similar method called _createOrGetFeatureLayer that seems to be +a new feature of map-feature probably introduced when TemplatedFeaturesOrTilesLayer +was introduced, because again it depends on the templated layer and needs to be +generalized to the other use cases, specifically for use with MapLayer. + +DONE Could "TemplatedFeaturesOrTilesLayerGroup" be renamed to reduce cognitive burden? +- to consider: semantic overlap with TemplatedTileLayer + +MapFeatureLayer and MapTileLayer are intended to work (together) as individual layers +in a LayerGroup. On the one hand, we have TemplatedFeaturesOrTilesLayerGroup as +a parent layer, and on the other we have MapLayer which acts as a parent container +but in an odd way - see StaticTileLayer and how the FeatureLayer is constructed and +used. + +There is a privileged relation between and (Map)FeatureLayer, as well, +which is determined by how the (Map)FeatureLayer is constructed, in contrast to how it +is constructed by MapLayer, as well as how it's constructed during a query. + +An additional complication is that (Map)FeatureLayer uses a custom renderer, and the custom +renderer has some behaviour that is a bit odd for a renderer, at least from an +outside perspective. +IN PROGRESS task -use MapLayer (a LayerGroup) in the same role as +TemplatedFeaturesOrTilesLayerGroup, EXCEPT that a MapLayer can have +, and/or in any order, whereas a +TemplatedFeaturesOrTilesLayerGroup can ONLY have and/or + +- to accomplish above, would have to behave like , in that +it would have to add its own LayerGroup to the parent MapLayer's LayerGroup +(I think it must do this already - CHECK IT). + +Idea: should/could we rename Templated* layers to MapLink* so that they are visually +associated to the element? Currently, there's no "MapLinkLayer", but +these could all potentially be subclasses of MapLinkLayer, tbd, sharing some +common code, perhaps?? map-link.js itself might be that common code, but we should +investigate if there's any behaviour implemented across those layers that could +be consolidated. + +DONE rename MapMLLayer to MapLayer for consistency with the custom element name? + +Could we rename mapml- to map-document, and provide backwards-compatibility to the +old name? + +DONE Rename ExtentLayer to MapExtentLayer + +FeatureLayer is fundamental currently. How to get rid of? We don't: we replace +it with MapFeatureLayer. MapFeatureLayer gets inserted into the MapLayer.layers +(LayerGroup) array (via LayerGroup.addLayer(l)) when the attaches +to the DOM. +- the MapLayer currently has a ._mapmlvectors property, that should be removed, +managed by the inherent LayerGroup-ness of MapLayer. +- also, the MapLayer currently has ._mapmlTileContainer and ._staticTileLayer which +should be removed and managed via the LayerGroup per features + +There is ImageLayer, but no MapImage element. Is this a shortcoming? TBD + + +NOTE: In order to get the staticTileLayer test working specifically the extent test +within that, I changed the .extent getter so that it always runs the +bounds calculation, not relying on pre-existing value of _layer.bounds, which was +turning out incorrect, not sure why. That was an optimization that was perhaps +premature?? + +Layer with only inline tiles never seems to be not disabled/enabled. what gives, +add a test for that. diff --git a/src/layer.js b/src/layer.js index 6c1e3ed11..4f1ecb964 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 { @@ -465,11 +466,10 @@ export class BaseLayerElement extends HTMLElement { 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. + * Features now manage themselves through their connectedCallback and MapFeatureLayer + * architecture. This method primarily handles extent recalculation and other + * child element processing. */ _runMutationObserver(elementsGroup) { const _addFeatureToMapMLVectors = (feature) => { @@ -478,7 +478,8 @@ export class BaseLayerElement extends HTMLElement { // 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); + // Features now manage themselves through connectedCallback and MapFeatureLayer + // This method now only handles extent recalculation }); }; const _addStylesheetLink = (mapLink) => { @@ -647,6 +648,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 +701,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-feature.js b/src/map-feature.js index 338c05769..242d7a43c 100644 --- a/src/map-feature.js +++ b/src/map-feature.js @@ -1,6 +1,6 @@ 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'; @@ -182,7 +182,10 @@ export class HTMLFeatureElement extends HTMLElement { this._parentEl.parentElement?.hasAttribute('data-moving') ) return; - if (this._parentEl.nodeName === 'MAP-LINK') { + if ( + this._parentEl.nodeName === 'MAP-LINK' || + this._parentEl.nodeName === 'MAP-LAYER' + ) { this._createOrGetFeatureLayer(); } // use observer to monitor the changes in mapFeature's subtree @@ -292,65 +295,76 @@ 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 + 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 }), + 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/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/MapFeatureLayer.js b/src/mapml/layers/MapFeatureLayer.js index a37e7b0f1..5d615abd9 100644 --- a/src/mapml/layers/MapFeatureLayer.js +++ b/src/mapml/layers/MapFeatureLayer.js @@ -35,70 +35,101 @@ 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(mapml, options); + + // Set up based on context + this._setupContainer(); + this._setupFeatures(mapml); + }, + + /** + * Determines the context for this MapFeatureLayer based on options + * @param {*} mapml - The mapml data + * @param {Object} options - Layer options + * @returns {string} - 'query', 'tiled', 'static', or 'templated' + */ + _determineContext: function (mapml, 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.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'; + }, + 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 +156,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 +183,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) { @@ -259,7 +290,7 @@ export var MapFeatureLayer = FeatureGroup.extend({ } }, getEvents: function () { - if (this._staticFeature) { + if (this._context === 'static') { return { moveend: this._handleMoveEnd, zoomend: this._handleZoomEnd @@ -322,7 +353,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 +463,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..5d91ceefe 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'; @@ -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/TemplatedFeaturesOrTilesLayer.js b/src/mapml/layers/TemplatedFeaturesOrTilesLayer.js index a71a5aa53..812145971 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'; /** 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.fails b/test.fails new file mode 100644 index 000000000..d40f5f9c6 --- /dev/null +++ b/test.fails @@ -0,0 +1,745 @@ + + + 1) api/events/map-change-event.test.js:72:7 › Map-change event are only fired when layers/extents are checked or unchecked in the layer menu › Map-change event for sub-layers work + + Test timeout of 30000ms exceeded. + + Error: locator.click: Target page, context or browser has been closed + Call log: + - waiting for locator('.mapml-layer-extent').locator('.mapml-layer-item-toggle') + - locator resolved to + - attempting click action + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #1 + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #2 + - waiting 20ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #3 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #4 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #5 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #6 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #7 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #8 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #9 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #10 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #11 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #12 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #13 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #14 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #15 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #16 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #17 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #18 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #19 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #20 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #21 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #22 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #23 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #24 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #25 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #26 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #27 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #28 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #29 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #30 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #31 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #32 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #33 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #34 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #35 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #36 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #37 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #38 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #39 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #40 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #41 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #42 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #43 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #44 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #45 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #46 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #47 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #48 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #49 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #50 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #51 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #52 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #53 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #54 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #55 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #56 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #57 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #58 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is not visible + - retrying click action, attempt #59 + - waiting 500ms + + + 107 | const button = await extentControls.locator('.mapml-layer-item-toggle'); + 108 | await button.click(); + > 109 | await button.click(); + | ^ + 110 | + 111 | expect(extentClicked).toBe(2); + 112 | + + at /home/prushfor/github/MapML.js/test/e2e/api/events/map-change-event.test.js:109:18 + + 2) api/matchMedia/map-bounding-box.test.js:22:7 › matchMedia map-bounding-box tests › matchMedia API detects changes in map-extents + + Error: Timed out 5000ms waiting for expect(locator).toHaveAttribute() + + Locator: locator('map-layer[label="test media query"]') + Expected: have attribute + Received: not have attribute + Call log: + - expect.toHaveAttribute with timeout 5000ms + - waiting for locator('map-layer[label="test media query"]') + - locator resolved to + - unexpected value "false" + - locator resolved to + - unexpected value "false" + - locator resolved to + - unexpected value "false" + - locator resolved to + - unexpected value "false" + - locator resolved to + - unexpected value "false" + - locator resolved to + - unexpected value "false" + - locator resolved to + - unexpected value "false" + - locator resolved to + - unexpected value "false" + - locator resolved to + - unexpected value "false" + + + 35 | await page.waitForTimeout(250); + 36 | await zoomIn.click(); + > 37 | await expect(layer).toHaveAttribute('hidden'); + | ^ + 38 | + 39 | // the layer should be shown as we zoom out again + 40 | await zoomOut.click(); + + at /home/prushfor/github/MapML.js/test/e2e/api/matchMedia/map-bounding-box.test.js:37:25 + + 3) core/featureIndexOverlayResults.test.js:18:7 › Feature Index Overlay results test › Feature index content is correct + + Error: expect(received).toContain(expected) // indexOf + + Expected substring: "1 Vermont" + Received string: "1 New York + , " + + 32 | + 33 | expect(spanCount).toEqual(8); + > 34 | expect(firstFeature).toContain('1 Vermont'); + | ^ + 35 | expect(moreResults).toContain('9 More results'); + 36 | }); + 37 | + + at /home/prushfor/github/MapML.js/test/e2e/core/featureIndexOverlayResults.test.js:34:26 + + 4) core/featureIndexOverlayResults.test.js:38:7 › Feature Index Overlay results test › Feature index more results are correct + + Error: page.$eval: Failed to find element matching selector "div > output.mapml-feature-index > span > span:nth-child(1)" + + 44 | (span) => span.childElementCount + 45 | ); + > 46 | const firstFeature = await page.$eval( + | ^ + 47 | 'div > output.mapml-feature-index > span > span:nth-child(1)', + 48 | (span) => span.innerText + 49 | ); + + at /home/prushfor/github/MapML.js/test/e2e/core/featureIndexOverlayResults.test.js:46:37 + + 5) core/featureIndexOverlayResults.test.js:60:7 › Feature Index Overlay results test › Feature index previous results are correct + + Error: expect(received).toEqual(expected) // deep equality + + Expected: 8 + Received: 0 + + 65 | ); + 66 | + > 67 | expect(spanCount).toEqual(8); + | ^ + 68 | }); + 69 | + 70 | test('Feature index content is correct on moveend', async () => { + + at /home/prushfor/github/MapML.js/test/e2e/core/featureIndexOverlayResults.test.js:67:23 + + 6) core/featureIndexOverlayResults.test.js:70:7 › Feature Index Overlay results test › Feature index content is correct on moveend + + Error: page.$eval: Failed to find element matching selector "div > output.mapml-feature-index > span > span:nth-child(1)" + + 75 | (span) => span.childElementCount + 76 | ); + > 77 | const firstFeature = await page.$eval( + | ^ + 78 | 'div > output.mapml-feature-index > span > span:nth-child(1)', + 79 | (span) => span.innerText + 80 | ); + + at /home/prushfor/github/MapML.js/test/e2e/core/featureIndexOverlayResults.test.js:77:37 + + 7) core/featureIndexOverlayResults.test.js:86:7 › Feature Index Overlay results test › Feature index message for "No features found", reticle still visible + + Error: page.$eval: Failed to find element matching selector ".mapml-feature-index-content > span" + + 96 | (div) => !div.hasAttribute('hidden') + 97 | ); + > 98 | const message = await page.$eval( + | ^ + 99 | '.mapml-feature-index-content > span', + 100 | (message) => message.textContent + 101 | ); + + at /home/prushfor/github/MapML.js/test/e2e/core/featureIndexOverlayResults.test.js:98:32 + + 8) core/featureNavigation.test.js:19:9 › Playwright Keyboard Navigation + Query Layer Tests › Arrow Key Navigable Tests › Tab focuses inline features + + Error: page.evaluateHandle: TypeError: Cannot read properties of null (reading 'getAttribute') + + at eval (eval at evaluate (:234:30), :1:14) + at UtilityScript.evaluate (:236:17) + at UtilityScript. (:1:44) + at eval (/home/prushfor/github/MapML.js/eval at evaluate (:234:30), :1:14) + at UtilityScript.evaluate (/home/prushfor/github/MapML.js/:236:17) + at UtilityScript. (/home/prushfor/github/MapML.js/:1:44) + at /home/prushfor/github/MapML.js/test/e2e/core/featureNavigation.test.js:37:20 + + 9) core/popupTabNavigation.test.js:101:9 › Playwright Keyboard Navigation + Query Layer Tests › Feature Popup Tab Navigation Tests › Shift + Tab to current feature while popup open + + Test timeout of 30000ms exceeded. + + Error: locator.evaluate: Target page, context or browser has been closed + Call log: + - waiting for getByTestId('viewer').getByTestId('big-square') + + + 106 | const viewer = page.getByTestId('viewer'); + 107 | const bigSquare = viewer.getByTestId('big-square'); + > 108 | const bigSquarePathData = await bigSquare.evaluate((f) => { + | ^ + 109 | return f._groupEl.firstElementChild.getAttribute('d'); + 110 | }); + 111 | const bigSquareGroupEl = viewer.locator( + + at /home/prushfor/github/MapML.js/test/e2e/core/popupTabNavigation.test.js:108:49 + + 10) core/popupTabNavigation.test.js:122:9 › Playwright Keyboard Navigation + Query Layer Tests › Feature Popup Tab Navigation Tests › Previous feature button focuses previous feature + + Error: Timed out 5000ms waiting for expect(locator).toBeFocused() + + Locator: getByTestId('viewer').locator('g:has( > path[d="M296 151L447 151L447 302L296 302z"])') + Expected: focused + Received: inactive + Call log: + - expect.toBeFocused with timeout 5000ms + - waiting for getByTestId('viewer').locator('g:has( > path[d="M296 151L447 151L447 302L296 302z"])') + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + + + 141 | 'g:has( > path[d="' + bigSquarePathData + '"])' + 142 | ); + > 143 | await expect(bigSquareGroupEl).toBeFocused(); + | ^ + 144 | const toolTipPane = viewer.locator('.leaflet-tooltip-pane'); + 145 | let tooltipCount = await toolTipPane.evaluate( + 146 | (div) => div.childElementCount + + at /home/prushfor/github/MapML.js/test/e2e/core/popupTabNavigation.test.js:143:38 + + 11) core/popupTabNavigation.test.js:151:9 › Playwright Keyboard Navigation + Query Layer Tests › Feature Popup Tab Navigation Tests › Tooltip appears after pressing esc key + + Error: Timed out 5000ms waiting for expect(locator).toBeFocused() + + Locator: getByTestId('viewer').locator('g:has( > path[d="M330 83L586 83L586 339L330 339z"])') + Expected: focused + Received: inactive + Call log: + - expect.toBeFocused with timeout 5000ms + - waiting for getByTestId('viewer').locator('g:has( > path[d="M330 83L586 83L586 339L330 339z"])') + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + + + 163 | 'g:has( > path[d="' + bigSquarePathData + '"])' + 164 | ); + > 165 | await expect(bigSquareGroupEl).toBeFocused(); + | ^ + 166 | const toolTipPane = viewer.locator('.leaflet-tooltip-pane'); + 167 | let tooltipCount = await toolTipPane.evaluate( + 168 | (div) => div.childElementCount + + at /home/prushfor/github/MapML.js/test/e2e/core/popupTabNavigation.test.js:165:38 + + 12) core/popupTabNavigation.test.js:173:9 › Playwright Keyboard Navigation + Query Layer Tests › Feature Popup Tab Navigation Tests › Tooltip appears after pressing enter on close button + + Error: Timed out 5000ms waiting for expect(locator).toBeFocused() + + Locator: getByTestId('viewer').locator('g:has( > path[d="M330 83L586 83L586 339L330 339z"])') + Expected: focused + Received: inactive + Call log: + - expect.toBeFocused with timeout 5000ms + - waiting for getByTestId('viewer').locator('g:has( > path[d="M330 83L586 83L586 339L330 339z"])') + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + + + 191 | 'g:has( > path[d="' + bigSquarePathData + '"])' + 192 | ); + > 193 | await expect(bigSquareGroupEl).toBeFocused(); + | ^ + 194 | const toolTipPane = viewer.locator('.leaflet-tooltip-pane'); + 195 | let tooltipCount = await toolTipPane.evaluate( + 196 | (div) => div.childElementCount + + at /home/prushfor/github/MapML.js/test/e2e/core/popupTabNavigation.test.js:193:38 + + 13) core/popupTabNavigation.test.js:201:9 › Playwright Keyboard Navigation + Query Layer Tests › Feature Popup Tab Navigation Tests › Next feature button focuses next feature + + Error: Timed out 5000ms waiting for expect(locator).toBeFocused() + + Locator: getByTestId('viewer').locator('g:has( > path[d="M285 373L460 380L468 477L329 459z"])') + Expected: focused + Received: inactive + Call log: + - expect.toBeFocused with timeout 5000ms + - waiting for getByTestId('viewer').locator('g:has( > path[d="M285 373L460 380L468 477L329 459z"])') + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + - locator resolved to + - unexpected value "not focused" + + + 222 | 'g:has( > path[d="' + smallTrapezoidPathData + '"])' + 223 | ); + > 224 | await expect(smallTrapezoidGroupEl).toBeFocused(); + | ^ + 225 | const toolTipPane = viewer.locator('.leaflet-tooltip-pane'); + 226 | let tooltipCount = await toolTipPane.evaluate( + 227 | (div) => div.childElementCount + + at /home/prushfor/github/MapML.js/test/e2e/core/popupTabNavigation.test.js:224:43 + + 14) core/popupTabNavigation.test.js:232:9 › Playwright Keyboard Navigation + Query Layer Tests › Feature Popup Tab Navigation Tests › Focus Controls focuses the first + 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/server.js b/test/server.js index 908875223..6603b4456 100644 --- a/test/server.js +++ b/test/server.js @@ -171,6 +171,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 4057a1dfc2efcccdf0f426e9494c9fd2acb80d47 Mon Sep 17 00:00:00 2001 From: Peter Rushforth Date: Fri, 8 Aug 2025 18:08:06 -0400 Subject: [PATCH 07/21] Replace map-extent way of setting zIndex to use map-extent.position Adapt calculatePosition to working within either shadow root or light DOM Un-break and de-flake tests as possible --- src/map-extent.js | 9 +------ .../layers/calculatePosition.js | 26 ++++++++++++++----- src/mapml/layers/MapExtentLayer.js | 4 +-- src/mapml/layers/MapLayer.js | 2 +- .../map-extent-checked-ordering.test.js | 9 +++---- .../map-extent-in-shadow-root.test.js | 1 + .../elements/map-link/map-link-media.test.js | 1 + test/e2e/layers/multipleExtents.test.js | 8 +++--- 8 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/map-extent.js b/src/map-extent.js index 0d68323d3..ed66e2d8b 100644 --- a/src/map-extent.js +++ b/src/map-extent.js @@ -267,7 +267,6 @@ export class HTMLExtentElement extends HTMLElement { // this._opacity is used to record the current opacity value (with or without updates), // 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; - console.log(this.label + ' extent position: ' + this.position); this._extentLayer = mapExtentLayer({ opacity: this.opacity, crs: M[this.units], @@ -435,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/mapml/elementSupport/layers/calculatePosition.js b/src/mapml/elementSupport/layers/calculatePosition.js index ea89627ba..d8dfb60a1 100644 --- a/src/mapml/elementSupport/layers/calculatePosition.js +++ b/src/mapml/elementSupport/layers/calculatePosition.js @@ -18,15 +18,29 @@ export function calculatePosition(element) { return 0; } - const parent = element.parentElement; + // 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 parent.children) { + 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 @@ -36,14 +50,14 @@ export function calculatePosition(element) { if (child === element) { foundTarget = true; - // map-extent always needs a new position + // 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 position + // If this element continues a sequence of the same type, return the current z-index if (lastTag === childTag) { return position; } @@ -56,13 +70,13 @@ export function calculatePosition(element) { // Before reaching target, count layer group transitions if (!foundTarget) { if (childTag === 'map-extent') { - // Each map-extent increments position + // 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 position 1 + // First valid element starts at z-index 1 position = 1; } diff --git a/src/mapml/layers/MapExtentLayer.js b/src/mapml/layers/MapExtentLayer.js index cbec2622b..bf57a50e2 100644 --- a/src/mapml/layers/MapExtentLayer.js +++ b/src/mapml/layers/MapExtentLayer.js @@ -34,11 +34,9 @@ export var MapExtentLayer = LayerGroup.extend({ // Call LayerGroup's initialize to trigger Leaflet's setup LayerGroup.prototype.initialize.call(this, null, options); this._container = DomUtil.create('div', 'leaflet-layer'); - if (options.zIndex) { - this._container.style.zIndex = options.zIndex; - } 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'); }, diff --git a/src/mapml/layers/MapLayer.js b/src/mapml/layers/MapLayer.js index 5d91ceefe..0fbefba99 100644 --- a/src/mapml/layers/MapLayer.js +++ b/src/mapml/layers/MapLayer.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( 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-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/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'); From 32e34b56c3548b4d44d4903f607251237b1eebb4 Mon Sep 17 00:00:00 2001 From: Peter Rushforth Date: Fri, 8 Aug 2025 18:17:10 -0400 Subject: [PATCH 08/21] Change label of extent to be perhaps less confusing --- test/e2e/layers/mixedLayer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/layers/mixedLayer.html b/test/e2e/layers/mixedLayer.html index 48904b9dd..cfe3024eb 100644 --- a/test/e2e/layers/mixedLayer.html +++ b/test/e2e/layers/mixedLayer.html @@ -94,7 +94,7 @@ - + From ff3eb052aff1cbabc00380159ff85de8e62e86a4 Mon Sep 17 00:00:00 2001 From: Peter Rushforth Date: Sun, 10 Aug 2025 21:09:08 -0400 Subject: [PATCH 09/21] up the timeout for assertion in layerContextMenu.test.js --- test/e2e/core/layerContextMenu.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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') ); From 0cac899a37d5d73151618a555fb5a0d6494baa57 Mon Sep 17 00:00:00 2001 From: Peter Rushforth Date: Tue, 12 Aug 2025 09:33:12 -0400 Subject: [PATCH 10/21] in progress work on map-tile testing --- src/map-tile.js | 19 +- src/mapml/layers/MapTileLayer.js | 52 +- .../map-tile/map-tile-dynamic-updates.test.js | 533 ++++++++++++++++++ .../after-adding-tile-linux.png | Bin 0 -> 19745 bytes .../after-col-change-linux.png | Bin 0 -> 19718 bytes .../after-row-change-linux.png | Bin 0 -> 19718 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-col-change-linux.png | Bin 0 -> 19745 bytes .../before-row-change-linux.png | Bin 0 -> 19745 bytes .../before-src-change-linux.png | Bin 0 -> 19745 bytes .../before-tile-removal-linux.png | Bin 0 -> 19745 bytes test/e2e/elements/map-tile/map-tile-test.html | 49 ++ .../e2e/elements/map-tile/test-immutable.html | 56 ++ .../elements/map-tile/test-immutable.test.js | 105 ++++ .../mixedLayer-zindex-rendering.test.js | 162 ++++++ .../mixedLayer-baseline-linux.png | Bin 0 -> 21714 bytes .../mixedLayer-blue-checked-linux.png | Bin 0 -> 36618 bytes .../mixedLayer-dom-reordered-linux.png | Bin 0 -> 21791 bytes .../mixedLayer-features-baseline-linux.png | Bin 0 -> 21714 bytes .../mixedLayer-hierarchy-validation-linux.png | Bin 0 -> 21714 bytes .../mixedLayer-red-unchecked-linux.png | Bin 0 -> 21791 bytes test/e2e/layers/mixedLayer.html | 7 +- 24 files changed, 973 insertions(+), 10 deletions(-) create mode 100644 test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js 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-col-change-linux.png create mode 100644 test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/after-row-change-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-col-change-linux.png create mode 100644 test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/before-row-change-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-test.html create mode 100644 test/e2e/elements/map-tile/test-immutable.html create mode 100644 test/e2e/elements/map-tile/test-immutable.test.js 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 diff --git a/src/map-tile.js b/src/map-tile.js index e1a490369..ba0fd742f 100644 --- a/src/map-tile.js +++ b/src/map-tile.js @@ -17,6 +17,9 @@ export class HTMLTileElement extends HTMLElement { return +(this.hasAttribute('row') ? this.getAttribute('row') : 0); } set row(val) { + if (this.#hasConnected) { + return; + } var parsedVal = parseInt(val, 10); if (!isNaN(parsedVal)) { this.setAttribute('row', parsedVal); @@ -26,6 +29,9 @@ export class HTMLTileElement extends HTMLElement { return +(this.hasAttribute('col') ? this.getAttribute('col') : 0); } set col(val) { + if (this.#hasConnected) { + return; + } var parsedVal = parseInt(val, 10); if (!isNaN(parsedVal)) { this.setAttribute('col', parsedVal); @@ -58,6 +64,9 @@ export class HTMLTileElement extends HTMLElement { } } set zoom(val) { + if (this.#hasConnected) { + return; + } var parsedVal = parseInt(val, 10); if (!isNaN(parsedVal) && parsedVal >= 0 && parsedVal <= 25) { this.setAttribute('zoom', parsedVal); @@ -170,10 +179,16 @@ 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': + // Prevent changes to row, col, and zoom after initialization + if (oldValue !== newValue) { + this.setAttribute(name, oldValue); + return; + } + break; + case 'src': if (oldValue !== newValue) { // If we've already calculated an extent, recalculate it if (this._extent) { @@ -182,7 +197,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); } diff --git a/src/mapml/layers/MapTileLayer.js b/src/mapml/layers/MapTileLayer.js index a3d2c7fb6..2e05f7ce3 100644 --- a/src/mapml/layers/MapTileLayer.js +++ b/src/mapml/layers/MapTileLayer.js @@ -102,7 +102,9 @@ export var MapTileLayer = GridLayer.extend({ this._mapTiles.push(mapTile); this._addToTileMap(mapTile); this._updateBounds(); - // this.redraw(); + if (this._map) { + this.redraw(); + } } }, @@ -116,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(); + } } }, @@ -271,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/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js b/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js new file mode 100644 index 000000000..fc0bba0b4 --- /dev/null +++ b/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js @@ -0,0 +1,533 @@ +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; + }, {}) + }; + }); + + console.log('Initial debug info:', debugInfo); + 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 + }; + }); + + console.log('Removed tiles info:', removedTiles); + + // 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 + }; + }); + + console.log('Final debug info:', finalDebugInfo); + + // 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('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 row attribute moves tile rendering', async () => { + // Reset by reloading the page + await page.reload(); + await page.waitForTimeout(1000); + + // Find a tile at current zoom level and get its initial state + 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'), + hasDiv: tile._tileDiv !== undefined, + tileKey: `${tile.col}:${tile.row}:${tile.zoom}` + }; + }); + + expect(initialState).toBeTruthy(); + expect(initialState.hasDiv).toBe(true); + + // Take screenshot before change + const beforeScreenshot = await page.screenshot({ fullPage: false }); + expect(beforeScreenshot).toMatchSnapshot('before-row-change.png'); + + // Change the row attribute + const newRow = parseInt(initialState.row) + 5; + await page.evaluate( + (params) => { + const tile = document.querySelector( + `map-tile[zoom="${params.zoom}"][row="${params.row}"][col="${params.col}"]` + ); + tile.setAttribute('row', params.newRow); + }, + { ...initialState, newRow } + ); + + // Wait for update + await page.waitForTimeout(1000); + + // Verify the tile moved + const finalState = await page.evaluate( + (params) => { + const tile = document.querySelector( + `map-tile[zoom="${params.zoom}"][row="${params.newRow}"][col="${params.col}"]` + ); + + return { + tileExists: tile !== null, + hasDiv: tile ? tile._tileDiv !== undefined : false, + newTileKey: tile ? `${tile.col}:${tile.row}:${tile.zoom}` : null, + row: tile ? tile.getAttribute('row') : null + }; + }, + { ...initialState, newRow } + ); + + expect(finalState.tileExists).toBe(true); + expect(finalState.hasDiv).toBe(true); + expect(finalState.row).toBe(newRow.toString()); + expect(finalState.newTileKey).not.toBe(initialState.tileKey); + + // Take screenshot after change + const afterScreenshot = await page.screenshot({ fullPage: false }); + expect(afterScreenshot).toMatchSnapshot('after-row-change.png'); + }); + + test('changing col attribute moves tile rendering', async () => { + // Reset by reloading the page + await page.reload(); + await page.waitForTimeout(1000); + + // Find a tile at current zoom level + 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'), + hasDiv: tile._tileDiv !== undefined + }; + }); + + expect(initialState).toBeTruthy(); + expect(initialState.hasDiv).toBe(true); + + // Take screenshot before change + const beforeScreenshot = await page.screenshot({ fullPage: false }); + expect(beforeScreenshot).toMatchSnapshot('before-col-change.png'); + + // Change the col attribute + const newCol = parseInt(initialState.col) + 5; + await page.evaluate( + (params) => { + const tile = document.querySelector( + `map-tile[zoom="${params.zoom}"][row="${params.row}"][col="${params.col}"]` + ); + tile.setAttribute('col', params.newCol); + }, + { ...initialState, newCol } + ); + + // Wait for update + await page.waitForTimeout(1000); + + // Verify the tile moved + const finalState = await page.evaluate( + (params) => { + const tile = document.querySelector( + `map-tile[zoom="${params.zoom}"][row="${params.row}"][col="${params.newCol}"]` + ); + + return { + tileExists: tile !== null, + hasDiv: tile ? tile._tileDiv !== undefined : false, + col: tile ? tile.getAttribute('col') : null + }; + }, + { ...initialState, newCol } + ); + + expect(finalState.tileExists).toBe(true); + expect(finalState.hasDiv).toBe(true); + expect(finalState.col).toBe(newCol.toString()); + + // Take screenshot after change + const afterScreenshot = await page.screenshot({ fullPage: false }); + expect(afterScreenshot).toMatchSnapshot('after-col-change.png'); + }); + + test('changing zoom attribute moves tile between zoom levels', async () => { + // Reset by reloading the page + await page.reload(); + await page.waitForTimeout(1000); + + // Find a tile at zoom level 2 + const initialState = await page.evaluate(() => { + const tile = document.querySelector('map-tile[zoom="2"]'); + + if (!tile) return null; + + return { + row: tile.getAttribute('row'), + col: tile.getAttribute('col'), + zoom: tile.getAttribute('zoom'), + hasDiv: tile._tileDiv !== undefined + }; + }); + + expect(initialState).toBeTruthy(); + + // Change zoom to level 1 + await page.evaluate((params) => { + const tile = document.querySelector( + `map-tile[zoom="${params.zoom}"][row="${params.row}"][col="${params.col}"]` + ); + tile.setAttribute('zoom', '1'); + }, initialState); + + // Wait for update + await page.waitForTimeout(1000); + + // Verify the tile moved to zoom level 1 + const finalState = await page.evaluate((params) => { + const tile = document.querySelector( + `map-tile[zoom="1"][row="${params.row}"][col="${params.col}"]` + ); + + return { + tileExists: tile !== null, + hasDiv: tile ? tile._tileDiv !== undefined : false, + zoom: tile ? tile.getAttribute('zoom') : null + }; + }, initialState); + + expect(finalState.tileExists).toBe(true); + expect(finalState.zoom).toBe('1'); + + // Note: At zoom level 2, zoom level 1 tiles are typically not rendered + // so hasDiv may be false - this is expected behavior + }); + + 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-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-col-change-linux.png b/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/after-col-change-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..79f7ca6ece81c31e06a6591dd42724afc78f09ae GIT binary patch literal 19718 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�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 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 zD81V!wt~ra8b9_C6eW8xJF+b(zK0;vWDPag6dxvP@Ts_dd9rshrR}}FS<&rrbk2jL zW(NQZ=)g#)jUGL6q$f`&TEWqh78hk>Xg;+hfU;kXaZ;yyo}R?l7zM}Q?FB6gCm-e& zk9d)*!^Pn!BZ{X9HDOAT>5)sr$of5oNELp#Uk-C|Na!{^AwO8ehMORi)fbITLl*{dc>2>GX4WjAf2( z0|2_n;D;_(%F+|U&#?D}(chr`Ea!MR`?FG8lDR&m1Eu_ET`cc0=VxwO+kO;A;oMzY zny{!8!r~<~wmpC%2#S_BPmqv{=$7PYft-%L5F%z@85v zPf&$Hnvqnb5am@TY8%)_>{7rwe6U}R9PKyU+p2rDbT*w~)PBk<%tgmuP zs^d0kD`Lz6=*jC_@Au4QT1zE#zV%K13B%oBu%qbKj+RYj7FL+KWOqIxhQF+ZGviD7 zwytNKr=*EV-6&l(xBeG9B0`$$vFgFb_DbYa%?+aRw=?1%1#iqTJ@7sk{n;$Ihq*8* zSJzVY?Hr@Bc*o&t^QCrM6fR!dj$>5<%8@nw^X-nX2acgX2NYlfJ)LaOT4ld*wplU( z_gIS|ABfgL3LwuTXX_2pHl5Ii`T3~lf3WkeNeble`B7VLhMW768?Ti_h^dBbeb7hl zIqtVHtUtuy6b3dK7q5Jrrz*Q}6ZR&VV1|mvgI97noqRa+`!kD!rSH^^8=IaJ zj6c`xxB)p@z%_n&w2)q|d95yMR)bwOnyzyg>{~|ST-TK^AMVnaTlm=Tb;`NoLubO% zsK=4jc#gqv#Kjdi=05x0i0LE|HhxC0F@*w4=kRsX9zDu~tKfQDH{oKv1mhE$9X}$s zx?xf`M=Jqbhe%7eqS2Enj5f-4nQLcgO^_mE;V56y=>n%&o9AxE+f5=?qr=$XdKS>iMyLY1dZWm=&Hn7wW_Ck*Lgd*l-l!T8_Jjt|kKZgg)L8gr7g z-JV8mULJ62oDC^S;vrsfaV(op`A=Df)yQp2cR*iFEZokungLqu{!Omcl_AD+XZoUB z0>SVLOsJmX#py(Q^PqDw#Jza>`NY_Se%mjAfSYMgt+RfN2Og9aj9VBe;4@F?L2Y3&fjwqZ)KULxGI?#mW8d82_!d_DfD530igLDBltlp>=vmsAkWNbY36KzYW8_Ejear8vObQz45 ze`A?v0?x~TvVdZhzic59S7<=-L?c=LU_GKh{z^O$sJjglHLk;$jgh4}J_`U$MzTgs zD1u{isKU(?HdLO6i*R4I4eQU>o@@*R1(NtpZ(+m6N0q9*T_S(GQok7|Y z?PMsio*#8T8+AB&c>kC~(@UMpm5;7FI!bQ|D);&D2go^dirdv=l^IXJ{%A^QI4pmV zfq%aGsjq_HK`1L;X0FBJBh1;p#k_Nsw5_xb*n`T@D3dxEBdIiFm3@QrNOc3A9qkl9 z2Y3#4T%A%=3fFyj@^fG6l_@P8#&ZXIDX{IRdF?+B-{yS;!^-syu_|vJUYDvgFRf;4 z;22K@-C@rcjMZ-*eA=L62)2r_y$D}(CV$s?n+OSi%`Kw5hZY04G=KGDba|^9R$Ep4 zGyaifgK7N7;b@|>109Z_6r5~h9r*~f=0&|5yj|)EdIz?^=4(l0(3}g}`=-TUZ!nhv z8aNVx{q{U@$}MRlN&^8_zZ#fbQSTdTy7JZ2 zMXHnpTOBvD<^L)>SBuV$2Tkv_aqRcw&$I2H6D%&)v+wf2wGidIZw*%&>Z;@dl53FG z%<8Cow9VzSSm2px*Z%Mr3>8GoQTN|K<5(To;?4AP zE+__+4&h%=rwr4?uGPh<*nNNf{{02m)WO#7T{4ZVFjFY^XdQ*^~&|BW7!_= zBA!emOaOmi^5%jZ*w(=vO7A7$zDDQ1Uc9*c@M7mj35ev#x!&}O{JXQn8vs@PO*$~a z&SK9N6Q#-{M~?=w?n6xt^Js&UL?A2a;xovlYT7L`s%7BCVYgSPbti7w;rgFH7k=4g z+W&l{?`{arw5$bqmpmGrq#3$H?uOCmmQ^~aIvP>O!q-Wc%ru@ev5Qe-E{$d&#ZZSS7?U5DI}&6_4|JFxI^lpQC|IFd*XuFNB zytMI+JJ6FIV4aT6-kF&uT~_;`stIETc(weQ#?#)V!!>(TVx7OAx6z4~O*n+>;JJi%`oNc^CQ>3KFdfcI2j^b0Mr1u)iPgM zJf)pC0mC%my40Mi595nb^`*bmi9rx|9A60_>kx;}QdY^Kt>F6lbNeDJDM;Ah&yN%f zGrQ&LRul`nT9IObk&~(P06kZlvNQ!}CV1r`SPzH6cj{bluA>60m~0RwXJ<@1U|e8M zSm=+;vu`t&iu7iFU5NvghlxPyGJm^MMxiXAC7{w9ya_gHTBXDK!*ICf^eX(bC5p^i z&bnRAhp;e(TFh|uPR)>5crJd~B_TT$bpQnkJOu@?TyowXcK#w%X1+!DDW5Zqu0)y z&wd;D&QM1UcH?r}P~7S-X-Day*RcS!mjl{1pcAD; zp9tcN7eRqE&2iBC>O@z5t5JRFxhB7b9bD#pL?BUX@69E{ zwL;ccBT!)u)alg_rrn@IxC+5h`AB~R>b=4}j{*+t5(uEc93-N{CXRXtpO zEQC3Fnmr{5-7U?gC?L#etqm|;uHEi)cfHP3w?nfWzW& zx~+KPyp{YXZ2{tT*lKr?WIk5ngX8ZsA*<-E#l@})Va8~&iwC2JpJY>vfrkh2W;LRc z8ok>~o_SrCH}(n|>M!mtSC<*8Fd@AfnHUw=)^K-qfT$C z*c2mfddCQBzg|}PXzV04RW%UT{sch_vY`f8t*n74vtTbCOyR;XxeaA|FZYsn{ju&c zUap!0v9lXBS=9-5V$kMy@C=)x+|0SD1tGZ*DyTKe#Ys&cD)HP`G+w_%mpA)kXK|XW z2g!G0kZ0%ml7K=7kwlnuljKqR$oprUNK=#mY_&iB%?@AF;V)tLLBh3{fiHTp>pHeoe<^sZiNf!<1Y&anhAH+W99jYTwR=B zPL|hmM1569?`!1hI+-=eckgkQ06W6wH=M#0{E~i_2K03SPyGuI7arUg9-LH;h<&EeGXqF;D>T3Dd~ySR@hY}KUE%1V5* z#Y4emo?{JL{yHF=WVvrHa}O7|x&oYLbS+-Et_=4ucUSkjNj~0)KP$Y^eQXCTI`Bq; z$k1U@Y#u|8UABaLJ>3;xDrp6~E6-DG$6vrCU3qY0`GG+CCcp#Lb6zYHAA5I`M#~%U zI$=Ln)&{J*8Wtl*uO{#tdY~nnhZ79PS<>gwGNswV@kex5_XR`SbIaCgJd3pg)3QrD ze1)aKvE}axVQTqv$}L|l#PNq;iJsDbA%AZUntd?GpE4l9tmQ6kLYOq9_tikk_}LAu zurTNUA}#g~k&SHimLGojBsNzaQwp4r@bb`Sxw<-k&OUWbn*i<~lEaw|WhF2b!It#p zshr!2a1kG}Rd(S%9Xw_<4oZlE*FWY3qD^i9I9_4Q-m^ zkEJ|Q>@;VQ*i-bGkHZO`y{AQWnGuTRFDr4G(dFb>SmEE`)o^hQ=gJ}x`cz2U8R4Fc z6`wHqb)kf0{ObIPt<@8LdC4PKR2#1M|b2!z* zNiZ|X0fPE7H?BC6Q}i;YTnVzSGJlz4BX;GaqyWBk>KqD6Ylpkmi}Tm_fpC;8k>&35jUnKY7&>Wm5^OX--h;u3_`QYOGIXhBptU}%fwdlI50m{?JoOX3m6t8w_}|Ez%DzIflHoTAUPkioM=hG7T>Ig)VV| zXp_Zs!pjO!5_}N?vB;~oao1qa;Dzs~7CvCtN=7 zB?a?&jyVLx@pkRn>Y2L2BZzT0h1+6<)mkf0)PhV5#0us03IkK`410vEnksFn$fk&} zxQxZZ7>wjAcGnSa{gcbD{U^v-4A;&kD4OSNxiW)vuCDL(n9>VE`tmj*Mlw6e-uI9` zzPz9Lu;oX{s+~=xTB3?4`V5x$jPtWHt&I;oS%$modlRXTS1@zI_wAb|Y68M*|j>KnO&;cD*f|;(1v$&Qz)xsz7C*U}uGS!)}bYqoWoU zypt4uiv7hC`kS@rRv-xd8nLt_!sv3b!o{XoAglH;m0E~yZGMiOmE{ey9C4pVx1#O+ zEc-4pUb7b=bR(y*6cXpD!vc7PXvi<|mK;t;Y)MxPDBln!l?r8%prGjWW=9z`y8vA* z)c>edM0o2jjO68_cR^uesKuW1kgmf9!z`=k>Kd!Zf?pEC z5iEY&CY-`*fXEX#T+* zPA6?ig@%;9XmwNlvD$UKdYU5&ZfFqf8_J>*aU<%Cmru|HiEN5?vT8e1sW~X1QJEOV zxpf^SH3!*h<^*OF&bd`k0B>^-U2MXpm@Qj&F^zfv6;`MqJ;UC7mT@f<{ZI%OdrL5W z%ZS3VTUc;+jWuBmKobAI0eyQ&E}HDARAm`ff!8|>>)`5A{^9~)8B9gZfx9dAiw%6R z27`%`Ih+Xnl1t6f7X9P8nFJih;nYdHNqW6wce>U8eK;smmL<`Xr3;=Dm!ZFzzfNm@ z9f|yaG6U>P|3=;du{~GvafknGvPG*Ewvp{w$-7oeiuvL;dK(|dK}SIC6zMi^(NG3* zbG>l8YCr`r;yD!C$T?K`zYmLv{rhnCgCi&!sCZ-POQ0mZLEG>d1w|O|GSu{6iuG^a ztD?nq#7vf{P~4exTP`DtB2>=zuS&CSLOfCD`w;Ogc)v{=fPwfrV;i+(IwU|p1Vb}sB z39kWZoQe6Zig#CQewQx(22#%h_&S9S*Cr4h_GUUzOBr|9O3k-`YSdrar#l?fY0nN_ z_G0>V6uDD9dV{I+l?pJ7@1q(3Sx$ifGYWKgDsfwyKS4}@-sYObOE@w6(q{lFs~`hE zHVtaSUohxLfIFXwGEj+>gX1)y1Ofc-Z~lA-FdF~?=P0}V5Yz%<%nU0E0YCuX=VwNT zhCD!EXz4Rq0fOe@L6wOp;4kxz3Io3f@=euMwr$4@M?G<}z$qkw}$T|ydw7deU(Y>e~ z4(@=8m{Dvv*-=129k=b_bwG+@}|F5%qK1a0c(Ab#Icy239yOCB2h)k%U+$*=ByL(V|!z9B-vn!mNup zo+zVS;?~V`aQGl$X&wZRJ6!9Jy|LuVAuYf4AGiYKy|uNqNTT_toR12kSz4tdXl#+f z`4-4S;hlg92JoW=qs#|UOiO(hs_@LoKoNpsX`9Miy9<3d1?ksWUu{&UN76HIGqOOu zpwj=uP%!Hv$#uE&A{jNLoQewI_=6;q`bj6g$WXMeXj1u zr=>hWrRfbXN9y$Rxi`+)*bI(>#UP8=8jvG;Z_U3B{1lK)qahZ+h2MW zgrNW%BHWAi^woY)vZH&DnoAY9kvbqqUY$#?1t51C)EJwJzcC zZ~MoNQV6hypnPImScCDhwYerM~33( ziygQwK_uy_(2UH?+TaB;z;2_)gb4zq$wY~Vy6d3VLgHaz$+-;}W+As%2%u{f&`-?w z!m5vVmK2RjGN?bsH6b(Uzzit^(RMw$K*YQS$t?dzz}oQ+?fLVrlTY>3nE^HzO8X8-aXr)!XG*p z&gL;Q)BqxZhxksI__8TLhXOeoawCizbr2XiqD~d~T*!Ms6N$Bu2hyx)#`wLnKbB@$u`=To0kVEuv);v zwE@B4RtzMiR)zqC&4Nd43_2uWlYn-xq#o(ut%ni~(qeB_Zkxas=XP>FFYEig!P zEs6JCnx6!%(E_-n7b9~s@DeEFZ#p5uny(5~8hBP(Yo`-+xMJAqLVD@6h*h03AiI!9 zfdu07>0+N8N1|%zrC|1ou<}QL)3da~_dEv)Jgb+u6sqJha9n@p`Gk)Rh(3_~I~`xY z_8tzi)>+d9JL@d;4zcP3Rb@dBjTHP!<2g+To(JAg$RWQQLS<>8j%X=}CBcl0)QDun3+2l#zg?M>k4fCxW)f*-Y}-0)L`n^{S%3hB)wu-BojyRytbs}33n2wCe@`$oKx4Z7=!_|9D z4pZm95qeAB5uo7&CI4FtSbl%#?6I?g_CAlQqn&7f^kGhu`NWEWKdBNSF4<+47)xwo zLil(ZHShRx7W(iwa6DmLEheljK^5~G0#Fl6c>u4N-)U$hN(_=3@fw6>?es)@x2H`W zZ&n6$B>}T1uIjdwEbY73@9jkCBH`vNcf?fZ+5{Ztd=@hdmpFHU(e{^J^ue48YsAU{ zCxhfpT-{k!I~JL96cP3LuGM%CXnJxrt1IWj7q9U1pnodwD0OW)XCi4)DC_r!kM)NS zI7n-*Zo_H(hKT)^+&q{b*&@EzgblQFn!>j}L3O9jg}Ri~xnN6R3@A{PeuzxHar7Mx z(^$tXW)5*roO35C_|EkCZ{#D)=cXj8@8)26a$%q4faG}G^ThD%13c{VZd~1U%&|Hz zU-DZBo;SdQev6hXDHUpmt#2uT&sW0FsYyqnB2QRhx?{42WU-1D>uY~oi>0`;27jzD zL0Iwd=bfQEVoPlx4FNlEv0}B4c0e?H%rt1uO}n5bCX`ZO7|U1VtzKPd6wM|7bqBU z%e<7y3NN+c5KEuSe+W;U`)ucZ+mD|~&tx6(dkeKDP|kL5@xv5G9%~EH2@V%ftwOsY z>aB7tdk8INnppUwBv!zr^+kH*{e{pT)(LO*!MV64q6QbDro~k!AMk&yBQmE^vh4Vc zI!Wb#*#|F$_ELx#5WgY~p_m^kfbUazhDBJDBGB|@Sc2;JsWXTjYj!-tE+Zis&63!6 zTtDj%UnmP7bK8+u%m)%wsC#)KtQr)9A2ZyaE8glsZHM5sy0MB`qvL~c++xwKSo{5) zK$74C@+V#pzLwC694RSnI|1Pk&4V-aRYEV4+dh_I>2E^)AYcmGRE7)T)(NF2z`}aL zuA>{L3`ThU8XH^lGG`YG_oKO z)HeqgUv4y;Ee56Qact0}b4r)J>0Bdo2B!D1GrUaStXqUU&!nh&+AYPEp_WhBOg2)- ztynaxI_N!uG!hJjPvZ+M)YS+{Ubh2ks!0>dQol57Dw5I;G`9v9b&)1Xy|CDu`i6gv zzJ%Y;bo`IT!PQt8fKe$MvLl5#O@btU?}02LBBn-gbyUU_F0 zj+HtZsb5{ug0*B48KW>g{BtN^>KvmFU;RRcQV9<=7}7^@C2ZJdRXP|g-Qn)mY{>(? zI9vTCw7+cRz--e}Tl4m#KrTxxZnKUp2T{2>brlYti@wg z?fE%#^@B1d&GpH??ft!TR$kRb_@kG{nn!$5_b8kT9NY5`5eg=tFb!4gxj$lJ^@BN; zJjdv*lW*UcE08p+Zgd}{k+5sK-zPJdx5e;1IyWk^VI13Vu}8I3>5hWDv1Zj|RtB%| zk(!7Q=PYx@tFw!BOZWH~ADZ2di;Xaf)cYq*$P2Z->BRZ5?furfZ|wJbZ#kmy9-8<; zNbx!4y|Fau`|0KeV)|>dTR~I})!pM0J5J~)>pigAWX|oM${%s0MnQ#Gr9&z3bzbzF z6LI=<$&gRgV`|JZoR3FLxn!Y0Tmip0ly1jj_%F)47jJd-nRKv2Igd 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 zcmeIaXIxZS(=WOkL>N$DMi51sFpd%=n2<~(h$u=D5S63@ih$%KG|;VpI4Gc^qNFB> zfC?x%2#q>QlAJS0jxDJPoo;RBdEVc9o_p{4a=x4o?|c~Ci@jHZ4PaG*OG=HnZ+8e7(=VPH93jU>kr)KgWBH38@=nv+>*~HCbv|PmvqhlMKNV4a%1-607grhmJ zPUKnoVOlO9$w~G45ta`ve_BBj(Q*q>-d?iy-E)H$yt_`~>1Z4ybWC#L;b@+;wbA7S zhJyvAsq^&kw>o2{A8S#j+GBE-&`BTPhGddY3JfbpISj53idx7MSWQ2oN^aoBOVULA zp6ir~sQMYreINU+*Mc!!HT^inNHc15z^C{a@3?3GE$T&`8^p~7tcv{TdTTLv#v%PLCea5z51 zyOFtEmyvj4ntA$1i3nllk*ToSeIu-A1UUgg1cioguRW3Dj2g(D*gw;C$8N2!;_q`N zlAe37tV>pl?C6);ThDSPsPNrfv2A4MX2C$>CLS1G52@<;hBRl*)Zjv;Xx>`ihuVgt zM^Dh26tN}DyjWHj(=*D&@uzL$2e~k2{Vzy!daHHvsInYqv>^4N=%)GRMwF9e8Yvr{ zLe^1t%%Fy&e$$9uZsaTD{L&qAbW@Stf4_;Bofty*M&OM*k9+^B(dbvVb)#SHJ*c+) zs_s~O6;{VaeW}lEXSQYW#p|+Ro9H-}<8QTMe&73&A#|6L%H&>snQK+*$)s;APd3?> zdR|YfWkM)&^jU0#!ojEyG3;MA`e#6F%a z!HI*!aJbKF#iQFu5UCcja{shgEk?ff<=$A_&V46D2=qm0yAyI7gWNlhF;v(oGaDH4 z#bnIL?aRHLk_qmgb%m^-dJpLEX{O1&mEmumL!#2!Sn4oX)! znvL}kUQbtYKWY2@{<3c-sHZ0XUg_2{ySo2~-(R1$k-))lGG8NDqn zi=eKXI%1p6QCKx?F4{slC1`D64I0a6L7K}io8Z)FKr1L`brcp}3)f^!8~J&AA9rm> zkiDj4Hae^&aNgOL*4tHiqp5-^=s!XVd@tVVE^v(H-1+WuiTjATh4nKlb!xYrSkOv~ z|MJ9Y200nxhH!=Y*&p+ajC!`{9b@sfpKD4o2& zKdOXMNz>*^zc8KpK)!6bQBCsvi}x8cqZfxq8r3Kthwt*}r(fV2siZBa{kXp$K1te) z5=O*h1cn8qC+5h?-os46W2`P4{QQw>k>#a&g>e2~kqTAY>c7F>V*7GSTatn_d41gB%4V;F*_lkiD-c6~?ePRGoe`8l@(`p%FF8qww*t z^cVJkjqzB8vZ>UZ2a-v*f1H&}G|RunhKz->C2;H7P)}3`h6u`dGS{HPKG*X3SzA^> z9&Wi}ZBWgjF=2?Y;K#ttB;glc9&>1f#`rnKpy~A3!NBDP{CuHB#p#{MBXe%|Q9*wy z3D3J-^btLrzfohYznoHu|MB-<5}~m+0gf%Hy6|H4f0DVu6q2`E|M`WFJTB*U*6=UyMwLlfn~%4bCmIGQ z`5vR+b{Q&cs_}7%X79G$6OpN zu4K%+<$gWWn)`x>mCPB!-{+@P!XY zr}nuS$tQVy+q*W1r)bjV+DaDL5c_Dksz`gV47>lHiJ?n&=GqcEFFPEVTyk-7VKCRo z1kjwqf`U-~=L)vLV~_QiYb@qaZs|na{%G|j&;TBZf`S4ouLea_z?PPlI$Uopay6H~ zA5*&3-8{91K^|cm3U9Zv^C}N_SlG^cjFJZ!#qQ#AIif?!CKYNUkVSHmC z@K1_cV9yWB2bVX-$n_Kgi?&8)F`z@{2p{1#W3`JsiluN#&>M#64WQmepdyOSopb%A z%cEkf+g*$dBT{gifzkoIemH;dM!juPz)TjHx$^1P@vddlui;!ME@UH!y_Ny@Prl%v zA%hmdvz9~p)Vs_X3-acN=%9DIbK@m;Go_O?)!dKN65JHX^d+^SjYc>QQy-TbAEZjD zRIZK17*$Rt;ma2C-A6u?=wp(#S1#A8#K>2!|L`mo(Vm){>o0V+&>6xYTHCuh$}r!V zJoR@kEe(D7ZznR;SUwgt80j2;nQ5d%9WCpH63v%r-TY8qkN%^u$e({a&qF9=qIokUK8Ip#uW&AweP1+y|rb` zB>D}iT>Bh)n#_j~cNi0A8$RP!E++8GvVtN~r|8Q~MjS5HWwIe`bq{as7^ZLR!`o6QXe=M4}=szKl5Ykf`nu*{hUgRKKS4U1~Hc4C<%^e zcF#1%sJT}TSr?v9R9!75Gv;Bmu(2OImHH364SsY;@}KxnEs9zw*V6IlW19+rBRueu zTZUm`Z}TTqV~uCF z4kvnReSdjupN2eafV1lgvefh$x1%%fYw^UvKbCMJa4ylK1~z4n_Bz~Ky;CEg(MfVu zh1aP~M9+^f5sR;SxJ{FJAtYHwU|6_LFFb|U^D@u47-)3UP2j|Qe{1)rTfLjVbg5_JL35TB z_nn=%etjSI<>A?hUHCtoz%;b=OOBKIOt{kd^;;Bd)`v(Xv*!r-?kvv8Awq8F5g$Aw zQq4B#1|#Ba61~M*L6bl3T*?^#RU~<8y9E*KgH8Tp`}inFzE%uFvbI2Rnwm=U)AZs`&bU%nZLj}sApkY`QY*8wK( z>@V<0th-)`WY}Ar&nL`?7sASL2=ek#1)KWl(BMEf=F)ojcBk9jW1xt0bv77Yi8;c+ zqDD?u-|55o1mT=Job2`J2hVHSM6_S{kNyI`(&0SwrSf%iCKw>la_fsc?p)U<3@Gy+ z1_qK-yO|Q^GyQi^#TKb?$1IpesuFu}FU8^2=IC2O!`tN}oT)}%&{^!zFXC|zI`{)V zDTMJ6nb-|BtJx5V2Ig56bmH9ODM(iiJDkg3miQ3lSDN3=m>ECaFd zJ1Jg2_(TqUX0J2CVf1yk&C5+!(_5(YkT`~&#{^j@(LR4ea(r# z!Lq+gXGgSfPI(-+!E2ZgS;_IMczY#R^E<~KS-Q?^bc%ClbA0bC93A7mN;TrGfrgc= zgXLOc9)JJZ&=7*3fE)bd?)}rQa0Y0k221L5kr)ERmuE4|M!!na2N~F>ntb=>GT1@L z>W|?!Q*xwoElC+tWjrGW_s|!8ZTQN?lWPv3FS7{_>mOXZ!5VvkF6$1rJIgfi zUtda<{3*Bq)U!E^M&{m+yjqQ0`(f;X zkq4`=VC6%ZCYKI>Dl~HKHSY>aQJU{v8t#=eVl{C1<&-JGc^6*iAJ+F}z8kxUCCWa5 zF{b1qMoXIZJ(s=wn|6sk#ZsFKY=kG*xUzh83PjuAJoHqaj`D|VXnb@UeUSRU+MXx8 z{Y^>DIxiR&;~ySvUuq(XTCFqqKd?$h9h2>i`W9(MuV+TFvMsI6+hAXBKQyFV`V zSA+Cl8x$Em3>g;#lXF?T^Ig7&^9(^KSB+$Bx6Kyv_KWB?fUyxMJfWLyU}70bcw*rw zhc=Z?%omerv&bvbmeR_|RSl@QgFL{B2`K8Cm1D+JpNjKgBq9{s9}- zjG_rS`|s$efC-HqEjbpYHd-R$w3<)b80D`nw=Moyofh>rc$d|S^Amg zQ#jPr$ZXcTk#P7;R(9&KU(L^o{K!sJ3x2;;bcn>Xl{n=gz3>5Ba{AEP_p*(@MVmg} zTFgEX_4vfrNzH`SThJK&5*b0BoishA$V>;?PKi?z!UM;D#N-dMN_7lpE3hSvvz@)X zr{AFaXqLGIF*QW=Q%zBCr*CdwNx`Yf%U4UZ=Q6JF-#@-}tgNncDD#3yAEy_g3bFs3 z3p~7H>vHIe<<(OC$D(}YQ2slme{IHe_4zGK)NI*g2Cr5xI>3&L=>RD#ipJXJWT3br`|J6RJ^XK}|cSC#a_j5FCpxG$LI zk6JVFT}N$+v+6X;q^=L*B(oECQ|K81L0WTd(F+m!QGk)>cn&_dA1(b&jByZ_|3LTxH>%!qAWU*NUG)XGb$Imc*`H zTXF_fP3o9ifScmIW3ojdCY;kf8>LT0gk55GOjnLKl}C3qJoh}J5chlhA%dh|SZZ^C--&ZV2E+{UxSby~V`Evjy_&)=r@J8*$_EyZEyCMZc zp>SRw8Jf#iVX@d+1;#BV78gt(2^R}q9|`w!p&9V9%g5FWCaFm8@?VHn`nm6#@_Z}{-(K2=1p?lR2)-BU-?@y|WIy>awB zm%buyvDTiRmvi)lIj+QGs&FY@|L3Kw3*&6+u;o$_+FTHSoin_5JUIuyP}pSy%hDf9 zt2N%Q;!6HYy+Q~<@=&prma0sDfJh*4@v9K$M?$GpFmq!vW(Xo0p#0G3B~!RXh8?hzc>uA#t+zZUSsz#)sro(ix&)OqDIo^HKO!__YuC=4TruRaDlkbh_mL% zyq^{-n*ph+tYr4FCsa!bbnco0!v)P4&(k!l0Q$%)BU@$Cg^Lub7{U3cvX9-Ps%=BR z%HC;3Oq(jC#y_ds=sn}hCu{3X6lo3)KM&?4Gwa{?ebG{saI^!`SErUL72B}pqpJ1V zk^BX{rrHg`wsT9IN)cc*jr+9+o?>j0>M305QlV0E@oCOFoHbJO#WLu0g|kYKSZyg? z*2>>&^OQc)}=s*;H?qZv6sBS_=6_rKj~gAq$|Ol zB7k1N(%kSrfdg3ONxXJ=vg!5vZf|x6zA0QD{!D>@G+JzE>JF^KT-TBa2eb&$OP4wx zoBI4hR<^Woi$LT}naG=l!2vj@Z{&*d*-i=8T=27^*O}>N1ypCXORuLLzes`@%q+$q zT&?K56Q7n@Dp2@5wevL^cQ{A%#$60vY19;L?KBG`jhSD8paNo$i!_5NWO{No6N_$5 z#Q)1BDEJWq7ufRmeNoZ+*Gg~(CTL(Gb;?AlyJ%>^n|M4w-ZdLlh>oN8+4_C{aECZ6 zYSa@PpL(Op>@^KEq$&}4^RsPlb)pBr?;@1o0nhHXll2>~*{rB2(h1Mb5je+{Z${_!bWZ?Cm?cS@TP{b^h>OKLdRHeATNvR7--U z4T9Xu`j@W&=)aR{93}{U{_wQQm~YH#FK6%mwSZYLbQ*QH@1=ng8E((>^Ugf219VFD zeGu86$NkQs_q@$ld)@5N#p_)BHv!-?uv}V9ooJEhVY3=$d&hqK5jB20tg))utc=H7 zBxC%2pR!@C)&)JzOvQPn22`amp!R-U4a)E6HHoWxT8K7k+e(Hty8pU1bDm}(2)lBX zOQxSqBzJvyzED&@{f81gqsE(9))H)rdJ22qMR5OIS{u4Zdwf_xRSSEQoOJ+{U`JgQ z$8BJZF2+7Sd`eZzz>zGyr5ib=tawhv=#LX|&Z2%DP>;l6lF9Qk!Kw;~o0o+I$@(a^RX?jZQ z=g;j;XE#fv#!H~vdO${F=Wo*vw#_oF!N>H_xi*UzAx-PWertqq2#jqT0g+*>4UuUE z8bz~Fq8gid_42d94SCn=b3QKBEf{^~@8-QI*z0y0l`-RO0YU-4VKJ(aNon)>a}cEg z8r*`t2)Vue>V6CT3th(*6<2TncJDN2CI`vpB6_JY-t&0#_6T_^2O3{S*FSewm*e(C zq-1;WA7(MUhmZRPH*%tDGJ>$=-zgU&+bt@|QB`ZaV2F+? zL%@A%!Bjg?gxXxOb3x}ss#8R&u^u1OyuLc(a%o)nURLjDDjZ1_?(~``EzgYSw~y_w zJ7Vif`VY@OkLx0{hqn{QAw7hufIPRm#1w*0W$eC#Ui8Mq2ilxd1~fTdn41yoqp>T=FJ{QZ3Ifk)(z#w?9OG%X+^QE1Yn-O|(3TZ@OQwXMCq-RDDET3WUC z<@)Dxvx|SUS3`I_cSOaeXuUH*QD;6@L;4ns7m*dm0bcW1EFhMt)dosKfy?OiEAQHq zH$Io&w7@!hGg;jSrt=8`E8@pIp5tMb{55l=1z32p@|#kQ+dzp}7Q4>VuE)jWt<>SV zqptj6F7lh;OvV12nnfYwCEtv7LGz6HTatWLZ1U{Sa*aHxaQh2P^k~WcC_nEU<@re; zv1>*&Tf9|!r+}hfih#=1k}}VtV*AEH-ooekRVyst|JtfqO+e~S!!&a1+bWY)4jpSp zcW2B-(eKVdPHKU|&5(Ph1~*tc&||pNu={F2-S{b$Sht8PHP_8NH(rD3(89dtQ;CAd;x_*l79o$8#pAVCvoaOLtgZ^Y|rHH3PQk&hPe&# z?q?#y+er>e*%1l!%wMVAW$(Oy`}NH^bo`V&>*O?kZ2|q34kIgz|AzvwS&0o^3g03p^E$UC%kYH2pW-tHA3CV_kLsCvLUkPJwVeTsd^}9nY??n`8`R!A5YL^HXIT}n~x3KZQ4xz%hr~lwb|M~g(+H7#O0_Hwc zpK$HJ4KCFjFgykZ1{I_faNaNHPec>wqm7Abw7|bmrs&0yw9?Y0puJa1K)uA%wjXhs znW>WCmRJ}(>D(2PrbM5a)64n*7yUlBj~?LbGKO3LF^;wJtorzP~t9yDBFq2lI#=Ro)<<3s87@V)%C_>*z$ypiLl-)ByMv z^}FfjCZ-YKy*jve2kO5at$S>@3oN#1=YGEEiEla z=oYse9bc;ZFQLI1J>%{*)DS#;GpAk!`t`_z`!M_nyDD@uFC{I_uI;tKY*#KNc)SK2 z-iLcyN=}|k1e>pAE>&g!1$Y(rp6juZ5H--AQT&_mQECe%5Lq>X-yv@E#!m`w`>wf^Y@!ztnp;fhiGiEP?4P?-WADP0tUG*3Zdc7nq3 z?3PuYN)8d$;J=B0dCcT~3m7+I%=OPalhI@J?}w|u$_l%IvikLVRKtABZB>BZ?a6oW zv+f7p42?e^(h-eLgtY^QH_$IzYyS+4O?#x{u1LRXAisgp(P;Dl+AAZNxlE#zl{j_0 zd7w~PvUb*XaIJDJF?e%&v^qMs>uO3JYA#&`uD(gm&UTpt3k%zQ?8bQkT@6>cXZkS* z4dRYFwq}~7mAOqgIXlPW2+ZC>XTQ1bMc{SUZnqb?^l5YLKmG892A=v<+O#vrn)dxz z(@O9(2hVPAU*FCNmy^2ai8++297X$ht@glJ`o`xd#ce%zBXnV{_P14c}h>V1Fh z3yHas5fv4sX&V3>EohCalhaJ__2}P@0%pM(Q2uj!X%j1ihb*T3etHigC2UE|x(jhL z^t<8}PTl%X)Z)2*x+7=_Y#&Qf3>W;-QPuGvY~ST;f;T~t{y)=!Wbf+g29WwWB6Lur z`f2yo|ILeH=yKPd<-2Nr_|z@ye9JY_*7(68B!ZcZ2l{ zmMDX2biXmtKV)#%`1c0pE>%PaRVlbGmdpCTGuKXWCZj&_BRu!v@^LrMeg}N*P~R(= zC7~UlVN(W}gJV}mNE)@DER%WBeHItE>ZwLEQr`1~iK?xKRMm=vQa&q`w<;Mu3pUbK zy0Nq{0u{QgL2vMb93{;W$7sdk{1t-gFfPX{M989LhQxc`PnS011Iy(oDOsxc*_1TK z+<5_w-q26(Lq>toC4MgSQI?~`JwlykG*zX0kQEk?4-mRk)eC-3Y)K6|A!UK#KcyS< ziW&Lh7lCL^eL)f4a$)jW3*N)2s1F5hh4Fkq8(~Yt;Ocz-jKlwV^4;%fl=&OCJM$%D z&4{ycE9iZ|W_9WYi@o)Z7ivSmUujg~VVQltd&wX5alJE;$(KEZ@xY@S`{8lruokB1 zSK0DFzmV~(!|ICz7^Jzc%97ZyKfmTPPA83hG6YUkb4G;kolZ>N*Ew?87|s%=Ow`C) z*>e>u-u9h&$l>I>EkEzKkW1Unan@|(VeKICCRn51Ebbj!;-MR?jvrq2C{mqF2su=B z;%@p&w~R8``_JSmu>iIm*TO*8u%JS5)@2leG5b@hTx%9_w4>S@Es;=MQ!8w{eAVu4 zb-(AcoF22bAmmN6mfbLZgDl-tlA4RUWqV z$R2`5Eny3e3{fo6eeX?N`B~dVqGyB~i6TUaJ#{k88ZZ9pBwcrF(_zk{kpG^zlS1&N zVnPpry_T@Wn&_N(DpxfT=Qz4AOOoWapTQzL5Z(z~%q}m%SNe)52D7|C5buzi^!%rjbTEYP8c$**T zmxC{{FBlom>0PMbWGrXi&Cz?lfEhS3JyM>DBdI{#WSVG4l;bi}+s!%tjdW_1FE$a1Y$(i}{ zyyrC*yusRgfMt$~zx~Xr-<=ai*&HONi|enQK4ox&Wp5ut<+w9Ei~yi{IC{=A6R*hK zO=sT$qSdTnHKX%aH19J{#y4X&9jGL?r6C-;W}RHD1?$dPIKXy` z-7riRAAhd$6E_;CtePxaCu4W0i089JVptfo$;UL>j_5=Dbd=V#YeP&H?d$YR8P`QW zRV~n!uYa&m_$xVS#tgb|m&|9~eZ=|)WVuL2g~+EHOyT&0r6I6U0s1TD1FA8RC=baD z;zMpi=$8^RK|9`a-1*LYaGr^BX4{>re!rxu<#vPhRf1KqHK~^OupB8v&i6n0wi?<` z+Ht#I6WVr^rpGKtf$^EFYnDWwZp;#6VGoMZ5I3F25c0;JlD6<7c$o(ze` z$k*J}y1`mG3vx?N5+-w9JP9+r!TJOA1(|uh$WdbCKZERMUVD!=I7tX{C|C2ay<{8{ z-|F;?E~as|Kv@iXPZd4ynIQ!N!*uKp#}TpZTeME+1vBDuJJ61M+0ggn^er%rdcejx zpvDDplJtT8U(O;LFBr!}V9x=h{l=Cst?MBNQDwQ z6V37@UaPwR9HtJ+VM?QFXlTkq?A<8~K*-3z%3cZ5Yxpk0>dSrGT( z55MZc?L;Se_&AWnku!*6cbCA{91p(bC}Co&KI2|Rz}c$0dc6c$%Q}s%nj@V@Sl^1AQDNn!7xBSdXrtYkF26h{;*~^ymibRRVmk6}DtdbnXJN*P@%(h>y?2}@$%(F|tll4!^9rRyw}{fICoHyp0!rAfp}+mDAyQQ9 z%cbS#zoS~soyl)WJT#PZeOag!g$Rw4*{o{E2IojypGp~H76=h;RHJ|KnD5wjKqm7w z!MDg-{?BN|J2e`x_T*u1Ga_fg4`4L6I8k6U!(#AQq7~fah?G8N!RrbRd=i?~x*n&v z!`2jlaK*K zP!q!kX+1}h{$<>rVn6dE6NeEXK!BUadq_8aoWA-0o>Npyd&-*4AyY<1!oo zJM^6dUafx}iRW-6(04LR}Hp)P^F z;R$Z{0N`iscc>yAXp6DnUI3#L8Is<}zm9LK4bfB+{1>GCKB|m@>1Bw+pHxyaCQ}tv z^%;FI56yG96!tAF0WptlWlJdSA!u_Zqu4Q+v`8=yTQ1hWEY1wK`)dc(xsyOuE;G?v za9HH~e|dJsrqVK1r7zJ5{L93(ULbm%Kqp{^A_vL57fgs=;9mhLwDqhhY)kY42WxD) z!q^8Duut1CTLP_zkh-Rp_bciK5>=h;!49KyY!0C--IN8V%3{>-&Vqa{Ixj8O);!-_ z<0x6{R~pJ^X|!M>&N8=1GY!Sph>&lmvx!v%JrYgIi0mM;S!L>o;oC6WhD^MzG{~%7 zuY$+@6S}12_hYs&$D7GzyRYW6RUa`2^u9FSc0V?KJ+9dIoZHRoUhp7B=MnZ&5Z9w`{kZS;B*S2$~TjC54s^3 zdlS(+7IhbAk}skyT;9a~M=S}{xH)AXL|Xs^6@eC1=1y-m(Uuq9#PcyMG-yPeGU}j( zEaOdl_=NRl>#J9BXiJ1Q@%v*I>V_juDNbn1j5l$|W7ZqApEo)8GEN?)iD_cR%f|@o z=qhI37-CKw$i`yD8G+cs{VZ@tOa!^#C*qt9IL{p0fJ}Z^*p++WW-@0Xr$urjcWbFK z_sr3jvz%x4ZRASAJ6G55p^Kkws*V?3vi%2wcD#>{ZxTSLIdQjxL{~yh`C$8cy7 z$aMDO&*@6f(H8p_wO@<{;@q}c~4*Th=F z*16L$b_DSoNnn#*$8cfjQa-)OMB>38<2B}7BB9p+_>@*KCsRYtOz90HlweNwWJmis z-;8lO#XN=v%9+i{Mj?>(Y^bW$;Yi+#+Agy{-C^Fi25;hj19rLJ_YgLxAv9*(cnTA0 zChPM+%f%_=->&eAU2`=O6RcY0zMj05tsEeyjF?#5FDx0mT5WF;ox7LgcC-_7%9h zbtg(l{r87U+a9Fc2AIeq*Jhxnr-wCgI#SrDMk4&77>@bO!sc?Bw_~YQl9HPZ9*_5& z&9N?r^wtjm#fZ9BVbFYd;G`)IQnB>_fo!1o3uIGj+WrYp^06D=Z@NCWpFzojqjd#; zrCiFhuZ>h1MBy(c<%He0hv(!=?MFU`ks-TQ{^QTj04NN(f7uCS<~i2^NbZcSTuHAM zBhVAP8aMuy)I8$Uo;ld`K8Qx0%_TEu-sYkixg-V1ly*q)>Abw_;Q7pNeRm^39kfnM zSMB%;{3sBsC;>k91Hd6$K=`1P!Z1oVx1Ajf8S&u-;@*fYuuZ*m_6K#oPcKqfP`3rp z6`-33e4g5+0)V!j+uhoF)PHF#2-1?*jX1VQ)VRWgI5IX@2XaMJ zJjd?;x?fmHDsvYsA(NZq#VwGMkbL=E9$=e3D=z*t;BwmhuNh--qwrVBx)TqFA@nLexEV&ripV{!bSS9y|du4r)q z3Rkr;Ny54G7A#o6a@*vS1yD0+7A99^uYTlF+)i#=|de}w+*X6Iu~sdc$tD!;}GabT>n)|5sMKBNTnK5LRE&!pC~Mrao8 ze||^y!Xe^9cB7P1s0@vR>kau%&2GlJ)DzV2360_A;f9@hz%y-2S)<|yjS|ghv zk1t>R2F0}32h)dCJU>|yHkV033*Ym}w2niTI?F|JmSlV_nckp6V)S5f@q~3t*RoB$ z+ArmQ@rtUY?Y7%~CL2veg6xlR&(i#@|JEqALBbjr5Te;zNNxJcqSUgwe&q??3?X@2 zFVltw{pS9v#wxo^h}i})r&tax*0@S9<`F{WQqQ=BwNJ5oG7vjOS^$cj{I+L%d5o2cB73uhI(1=1SyL_f@B zIVidHd-pnMGT+8i0v%W5Lilhi1x>-JyWMssCzUz5wEB#8c@Id;q^FE>AZH38_h&C> zW1u6gccJU!Iz6tKJU`{5rsVTfEn`k?6+q>_f*XvnEYn`ShrzC2&PjxxZF~LhQmN;B zy#lM}A*0A=p}Y4((Abp8{_2OlOLebrTD9Bde=8i??5fD1Ecdjrs4eNyIC5ZzKY=j# z{TScJl~h6rvk$l4>sP5#d3}x+Z5y~bO{lOlE8R_rdShAUJq?)a5y&0@4# zU3n*^U%f2oyX7QyquPQbrsDWLp(VVj+qw5xyhUNOSl+2sJ zWcD-#Q!6MzZWLBpMs=F+0?fI^B-Vr-vA>X56kiy1v+qL?UgQV=XMmI~^$H?|Rh(!= z*zx!HwuPv9wbKtpQ2DOrzN3_R(u!R6pN^6Z?^>Jcd+$0>O!nz`tk)zqpz5^o_ALly zf1m1)#%yfgx%3OBmThmbeLs}t6`%R~dOwVcQ@zV(#RtjrD9)|sI|sS`0hBwJWuE;5 zbiXo5JMA;{y`!`91XNc5N3ziUVRSs!c409S%zPOC>4$rcKxz&UE$^($sV^OprWvh( z>rc(C$hDm@Z-V+ZlyRJ!17bpD`c+Kj(zD$2Nnlhv39L1O?T0_Vf_7+gp(yhayKhi7 zk=Wnf+bdkX2#NYF&bbwxi*RvPbYvk$eQv#CB*th$F)M@rvsY8j3r#yR&dhy}j+}vxO zuy?Du1O}9+$;HyTF9*Tp2EvO>o%#a3Ly1Ls#{89Cl7?chE55HY8#BX{6xp zA;@2*ZGpb%LJ4A>-QTN+b)P!f#rUbGSHZ%r4Kc{|&{b1X0BsD^DxdnB78}{^Po_gk^kV z_|x5>4Fe9;ibBX6D=uCu$upAy5&*6bM+R;KvTMz)THi%%81=dVqX;avmzNjtV4esa z>l(O^o|390jf@Hp%iGxIDf47RfK39!}igC^mS9v zl$#FMxaY?DXmqqr;4~lEr#YU_f6X?*y)mP4u;s(D3q^f1pvl?EDXLGOM5i^;mvJ_WOTDpt%5%xfWO_Q3Jkr5BKz@EU8PZ~s;a3{`n{A0!9!?m9r!=$rA@ZXaofsC4T=gK($Jvt1h^EG z1cawz$oGO8Bq8mRu_x!ynxX-yl!Kz2rppeAg^+kxuRvD++v9#(x8V^4kyx?1T3Y{K z2@g0v&GA8{Fn&$X1>3cfN@*EvS=V=9om0n3hB8iMPf7V13LkO3&{x9$`CDRcP7hU| zE2XeqJ*a(fe_XHcbHD6CYK9A1EIBWiM%}BDrQ$T$Tk6vBJXUqIYmHB&rCrr-Mf03e z_6~`;W1bhzWo@L-&r-!ST&7)jeKFMp3B}(c!_GUMVa6QD^_}k(toFz|v` z9+O5HnzSQ<8)OtTV@lra$bG^dLIL&|DjajIrEQpxa<_KQ(h@lO>O42-vSh zsD4yHh%1@3^391J8;d&$b3u$leM%qm7(4ZH=Vkq5@jgD$KOQEkB%}Y@r^W+oQoW?!BG~c$? zW1Ub`JfOG=44xG*=v*UE|2fkV3?+Q-YXfLyD_ zK4&{~Bnfg;(Siu@@&X`772od-Z0u&hFeku2U(mk`Ab07#c<4_B){+9`sRVM3n1%-( zmZ?6AY3%#}Ae^~Hn00at`*qBo*J)9zPBZOUKr$*+91lGV5~2jJm4^g9p#)Lz;Ub=A zxJK#@<*3P-B}I-b42LUeV4wZqrw{2MS}8qjJ09((;D=~WY|%EOhj)*~SVYZ)n zY|olBe|zzOP_*)o`A6nyT} zzLY<=F%$VKBK}3->R_^;$#*MAE3DdaQfFz1@x4RA4XjN!FxW8z;)66J+yHs+c=Gx@F{g9<5St&qQ6bx&}uWI9GYF;?iC2obhwHK zeEUQfL{`_+!!6w^6fa*mbb042#7f)}@07=>S1Q@J3LJan2;=XYs87hnXU&f*?=j($ z;5I4o>Zqs{lq3audj39?BbZV?OW^t0ntl!~p5*^5ossawDki~PIrKf9fqUD7N01tX z-vjC;DQ&4M*)r>wPpD%)%Q4% zu-e@Pj%{$q&I&)=gNWk=uC^Yb!`SHNpIY7k!;+jAcd zsxjD-xPHiz802R<$uR17v7G0rJ0(ISUdxylbLx9SYt9>z|mj9b{S?;Z#HVOQnS7_iG%;qk}C;hWktZozi<@O~OPnOL^r(CHMOCo*039kk4uy zH5#St{j^?9O+jU5j;uZw%KsU%B`cxM*9Nl8*)_k!lIi1UE$;?{lTfnyamd!h$py{z zg+#!c8#EhRwg5=RkqBKJt?pXdi9udP$yISY``kmoqBMKT3MhH%>#bbh*ItzJxwmV! z*zntst{-dd+k>u?y!nW&eb_FMPdz&BlL_VR1^%Af*&)cqAfP zm$qXN;kwl?6)V#w-*^h%#9g*+H=S=7I?Omw{^0DkGBxIm-?o(zqd2xAA4X zecPpNmM8bI7r!seTjYDS$mfLp^!u}Ic!_8H#_gv*?3BKxh?iRseq8dQwtAtm>5D*Y zX~SW!2!EAh4&O#bVn~{V^^VwR3duFR)Y5KEY!$yU)u@5lfgGP7q+)(jtuxD6#p5lB z_(q*J-SP#m#xJTO7WXtCDs}}@C#MH&DMO5nS<9}$jg^XMT)-N2-cl^^_AKMbw`e26 z26K9pl0=8x(jiU8=-LO%<=%vHmv{cuv1OiB9>n;@_L8sPC%uFS2On81{1(ajGIE&L zP9*lLDt5GIdSvBr5|%e3+#`VQ{BX3l#Tot%LY!T^SHp+w(kQjb7n7Zo5TnY&>^qQc zm$w}n`)zWRHGDdODV(&+4L(>D?6k~r5{>zXt-(cm)JKT+#C&<&4+ z-HkSz0~42K$6+Rq4iFE$8h9Y@$@=MJ{cRC9ncy5X>b-EqOKH-zVIZz6y6;4;n*%wT z=I8a!huTVsn-M~Wb=j0ZjaE+jFaBZm?ZS_7`PFrn-}a^t*vU{<&$laf@uM377On7J zAlv#(dAlFWjkvwCH|N_rNzb`aaq`5Z@A)4d^q?YwzAZvzE#{dguhAGG3#z8Frg&L@4mvVAc&j_`5rZO{^C#WE=d$;x9kA5Ro(d;HDsdz^w$V z-8M9}>ld~?2twQj+lXl0Mc^CplPFI4Nc?|Z{~yWxj}rXP@%X>R5{xLA5*~=v{cQ|p Q3_;H78lKA0zIyln0qSNn)c^nh literal 0 HcmV?d00001 diff --git a/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/before-col-change-linux.png b/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/before-col-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-row-change-linux.png b/test/e2e/elements/map-tile/map-tile-dynamic-updates.test.js-snapshots/before-row-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-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-test.html b/test/e2e/elements/map-tile/map-tile-test.html new file mode 100644 index 000000000..4c024848c --- /dev/null +++ b/test/e2e/elements/map-tile/map-tile-test.html @@ -0,0 +1,49 @@ + + + + + map-tile-test.html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/e2e/elements/map-tile/test-immutable.html b/test/e2e/elements/map-tile/test-immutable.html new file mode 100644 index 000000000..a93e77efa --- /dev/null +++ b/test/e2e/elements/map-tile/test-immutable.html @@ -0,0 +1,56 @@ + + + + Test Map Tile Immutable Attributes + + + + + + + + + + + + \ No newline at end of file diff --git a/test/e2e/elements/map-tile/test-immutable.test.js b/test/e2e/elements/map-tile/test-immutable.test.js new file mode 100644 index 000000000..8f47a2c69 --- /dev/null +++ b/test/e2e/elements/map-tile/test-immutable.test.js @@ -0,0 +1,105 @@ +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(); + }); +}); \ No newline at end of file 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..06ef01671 --- /dev/null +++ b/test/e2e/layers/mixedLayer-zindex-rendering.test.js @@ -0,0 +1,162 @@ +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 () => { + // Take baseline screenshot showing red tiles on top with blue feature visible + const screenshot = await page.screenshot({ fullPage: false }); + expect(screenshot).toMatchSnapshot('mixedLayer-baseline.png'); + + // 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; + } + }); + + // Take screenshot showing green tiles are now visible + const screenshot = await page.screenshot({ fullPage: false }); + expect(screenshot).toMatchSnapshot('mixedLayer-red-unchecked.png'); + + // 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; + } + }); + + // Take screenshot showing blue extent covering everything + const screenshot = await page.screenshot({ fullPage: false }); + expect(screenshot).toMatchSnapshot('mixedLayer-blue-checked.png'); + + // 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 + ); + } + }); + + // Take screenshot to validate the DOM order change effect + const screenshot = await page.screenshot({ fullPage: false }); + expect(screenshot).toMatchSnapshot('mixedLayer-dom-reordered.png'); + }); + + 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); + + // Take screenshot to validate feature visibility and positioning + const screenshot = await page.screenshot({ fullPage: false }); + expect(screenshot).toMatchSnapshot('mixedLayer-features-baseline.png'); + }); + + 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); + + // Take a screenshot to validate the final hierarchy + const screenshot = await page.screenshot({ fullPage: false }); + expect(screenshot).toMatchSnapshot('mixedLayer-hierarchy-validation.png'); + }); + + 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..a1f01131e95fb53f607f72078fc74131edb06166 GIT binary patch literal 21714 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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..082d1154472842acf6fbe0c97729de57b4192b47 GIT binary patch literal 36618 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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..a1f01131e95fb53f607f72078fc74131edb06166 GIT binary patch literal 21714 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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..fb6b7026767ec84db50df7d5bca31b9f7b1dedd3 GIT binary patch literal 21791 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 + + + + + + + + + + + + + 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-tile/map-tile-test.html b/test/e2e/elements/map-tile/map-tile-test.html index 4c024848c..63bcaa005 100644 --- a/test/e2e/elements/map-tile/map-tile-test.html +++ b/test/e2e/elements/map-tile/map-tile-test.html @@ -14,7 +14,7 @@ - + @@ -46,4 +46,4 @@ - \ No newline at end of file + diff --git a/test/e2e/elements/map-tile/map-tile.test.js b/test/e2e/elements/map-tile/map-tile.test.js index 25d1f8e2e..3a9a366e9 100644 --- a/test/e2e/elements/map-tile/map-tile.test.js +++ b/test/e2e/elements/map-tile/map-tile.test.js @@ -110,6 +110,32 @@ test.describe('Map Tile Dynamic Updates Tests', () => { 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();