@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
100 lines (83 loc) • 11.1 kB
JavaScript
;
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==