@@ -107,6 +107,33 @@ function resolveFrame(frame) {
107
107
}
108
108
}
109
109
110
+ function resolveEventBubble ( node ) {
111
+ if ( node . detail . listeners ) {
112
+ for ( const listener of node . detail . listeners ) {
113
+ if ( ! listener . handler . includes ( 'bubble($$self, event)' ) ) continue
114
+
115
+ listener . handler = ( ) => {
116
+ let target = node
117
+ while ( ( target = target . parent ) ) if ( target . type == 'component' ) break
118
+
119
+ const listeners = target . detail . listeners
120
+ if ( ! listeners ) return null
121
+
122
+ const parentListener = listeners . find ( o => o . event == listener . event )
123
+ if ( ! parentListener ) return null
124
+
125
+ const handler = parentListener . handler
126
+ if ( ! handler ) return null
127
+
128
+ return (
129
+ '// From parent\n' +
130
+ ( typeof handler == 'function' ? handler ( ) : handler )
131
+ )
132
+ }
133
+ }
134
+ }
135
+ }
136
+
110
137
port . onMessage . addListener ( msg => {
111
138
switch ( msg . type ) {
112
139
case 'init' : {
@@ -122,6 +149,7 @@ port.onMessage.addListener(msg => {
122
149
node . children = [ ]
123
150
node . collapsed = true
124
151
node . invalidate = noop
152
+ resolveEventBubble ( node )
125
153
126
154
const targetNode = nodeMap . get ( msg . target )
127
155
nodeMap . set ( node . id , node )
@@ -157,6 +185,7 @@ port.onMessage.addListener(msg => {
157
185
case 'updateNode' : {
158
186
const node = nodeMap . get ( msg . node . id )
159
187
Object . assign ( node , msg . node )
188
+ resolveEventBubble ( node )
160
189
161
190
const selected = get ( selectedNode )
162
191
if ( selected && selected . id == msg . node . id ) selectedNode . update ( o => o )
0 commit comments