Skip to content

Commit a4bf5e3

Browse files
committed
Merge branch 'main' into experiment_s
2 parents 74c483c + 5419610 commit a4bf5e3

File tree

7 files changed

+126
-1
lines changed

7 files changed

+126
-1
lines changed

.changeset/lemon-llamas-reflect.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: ensure resume effects are scheduled in topological order

.changeset/sour-pots-wonder.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: remove listener on `bind_current_time` teardown

packages/svelte/src/internal/client/dom/elements/bindings/media.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,10 @@ export function bind_current_time(media, get, set = get) {
5252
}
5353
});
5454

55-
teardown(() => cancelAnimationFrame(raf_id));
55+
teardown(() => {
56+
cancelAnimationFrame(raf_id);
57+
media.removeEventListener('timeupdate', callback);
58+
});
5659
}
5760

5861
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { flushSync } from 'svelte';
2+
import { ok, test } from '../../test';
3+
4+
export default test({
5+
async test({ assert, target, logs }) {
6+
const audio = target.querySelector('audio');
7+
const btn = target.querySelector('button');
8+
9+
ok(audio);
10+
11+
flushSync(() => {
12+
audio.currentTime = 10;
13+
audio.dispatchEvent(new Event('timeupdate'));
14+
});
15+
assert.deepEqual(logs, ['event']);
16+
17+
flushSync(() => {
18+
btn?.click();
19+
});
20+
flushSync(() => {
21+
audio.currentTime = 20;
22+
audio.dispatchEvent(new Event('timeupdate'));
23+
});
24+
assert.deepEqual(logs, ['event']);
25+
}
26+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<script>
2+
let show = $state(true);
3+
let time = $state(0);
4+
</script>
5+
6+
<button onclick={()=> show = false}></button>
7+
{#if show}
8+
<audio bind:currentTime={()=>time,(new_time)=>{
9+
console.log("event");
10+
time = new_time;
11+
}}></audio>
12+
{/if}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { flushSync } from '../../../../src/index-client.js';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
async test({ assert, raf, target, logs }) {
6+
assert.htmlEqual(
7+
target.innerHTML,
8+
'<button>Toggle</button><div><div>1</div><div>2</div><div>3</div></div>'
9+
);
10+
11+
const btn1 = target.querySelector('button');
12+
btn1?.click();
13+
flushSync();
14+
raf.tick(250);
15+
16+
assert.htmlEqual(
17+
target.innerHTML,
18+
'<button>Toggle</button><div style="opacity: 0.5;"><div>1</div><div>2</div><div>3</div></div>'
19+
);
20+
21+
logs.length = 0;
22+
23+
await Promise.resolve();
24+
25+
flushSync();
26+
raf.tick(500);
27+
28+
assert.htmlEqual(
29+
target.innerHTML,
30+
'<button>Toggle</button><div style=""><div>3</div><div>4</div></div>'
31+
);
32+
33+
assert.deepEqual(logs, ['$effect.pre', '$effect.pre', '$effect', '$effect']);
34+
}
35+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<script>
2+
function fade(_) {
3+
return {
4+
duration: 500,
5+
css: t => `opacity: ${t}`,
6+
}
7+
}
8+
9+
let toggle = $state(true);
10+
let items = $state([ 1, 2, 3 ]);
11+
12+
const handle_toggle = async () => {
13+
toggle = false;
14+
await Promise.resolve();
15+
items = [3, 4];
16+
toggle = true;
17+
};
18+
</script>
19+
20+
<button onclick={handle_toggle}>Toggle</button>
21+
22+
{#if toggle}
23+
<div transition:fade>
24+
{#each items as item (item)}
25+
{(() => {
26+
$effect(() => {
27+
items;
28+
console.log('$effect');
29+
});
30+
31+
$effect.pre(() => {
32+
items;
33+
console.log('$effect.pre');
34+
});
35+
})()}
36+
<div>{item}</div>
37+
{/each}
38+
</div>
39+
{/if}

0 commit comments

Comments
 (0)