errors.push({ warn }); } if (purposes.size === 0) { const warn = domBundle.formatStringFromName("ManifestImageUnusable", [ aMemberName, index, ]); errors.push({ warn }); throw new TypeError(warn); } return [...purposes]; } function processTypeMember(aImage) { const charset = {}; const hadCharset = {}; const spec = { objectName: "image", object: aImage, property: "type", expectedType: "string", trim: true, }; let value = extractor.extractValue(spec); if (value) { value = Services.io.parseRequestContentType(value, charset, hadCharset); } return value || undefined; } function processSrcMember(aImage, aBaseURL, index) { const spec = { objectName: aMemberName, object: aImage, property: "src", expectedType: "string", trim: false, throwTypeError: true, }; const value = extractor.extractValue(spec); let url; if (typeof value === "undefined" || value === "") { // We throw here as the value is unusable, // but it's not an developer error. throw new TypeError(); } if (value && value.length) { try { url = new URL(value, aBaseURL).href; } catch (e) { const warn = domBundle.formatStringFromName( "ManifestImageURLIsInvalid", [aMemberName, index, "src", value] ); errors.push({ warn }); throw e; } } return url; } function processSizesMember(aImage) { const sizes = new Set(); const spec = { objectName: "image", object: aImage, property: "sizes", expectedType: "string", trim: true, }; const value = extractor.extractValue(spec); if (value) { // Split on whitespace and filter out invalid values. value .split(/\s+/) .filter(isValidSizeValue) .reduce((collector, size) => collector.add(size), sizes); } return sizes.size ? Array.from(sizes) : undefined; // Implementation of HTML's link@size attribute checker. function isValidSizeValue(aSize) { const size = aSize.toLowerCase(); if (ImageObjectProcessor.anyRegEx.test(aSize)) { return true; } if (!size.includes("x") || size.indexOf("x") !== size.lastIndexOf("x")) { return false; } // Split left of x for width, after x for height. const widthAndHeight = size.split("x"); const w = widthAndHeight.shift(); const h = widthAndHeight.join("x"); const validStarts = !w.startsWith("0") && !h.startsWith("0"); const validDecimals = ImageObjectProcessor.decimals.test(w + h); return validStarts && validDecimals; } } }; PK