mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-05 02:44:02 +00:00
fix(street-level): re-check an unknown key, Esc leaves full screen, say why a view is empty
- A failed or missing key status is asked again on the next switch-on, and the check gives up after 10 s instead of holding LOADING forever. - Waiting for the key status reads as LOADING while the layer is on. - Esc shrinks the photo in full screen too, before the panel's own Esc. - Destroying the panel with the iPhone popover open leaves no popover behind. - An empty view says whether the filter emptied it. - A freed upstream tile slot passes straight to the oldest waiter. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
d313b6e62c
commit
8e5e3cdd3b
10 files changed
+201
-30
No files matched your search
@@ -185,6 +185,11 @@ function panelDom({ fullscreen = true, popover = false } = {}) {
|
||||
const wrap = add(root, 'div', { id: 'sl-viewer-wrap' });
|
||||
if (fullscreen) wrap.requestFullscreen = async () => fullscreenTo(wrap);
|
||||
if (popover) {
|
||||
// `popover` reflects its attribute, as in the DOM.
|
||||
Object.defineProperty(wrap, 'popover', {
|
||||
get: () => wrap.getAttribute('popover'),
|
||||
set: (value) => wrap.setAttribute('popover', value),
|
||||
});
|
||||
// The browser fires `toggle` after the popover opens or closes.
|
||||
const toggleTo = (newState) =>
|
||||
setTimeout(() => wrap.dispatchEvent({ type: 'toggle', newState }), 0);
|
||||
@@ -559,6 +564,28 @@ test('EXPAND puts the viewer full screen in place, and the button shrinks it aga
|
||||
controls.destroy();
|
||||
}));
|
||||
|
||||
test('Esc in full screen shrinks the photo; the panel never sees it', () =>
|
||||
withDom(async (dom) => {
|
||||
const { controls } = stubPanel(dom, uiState({ open: true }));
|
||||
const expand = dom.root.querySelector('#sl-viewer-expand');
|
||||
expand.click();
|
||||
await settle();
|
||||
await settle();
|
||||
assert.equal(dom.document.fullscreenElement, dom.wrap);
|
||||
let panelEsc = 0;
|
||||
dom.root.addEventListener('keydown', () => panelEsc++);
|
||||
expand.dispatchEvent({ type: 'keydown', key: 'Escape', bubbles: true });
|
||||
await settle();
|
||||
await settle();
|
||||
assert.equal(dom.document.fullscreenElement, null);
|
||||
assert.equal(panelEsc, 0, 'the panel stays open');
|
||||
assert.deepEqual(expandLabel(dom), ['EXPAND', 'false']);
|
||||
// Not expanded, Esc is the panel's again.
|
||||
expand.dispatchEvent({ type: 'keydown', key: 'Escape', bubbles: true });
|
||||
assert.equal(panelEsc, 1);
|
||||
controls.destroy();
|
||||
}));
|
||||
|
||||
test('an image closed while full screen leaves full screen', () =>
|
||||
withDom(async (dom) => {
|
||||
const { layer, controls } = stubPanel(dom, uiState({ open: true }));
|
||||
@@ -622,6 +649,26 @@ test('on iPhone (no element fullscreen) EXPAND opens the viewer as a popover ove
|
||||
{ fullscreen: false, popover: true },
|
||||
));
|
||||
|
||||
test('destroying the panel while the iPhone popover is open leaves no popover behind', () =>
|
||||
withDom(
|
||||
async (dom) => {
|
||||
const { controls } = stubPanel(dom, uiState({ open: true }));
|
||||
dom.root.querySelector('#sl-viewer-expand').click();
|
||||
await settle();
|
||||
await settle();
|
||||
assert.equal(dom.wrap.getAttribute('popover'), 'auto');
|
||||
controls.destroy();
|
||||
await settle();
|
||||
assert.equal(dom.wrap.popoverOpen, false);
|
||||
assert.equal(
|
||||
dom.wrap.getAttribute('popover'),
|
||||
null,
|
||||
'its toggle is not heard any more',
|
||||
);
|
||||
},
|
||||
{ fullscreen: false, popover: true },
|
||||
));
|
||||
|
||||
/** A MutationObserver stand-in whose callback the test fires. */
|
||||
function fakeMutationObserver() {
|
||||
const observers = new Set();
|
||||
|
||||
Reference in new issue
Block a user