Skip to content

Commit 434a587

Browse files
authored
fix: sanitize component event names (#10235)
fixes #9916
1 parent 6b8b57c commit 434a587

File tree

5 files changed

+27
-12
lines changed

5 files changed

+27
-12
lines changed

.changeset/hungry-boxes-relate.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"svelte": patch
3+
---
4+
5+
fix: sanitize component event names

packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -871,14 +871,10 @@ function serialize_inline_component(node, component_name, context) {
871871
if (Object.keys(events).length > 0) {
872872
const events_expression = b.object(
873873
Object.keys(events).map((name) =>
874-
b.prop(
875-
'init',
876-
b.id(name),
877-
events[name].length > 1 ? b.array(events[name]) : events[name][0]
878-
)
874+
b.init(name, events[name].length > 1 ? b.array(events[name]) : events[name][0])
879875
)
880876
);
881-
push_prop(b.prop('init', b.id('$$events'), events_expression));
877+
push_prop(b.init('$$events', events_expression));
882878
}
883879

884880
/** @type {import('estree').Statement[]} */
@@ -932,19 +928,18 @@ function serialize_inline_component(node, component_name, context) {
932928

933929
if (slot_name === 'default') {
934930
push_prop(
935-
b.prop(
936-
'init',
937-
b.id('children'),
931+
b.init(
932+
'children',
938933
context.state.options.dev ? b.call('$.add_snippet_symbol', slot_fn) : slot_fn
939934
)
940935
);
941936
} else {
942-
serialized_slots.push(b.prop('init', b.key(slot_name), slot_fn));
937+
serialized_slots.push(b.init(slot_name, slot_fn));
943938
}
944939
}
945940

946941
if (serialized_slots.length > 0) {
947-
push_prop(b.prop('init', b.id('$$slots'), b.object(serialized_slots)));
942+
push_prop(b.init('$$slots', b.object(serialized_slots)));
948943
}
949944

950945
const props_expression =
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<script>
2+
import { createEventDispatcher } from "svelte";
3+
4+
const dispatch = createEventDispatcher();
5+
</script>
6+
7+
<button on:click={() => dispatch('event-name')}>toggle</button>

packages/svelte/tests/runtime-legacy/samples/event-handler-sanitize/_config.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,32 @@ import { ok, test } from '../../test';
33
export default test({
44
html: `
55
<div>toggle</div>
6+
<button>toggle</button>
67
`,
78

89
async test({ assert, target, window }) {
910
const div = target.querySelector('div');
11+
const button = target.querySelector('button');
1012
ok(div);
13+
ok(button);
1114
const event = new window.MouseEvent('some-event');
1215

1316
await div.dispatchEvent(event);
1417
assert.htmlEqual(
1518
target.innerHTML,
1619
`
1720
<div>toggle</div>
21+
<button>toggle</button>
1822
<p>hello!</p>
1923
`
2024
);
2125

22-
await div.dispatchEvent(event);
26+
await button.click();
2327
assert.htmlEqual(
2428
target.innerHTML,
2529
`
2630
<div>toggle</div>
31+
<button>toggle</button>
2732
`
2833
);
2934
}

packages/svelte/tests/runtime-legacy/samples/event-handler-sanitize/main.svelte

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
<script>
2+
import Component from "./Component.svelte";
3+
24
export let visible;
35
</script>
46

57
<div on:some-event='{() => visible = !visible}'>toggle</div>
8+
<Component on:event-name={() => visible = !visible}></Component>
69

710
{#if visible}
811
<p>hello!</p>

0 commit comments

Comments
 (0)