Harden stub callback dispatch
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run

This commit is contained in:
Snider 2026-04-17 19:33:54 +01:00
parent 8fd4da836f
commit 463fa72c30
4 changed files with 45 additions and 3 deletions

View file

@ -154,11 +154,22 @@ func (em *EventManager) Emit(name string, data ...any) bool {
if event.IsCancelled() {
break
}
listener.callback(event)
invokeCustomEventListener(listener, event)
}
return event.IsCancelled()
}
func invokeCustomEventListener(listener *customEventListener, event *CustomEvent) {
if listener == nil || listener.callback == nil || event == nil {
return
}
defer func() {
_ = recover()
}()
listener.callback(event)
}
// On registers a persistent listener for the named custom event.
// Returns a cancellation function that removes the listener.
//

View file

@ -98,6 +98,21 @@ func TestEvents_EventManager_Emit_Ugly(t *testing.T) {
assert.Equal(t, 1, calls)
}
func TestEvents_EventManager_Emit_RecoversFromPanic(t *testing.T) {
manager := newEventManager()
calls := 0
manager.On("ready", func(*CustomEvent) {
panic("boom")
})
manager.On("ready", func(*CustomEvent) {
calls++
})
assert.False(t, manager.Emit("ready"))
assert.Equal(t, 1, calls)
}
func TestEvents_EventManager_OnApplicationEvent_Good(t *testing.T) {
manager := newEventManager()
eventType := events.ApplicationEventType(42)

View file

@ -43,13 +43,19 @@ func (m *KeyBindingManager) Remove(accelerator string) {
// Process fires the callback for the given accelerator and returns true if handled.
//
// if manager.Process("CmdOrCtrl+K", window) { return }
func (m *KeyBindingManager) Process(accelerator string, window Window) bool {
func (m *KeyBindingManager) Process(accelerator string, window Window) (handled bool) {
m.mu.RLock()
callback, exists := m.bindings[accelerator]
m.mu.RUnlock()
if exists && callback != nil {
handled = true
defer func() {
if recover() != nil {
handled = false
}
}()
callback(window)
return true
return
}
return false
}

View file

@ -44,6 +44,16 @@ func TestKeyBindingManager_Add_Ugly(t *testing.T) {
assert.Equal(t, 10, calls)
}
func TestKeyBindingManager_Process_RecoversFromPanic(t *testing.T) {
manager := &KeyBindingManager{}
manager.Add("CmdOrCtrl+K", func(Window) {
panic("boom")
})
assert.False(t, manager.Process("CmdOrCtrl+K", nil))
}
func TestKeyBindingManager_Remove_Good(t *testing.T) {
manager := &KeyBindingManager{}
manager.Add("CmdOrCtrl+K", func(Window) {})