diff --git a/pkg/menu/menu.go b/pkg/menu/menu.go index de3a0119..81c15a89 100644 --- a/pkg/menu/menu.go +++ b/pkg/menu/menu.go @@ -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) } diff --git a/pkg/menu/menu_test.go b/pkg/menu/menu_test.go index dd4cf18e..f4a21f00 100644 --- a/pkg/menu/menu_test.go +++ b/pkg/menu/menu_test.go @@ -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"}}}, + })) + }) +}