Skip to content

Commit 1b452fa

Browse files
committed
Fix how QueryHandler manages multiple fetches using Promise.allSettled
Remove timeout from multipleHeterogeneousQueryExtents test Remove windows/linux system dependency from test Fix system dependency for copy-pasting text in test
1 parent 31b5b99 commit 1b452fa

File tree

3 files changed

+28
-21
lines changed

3 files changed

+28
-21
lines changed

src/mapml/handlers/QueryHandler.js

+22-17
Original file line numberDiff line numberDiff line change
@@ -102,25 +102,23 @@ export var QueryHandler = L.Handler.extend({
102102
}
103103
})
104104
.then((response) => {
105-
if (!layer._mapmlFeatures) layer._mapmlFeatures = [];
105+
let features = [];
106106
if (response.contenttype.startsWith('text/mapml')) {
107107
// the mapmldoc could have <map-meta> elements that are important, perhaps
108108
// also, the mapmldoc can have many features
109109
let mapmldoc = parser.parseFromString(
110-
response.text,
111-
'application/xml'
112-
),
113-
features = Array.prototype.slice.call(
114-
mapmldoc.querySelectorAll('map-feature')
115-
);
110+
response.text,
111+
'application/xml'
112+
);
113+
features = Array.prototype.slice.call(
114+
mapmldoc.querySelectorAll('map-feature')
115+
);
116116
// <map-meta> elements
117117
layer.metas = Array.prototype.slice.call(
118118
mapmldoc.querySelectorAll(
119119
'map-meta[name=cs], map-meta[name=zoom], map-meta[name=projection]'
120120
)
121121
);
122-
if (features.length)
123-
layer._mapmlFeatures = layer._mapmlFeatures.concat(features);
124122
} else {
125123
// synthesize a single feature from text or html content
126124
let geom =
@@ -139,9 +137,9 @@ export var QueryHandler = L.Handler.extend({
139137
'text/html'
140138
)
141139
.querySelector('map-feature');
142-
layer._mapmlFeatures.push(feature);
140+
features.push(feature);
143141
}
144-
return layer._mapmlFeatures;
142+
return { features: features, template: template };
145143
})
146144
.catch((err) => {
147145
console.log('Looks like there was a problem. Status: ' + err.message);
@@ -248,14 +246,21 @@ export var QueryHandler = L.Handler.extend({
248246
fetches.push(fetchFeatures(template, obj));
249247
}
250248
}
251-
Promise.allSettled(fetches).then(() => {
252-
// create connection between queried <map-feature> and its parent <map-extent>
253-
if (layer._mapmlFeatures) {
254-
for (let feature of layer._mapmlFeatures) {
255-
feature._extentEl = template._extentEl;
249+
Promise.allSettled(fetches).then((results) => {
250+
layer._mapmlFeatures = [];
251+
// f is an array of {features[], template}
252+
253+
for (let f of results) {
254+
if (f.status === 'fulfilled') {
255+
// create connection between queried <map-feature> and its parent <map-extent>
256+
for (let feature of f.value.features) {
257+
feature._extentEl = f.value.template._extentEl;
258+
}
259+
layer._mapmlFeatures = layer._mapmlFeatures.concat(f.value.features);
256260
}
257-
displayFeaturesPopup(layer._mapmlFeatures, e.latlng);
258261
}
262+
if (layer._mapmlFeatures.length > 0)
263+
displayFeaturesPopup(layer._mapmlFeatures, e.latlng);
259264
});
260265

261266
function displayFeaturesPopup(features, loc) {

test/e2e/core/layerContextMenu.test.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ test.describe('Playwright Layer Context Menu Tests', () => {
4545
).jsonValue();
4646

4747
expect(menuDisplay).toEqual('block');
48+
await page.keyboard.press('Escape');
4849
});
4950

5051
test('Layer context menu copy layer', async () => {
@@ -157,6 +158,7 @@ test.describe('Playwright Layer Context Menu Tests', () => {
157158
});
158159

159160
test('Copy layer with relative src attribute', async () => {
161+
await page.reload();
160162
await page.hover(
161163
'div > div.leaflet-control-container > div.leaflet-top.leaflet-right > div'
162164
);
@@ -167,8 +169,10 @@ test.describe('Playwright Layer Context Menu Tests', () => {
167169

168170
await page.keyboard.press('l');
169171
await page.click('body > textarea#messageLayer');
170-
await page.keyboard.press('Control+a');
171-
await page.keyboard.press('Backspace');
172+
// reload is better than deleting text, because of cross-platform issue
173+
// with copy-pasting text on Windows/Linux
174+
// await page.keyboard.press('Control+a');
175+
// await page.keyboard.press('Backspace');
172176
await page.keyboard.press('Control+v');
173177
const copyLayer = await page.$eval(
174178
'body > textarea#messageLayer',

test/e2e/layers/multipleHeterogeneousQueryExtents.test.js

-2
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,6 @@ test.describe('Multiple Extent Queries with heterogeneous response content types
9292
(span) => span.innerText.toLowerCase()
9393
);
9494
expect(thirdExtentInLayerControl).toEqual('html query response');
95-
96-
await page.waitForTimeout(1000);
9795

9896
await page.click('div');
9997
await page.waitForSelector(

0 commit comments

Comments
 (0)