UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

100 lines (83 loc) 11.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.applySVGInnerHTMLFix = applySVGInnerHTMLFix; exports.SVG_NAMESPACE = void 0; var _util = require("@glimmer/util"); var _operations = require("../dom/operations"); const SVG_NAMESPACE = "http://www.w3.org/2000/svg" /* SVG */ ; // Patch: insertAdjacentHTML on SVG Fix // Browsers: Safari, IE, Edge, Firefox ~33-34 // Reason: insertAdjacentHTML does not exist on SVG elements in Safari. It is // present but throws an exception on IE and Edge. Old versions of // Firefox create nodes in the incorrect namespace. // Fix: Since IE and Edge silently fail to create SVG nodes using // innerHTML, and because Firefox may create nodes in the incorrect // namespace using innerHTML on SVG elements, an HTML-string wrapping // approach is used. A pre/post SVG tag is added to the string, then // that whole string is added to a div. The created nodes are plucked // out and applied to the target location on DOM. exports.SVG_NAMESPACE = SVG_NAMESPACE; function applySVGInnerHTMLFix(document, DOMClass, svgNamespace) { if (!document) return DOMClass; if (!shouldApplyFix(document, svgNamespace)) { return DOMClass; } let div = document.createElement('div'); return class DOMChangesWithSVGInnerHTMLFix extends DOMClass { insertHTMLBefore(parent, nextSibling, html) { if (html === '') { return super.insertHTMLBefore(parent, nextSibling, html); } if (parent.namespaceURI !== svgNamespace) { return super.insertHTMLBefore(parent, nextSibling, html); } return fixSVG(parent, div, html, nextSibling); } }; } function fixSVG(parent, div, html, reference) { false && (0, _util.assert)(html !== '', 'html cannot be empty'); let source; // This is important, because descendants of the <foreignObject> integration // point are parsed in the HTML namespace if (parent.tagName.toUpperCase() === 'FOREIGNOBJECT') { // IE, Edge: also do not correctly support using `innerHTML` on SVG // namespaced elements. So here a wrapper is used. let wrappedHtml = '<svg><foreignObject>' + html + '</foreignObject></svg>'; (0, _util.clearElement)(div); div.insertAdjacentHTML("afterbegin" /* afterbegin */ , wrappedHtml); source = div.firstChild.firstChild; } else { // IE, Edge: also do not correctly support using `innerHTML` on SVG // namespaced elements. So here a wrapper is used. let wrappedHtml = '<svg>' + html + '</svg>'; (0, _util.clearElement)(div); div.insertAdjacentHTML("afterbegin" /* afterbegin */ , wrappedHtml); source = div.firstChild; } return (0, _operations.moveNodesBefore)(source, parent, reference); } function shouldApplyFix(document, svgNamespace) { let svg = document.createElementNS(svgNamespace, 'svg'); try { svg.insertAdjacentHTML("beforeend" /* beforeend */ , '<circle></circle>'); } catch (e) {// IE, Edge: Will throw, insertAdjacentHTML is unsupported on SVG // Safari: Will throw, insertAdjacentHTML is not present on SVG } finally { // FF: Old versions will create a node in the wrong namespace if (svg.childNodes.length === 1 && svg.firstChild.namespaceURI === SVG_NAMESPACE) { // The test worked as expected, no fix required return false; } return true; } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBhdC9zdmctaW5uZXItaHRtbC1maXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFDQTs7QUFRQTs7QUFFTyxNQUFNLGFBQWEsR0FBQTtBQUFBO0FBQW5CLEMsQ0FHUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBQ00sU0FBQSxvQkFBQSxDQUFBLFFBQUEsRUFBQSxRQUFBLEVBQUEsWUFBQSxFQUd1QjtBQUUzQixNQUFJLENBQUosUUFBQSxFQUFlLE9BQUEsUUFBQTs7QUFFZixNQUFJLENBQUMsY0FBYyxDQUFBLFFBQUEsRUFBbkIsWUFBbUIsQ0FBbkIsRUFBNkM7QUFDM0MsV0FBQSxRQUFBO0FBQ0Q7O0FBRUQsTUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFSLGFBQUEsQ0FBVixLQUFVLENBQVY7QUFFQSxTQUFPLE1BQUEsNkJBQUEsU0FBQSxRQUFBLENBQW9EO0FBQ3pELElBQUEsZ0JBQWdCLENBQUEsTUFBQSxFQUFBLFdBQUEsRUFBQSxJQUFBLEVBQXFFO0FBQ25GLFVBQUksSUFBSSxLQUFSLEVBQUEsRUFBaUI7QUFDZixlQUFPLE1BQUEsZ0JBQUEsQ0FBQSxNQUFBLEVBQUEsV0FBQSxFQUFQLElBQU8sQ0FBUDtBQUNEOztBQUVELFVBQUksTUFBTSxDQUFOLFlBQUEsS0FBSixZQUFBLEVBQTBDO0FBQ3hDLGVBQU8sTUFBQSxnQkFBQSxDQUFBLE1BQUEsRUFBQSxXQUFBLEVBQVAsSUFBTyxDQUFQO0FBQ0Q7O0FBRUQsYUFBTyxNQUFNLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxJQUFBLEVBQWIsV0FBYSxDQUFiO0FBQ0Q7O0FBWHdELEdBQTNEO0FBYUQ7O0FBRUQsU0FBQSxNQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxJQUFBLEVBQUEsU0FBQSxFQUkrQjtBQUFBLFdBRTdCLGtCQUFPLElBQUksS0FBTCxFQUFOLEVBRjZCLHNCQUU3QixDQUY2QjtBQUk3QixNQUo2QixNQUk3QixDQUo2QixDQU03QjtBQUNBOztBQUNBLE1BQUksTUFBTSxDQUFOLE9BQUEsQ0FBQSxXQUFBLE9BQUosZUFBQSxFQUFzRDtBQUNwRDtBQUNBO0FBQ0EsUUFBSSxXQUFXLEdBQUcseUJBQUEsSUFBQSxHQUFsQix3QkFBQTtBQUVBLDRCQUFBLEdBQUE7QUFDQSxJQUFBLEdBQUcsQ0FBSCxrQkFBQSxDQUFzQjtBQUFBO0FBQXRCLE1BQUEsV0FBQTtBQUVBLElBQUEsTUFBTSxHQUFHLEdBQUcsQ0FBSCxVQUFBLENBQVQsVUFBQTtBQVJGLEdBQUEsTUFTTztBQUNMO0FBQ0E7QUFDQSxRQUFJLFdBQVcsR0FBRyxVQUFBLElBQUEsR0FBbEIsUUFBQTtBQUVBLDRCQUFBLEdBQUE7QUFDQSxJQUFBLEdBQUcsQ0FBSCxrQkFBQSxDQUFzQjtBQUFBO0FBQXRCLE1BQUEsV0FBQTtBQUVBLElBQUEsTUFBTSxHQUFHLEdBQUcsQ0FBWixVQUFBO0FBQ0Q7O0FBRUQsU0FBTyxpQ0FBZSxNQUFmLEVBQWUsTUFBZixFQUFQLFNBQU8sQ0FBUDtBQUNEOztBQUVELFNBQUEsY0FBQSxDQUFBLFFBQUEsRUFBQSxZQUFBLEVBQTZFO0FBQzNFLE1BQUksR0FBRyxHQUFHLFFBQVEsQ0FBUixlQUFBLENBQUEsWUFBQSxFQUFWLEtBQVUsQ0FBVjs7QUFFQSxNQUFJO0FBQ0YsSUFBQSxHQUFHLENBQUgsa0JBQUEsQ0FBc0I7QUFBQTtBQUF0QixNQUFBLG1CQUFBO0FBREYsR0FBQSxDQUVFLE9BQUEsQ0FBQSxFQUFVLENBQ1Y7QUFDQTtBQUpGLEdBQUEsU0FLVTtBQUNSO0FBQ0EsUUFDRSxHQUFHLENBQUgsVUFBQSxDQUFBLE1BQUEsS0FBQSxDQUFBLElBQ3FCLEdBQUcsQ0FBeEIsVUFBcUIsQ0FBckIsWUFBcUIsS0FGdkIsYUFBQSxFQUdFO0FBQ0E7QUFDQSxhQUFBLEtBQUE7QUFDRDs7QUFFRCxXQUFBLElBQUE7QUFDRDtBQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQm91bmRzLCBPcHRpb24gfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydCwgY2FzdFRvQnJvd3NlciwgY2xlYXJFbGVtZW50LCB1bndyYXAgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7XG4gIEluc2VydFBvc2l0aW9uLFxuICBOYW1lc3BhY2UsXG4gIFNpbXBsZURvY3VtZW50LFxuICBTaW1wbGVFbGVtZW50LFxuICBTaW1wbGVOb2RlLFxufSBmcm9tICdAc2ltcGxlLWRvbS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRE9NT3BlcmF0aW9ucywgbW92ZU5vZGVzQmVmb3JlIH0gZnJvbSAnLi4vZG9tL29wZXJhdGlvbnMnO1xuXG5leHBvcnQgY29uc3QgU1ZHX05BTUVTUEFDRSA9IE5hbWVzcGFjZS5TVkc7XG5leHBvcnQgdHlwZSBTVkdfTkFNRVNQQUNFID0gdHlwZW9mIFNWR19OQU1FU1BBQ0U7XG5cbi8vIFBhdGNoOiAgICBpbnNlcnRBZGphY2VudEhUTUwgb24gU1ZHIEZpeFxuLy8gQnJvd3NlcnM6IFNhZmFyaSwgSUUsIEVkZ2UsIEZpcmVmb3ggfjMzLTM0XG4vLyBSZWFzb246ICAgaW5zZXJ0QWRqYWNlbnRIVE1MIGRvZXMgbm90IGV4aXN0IG9uIFNWRyBlbGVtZW50cyBpbiBTYWZhcmkuIEl0IGlzXG4vLyAgICAgICAgICAgcHJlc2VudCBidXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvbiBJRSBhbmQgRWRnZS4gT2xkIHZlcnNpb25zIG9mXG4vLyAgICAgICAgICAgRmlyZWZveCBjcmVhdGUgbm9kZXMgaW4gdGhlIGluY29ycmVjdCBuYW1lc3BhY2UuXG4vLyBGaXg6ICAgICAgU2luY2UgSUUgYW5kIEVkZ2Ugc2lsZW50bHkgZmFpbCB0byBjcmVhdGUgU1ZHIG5vZGVzIHVzaW5nXG4vLyAgICAgICAgICAgaW5uZXJIVE1MLCBhbmQgYmVjYXVzZSBGaXJlZm94IG1heSBjcmVhdGUgbm9kZXMgaW4gdGhlIGluY29ycmVjdFxuLy8gICAgICAgICAgIG5hbWVzcGFjZSB1c2luZyBpbm5lckhUTUwgb24gU1ZHIGVsZW1lbnRzLCBhbiBIVE1MLXN0cmluZyB3cmFwcGluZ1xuLy8gICAgICAgICAgIGFwcHJvYWNoIGlzIHVzZWQuIEEgcHJlL3Bvc3QgU1ZHIHRhZyBpcyBhZGRlZCB0byB0aGUgc3RyaW5nLCB0aGVuXG4vLyAgICAgICAgICAgdGhhdCB3aG9sZSBzdHJpbmcgaXMgYWRkZWQgdG8gYSBkaXYuIFRoZSBjcmVhdGVkIG5vZGVzIGFyZSBwbHVja2VkXG4vLyAgICAgICAgICAgb3V0IGFuZCBhcHBsaWVkIHRvIHRoZSB0YXJnZXQgbG9jYXRpb24gb24gRE9NLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U1ZHSW5uZXJIVE1MRml4KFxuICBkb2N1bWVudDogT3B0aW9uPFNpbXBsZURvY3VtZW50PixcbiAgRE9NQ2xhc3M6IHR5cGVvZiBET01PcGVyYXRpb25zLFxuICBzdmdOYW1lc3BhY2U6IFNWR19OQU1FU1BBQ0Vcbik6IHR5cGVvZiBET01PcGVyYXRpb25zIHtcbiAgaWYgKCFkb2N1bWVudCkgcmV0dXJuIERPTUNsYXNzO1xuXG4gIGlmICghc2hvdWxkQXBwbHlGaXgoZG9jdW1lbnQsIHN2Z05hbWVzcGFjZSkpIHtcbiAgICByZXR1cm4gRE9NQ2xhc3M7XG4gIH1cblxuICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykgYXMgU2ltcGxlRWxlbWVudDtcblxuICByZXR1cm4gY2xhc3MgRE9NQ2hhbmdlc1dpdGhTVkdJbm5lckhUTUxGaXggZXh0ZW5kcyBET01DbGFzcyB7XG4gICAgaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnQ6IFNpbXBsZUVsZW1lbnQsIG5leHRTaWJsaW5nOiBPcHRpb248U2ltcGxlTm9kZT4sIGh0bWw6IHN0cmluZyk6IEJvdW5kcyB7XG4gICAgICBpZiAoaHRtbCA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmluc2VydEhUTUxCZWZvcmUocGFyZW50LCBuZXh0U2libGluZywgaHRtbCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJICE9PSBzdmdOYW1lc3BhY2UpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmluc2VydEhUTUxCZWZvcmUocGFyZW50LCBuZXh0U2libGluZywgaHRtbCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaXhTVkcocGFyZW50LCBkaXYsIGh0bWwsIG5leHRTaWJsaW5nKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpeFNWRyhcbiAgcGFyZW50OiBTaW1wbGVFbGVtZW50LFxuICBkaXY6IFNpbXBsZUVsZW1lbnQsXG4gIGh0bWw6IHN0cmluZyxcbiAgcmVmZXJlbmNlOiBPcHRpb248U2ltcGxlTm9kZT5cbik6IEJvdW5kcyB7XG4gIGFzc2VydChodG1sICE9PSAnJywgJ2h0bWwgY2Fubm90IGJlIGVtcHR5Jyk7XG5cbiAgbGV0IHNvdXJjZTogU2ltcGxlTm9kZTtcblxuICAvLyBUaGlzIGlzIGltcG9ydGFudCwgYmVjYXVzZSBkZXNjZW5kYW50cyBvZiB0aGUgPGZvcmVpZ25PYmplY3Q+IGludGVncmF0aW9uXG4gIC8vIHBvaW50IGFyZSBwYXJzZWQgaW4gdGhlIEhUTUwgbmFtZXNwYWNlXG4gIGlmIChwYXJlbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnRk9SRUlHTk9CSkVDVCcpIHtcbiAgICAvLyBJRSwgRWRnZTogYWxzbyBkbyBub3QgY29ycmVjdGx5IHN1cHBvcnQgdXNpbmcgYGlubmVySFRNTGAgb24gU1ZHXG4gICAgLy8gbmFtZXNwYWNlZCBlbGVtZW50cy4gU28gaGVyZSBhIHdyYXBwZXIgaXMgdXNlZC5cbiAgICBsZXQgd3JhcHBlZEh0bWwgPSAnPHN2Zz48Zm9yZWlnbk9iamVjdD4nICsgaHRtbCArICc8L2ZvcmVpZ25PYmplY3Q+PC9zdmc+JztcblxuICAgIGNsZWFyRWxlbWVudChkaXYpO1xuICAgIGRpdi5pbnNlcnRBZGphY2VudEhUTUwoSW5zZXJ0UG9zaXRpb24uYWZ0ZXJiZWdpbiwgd3JhcHBlZEh0bWwpO1xuXG4gICAgc291cmNlID0gZGl2LmZpcnN0Q2hpbGQhLmZpcnN0Q2hpbGQhO1xuICB9IGVsc2Uge1xuICAgIC8vIElFLCBFZGdlOiBhbHNvIGRvIG5vdCBjb3JyZWN0bHkgc3VwcG9ydCB1c2luZyBgaW5uZXJIVE1MYCBvbiBTVkdcbiAgICAvLyBuYW1lc3BhY2VkIGVsZW1lbnRzLiBTbyBoZXJlIGEgd3JhcHBlciBpcyB1c2VkLlxuICAgIGxldCB3cmFwcGVkSHRtbCA9ICc8c3ZnPicgKyBodG1sICsgJzwvc3ZnPic7XG5cbiAgICBjbGVhckVsZW1lbnQoZGl2KTtcbiAgICBkaXYuaW5zZXJ0QWRqYWNlbnRIVE1MKEluc2VydFBvc2l0aW9uLmFmdGVyYmVnaW4sIHdyYXBwZWRIdG1sKTtcblxuICAgIHNvdXJjZSA9IGRpdi5maXJzdENoaWxkITtcbiAgfVxuXG4gIHJldHVybiBtb3ZlTm9kZXNCZWZvcmUoc291cmNlLCBwYXJlbnQsIHJlZmVyZW5jZSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEFwcGx5Rml4KGRvY3VtZW50OiBTaW1wbGVEb2N1bWVudCwgc3ZnTmFtZXNwYWNlOiBTVkdfTkFNRVNQQUNFKSB7XG4gIGxldCBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoc3ZnTmFtZXNwYWNlLCAnc3ZnJyk7XG5cbiAgdHJ5IHtcbiAgICBzdmcuaW5zZXJ0QWRqYWNlbnRIVE1MKEluc2VydFBvc2l0aW9uLmJlZm9yZWVuZCwgJzxjaXJjbGU+PC9jaXJjbGU+Jyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJRSwgRWRnZTogV2lsbCB0aHJvdywgaW5zZXJ0QWRqYWNlbnRIVE1MIGlzIHVuc3VwcG9ydGVkIG9uIFNWR1xuICAgIC8vIFNhZmFyaTogV2lsbCB0aHJvdywgaW5zZXJ0QWRqYWNlbnRIVE1MIGlzIG5vdCBwcmVzZW50IG9uIFNWR1xuICB9IGZpbmFsbHkge1xuICAgIC8vIEZGOiBPbGQgdmVyc2lvbnMgd2lsbCBjcmVhdGUgYSBub2RlIGluIHRoZSB3cm9uZyBuYW1lc3BhY2VcbiAgICBpZiAoXG4gICAgICBzdmcuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgJiZcbiAgICAgIGNhc3RUb0Jyb3dzZXIodW53cmFwKHN2Zy5maXJzdENoaWxkKSwgJ1NWRycpLm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRVxuICAgICkge1xuICAgICAgLy8gVGhlIHRlc3Qgd29ya2VkIGFzIGV4cGVjdGVkLCBubyBmaXggcmVxdWlyZWRcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==