Skip to content

Commit c32a918

Browse files
authored
fix: ensure event handlers referencing $host are not hoisted (#12775)
1 parent 9ff33f1 commit c32a918

File tree

4 files changed

+18
-6
lines changed

4 files changed

+18
-6
lines changed

.changeset/smooth-windows-explain.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: ensure event handlers referencing $host are not hoisted

packages/svelte/src/compiler/phases/2-analyze/visitors/Attribute.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ function get_delegated_event(event_name, handler, context) {
155155
const visited_references = new Set();
156156
const scope = target_function.metadata.scope;
157157
for (const [reference] of scope.references) {
158-
// Bail out if the arguments keyword is used
159-
if (reference === 'arguments') return unhoisted;
158+
// Bail out if the arguments keyword is used or $host is referenced
159+
if (reference === 'arguments' || reference === '$host') return unhoisted;
160160
// Bail out if references a store subscription
161161
if (scope.get(`$${reference}`)?.kind === 'store_sub') return unhoisted;
162162

packages/svelte/tests/runtime-browser/custom-elements-samples/host-rune/_config.js

+6-4
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ export default test({
1414

1515
await tick();
1616

17-
el.shadowRoot.querySelector('button').click();
18-
assert.deepEqual(events, ['greeting', 'hello']);
17+
el.shadowRoot.querySelectorAll('button')[0].click();
18+
el.shadowRoot.querySelectorAll('button')[1].click();
19+
assert.deepEqual(events, ['greeting', 'hello', 'greeting', 'welcome']);
1920

2021
el.removeEventListener('greeting', handle_evt);
21-
el.shadowRoot.querySelector('button').click();
22-
assert.deepEqual(events, ['greeting', 'hello']);
22+
el.shadowRoot.querySelectorAll('button')[0].click();
23+
el.shadowRoot.querySelectorAll('button')[1].click();
24+
assert.deepEqual(events, ['greeting', 'hello', 'greeting', 'welcome']);
2325
}
2426
});

packages/svelte/tests/runtime-browser/custom-elements-samples/host-rune/main.svelte

+5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
function greet(greeting) {
55
$host().dispatchEvent(new CustomEvent('greeting', { detail: greeting }))
66
}
7+
8+
function welcome() {
9+
$host().dispatchEvent(new CustomEvent('greeting', { detail: 'welcome' }))
10+
}
711
</script>
812

913
<button onclick={() => greet('hello')}>say hello</button>
14+
<button onclick={welcome}>say welcome</button>

0 commit comments

Comments
 (0)