From a8ff66cf730ab3ce700870f10682a4662b1db13a Mon Sep 17 00:00:00 2001 From: Peter Rushforth Date: Fri, 13 Dec 2024 15:48:30 -0500 Subject: [PATCH] Add media attribute to map-layer, map-link, map-style Remove prefers-map-content hardcoded demo hack Add implementation of _changeHandler that invokes _onAdd, _onRemove. Add media query matches to map-layer._validateDisabled Re-organize _onRemove so that stuff isn't deleted until it's no longer needed, Make call to registerMediaQuery(mq) conditional on there being a mq, make it the path through which a layer gets initialized only when that is true, so as to not perform _onAdd twice. Move detection of media query matches check out of core if (map) block in map-layer._validateDisabled() Remove vestige of old prefers-map-content demo implementation from both map-link.js and layer.js Make execution of map-extent's map-projectionchange handler conditional on the there being a parentLayer._layer property value. This specifically covers the case when this handler is invoked by the projection change event happening, in which the parent layer may be disabled due to a media condition and therefore there is no LayerGroup to add the extentLayer to. add map-layer media attribute as an observed attribute Make map-link._registerMediaQuery async, wait on mapml-viewer to be ready before trying to register a media query (which may depend on mapml-viewer.extent). Remove map-link media attribute from those attributes that are copied onto the 'rendered' element, because the link element actually supports the media attribute, but not the media features we are designing (hence it always forces the element to be disabled). Update map-layer._registerMediaQuery so that when the observed media attribute is removed or set to the empty string, the map-layer goes through the initialization life cycle, as though it was newly connected to the DOM (it may go from disabled to enabled due to the removal). Clean up map-layer _registerMediaQuery Add tests for attribute Add tests for attributes Add test for attribute cycling Update linux image for map-link-media test Initial implementation of map-style media attribute Refactor enable/disableLink methods to _enable/_disableLink Update / fix test title for map-link (should not be 'map-layer') Add test for map-style media attribute. Update implementation of map-link and map-style rendering to take media attribute into account. Move renderStyles to its own file, import it and export as member func Co-authored-by: Yushan Mu --- src/layer.js | 158 +++++++++--------- src/map-extent.js | 6 +- src/map-link.js | 46 +++-- src/map-style.js | 127 +++++++++++--- .../elementSupport/layers/renderStyles.js | 52 ++++++ src/mapml/layers/ExtentLayer.js | 27 +-- src/mapml/layers/MapMLLayer.js | 27 +-- src/mapml/layers/TemplatedFeaturesLayer.js | 28 +--- test/e2e/data/restaurants/restaurants.mapml | 16 +- .../elements/map-layer/map-layer-media.html | 44 +++++ .../map-layer/map-layer-media.test.js | 90 ++++++++++ .../map-link/map-link-disabled.test.js | 9 +- .../e2e/elements/map-link/map-link-media.html | 4 +- .../elements/map-link/map-link-media.test.js | 16 ++ .../default-styled-markers-linux.png | Bin 0 -> 9793 bytes .../default-styled-markers-win32.png | Bin 0 -> 9712 bytes .../map-link/map-link-stylesheet-media.html | 49 ++++++ .../map-link-stylesheet-media.test.js | 69 ++++++++ .../default-styled-markers-linux.png | Bin 0 -> 8513 bytes .../default-styled-markers-win32.png | Bin 0 -> 8513 bytes .../red-styled-markers-linux.png | Bin 0 -> 7688 bytes .../red-styled-markers-win32.png | Bin 0 -> 7688 bytes test/e2e/elements/map-link/red.css | 4 + .../elements/map-style/map-style-media.html | 54 ++++++ .../map-style/map-style-media.test.js | 83 +++++++++ .../orange-styled-markers-linux.png | Bin 0 -> 8193 bytes .../orange-styled-markers-win32.png | Bin 0 -> 8193 bytes .../pink-styled-markers-linux.png | Bin 0 -> 7558 bytes .../pink-styled-markers-win32.png | Bin 0 -> 7558 bytes .../purple-styled-markers-linux.png | Bin 0 -> 7725 bytes .../purple-styled-markers-win32.png | Bin 0 -> 7725 bytes .../red-styled-markers-linux.png | Bin 0 -> 7138 bytes .../red-styled-markers-win32.png | Bin 0 -> 7138 bytes 33 files changed, 699 insertions(+), 210 deletions(-) create mode 100644 src/mapml/elementSupport/layers/renderStyles.js create mode 100644 test/e2e/elements/map-layer/map-layer-media.html create mode 100644 test/e2e/elements/map-layer/map-layer-media.test.js create mode 100644 test/e2e/elements/map-link/map-link-media.test.js-snapshots/default-styled-markers-linux.png create mode 100644 test/e2e/elements/map-link/map-link-media.test.js-snapshots/default-styled-markers-win32.png create mode 100644 test/e2e/elements/map-link/map-link-stylesheet-media.html create mode 100644 test/e2e/elements/map-link/map-link-stylesheet-media.test.js create mode 100644 test/e2e/elements/map-link/map-link-stylesheet-media.test.js-snapshots/default-styled-markers-linux.png create mode 100644 test/e2e/elements/map-link/map-link-stylesheet-media.test.js-snapshots/default-styled-markers-win32.png create mode 100644 test/e2e/elements/map-link/map-link-stylesheet-media.test.js-snapshots/red-styled-markers-linux.png create mode 100644 test/e2e/elements/map-link/map-link-stylesheet-media.test.js-snapshots/red-styled-markers-win32.png create mode 100644 test/e2e/elements/map-link/red.css create mode 100644 test/e2e/elements/map-style/map-style-media.html create mode 100644 test/e2e/elements/map-style/map-style-media.test.js create mode 100644 test/e2e/elements/map-style/map-style-media.test.js-snapshots/orange-styled-markers-linux.png create mode 100644 test/e2e/elements/map-style/map-style-media.test.js-snapshots/orange-styled-markers-win32.png create mode 100644 test/e2e/elements/map-style/map-style-media.test.js-snapshots/pink-styled-markers-linux.png create mode 100644 test/e2e/elements/map-style/map-style-media.test.js-snapshots/pink-styled-markers-win32.png create mode 100644 test/e2e/elements/map-style/map-style-media.test.js-snapshots/purple-styled-markers-linux.png create mode 100644 test/e2e/elements/map-style/map-style-media.test.js-snapshots/purple-styled-markers-win32.png create mode 100644 test/e2e/elements/map-style/map-style-media.test.js-snapshots/red-styled-markers-linux.png create mode 100644 test/e2e/elements/map-style/map-style-media.test.js-snapshots/red-styled-markers-win32.png diff --git a/src/layer.js b/src/layer.js index 2ce4c1f50..dd16c5e2b 100644 --- a/src/layer.js +++ b/src/layer.js @@ -6,7 +6,7 @@ import { createLayerControlHTML } from './mapml/elementSupport/layers/createLaye export class BaseLayerElement extends HTMLElement { static get observedAttributes() { - return ['src', 'label', 'checked', 'hidden', 'opacity']; + return ['src', 'label', 'checked', 'hidden', 'opacity', 'media']; } /* jshint ignore:start */ #hasConnected; @@ -53,6 +53,13 @@ export class BaseLayerElement extends HTMLElement { } } + get media() { + return this.getAttribute('media'); + } + set media(val) { + this.setAttribute('media', val); + } + get opacity() { // use ?? since 0 is falsy, || would return rhs in that case return +(this._opacity ?? this.getAttribute('opacity')); @@ -114,17 +121,59 @@ export class BaseLayerElement extends HTMLElement { this._onAdd(); } } + break; + case 'media': + if (oldValue !== newValue) { + this._registerMediaQuery(newValue); + } + break; } } } + _registerMediaQuery(mq) { + if (!this._changeHandler) { + this._changeHandler = () => { + this._onRemove(); + if (this._mql.matches) { + this._onAdd(); + } + // set the disabled 'read-only' attribute indirectly, via _validateDisabled + this._validateDisabled(); + }; + } + + if (mq) { + // a new media query is being established + let map = this.getMapEl(); + if (!map) return; + // Remove listener from the old media query (if it exists) + if (this._mql) { + this._mql.removeEventListener('change', this._changeHandler); + } + + this._mql = map.matchMedia(mq); + this._changeHandler(); + this._mql.addEventListener('change', this._changeHandler); + } else if (this._mql) { + // the media attribute removed or query set to '' + this._mql.removeEventListener('change', this._changeHandler); + delete this._mql; + // effectively, no / empty media attribute matches, do what changeHandler does + this._onRemove(); + this._onAdd(); + this._validateDisabled(); + } + } + getMapEl() { + return Util.getClosest(this, 'mapml-viewer,map[is=web-map]'); + } constructor() { // Always call super first in constructor super(); // 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; - this._renderingMapContent = M.options.contentPreference; this.attachShadow({ mode: 'open' }); } disconnectedCallback() { @@ -132,6 +181,13 @@ export class BaseLayerElement extends HTMLElement { // removed from the map and the layer control if (this.hasAttribute('data-moving')) return; this._onRemove(); + + if (this._mql) { + if (this._changeHandler) { + this._mql.removeEventListener('change', this._changeHandler); + } + delete this._mql; + } } _onRemove() { @@ -141,13 +197,6 @@ export class BaseLayerElement extends HTMLElement { let l = this._layer, lc = this._layerControl, lchtml = this._layerControlHTML; - // remove properties of layer involved in whenReady() logic - delete this._layer; - delete this._layerControl; - delete this._layerControlHTML; - delete this._fetchError; - this.shadowRoot.innerHTML = ''; - if (this.src) this.innerHTML = ''; if (l) { l.off(); @@ -158,8 +207,16 @@ export class BaseLayerElement extends HTMLElement { } if (lc && !this.hidden) { + // lc.removeLayer depends on this._layerControlHTML, can't delete it until after lc.removeLayer(l); } + // remove properties of layer involved in whenReady() logic + delete this._layer; + delete this._layerControl; + delete this._layerControlHTML; + delete this._fetchError; + this.shadowRoot.innerHTML = ''; + if (this.src) this.innerHTML = ''; } connectedCallback() { @@ -170,11 +227,17 @@ export class BaseLayerElement extends HTMLElement { this._createLayerControlHTML = createLayerControlHTML.bind(this); const doConnected = this._onAdd.bind(this); const doRemove = this._onRemove.bind(this); + const registerMediaQuery = this._registerMediaQuery.bind(this); + let mq = this.media; this.parentElement .whenReady() .then(() => { doRemove(); - doConnected(); + if (mq) { + registerMediaQuery(mq); + } else { + doConnected(); + } }) .catch((error) => { throw new Error('Map never became ready: ' + error); @@ -189,20 +252,11 @@ export class BaseLayerElement extends HTMLElement { e.stopPropagation(); // if user changes the style in layer control if (e.detail) { - this._renderingMapContent = e.detail._renderingMapContent; this.src = e.detail.src; } }, { once: true } ); - this.addEventListener( - 'zoomchangesrc', - function (e) { - e.stopPropagation(); - this.src = e.detail.href; - }, - { once: true } - ); let base = this.baseURI ? this.baseURI : document.baseURI; const headers = new Headers(); headers.append('Accept', 'text/mapml'); @@ -240,7 +294,6 @@ export class BaseLayerElement extends HTMLElement { .then(() => { // may throw: this.selectAlternateOrChangeProjection(); - this.checkForPreferredContent(); }) .then(() => { this._layer = mapMLLayer(new URL(this.src, base).href, this, { @@ -278,7 +331,6 @@ export class BaseLayerElement extends HTMLElement { .then(() => { // may throw: this.selectAlternateOrChangeProjection(); - this.checkForPreferredContent(); }) .then(() => { this._layer = mapMLLayer(null, this, { @@ -317,13 +369,6 @@ export class BaseLayerElement extends HTMLElement { ); this.parentElement.projection = e.cause.mapprojection; } - } else if (e.message === 'findmatchingpreferredcontent') { - if (e.cause.href) { - console.log( - 'Changing layer to matching preferred content at: ' + e.cause.href - ); - this.src = e.cause.href; - } } else if (e.message === 'Failed to fetch') { // cut short whenReady with the _fetchError property this._fetchError = true; @@ -372,23 +417,6 @@ export class BaseLayerElement extends HTMLElement { } } - checkForPreferredContent() { - let mapml = this.src ? this.shadowRoot : this; - let availablePreferMapContents = mapml.querySelector( - `map-link[rel="style"][media="prefers-map-content=${this._renderingMapContent}"][href]` - ); - if (availablePreferMapContents) { - // resolve href - let url = new URL( - availablePreferMapContents.getAttribute('href'), - availablePreferMapContents.getBase() - ).href; - throw new Error('findmatchingpreferredcontent', { - cause: { href: url } - }); - } - } - copyRemoteContentToShadowRoot(mapml) { let shadowRoot = this.shadowRoot; // get the map-meta[name=projection/cs/extent/zoom] from map-head of remote mapml, attach them to the shadowroot @@ -454,12 +482,12 @@ export class BaseLayerElement extends HTMLElement { }; const _addStylesheetLink = (mapLink) => { this.whenReady().then(() => { - this._layer.appendStyleLink(mapLink); + this._layer.renderStyles(mapLink); }); }; const _addStyleElement = (mapStyle) => { this.whenReady().then(() => { - this._layer.appendStyleElement(mapStyle); + this._layer.renderStyles(mapStyle); }); }; const _addExtentElement = (mapExtent) => { @@ -610,8 +638,13 @@ export class BaseLayerElement extends HTMLElement { setTimeout(() => { let layer = this._layer, map = layer?._map; + // if there's a media query in play, check it early + if (this._mql && !this._mql.matches) { + this.setAttribute('disabled', ''); + this.disabled = true; + return; + } if (map) { - this._validateLayerZoom({ zoom: map.getZoom() }); // prerequisite: no inline and remote mapml elements exists at the same time const mapExtents = this.src ? this.shadowRoot.querySelectorAll('map-extent') @@ -664,35 +697,6 @@ export class BaseLayerElement extends HTMLElement { } }, 0); } - _validateLayerZoom(e) { - // get the min and max zooms from all extents - let toZoom = e.zoom; - let min = this.extent.zoom.minZoom; - let max = this.extent.zoom.maxZoom; - let inLink = this.src - ? this.shadowRoot.querySelector('map-link[rel=zoomin]') - : this.querySelector('map-link[rel=zoomin]'), - outLink = this.src - ? this.shadowRoot.querySelector('map-link[rel=zoomout]') - : this.querySelector('map-link[rel=zoomout]'); - let targetURL; - if (!(min <= toZoom && toZoom <= max)) { - if (inLink && toZoom > max) { - targetURL = inLink.href; - } else if (outLink && toZoom < min) { - targetURL = outLink.href; - } - if (targetURL) { - this.dispatchEvent( - new CustomEvent('zoomchangesrc', { - detail: { - href: targetURL - } - }) - ); - } - } - } // disable/italicize layer control elements based on the map-layer.disabled property toggleLayerControlDisabled() { let input = this._layerControlCheckbox, diff --git a/src/map-extent.js b/src/map-extent.js index b94b34271..cdc1f0395 100644 --- a/src/map-extent.js +++ b/src/map-extent.js @@ -311,12 +311,12 @@ export class HTMLExtentElement extends HTMLElement { }; const _addStylesheetLink = (mapLink) => { this.whenReady().then(() => { - this._extentLayer.appendStyleLink(mapLink); + this._extentLayer.renderStyles(mapLink); }); }; const _addStyleElement = (mapStyle) => { this.whenReady().then(() => { - this._extentLayer.appendStyleElement(mapStyle); + this._extentLayer.renderStyles(mapStyle); }); }; for (let i = 0; i < elementsGroup.length; ++i) { @@ -431,7 +431,7 @@ export class HTMLExtentElement extends HTMLElement { _handleChange() { // add _extentLayer to map if map-extent is checked, otherwise remove it - if (this.checked && !this.disabled) { + if (this.checked && !this.disabled && this.parentLayer._layer) { // can be added to mapmllayer layerGroup no matter map-layer is checked or not this._extentLayer.addTo(this.parentLayer._layer); this._extentLayer.setZIndex( diff --git a/src/map-link.js b/src/map-link.js index bcc1fa7d6..600b2f423 100644 --- a/src/map-link.js +++ b/src/map-link.js @@ -252,9 +252,9 @@ export class HTMLLinkElement extends HTMLElement { break; case 'disabled': if (typeof newValue === 'string') { - this.disableLink(); + this._disableLink(); } else { - this.enableLink(); + this._enableLink(); } break; } @@ -277,6 +277,9 @@ export class HTMLLinkElement extends HTMLElement { case 'image': case 'features': case 'query': + // because we skip the attributeChangedCallback for initialization, + // respect the disabled attribute which can be set by the author prior + // to initialization if (!this.disabled) { this._initTemplateVars(); await this._createTemplatedLink(); @@ -296,7 +299,9 @@ export class HTMLLinkElement extends HTMLElement { //this._createLegendLink(); break; case 'stylesheet': - this._createStylesheetLink(); + if (!this.disabled) { + this._createStylesheetLink(); + } break; case 'alternate': this._createAlternateLink(); // add media attribute @@ -305,7 +310,10 @@ export class HTMLLinkElement extends HTMLElement { // this._createLicenseLink(); break; } - this._registerMediaQuery(this.media); + // the media attribute uses / overrides the disabled attribute to enable or + // disable the link, so at this point the #hasConnected must be true so + // that the disabled attributeChangedCallback can have its desired side effect + await this._registerMediaQuery(this.media); // create the type of templated leaflet layer appropriate to the rel value // image/map/features = templated(Image/Feature), tile=templatedTile, // this._tempatedTileLayer = Util.templatedTile(pane: this.extentElement._leafletLayer._container) @@ -323,7 +331,7 @@ export class HTMLLinkElement extends HTMLElement { break; } } - disableLink() { + _disableLink() { switch (this.rel.toLowerCase()) { case 'tile': case 'image': @@ -355,24 +363,22 @@ export class HTMLLinkElement extends HTMLElement { break; } } - async enableLink() { + async _enableLink() { switch (this.rel.toLowerCase()) { case 'tile': case 'image': case 'features': case 'query': - if (!this.disabled) { - this._initTemplateVars(); - await this._createTemplatedLink(); - this.getLayerEl()._validateDisabled(); - } + this._initTemplateVars(); + await this._createTemplatedLink(); + this.getLayerEl()._validateDisabled(); break; case 'stylesheet': this._createStylesheetLink(); break; } } - _registerMediaQuery(mq) { + async _registerMediaQuery(mq) { if (!this._changeHandler) { // Define and bind the change handler once this._changeHandler = () => { @@ -383,6 +389,9 @@ export class HTMLLinkElement extends HTMLElement { if (mq) { let map = this.getMapEl(); if (!map) return; + // have to wait until map has an extent i.e. is ready, because the + // matchMedia function below relies on it for map related queries + await map.whenReady(); // Remove listener from the old media query (if it exists) if (this._mql) { @@ -397,6 +406,8 @@ export class HTMLLinkElement extends HTMLElement { // Clean up the existing listener this._mql.removeEventListener('change', this._changeHandler); delete this._mql; + // unlike map-layer.disabled, map-link.disabled is an observed attribute + this.disabled = false; } } _createAlternateLink(mapml) { @@ -441,17 +452,17 @@ export class HTMLLinkElement extends HTMLElement { copyAttributes(this, this.link); if (this._stylesheetHost._layer) { - this._stylesheetHost._layer.appendStyleLink(this); + this._stylesheetHost._layer.renderStyles(this); } else if (this._stylesheetHost._templatedLayer) { - this._stylesheetHost._templatedLayer.appendStyleLink(this); + this._stylesheetHost._templatedLayer.renderStyles(this); } else if (this._stylesheetHost._extentLayer) { - this._stylesheetHost._extentLayer.appendStyleLink(this); + this._stylesheetHost._extentLayer.renderStyles(this); } } function copyAttributes(source, target) { return Array.from(source.attributes).forEach((attribute) => { - if (attribute.nodeName !== 'href') + if (attribute.nodeName !== 'href' && attribute.nodeName !== 'media') target.setAttribute(attribute.nodeName, attribute.nodeValue); }); } @@ -989,8 +1000,7 @@ export class HTMLLinkElement extends HTMLElement { layerEl.dispatchEvent( new CustomEvent('changestyle', { detail: { - src: e.target.getAttribute('data-href'), - preference: this.media['prefers-map-content'] + src: e.target.getAttribute('data-href') } }) ); diff --git a/src/map-style.js b/src/map-style.js index 1aa21d35f..5aff36f10 100644 --- a/src/map-style.js +++ b/src/map-style.js @@ -1,43 +1,91 @@ +import { Util } from './mapml/utils/Util.js'; export class HTMLStyleElement extends HTMLElement { static get observedAttributes() { - return; + return ['media']; } + /* jshint ignore:start */ + #hasConnected; + /* jshint ignore:end */ + get media() { + return this.getAttribute('media'); + } + set media(val) { + this.setAttribute('media', val); + } + async attributeChangedCallback(name, oldValue, newValue) { + if (this.#hasConnected /* jshint ignore:line */) { + switch (name) { + case 'media': + if (oldValue !== newValue) { + await this._registerMediaQuery(newValue); + } + break; + } + } + } + async _registerMediaQuery(mq) { + if (!this._changeHandler) { + // Define and bind the change handler once + this._changeHandler = () => { + this._disconnect(); + if (this._mql.matches) { + this._connect(); + } + }; + } + + if (mq) { + let map = this.getMapEl(); + if (!map) return; + // have to wait until map has an extent i.e. is ready, because the + // matchMedia function below relies on it for map related queries + await map.whenReady(); - attributeChangedCallback(name, oldValue, newValue) {} + // Remove listener from the old media query (if it exists) + if (this._mql) { + this._mql.removeEventListener('change', this._changeHandler); + } + + // Set up the new media query and listener + this._mql = map.matchMedia(mq); + this._changeHandler(); // Initial evaluation + this._mql.addEventListener('change', this._changeHandler); + } else if (this._mql) { + // Clean up the existing listener + this._mql.removeEventListener('change', this._changeHandler); + delete this._mql; + this._disconnect(); + this._connect(); + } + } + getMapEl() { + return Util.getClosest(this, 'mapml-viewer,map[is=web-map]'); + } constructor() { // Always call super first in constructor super(); } - connectedCallback() { - // if the parent element is a map-link, the stylesheet should - // be created as part of a templated layer processing i.e. on moveend / when connected - // and the generated + + + + + + media query: (0 <= map-zoom <=3) + + + + -87 68 + + + + + + + + + + \ No newline at end of file diff --git a/test/e2e/elements/map-layer/map-layer-media.test.js b/test/e2e/elements/map-layer/map-layer-media.test.js new file mode 100644 index 000000000..29b785db5 --- /dev/null +++ b/test/e2e/elements/map-layer/map-layer-media.test.js @@ -0,0 +1,90 @@ +import { test, expect, chromium } from '@playwright/test'; + +test.describe('map-layer media attribute', () => { + let page; + let context; + let viewer; + test.beforeAll(async function () { + context = await chromium.launchPersistentContext(''); + page = + context.pages().find((page) => page.url() === 'about:blank') || + (await context.newPage()); + await page.goto('map-layer-media.html'); + await page.waitForTimeout(1000); + viewer = page.getByTestId('viewer'); + }); + test('On initial load, a matching media queried layer is enabled', async () => { + const matchedQueryLayer = page.getByTestId('initial-mq'); + // map loads at z=2, query matches 0 <= z <= 3 + await expect(matchedQueryLayer).not.toHaveAttribute('disabled', ''); + }); + test(`A visible (enabled) map-layer with no media query should remain enabled \ +when a matching mq is added`, async () => { + const noInitialQueryLayer = page.getByTestId('no-initial-mq'); + await expect(noInitialQueryLayer).not.toHaveAttribute('disabled', ''); + await viewer.evaluate((v) => v.zoomTo(v.lat, v.lon, 4)); + await page.waitForTimeout(200); + // should still be enabled: + await expect(noInitialQueryLayer).not.toHaveAttribute('disabled', ''); + }); + test(`A visible (enabled) map-layer with no media query should be disabled \ +when a non-matching media query attribute is set`, async () => { + await expect(viewer).toHaveAttribute('zoom', '4'); + const presentInLayerControl = await viewer.evaluate((v) => { + let lc = v._layerControl; + let layers = lc._layers.map((e) => e.layer._layerEl); + let noInitialQueryLayer = v.querySelector('[data-testid=no-initial-mq]'); + return layers.some((e) => e === noInitialQueryLayer); + }); + expect(presentInLayerControl).toBe(true); + const noInitialQueryLayer = page.getByTestId('no-initial-mq'); + await expect(noInitialQueryLayer).not.toHaveAttribute('disabled', ''); + await noInitialQueryLayer.evaluate( + (l) => (l.media = '(0 <= map-zoom <=3)') + ); + await expect(noInitialQueryLayer).toHaveAttribute('disabled', ''); + }); + test(`A mq-disabled layer is removed from the layer control`, async () => { + const noInitialQueryLayer = page.getByTestId('no-initial-mq'); + await expect(noInitialQueryLayer).toHaveAttribute( + 'media', + '(0 <= map-zoom <=3)' + ); + await expect(noInitialQueryLayer).toHaveAttribute('disabled', ''); + const presentInLayerControl = await viewer.evaluate((v) => { + let lc = v._layerControl; + let layers = lc._layers.map((e) => e.layer._layerEl); + let noInitialQueryLayer = v.querySelector('[data-testid=no-initial-mq]'); + return layers.some((e) => e === noInitialQueryLayer); + }); + expect(presentInLayerControl).toBe(false); + }); + test(`A layer disabled due to mq would otherwise be enabled is \ +enabled and added to the layer control when mq removed`, async () => { + const noInitialQueryLayer = page.getByTestId('no-initial-mq'); + await expect(noInitialQueryLayer).toHaveAttribute( + 'media', + '(0 <= map-zoom <=3)' + ); + await expect(noInitialQueryLayer).toHaveAttribute('disabled', ''); + await noInitialQueryLayer.evaluate((l) => l.removeAttribute('media')); + await expect(noInitialQueryLayer).not.toHaveAttribute('disabled', ''); + const presentInLayerControl = await viewer.evaluate((v) => { + let lc = v._layerControl; + let layers = lc._layers.map((e) => e.layer._layerEl); + let noInitialQueryLayer = v.querySelector('[data-testid=no-initial-mq]'); + return layers.some((e) => e === noInitialQueryLayer); + }); + expect(presentInLayerControl).toBe(true); + }); + test(`An empty media query is the same as no media query`, async () => { + const noInitialQueryLayer = page.getByTestId('no-initial-mq'); + await noInitialQueryLayer.evaluate((l) => l.setAttribute('media', ' ')); + await expect(noInitialQueryLayer).not.toHaveAttribute('disabled', ''); + }); + test(`An invalid media query is the same as a non-matching media query`, async () => { + const noInitialQueryLayer = page.getByTestId('no-initial-mq'); + await noInitialQueryLayer.evaluate((l) => l.setAttribute('media', '(foo ')); + await expect(noInitialQueryLayer).toHaveAttribute('disabled', ''); + }); +}); diff --git a/test/e2e/elements/map-link/map-link-disabled.test.js b/test/e2e/elements/map-link/map-link-disabled.test.js index a577fdbd7..5799c1c6d 100644 --- a/test/e2e/elements/map-link/map-link-disabled.test.js +++ b/test/e2e/elements/map-link/map-link-disabled.test.js @@ -15,10 +15,6 @@ test.describe('map-link disabled', () => { }); test('rel=stylesheet disabled attribute', async () => { const viewer = page.getByTestId('viewer'); - // there's a problem when attempting to select this link by testid. The map-link - // code copies all the attributes of the map-link element onto the generated - // element it uses to render the content, including the data-testid, - // resulting in duplicate ids that mess up the getByTestId algorithm. const featuresLink = page.getByTestId('restaurants_templated_link'); // test that a templated content link can be disabled by the HTML author at // page load, and the bounds of the extent do not include the disabled link @@ -29,6 +25,11 @@ test.describe('map-link disabled', () => { maxDiffPixels: 20 }); await featuresLink.evaluate((fl) => (fl.disabled = false)); + // there's a problem when attempting to select this link by testid. The map-link + // code copies all the attributes of the map-link element onto the generated + // element it uses to render the content, including the data-testid, + // resulting in duplicate ids that mess up the getByTestId algorithm. + // // selecting it this way seems unambiguous at least const stylesheetLink = page.locator( 'map-link[rel=stylesheet][href="restaurants/restaurants.css"]' diff --git a/test/e2e/elements/map-link/map-link-media.html b/test/e2e/elements/map-link/map-link-media.html index 7f1b4919e..21dd8dd79 100644 --- a/test/e2e/elements/map-link/map-link-media.html +++ b/test/e2e/elements/map-link/map-link-media.html @@ -104,7 +104,7 @@ - + @@ -117,7 +117,7 @@ Italian Mexican - + 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 ec6ed6be1..e6e9b6ee8 100644 --- a/test/e2e/elements/map-link/map-link-media.test.js +++ b/test/e2e/elements/map-link/map-link-media.test.js @@ -1,3 +1,7 @@ +/* to do: test that map-link rel=features is re-enabled when the media attribute + * is removed + */ + import { test, expect, chromium } from '@playwright/test'; test.describe('map-link media attribute', () => { @@ -98,4 +102,16 @@ test.describe('map-link media attribute', () => { await expect(layer).not.toHaveAttribute('disabled'); await expect(mapLink).not.toHaveAttribute('disabled'); }); + test('map-link rel=features is enabled when non-matching media attribute removed', async () => { + const viewer = page.getByTestId('viewer'); + const featuresLink = page.getByTestId('features-link'); + await featuresLink.evaluate((l) => (l.media = '(16 < map-zoom <= 18)')); + await expect(featuresLink).toHaveAttribute('disabled'); + await featuresLink.evaluate((l) => l.removeAttribute('media')); + await expect(featuresLink).not.toHaveAttribute('disabled'); + await page.waitForTimeout(500); + await expect(viewer).toHaveScreenshot('default_styled_markers.png', { + maxDiffPixels: 100 + }); + }); }); diff --git a/test/e2e/elements/map-link/map-link-media.test.js-snapshots/default-styled-markers-linux.png b/test/e2e/elements/map-link/map-link-media.test.js-snapshots/default-styled-markers-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..306346c49008c804170312b3ae687617d21fae09 GIT binary patch literal 9793 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 W0|G9dk$jcU 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 + + + + + map-link-stylesheet-media.html + + + + + + + + + + + + + All cuisines + African + Asian + Cajun + Indian + Italian + Mexican + + + + + + + diff --git a/test/e2e/elements/map-link/map-link-stylesheet-media.test.js b/test/e2e/elements/map-link/map-link-stylesheet-media.test.js new file mode 100644 index 000000000..1950478e1 --- /dev/null +++ b/test/e2e/elements/map-link/map-link-stylesheet-media.test.js @@ -0,0 +1,69 @@ +import { test, expect, chromium } from '@playwright/test'; + +test.describe('map-link rel=stylesheet media attribute', () => { + let page; + let context; + let viewer; + let stylesheetLink; + test.beforeAll(async function () { + context = await chromium.launchPersistentContext(''); + page = + context.pages().find((page) => page.url() === 'about:blank') || + (await context.newPage()); + await page.goto('map-link-stylesheet-media.html'); + await page.waitForTimeout(1000); + viewer = page.getByTestId('viewer'); + stylesheetLink = page.locator('map-link[rel=stylesheet][href="red.css"]'); + }); + test(`when a map-link disables due to a media query, the styles\ + should be removed`, async () => { + // map starts off at + await expect(viewer).toHaveScreenshot('red_styled_markers.png', { + maxDiffPixels: 20 + }); + await stylesheetLink.evaluate((l) => (l.media = '(14 < map-zoom <= 18)')); + await page.waitForTimeout(500); + await expect(viewer).toHaveScreenshot('default_styled_markers.png', { + maxDiffPixels: 20 + }); + }); + test(`when a map-link enables due to a mq being removed, the \ + styles should apply`, async () => { + await stylesheetLink.evaluate((l) => l.removeAttribute('media')); + await expect(viewer).toHaveScreenshot('red_styled_markers.png', { + maxDiffPixels: 20 + }); + }); + + test(`when a map-link enables due to disabled attribute removed\ + ensure styles change`, async () => { + await stylesheetLink.evaluate((l) => (l.disabled = true)); + await page.waitForTimeout(500); + await expect(viewer).toHaveScreenshot('default_styled_markers.png', { + maxDiffPixels: 20 + }); + await stylesheetLink.evaluate((l) => (l.disabled = false)); + await page.waitForTimeout(500); + await expect(viewer).toHaveScreenshot('red_styled_markers.png', { + maxDiffPixels: 20 + }); + }); + test(`when a map-link does not enable due to disabled attribute \ +removed while a non-matching media query is present, ensure that style does not \ +change`, async () => { + await stylesheetLink.evaluate((l) => (l.disabled = true)); + await page.waitForTimeout(500); + await expect(viewer).toHaveScreenshot('default_styled_markers.png', { + maxDiffPixels: 20 + }); + // non-matching query (map z=14) + await stylesheetLink.evaluate((l) => (l.media = '(14 < map-zoom <= 18)')); + await page.waitForTimeout(500); + // disabled overrides the media query because they compete to change it + await stylesheetLink.evaluate((l) => (l.disabled = false)); + await page.waitForTimeout(500); + await expect(viewer).toHaveScreenshot('red_styled_markers.png', { + maxDiffPixels: 20 + }); + }); +}); diff --git a/test/e2e/elements/map-link/map-link-stylesheet-media.test.js-snapshots/default-styled-markers-linux.png b/test/e2e/elements/map-link/map-link-stylesheet-media.test.js-snapshots/default-styled-markers-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..3f7a30a23c11f27780c8a81dbded13de747dad62 GIT binary patch literal 8513 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 aZXEFzWo(xPHz2{%AsVXMDn&{UkpBi@;S4JP literal 0 HcmV?d00001 diff --git a/test/e2e/elements/map-link/map-link-stylesheet-media.test.js-snapshots/default-styled-markers-win32.png b/test/e2e/elements/map-link/map-link-stylesheet-media.test.js-snapshots/default-styled-markers-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..3f7a30a23c11f27780c8a81dbded13de747dad62 GIT binary patch literal 8513 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 aZXEFzWo(xPHz2{%AsVXMDn&{UkpBi@;S4JP literal 0 HcmV?d00001 diff --git a/test/e2e/elements/map-link/map-link-stylesheet-media.test.js-snapshots/red-styled-markers-linux.png b/test/e2e/elements/map-link/map-link-stylesheet-media.test.js-snapshots/red-styled-markers-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..80bf5288ac5025d633fda9e7357b89ee4bdc0154 GIT binary patch literal 7688 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 + + + + + map-style-media.html + + + + + + + + + + .restaurant {fill: red; stroke: red;} + + + .restaurant {fill: orange; stroke: orange} + + .restaurant {fill: purple; stroke: purple} + .restaurant {fill: pink; stroke: pink} + + All cuisines + African + Asian + Cajun + Indian + Italian + Mexican + + + + + + + diff --git a/test/e2e/elements/map-style/map-style-media.test.js b/test/e2e/elements/map-style/map-style-media.test.js new file mode 100644 index 000000000..5b8ad22bf --- /dev/null +++ b/test/e2e/elements/map-style/map-style-media.test.js @@ -0,0 +1,83 @@ +import { test, expect, chromium } from '@playwright/test'; + +test.describe('map-style media attribute', () => { + let page; + let context; + let viewer; + test.beforeAll(async function () { + context = await chromium.launchPersistentContext(''); + page = + context.pages().find((page) => page.url() === 'about:blank') || + (await context.newPage()); + await page.goto('map-style-media.html'); + await page.waitForTimeout(1000); + viewer = page.getByTestId('viewer'); + }); + test(`when a map-style loads with a matching media query, the styles apply`, async () => { + await expect(viewer).toHaveAttribute('zoom', '14'); + // map starts off with orange markers enabled via media="(map-zoom: 14)" + const orangeStyle = page.getByTestId('orange'); + await expect(orangeStyle).toHaveAttribute('media', '(map-zoom: 14)'); + await expect(viewer).toHaveScreenshot('orange_styled_markers.png', { + maxDiffPixels: 20 + }); + }); + test('when a map-style loads without a media query, the styles apply', async () => { + await expect(viewer).toHaveAttribute('zoom', '14'); + await viewer.evaluate((v) => v.zoomTo(v.lat, v.lon, v.zoom - 1)); + + await page.waitForTimeout(500); + await expect(viewer).toHaveScreenshot('red_styled_markers.png', { + maxDiffPixels: 20 + }); + }); + test(`when a map-style enables due to its mq being removed, the \ + styles should apply`, async () => { + await expect(viewer).toHaveAttribute('zoom', '13'); + let stylesheet = page.locator('map-style[data-testid="invalid-mq"]'); + await stylesheet.evaluate((l) => l.removeAttribute('media')); + await page.waitForTimeout(500); + await expect(viewer).toHaveScreenshot('purple_styled_markers.png', { + maxDiffPixels: 20 + }); + }); + test(`when a map-style loads with a non-matching media query, \ +its styles do not apply`, async () => { + await expect(viewer).toHaveAttribute('zoom', '13'); + let stylesheet = page.getByTestId('pink'); + let isRenderedAsStyleElement = await stylesheet.evaluate((s) => + s.hasOwnProperty('styleElement') + ); + await expect(isRenderedAsStyleElement).toBe(false); + }); + test(`map-style disabled due to setting of non-matching media query`, async () => { + await expect(viewer).toHaveAttribute('zoom', '13'); + // it's no longer invalid, but valid and matching, let's set it to non-match + let stylesheet = page.locator('map-style[data-testid="invalid-mq"]'); + await stylesheet.evaluate((s) => (s.media = '(map-zoom: 14)')); + // markers should fall back to red style + + await page.waitForTimeout(500); + await expect(viewer).toHaveScreenshot('red_styled_markers.png', { + maxDiffPixels: 20 + }); + }); + test(`map-style enables when non-matching media query is updated to be matching`, async () => { + let stylesheet = page.getByTestId('pink'); + // pink is the last stylesheet, closest to content + await stylesheet.evaluate((s) => (s.media = '(map-zoom: 13)')); + await page.waitForTimeout(500); + await expect(viewer).toHaveScreenshot('pink_styled_markers.png', { + maxDiffPixels: 20 + }); + }); + test(`map-style disabled due to update of matching to invalid mq`, async () => { + let stylesheet = page.getByTestId('pink'); + await stylesheet.evaluate((s) => (s.media = 'invalid mq')); + + await page.waitForTimeout(500); + await expect(viewer).toHaveScreenshot('red_styled_markers.png', { + maxDiffPixels: 20 + }); + }); +}); diff --git a/test/e2e/elements/map-style/map-style-media.test.js-snapshots/orange-styled-markers-linux.png b/test/e2e/elements/map-style/map-style-media.test.js-snapshots/orange-styled-markers-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..909225bbb1afedc9a6c178047188ec50269a4ed2 GIT binary patch literal 8193 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 PfTp8yUA;*4PSAe=WYlQ1 literal 0 HcmV?d00001 diff --git a/test/e2e/elements/map-style/map-style-media.test.js-snapshots/orange-styled-markers-win32.png b/test/e2e/elements/map-style/map-style-media.test.js-snapshots/orange-styled-markers-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..909225bbb1afedc9a6c178047188ec50269a4ed2 GIT binary patch literal 8193 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 PfTp8yUA;*4PSAe=WYlQ1 literal 0 HcmV?d00001 diff --git a/test/e2e/elements/map-style/map-style-media.test.js-snapshots/pink-styled-markers-linux.png b/test/e2e/elements/map-style/map-style-media.test.js-snapshots/pink-styled-markers-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f2154310ee77a53836693ec542a58e2e9f8694 GIT binary patch literal 7558 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 b-)H7Hs=4mOh7Si`tb){)b>Kxxk6!#2r+Hs} literal 0 HcmV?d00001 diff --git a/test/e2e/elements/map-style/map-style-media.test.js-snapshots/pink-styled-markers-win32.png b/test/e2e/elements/map-style/map-style-media.test.js-snapshots/pink-styled-markers-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f2154310ee77a53836693ec542a58e2e9f8694 GIT binary patch literal 7558 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 b-)H7Hs=4mOh7Si`tb){)b>Kxxk6!#2r+Hs} literal 0 HcmV?d00001 diff --git a/test/e2e/elements/map-style/map-style-media.test.js-snapshots/purple-styled-markers-linux.png b/test/e2e/elements/map-style/map-style-media.test.js-snapshots/purple-styled-markers-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0899f93c39853bb62fc94b48d7c732d62f6500 GIT binary patch literal 7725 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 u;01MP`|csgtl;~igVDYH5WJ>tpcSLXHNCvX1i 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 TNhk299f!#U3&TQv$H#vMOs`ZK literal 0 HcmV?d00001 diff --git a/test/e2e/elements/map-style/map-style-media.test.js-snapshots/red-styled-markers-win32.png b/test/e2e/elements/map-style/map-style-media.test.js-snapshots/red-styled-markers-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..fde0c149351de40821a78c780d2acfc90540073c GIT binary patch literal 7138 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 TNhk299f!#U3&TQv$H#vMOs`ZK literal 0 HcmV?d00001