Harden stub callback dispatch
This commit is contained in:
parent
8fd4da836f
commit
463fa72c30
4 changed files with 45 additions and 3 deletions
|
|
@ -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.
|
||||
//
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {})
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue