Skip to content

Commit c8b7c18

Browse files
author
Timothy Johnson
committed
Render event handlers
1 parent f43ca7e commit c8b7c18

File tree

7 files changed

+92
-21
lines changed

7 files changed

+92
-21
lines changed

dest/devtools/panel.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
background-color: rgb(48, 64, 81);
4040
color: white;
4141
content: attr(data-tooltip);
42+
white-space: pre;
4243
opacity: 0;
4344
transition: opacity 0.2s;
4445
transform: translateY(100%);

dest/privilegedContent.js

Lines changed: 61 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@
3939
o.push({ key, value, isBound: key in node.detail.$$.bound })
4040
return o
4141
}, []),
42+
listeners: Object.entries(node.detail.$$.callbacks).reduce(
43+
(list, [type, value]) =>
44+
list.concat(value.map(o => ({ type, handler: o.toString() }))),
45+
[]
46+
),
4247
ctx: Object.entries(ctx).map(([key, value]) => ({ key, value }))
4348
}
4449
break
@@ -47,7 +52,13 @@
4752
attributes: Array.from(node.detail.attributes).map(attr => ({
4853
key: attr.name,
4954
value: attr.value
50-
}))
55+
})),
56+
listeners: node.detail._listeners
57+
? node.detail._listeners.map(o => ({
58+
type: o.type,
59+
handler: o.handler.toString()
60+
}))
61+
: []
5162
}
5263

5364
break
@@ -69,6 +80,7 @@
6980

7081
const nodeMap = new Map()
7182
let _id = 0
83+
let svelteDepth = 0
7284
let currentComponent
7385

7486
function addNode(node, target, anchor) {
@@ -90,8 +102,6 @@
90102
}
91103

92104
function onElementAdded(element, target, anchor) {
93-
instrumentElement(element)
94-
95105
addNode(
96106
{
97107
id: _id++,
@@ -114,6 +124,22 @@
114124
}
115125
}
116126

127+
function addEventListener(type, handler, options) {
128+
if (!this._listeners) this._listeners = []
129+
this._listeners.push({ type, handler })
130+
this._addEventListener(type, handler, options)
131+
}
132+
133+
function removeEventListener(type, handler, options) {
134+
if (this._listeners) {
135+
const index = this._listeners.findIndex(
136+
o => o.type == type && o.handler == handler
137+
)
138+
if (index != -1) this._listeners.splice(index, 1)
139+
}
140+
this._removeEventListener(type, handler, options)
141+
}
142+
117143
function appendChild(child) {
118144
onElementAdded(child, this)
119145
this._appendChild(child)
@@ -146,23 +172,30 @@
146172
})
147173
)
148174

149-
function instrumentElement(element) {
150-
if (!element._appendChild) {
151-
element._appendChild = element.appendChild
152-
element.appendChild = appendChild
153-
}
175+
document._createElement = document.createElement
176+
document.createElement = type => {
177+
if (svelteDepth < 1) return document._createElement(type)
154178

155-
if (!element._insertBefore) {
156-
element._insertBefore = element.insertBefore
157-
element.insertBefore = insertBefore
158-
}
179+
const element = document._createElement(type)
159180

160-
if (!element._removeChild) {
161-
element._removeChild = element.removeChild
162-
element.removeChild = removeChild
163-
}
181+
element._addEventListener = element.addEventListener
182+
element.addEventListener = addEventListener
183+
184+
element._removeEventListener = element.removeEventListener
185+
element.removeEventListener = removeEventListener
186+
187+
element._appendChild = element.appendChild
188+
element.appendChild = appendChild
189+
190+
element._insertBefore = element.insertBefore
191+
element.insertBefore = insertBefore
192+
193+
element._removeChild = element.removeChild
194+
element.removeChild = removeChild
164195

165196
observer.observe(element, { characterData: true })
197+
198+
return element
166199
}
167200

168201
document.addEventListener('SvelteRegisterComponent', e => {
@@ -175,10 +208,17 @@
175208
})
176209
})
177210

