diff --git a/src/runtime/internal/transitions.ts b/src/runtime/internal/transitions.ts index 91f243b4d6e8..e3a0b44fc499 100644 --- a/src/runtime/internal/transitions.ts +++ b/src/runtime/internal/transitions.ts @@ -28,15 +28,17 @@ let outros; export function group_outros() { outros = { - remaining: 0, - callbacks: [] + r: 0, // remaining outros + c: [], // callbacks + p: outros // parent group }; } export function check_outros() { - if (!outros.remaining) { - run_all(outros.callbacks); + if (!outros.r) { + run_all(outros.c); } + outros = outros.p; } export function transition_in(block, local?: 0 | 1) { @@ -51,7 +53,7 @@ export function transition_out(block, local: 0 | 1, detach: 0 | 1, callback) { if (outroing.has(block)) return; outroing.add(block); - outros.callbacks.push(() => { + outros.c.push(() => { outroing.delete(block); if (callback) { if (detach) block.d(1); @@ -153,7 +155,7 @@ export function create_out_transition(node: Element & ElementCSSInlineStyle, fn: const group = outros; - group.remaining += 1; + group.r += 1; function go() { const { @@ -178,10 +180,10 @@ export function create_out_transition(node: Element & ElementCSSInlineStyle, fn: dispatch(node, false, 'end'); - if (!--group.remaining) { + if (!--group.r) { // this will result in `end()` being called, // so we don't need to clean up here - run_all(group.callbacks); + run_all(group.c); } return false; @@ -266,7 +268,7 @@ export function create_bidirectional_transition(node: Element & ElementCSSInline if (!b) { // @ts-ignore todo: improve typings program.group = outros; - outros.remaining += 1; + outros.r += 1; } if (running_program) { @@ -309,7 +311,7 @@ export function create_bidirectional_transition(node: Element & ElementCSSInline clear_animation(); } else { // outro — needs to be coordinated - if (!--running_program.group.remaining) run_all(running_program.group.callbacks); + if (!--running_program.group.r) run_all(running_program.group.c); } } diff --git a/test/runtime/samples/each-block-keyed-nested/Child.svelte b/test/runtime/samples/each-block-keyed-nested/Child.svelte new file mode 100644 index 000000000000..e7ed72685038 --- /dev/null +++ b/test/runtime/samples/each-block-keyed-nested/Child.svelte @@ -0,0 +1,5 @@ + + +{id} \ No newline at end of file diff --git a/test/runtime/samples/each-block-keyed-nested/_config.js b/test/runtime/samples/each-block-keyed-nested/_config.js new file mode 100644 index 000000000000..3440874a8cc1 --- /dev/null +++ b/test/runtime/samples/each-block-keyed-nested/_config.js @@ -0,0 +1,16 @@ +export default { + html: ` + 1 + `, + + test({ assert, component, target }) { + component.desks = [ + { + id: 1, + teams: [] + } + ]; + + assert.htmlEqual(target.innerHTML, ''); + } +}; diff --git a/test/runtime/samples/each-block-keyed-nested/main.svelte b/test/runtime/samples/each-block-keyed-nested/main.svelte new file mode 100644 index 000000000000..86f665a5e785 --- /dev/null +++ b/test/runtime/samples/each-block-keyed-nested/main.svelte @@ -0,0 +1,16 @@ + + +{#each desks as desk (desk.id)} + {#each desk.teams as team (team.id)} + + {/each} +{/each} \ No newline at end of file diff --git a/test/runtime/samples/head-detached-in-dynamic-component/A.svelte b/test/runtime/samples/head-detached-in-dynamic-component/A.svelte new file mode 100644 index 000000000000..f05488e3e4e3 --- /dev/null +++ b/test/runtime/samples/head-detached-in-dynamic-component/A.svelte @@ -0,0 +1,5 @@ + + + + +A \ No newline at end of file diff --git a/test/runtime/samples/head-detached-in-dynamic-component/B.svelte b/test/runtime/samples/head-detached-in-dynamic-component/B.svelte new file mode 100644 index 000000000000..943b307cc302 --- /dev/null +++ b/test/runtime/samples/head-detached-in-dynamic-component/B.svelte @@ -0,0 +1,5 @@ + + + + +B \ No newline at end of file diff --git a/test/runtime/samples/head-detached-in-dynamic-component/_config.js b/test/runtime/samples/head-detached-in-dynamic-component/_config.js new file mode 100644 index 000000000000..e18589e10e17 --- /dev/null +++ b/test/runtime/samples/head-detached-in-dynamic-component/_config.js @@ -0,0 +1,15 @@ +export default { + html: ` + A + `, + + test({ assert, component, window }) { + component.x = false; + + const meta = window.document.querySelectorAll('meta'); + + assert.equal(meta.length, 1); + assert.equal(meta[0].name, 'description'); + assert.equal(meta[0].content, 'B'); + } +}; diff --git a/test/runtime/samples/head-detached-in-dynamic-component/main.svelte b/test/runtime/samples/head-detached-in-dynamic-component/main.svelte new file mode 100644 index 000000000000..e4acd7737ad9 --- /dev/null +++ b/test/runtime/samples/head-detached-in-dynamic-component/main.svelte @@ -0,0 +1,8 @@ + + + \ No newline at end of file