chore(web): passive events (#19179)

This commit is contained in:
Mert 2025-06-16 11:03:23 -04:00 committed by GitHub
parent 3d0c851636
commit 5fc448bc97
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 68 additions and 58 deletions

View File

@ -53,12 +53,10 @@
img.src = getAssetOriginalUrl({ id: asset.id, cacheKey: asset.thumbhash }); img.src = getAssetOriginalUrl({ id: asset.id, cacheKey: asset.thumbhash });
img.addEventListener('load', () => onImageLoad(true)); img.addEventListener('load', () => onImageLoad(true), { passive: true });
img.addEventListener('error', (error) => { img.addEventListener('error', (error) => handleError(error, $t('error_loading_image')), { passive: true });
handleError(error, $t('error_loading_image'));
});
globalThis.addEventListener('mousemove', handleMouseMove); globalThis.addEventListener('mousemove', handleMouseMove, { passive: true });
}); });
onDestroy(() => { onDestroy(() => {

View File

@ -31,8 +31,8 @@ export function onImageLoad(resetSize: boolean = false) {
cropFrameEl?.classList.add('transition'); cropFrameEl?.classList.add('transition');
cropSettings.update((crop) => normalizeCropArea(crop, img, scale)); cropSettings.update((crop) => normalizeCropArea(crop, img, scale));
cropFrameEl?.classList.add('transition'); cropFrameEl?.classList.add('transition');
cropFrameEl?.addEventListener('transitionend', () => { cropFrameEl?.addEventListener('transitionend', () => cropFrameEl?.classList.remove('transition'), {
cropFrameEl?.classList.remove('transition'); passive: true,
}); });
} }
cropImageScale.set(scale); cropImageScale.set(scale);

View File

@ -58,7 +58,7 @@ export function handleMouseDown(e: MouseEvent) {
} }
document.body.style.userSelect = 'none'; document.body.style.userSelect = 'none';
globalThis.addEventListener('mouseup', handleMouseUp); globalThis.addEventListener('mouseup', handleMouseUp, { passive: true });
} }
export function handleMouseMove(e: MouseEvent) { export function handleMouseMove(e: MouseEvent) {

View File

@ -7,9 +7,9 @@
type AdapterConstructor, type AdapterConstructor,
type PluginConstructor, type PluginConstructor,
} from '@photo-sphere-viewer/core'; } from '@photo-sphere-viewer/core';
import { SettingsPlugin } from '@photo-sphere-viewer/settings-plugin';
import { ResolutionPlugin } from '@photo-sphere-viewer/resolution-plugin';
import '@photo-sphere-viewer/core/index.css'; import '@photo-sphere-viewer/core/index.css';
import { ResolutionPlugin } from '@photo-sphere-viewer/resolution-plugin';
import { SettingsPlugin } from '@photo-sphere-viewer/settings-plugin';
import '@photo-sphere-viewer/settings-plugin/index.css'; import '@photo-sphere-viewer/settings-plugin/index.css';
import { onDestroy, onMount } from 'svelte'; import { onDestroy, onMount } from 'svelte';
@ -68,8 +68,6 @@
fisheye: false, fisheye: false,
}); });
const resolutionPlugin = viewer.getPlugin(ResolutionPlugin) as ResolutionPlugin; const resolutionPlugin = viewer.getPlugin(ResolutionPlugin) as ResolutionPlugin;
if (originalPanorama && !$alwaysLoadOriginalFile) {
const zoomHandler = ({ zoomLevel }: events.ZoomUpdatedEvent) => { const zoomHandler = ({ zoomLevel }: events.ZoomUpdatedEvent) => {
// zoomLevel range: [0, 100] // zoomLevel range: [0, 100]
if (Math.round(zoomLevel) >= 75) { if (Math.round(zoomLevel) >= 75) {
@ -78,8 +76,12 @@
viewer.removeEventListener(events.ZoomUpdatedEvent.type, zoomHandler); viewer.removeEventListener(events.ZoomUpdatedEvent.type, zoomHandler);
} }
}; };
viewer.addEventListener(events.ZoomUpdatedEvent.type, zoomHandler);
if (originalPanorama && !$alwaysLoadOriginalFile) {
viewer.addEventListener(events.ZoomUpdatedEvent.type, zoomHandler, { passive: true });
} }
return () => viewer.removeEventListener(events.ZoomUpdatedEvent.type, zoomHandler);
}); });
onDestroy(() => { onDestroy(() => {

View File

@ -193,8 +193,8 @@
if (loader?.complete) { if (loader?.complete) {
onload(); onload();
} }
loader?.addEventListener('load', onload); loader?.addEventListener('load', onload, { passive: true });
loader?.addEventListener('error', onerror); loader?.addEventListener('error', onerror, { passive: true });
return () => { return () => {
loader?.removeEventListener('load', onload); loader?.removeEventListener('load', onload);
loader?.removeEventListener('error', onerror); loader?.removeEventListener('error', onerror);

View File

@ -123,17 +123,21 @@
mouseOver = false; mouseOver = false;
}; };
let timer: ReturnType<typeof setTimeout>; let timer: ReturnType<typeof setTimeout> | null = null;
const preventContextMenu = (evt: Event) => evt.preventDefault(); const preventContextMenu = (evt: Event) => evt.preventDefault();
let disposeables: (() => void)[] = []; const disposeables: (() => void)[] = [];
const clearLongPressTimer = () => { const clearLongPressTimer = () => {
if (!timer) {
return;
}
clearTimeout(timer); clearTimeout(timer);
timer = null;
for (const dispose of disposeables) { for (const dispose of disposeables) {
dispose(); dispose();
} }
disposeables = []; disposeables.length = 0;
}; };
let startX: number = 0; let startX: number = 0;
@ -162,7 +166,7 @@
}; };
element.addEventListener('click', click); element.addEventListener('click', click);
element.addEventListener('pointerdown', start, true); element.addEventListener('pointerdown', start, true);
element.addEventListener('pointerup', clearLongPressTimer, true); element.addEventListener('pointerup', clearLongPressTimer, { capture: true, passive: true });
return { return {
destroy: () => { destroy: () => {
element.removeEventListener('click', click); element.removeEventListener('click', click);
@ -172,17 +176,15 @@
}; };
} }
function moveHandler(e: PointerEvent) { function moveHandler(e: PointerEvent) {
var diffX = Math.abs(startX - e.clientX); if (Math.abs(startX - e.clientX) >= 10 || Math.abs(startY - e.clientY) >= 10) {
var diffY = Math.abs(startY - e.clientY);
if (diffX >= 10 || diffY >= 10) {
clearLongPressTimer(); clearLongPressTimer();
} }
} }
onMount(() => { onMount(() => {
document.addEventListener('scroll', clearLongPressTimer, true); document.addEventListener('scroll', clearLongPressTimer, { capture: true, passive: true });
document.addEventListener('wheel', clearLongPressTimer, true); document.addEventListener('wheel', clearLongPressTimer, { capture: true, passive: true });
document.addEventListener('contextmenu', clearLongPressTimer, true); document.addEventListener('contextmenu', clearLongPressTimer, { capture: true, passive: true });
document.addEventListener('pointermove', moveHandler, true); document.addEventListener('pointermove', moveHandler, { capture: true, passive: true });
return () => { return () => {
document.removeEventListener('scroll', clearLongPressTimer, true); document.removeEventListener('scroll', clearLongPressTimer, true);
document.removeEventListener('wheel', clearLongPressTimer, true); document.removeEventListener('wheel', clearLongPressTimer, true);

View File

@ -105,9 +105,9 @@
} }
observer.observe(input); observer.observe(input);
const scrollableAncestor = input?.closest('.overflow-y-auto, .overflow-y-scroll'); const scrollableAncestor = input?.closest('.overflow-y-auto, .overflow-y-scroll');
scrollableAncestor?.addEventListener('scroll', onPositionChange); scrollableAncestor?.addEventListener('scroll', onPositionChange, { passive: true });
window.visualViewport?.addEventListener('resize', onPositionChange); window.visualViewport?.addEventListener('resize', onPositionChange, { passive: true });
window.visualViewport?.addEventListener('scroll', onPositionChange); window.visualViewport?.addEventListener('scroll', onPositionChange, { passive: true });
return () => { return () => {
observer.disconnect(); observer.disconnect();

View File

@ -53,7 +53,7 @@
onMount(() => { onMount(() => {
if (browser) { if (browser) {
document.addEventListener('scroll', onScroll); document.addEventListener('scroll', onScroll, { passive: true });
} }
}); });

View File

@ -357,18 +357,18 @@
}; };
/* eslint-enable tscompat/tscompat */ /* eslint-enable tscompat/tscompat */
onMount(() => { onMount(() => {
document.addEventListener('touchmove', onTouchMove, true); document.addEventListener('touchmove', onTouchMove, { capture: true, passive: true });
return () => { return () => {
document.removeEventListener('touchmove', onTouchMove); document.removeEventListener('touchmove', onTouchMove, true);
}; };
}); });
onMount(() => { onMount(() => {
document.addEventListener('touchstart', onTouchStart, true); document.addEventListener('touchstart', onTouchStart, { capture: true, passive: true });
document.addEventListener('touchend', onTouchEnd, true); document.addEventListener('touchend', onTouchEnd, { capture: true, passive: true });
return () => { return () => {
document.addEventListener('touchstart', onTouchStart, true); document.removeEventListener('touchstart', onTouchStart, true);
document.addEventListener('touchend', onTouchEnd, true); document.removeEventListener('touchend', onTouchEnd, true);
}; };
}); });

View File

@ -52,11 +52,15 @@ class ThemeManager {
} }
#onAppInit() { #onAppInit() {
globalThis.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { globalThis.matchMedia('(prefers-color-scheme: dark)').addEventListener(
'change',
() => {
if (this.theme.system) { if (this.theme.system) {
this.#update('system'); this.#update('system');
} }
}); },
{ passive: true },
);
} }
#update(value: Theme | 'system') { #update(value: Theme | 'system') {

View File

@ -67,7 +67,9 @@ export const openFileUploadDialog = async (options: FileUploadParam = {}) => {
fileSelector.type = 'file'; fileSelector.type = 'file';
fileSelector.multiple = multiple; fileSelector.multiple = multiple;
fileSelector.accept = extensions.join(','); fileSelector.accept = extensions.join(',');
fileSelector.addEventListener('change', (e: Event) => { fileSelector.addEventListener(
'change',
(e: Event) => {
const target = e.target as HTMLInputElement; const target = e.target as HTMLInputElement;
if (!target.files) { if (!target.files) {
return; return;
@ -75,7 +77,9 @@ export const openFileUploadDialog = async (options: FileUploadParam = {}) => {
const files = Array.from(target.files); const files = Array.from(target.files);
resolve(fileUploadHandler({ files, albumId, replaceAssetId: assetId })); resolve(fileUploadHandler({ files, albumId, replaceAssetId: assetId }));
}); },
{ passive: true },
);
fileSelector.click(); fileSelector.click();
} catch (error) { } catch (error) {

View File

@ -20,7 +20,7 @@ const handleInstall = (event: ExtendableEvent) => {
event.waitUntil(addFilesToCache()); event.waitUntil(addFilesToCache());
}; };
sw.addEventListener('install', handleInstall); sw.addEventListener('install', handleInstall, { passive: true });
sw.addEventListener('activate', handleActivate); sw.addEventListener('activate', handleActivate, { passive: true });
sw.addEventListener('fetch', handleFetchEvent); sw.addEventListener('fetch', handleFetchEvent, { passive: true });
installBroadcastChannelListener(); installBroadcastChannelListener();