211+
const createFn = e.detail.component.$$.fragment.c
178212
const mountFn = e.detail.component.$$.fragment.m
179213
const patchFn = e.detail.component.$$.fragment.p
180214
const detachFn = e.detail.component.$$.fragment.d
215+
e.detail.component.$$.fragment.c = () => {
216+
svelteDepth++
217+
createFn()
218+
svelteDepth--
219+
}
181220
e.detail.component.$$.fragment.m = (target, anchor) => {
221+
svelteDepth++
182222
const node = {
183223
id: _id++,
184224
type: 'component',
@@ -188,14 +228,15 @@
188228
}
189229
addNode(node, target, anchor)
190230
currentComponent = node
191-
instrumentElement(target)
192231

193232
mountFn(target, anchor)
194233

195234
currentComponent = currentComponent.parentComponent
235+
svelteDepth--
196236
}
197237

198238
e.detail.component.$$.fragment.p = (changed, ctx) => {
239+
svelteDepth++
199240
const parentComponent = currentComponent
200241
currentComponent = nodeMap.get(e.detail.component)
201242

@@ -206,9 +247,11 @@
206247

207248
patchFn(changed, ctx)
208249
currentComponent = parentComponent
250+
svelteDepth--
209251
}
210252

211253
e.detail.component.$$.fragment.d = detaching => {
254+
svelteDepth++
212255
const node = nodeMap.get(e.detail.component)
213256
nodeMap.delete(node.id)
214257
nodeMap.delete(e.detail.component)
@@ -217,6 +260,7 @@
217260
node: serializeNode(node)
218261
})
219262
detachFn(detaching)
263+
svelteDepth--
220264
}
221265
})
222266

src/nodes/Attributes.svelte

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
<script>
2-
export let values
2+
export let attributes
3+
export let listeners
34
</script>
45

56
<style>
67
.attr-name {
8+
position: relative;
79
color: rgb(221, 0, 169);
810
}
911
@@ -18,7 +20,7 @@
1820
}
1921
</style>
2022

21-
{#each values as { key, value, isBound } (key)}
23+
{#each attributes as { key, value, isBound } (key)}
2224
&nbsp;
2325
<span class="attr-name">
2426
{#if isBound}bind:{/if}
@@ -27,3 +29,8 @@
2729
=
2830
<span class="attr-value">{JSON.stringify(value)}</span>
2931
{/each}
32+
33+
{#each listeners as { type, handler } (type)}
34+
&nbsp;
35+
<span class="attr-name" data-tooltip={handler}>on:{type}</span>
36+
{/each}

src/nodes/Element.svelte

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
export let highlighted
1010
export let tagName
1111
export let attributes = []
12+
export let listeners = []
1213
export let collapsed
1314
</script>
1415

@@ -28,7 +29,7 @@
2829
<Collapse {selected} bind:collapsed />
2930
&lt;
3031
<span>{tagName}</span>
31-
<Attributes values={attributes} />
32+
<Attributes {attributes} {listeners} />
3233
&gt;
3334
{#if collapsed}
3435
...&lt;/
@@ -48,7 +49,7 @@
4849
<div class:hover class:selected {style}>
4950
&lt;
5051
<span>{tagName}</span>
51-
<Attributes values={attributes} />
52+
<Attributes {attributes} {listeners} />
5253
&nbsp;/&gt;
5354
</div>
5455
{/if}

test/src/App.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import Detach from './Detach/Detach.svelte'
44
import Blocks from './Blocks.svelte'
55
import Bind from './Bind/Bind.svelte'
6+
import Events from './Events/Events.svelte'
67
</script>
78

89
<style>
@@ -35,4 +36,5 @@
3536
<Detach />
3637
<Blocks />
3738
<Bind />
39+
<Events />
3840
</div>

test/src/Events/Events.svelte

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<script>
2+
import EventsComponent from './EventsComponent.svelte'
3+
</script>
4+
5+
<p>Render event listeners on elements and components.</p>
6+
7+
<EventsComponent on:click={e => console.log(e.detail)} />
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script>
2+
import { createEventDispatcher } from 'svelte'
3+
4+
const dispatch = createEventDispatcher()
5+
</script>
6+
7+
<button type="button" on:click={() => dispatch('click', 'I was clicked!')}>
8+
Click me!
9+
</button>

0 commit comments

Comments
 (0)