From 326b32932cf81ba01005b2757268321460f477cb Mon Sep 17 00:00:00 2001 From: 7nik Date: Tue, 13 May 2025 03:04:48 +0300 Subject: [PATCH] fix: more frequently update `bind:buffered` to actual value (#15874) * fix: more frequently update `bind:buffered` to actual value * small tweak --------- Co-authored-by: 7nik Co-authored-by: Rich Harris --- .changeset/short-impalas-exist.md | 5 +++++ .../client/dom/elements/bindings/media.js | 18 +++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 .changeset/short-impalas-exist.md diff --git a/.changeset/short-impalas-exist.md b/.changeset/short-impalas-exist.md new file mode 100644 index 0000000000..a1f9120c8f --- /dev/null +++ b/.changeset/short-impalas-exist.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: more frequently update `bind:buffered` to actual value diff --git a/packages/svelte/src/internal/client/dom/elements/bindings/media.js b/packages/svelte/src/internal/client/dom/elements/bindings/media.js index 30a8dac1af..f96ee05989 100644 --- a/packages/svelte/src/internal/client/dom/elements/bindings/media.js +++ b/packages/svelte/src/internal/client/dom/elements/bindings/media.js @@ -62,7 +62,23 @@ export function bind_current_time(media, get, set = get) { * @param {(array: Array<{ start: number; end: number }>) => void} set */ export function bind_buffered(media, set) { - listen(media, ['loadedmetadata', 'progress'], () => set(time_ranges_to_array(media.buffered))); + /** @type {{ start: number; end: number; }[]} */ + var current; + + // `buffered` can update without emitting any event, so we check it on various events. + // By specs, `buffered` always returns a new object, so we have to compare deeply. + listen(media, ['loadedmetadata', 'progress', 'timeupdate', 'seeking'], () => { + var ranges = media.buffered; + + if ( + !current || + current.length !== ranges.length || + current.some((range, i) => ranges.start(i) !== range.start || ranges.end(i) !== range.end) + ) { + current = time_ranges_to_array(ranges); + set(current); + } + }); } /**