123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- 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;
|