diff --git a/app/common/lib/menuUtil.js b/app/common/lib/menuUtil.js index 818eb0b5001..63841056e69 100644 --- a/app/common/lib/menuUtil.js +++ b/app/common/lib/menuUtil.js @@ -151,20 +151,19 @@ const isItemValid = (currentItem, previousItem) => { return false } } - return currentItem && (typeof currentItem.l10nLabelId === 'string' || typeof currentItem.label === 'string' || currentItem.type === 'separator') + + return currentItem && (typeof currentItem.l10nLabelId === 'string' || typeof currentItem.label === 'string' || + currentItem.type === 'separator' || typeof currentItem.slice === 'function') } -/** - * Remove invalid entries from a menu template: - * - null or falsey entries - * - extra menu separators - * - entries which don't have a label (or l10nLabelId) if their type is not 'separator' - */ -module.exports.sanitizeTemplateItems = (template) => { +const sanitizeTemplateItems = (template) => { const reduced = template.reduce((result, currentValue, currentIndex, array) => { const previousItem = result.length > 0 ? result[result.length - 1] : undefined + if (currentValue && currentValue.submenu) { + currentValue.submenu = sanitizeTemplateItems(currentValue.submenu) + } if (isItemValid(currentValue, previousItem)) { result.push(currentValue) } @@ -185,3 +184,11 @@ module.exports.sanitizeTemplateItems = (template) => { return result } + +/** + * Remove invalid entries from a menu template: + * - null or falsey entries + * - extra menu separators + * - entries which don't have a label (or l10nLabelId) if their type is not 'separator' + */ +module.exports.sanitizeTemplateItems = sanitizeTemplateItems diff --git a/test/unit/app/common/lib/menuUtilTest.js b/test/unit/app/common/lib/menuUtilTest.js index 64a6c98b464..ba3a1f3bd3c 100644 --- a/test/unit/app/common/lib/menuUtilTest.js +++ b/test/unit/app/common/lib/menuUtilTest.js @@ -255,6 +255,14 @@ describe('menuUtil tests', function () { const expectedResult = [{l10nLabelId: 'lol1'}] assert.deepEqual(result, expectedResult) }) + it('checks submenus recursively', function () { + const template = [separator, {test: 'test'}, {label: 'lol'}, + { label: 'submenu', submenu: [separator, {label: 'foo'}] }] + const result = menuUtil.sanitizeTemplateItems(template) + const expectedResult = [{label: 'lol'}, {label: 'submenu', submenu: [{label: 'foo'}]}] + + assert.deepEqual(result, expectedResult) + }) it('removes items which are missing label or type', function () { const template = [{}, {test: 'test'}, {label: 'lol'}] const result = menuUtil.sanitizeTemplateItems(template)