46 lines
1.4 KiB
JavaScript
46 lines
1.4 KiB
JavaScript
import { isStr } from "./utils";
|
|
export const validateContent = (svgContent) => {
|
|
const div = document.createElement('div');
|
|
div.innerHTML = svgContent;
|
|
// setup this way to ensure it works on our buddy IE
|
|
for (let i = div.childNodes.length - 1; i >= 0; i--) {
|
|
if (div.childNodes[i].nodeName.toLowerCase() !== 'svg') {
|
|
div.removeChild(div.childNodes[i]);
|
|
}
|
|
}
|
|
// must only have 1 root element
|
|
const svgElm = div.firstElementChild;
|
|
if (svgElm && svgElm.nodeName.toLowerCase() === 'svg') {
|
|
const svgClass = svgElm.getAttribute('class') || '';
|
|
svgElm.setAttribute('class', (svgClass + ' s-ion-icon').trim());
|
|
// root element must be an svg
|
|
// lets double check we've got valid elements
|
|
// do not allow scripts
|
|
if (isValid(svgElm)) {
|
|
return div.innerHTML;
|
|
}
|
|
}
|
|
return '';
|
|
};
|
|
export const isValid = (elm) => {
|
|
if (elm.nodeType === 1) {
|
|
if (elm.nodeName.toLowerCase() === 'script') {
|
|
return false;
|
|
}
|
|
for (let i = 0; i < elm.attributes.length; i++) {
|
|
const name = elm.attributes[i].name;
|
|
if (isStr(name) && name.toLowerCase().indexOf('on') === 0) {
|
|
return false;
|
|
}
|
|
}
|
|
for (let i = 0; i < elm.childNodes.length; i++) {
|
|
if (!isValid(elm.childNodes[i])) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
export const isSvgDataUrl = (url) => url.startsWith('data:image/svg+xml');
|
|
export const isEncodedDataUrl = (url) => url.indexOf(';utf8,') !== -1;
|