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