in src/parsers/manifestjson.js [994:1051]
validateIcons() {
const icons = [];
if (this.parsedJSON.icons) {
Object.keys(this.parsedJSON.icons).forEach((size) => {
icons.push([size, this.parsedJSON.icons[size]]);
});
}
// Check for default_icon key at each of the action properties
['browser_action', 'page_action', 'sidebar_action'].forEach((key) => {
if (this.parsedJSON[key] && this.parsedJSON[key].default_icon) {
if (typeof this.parsedJSON[key].default_icon === 'string') {
icons.push([null, this.parsedJSON[key].default_icon]);
} else {
Object.keys(this.parsedJSON[key].default_icon).forEach((size) => {
icons.push([size, this.parsedJSON[key].default_icon[size]]);
});
}
}
});
// Check for the theme_icons from the browser_action
if (
this.parsedJSON.browser_action &&
this.parsedJSON.browser_action.theme_icons
) {
this.parsedJSON.browser_action.theme_icons.forEach((icon) => {
['dark', 'light'].forEach((theme) => {
if (icon[theme]) {
icons.push([icon.size, icon[theme]]);
}
});
});
}
const promises = [];
const errorIcons = [];
icons.forEach(([size, iconPath]) => {
const _path = normalizePath(iconPath);
if (!Object.prototype.hasOwnProperty.call(this.io.files, _path)) {
if (!errorIcons.includes(_path)) {
this.collector.addError(messages.manifestIconMissing(_path));
this.isValid = false;
errorIcons.push(_path);
}
} else if (
!IMAGE_FILE_EXTENSIONS.includes(getNormalizedExtension(_path))
) {
if (!errorIcons.includes(_path)) {
this.collector.addWarning(messages.WRONG_ICON_EXTENSION);
}
} else {
promises.push(this.validateIcon(_path, size));
}
});
return Promise.all(promises);
}