Harden menu builder against nil handles
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 21:02:34 +01:00
parent 99cfa72fa1
commit 6f9285a48d
2 changed files with 33 additions and 0 deletions

View file

@ -42,6 +42,9 @@ func (m *Manager) Build(items []MenuItem) PlatformMenu {
}
func (m *Manager) buildItems(menu PlatformMenu, items []MenuItem) {
if m == nil || menu == nil {
return
}
for _, item := range items {
if item.Role != nil {
menu.AddRole(*item.Role)
@ -53,10 +56,16 @@ func (m *Manager) buildItems(menu PlatformMenu, items []MenuItem) {
}
if len(item.Children) > 0 {
sub := menu.AddSubmenu(item.Label)
if sub == nil {
continue
}
m.buildItems(sub, item.Children)
continue
}
mi := menu.Add(item.Label)
if mi == nil {
continue
}
if item.Accelerator != "" {
mi.SetAccelerator(item.Accelerator)
}

View file

@ -104,3 +104,27 @@ func TestManager_SetApplicationMenu_NilReceiver_Good(t *testing.T) {
m.SetApplicationMenu([]MenuItem{{Label: "Test"}})
})
}
type nilMenuPlatform struct{}
func (p *nilMenuPlatform) NewMenu() PlatformMenu { return &nilMenu{} }
func (p *nilMenuPlatform) SetApplicationMenu(menu PlatformMenu) {}
type nilMenu struct{}
func (m *nilMenu) Add(label string) PlatformMenuItem { return nil }
func (m *nilMenu) AddSeparator() {}
func (m *nilMenu) AddSubmenu(label string) PlatformMenu {
return nil
}
func (m *nilMenu) AddRole(role MenuRole) {}
func TestManager_Build_NilMenuHandles_Good(t *testing.T) {
m := NewManager(&nilMenuPlatform{})
assert.NotPanics(t, func() {
assert.NotNil(t, m.Build([]MenuItem{
{Label: "File"},
{Label: "Parent", Children: []MenuItem{{Label: "Child"}}},
}))
})
}