fix: cleanup event handlers on media elements (#16005)

Co-authored-by: 7nik <kifiranet@gmail.com>
Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com>
pull/16002/head
7nik 4 months ago committed by GitHub
parent fbb6444fd8
commit 94a2bca0e3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: cleanup event handlers on media elements

@ -112,8 +112,15 @@ export function event(event_name, dom, handler, capture, passive) {
var options = { capture, passive };
var target_handler = create_event(event_name, dom, handler, options);
// @ts-ignore
if (dom === document.body || dom === window || dom === document) {
if (
dom === document.body ||
// @ts-ignore
dom === window ||
// @ts-ignore
dom === document ||
// Firefox has quirky behavior, it can happen that we still get "canplay" events when the element is already removed
dom instanceof HTMLMediaElement
) {
teardown(() => {
dom.removeEventListener(event_name, target_handler, options);
});

@ -0,0 +1,20 @@
import { flushSync } from 'svelte';
import { test } from '../../test';
import { expect, vi } from 'vitest';
const handler = vi.fn();
export default test({
props: {
handler
},
async test({ target }) {
const button = target.querySelector('button');
const video = target.querySelector('video');
button?.click();
flushSync();
video?.dispatchEvent(new Event('someevent'));
expect(handler).not.toHaveBeenCalled();
}
});

@ -0,0 +1,9 @@
<script>
const { handler } = $props();
let show = $state(true);
</script>
<button onclick={() => show = false}>show/hide</button>
{#if show}
<video onsomeevent={handler}></video>
{/if}
Loading…
Cancel
Save