UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

116 lines (94 loc) 12 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"); function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } var 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; } var div = document.createElement('div'); return /*#__PURE__*/function (_DOMClass) { _inheritsLoose(DOMChangesWithSVGInnerHTMLFix, _DOMClass); function DOMChangesWithSVGInnerHTMLFix() { return _DOMClass.apply(this, arguments) || this; } var _proto = DOMChangesWithSVGInnerHTMLFix.prototype; _proto.insertHTMLBefore = function insertHTMLBefore(parent, nextSibling, html) { if (html === '') { return _DOMClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html); } if (parent.namespaceURI !== svgNamespace) { return _DOMClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html); } return fixSVG(parent, div, html, nextSibling); }; return DOMChangesWithSVGInnerHTMLFix; }(DOMClass); } function fixSVG(parent, div, html, reference) { false && (0, _util.assert)(html !== '', 'html cannot be empty'); var 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. var 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. var _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) { var 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBhdC9zdmctaW5uZXItaHRtbC1maXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFDQTs7QUFRQTs7Ozs7Ozs7QUFFTyxJQUFNLGFBQWEsR0FBQTtBQUFBO0FBQW5CLEMsQ0FHUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBQ00sU0FBQSxvQkFBQSxDQUFBLFFBQUEsRUFBQSxRQUFBLEVBQUEsWUFBQSxFQUd1QjtBQUUzQixNQUFJLENBQUosUUFBQSxFQUFlLE9BQUEsUUFBQTs7QUFFZixNQUFJLENBQUMsY0FBYyxDQUFBLFFBQUEsRUFBbkIsWUFBbUIsQ0FBbkIsRUFBNkM7QUFDM0MsV0FBQSxRQUFBO0FBQ0Q7O0FBRUQsTUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFSLGFBQUEsQ0FBVixLQUFVLENBQVY7QUFFQSxTQUFBLGFBQUEsVUFBQSxTQUFBLEVBQUE7QUFBQSxJQUFBLGNBQUEsQ0FBQSw2QkFBQSxFQUFBLFNBQUEsQ0FBQTs7QUFBQSxhQUFBLDZCQUFBLEdBQUE7QUFBQSxhQUFBLFNBQUEsQ0FBQSxLQUFBLENBQUEsSUFBQSxFQUFBLFNBQUEsS0FBQSxJQUFBO0FBQUE7O0FBQUEsUUFBQSxNQUFBLEdBQUEsNkJBQUEsQ0FBQSxTQUFBOztBQUFBLElBQUEsTUFBQSxDQUFBLGdCQUFBLEdBQ0UsU0FBQSxnQkFBQSxDQUFBLE1BQUEsRUFBQSxXQUFBLEVBQUEsSUFBQSxFQUFxRjtBQUNuRixVQUFJLElBQUksS0FBUixFQUFBLEVBQWlCO0FBQ2YsZUFBQSxTQUFBLENBQUEsU0FBQSxDQUFBLGdCQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsRUFBQSxNQUFBLEVBQUEsV0FBQSxFQUFBLElBQUEsQ0FBQTtBQUNEOztBQUVELFVBQUksTUFBTSxDQUFOLFlBQUEsS0FBSixZQUFBLEVBQTBDO0FBQ3hDLGVBQUEsU0FBQSxDQUFBLFNBQUEsQ0FBQSxnQkFBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLEVBQUEsTUFBQSxFQUFBLFdBQUEsRUFBQSxJQUFBLENBQUE7QUFDRDs7QUFFRCxhQUFPLE1BQU0sQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLElBQUEsRUFBYixXQUFhLENBQWI7QUFWSixLQUFBOztBQUFBLFdBQUEsNkJBQUE7QUFBQSxHQUFBLENBQUEsUUFBQSxDQUFBO0FBYUQ7O0FBRUQsU0FBQSxNQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxJQUFBLEVBQUEsU0FBQSxFQUkrQjtBQUFBLFdBRTdCLGtCQUFPLElBQUksS0FBTCxFQUFOLEVBRjZCLHNCQUU3QixDQUY2QjtBQUk3QixNQUo2QixNQUk3QixDQUo2QixDQU03QjtBQUNBOztBQUNBLE1BQUksTUFBTSxDQUFOLE9BQUEsQ0FBQSxXQUFBLE9BQUosZUFBQSxFQUFzRDtBQUNwRDtBQUNBO0FBQ0EsUUFBSSxXQUFXLEdBQUcseUJBQUEsSUFBQSxHQUFsQix3QkFBQTtBQUVBLDRCQUFBLEdBQUE7QUFDQSxJQUFBLEdBQUcsQ0FBSCxrQkFBQSxDQUFzQjtBQUFBO0FBQXRCLE1BQUEsV0FBQTtBQUVBLElBQUEsTUFBTSxHQUFHLEdBQUcsQ0FBSCxVQUFBLENBQVQsVUFBQTtBQVJGLEdBQUEsTUFTTztBQUNMO0FBQ0E7QUFDQSxRQUFJLFlBQVcsR0FBRyxVQUFBLElBQUEsR0FBbEIsUUFBQTs7QUFFQSw0QkFBQSxHQUFBO0FBQ0EsSUFBQSxHQUFHLENBQUgsa0JBQUEsQ0FBc0I7QUFBQTtBQUF0QixNQUFBLFlBQUE7QUFFQSxJQUFBLE1BQU0sR0FBRyxHQUFHLENBQVosVUFBQTtBQUNEOztBQUVELFNBQU8saUNBQWUsTUFBZixFQUFlLE1BQWYsRUFBUCxTQUFPLENBQVA7QUFDRDs7QUFFRCxTQUFBLGNBQUEsQ0FBQSxRQUFBLEVBQUEsWUFBQSxFQUE2RTtBQUMzRSxNQUFJLEdBQUcsR0FBRyxRQUFRLENBQVIsZUFBQSxDQUFBLFlBQUEsRUFBVixLQUFVLENBQVY7O0FBRUEsTUFBSTtBQUNGLElBQUEsR0FBRyxDQUFILGtCQUFBLENBQXNCO0FBQUE7QUFBdEIsTUFBQSxtQkFBQTtBQURGLEdBQUEsQ0FFRSxPQUFBLENBQUEsRUFBVSxDQUNWO0FBQ0E7QUFKRixHQUFBLFNBS1U7QUFDUjtBQUNBLFFBQ0UsR0FBRyxDQUFILFVBQUEsQ0FBQSxNQUFBLEtBQUEsQ0FBQSxJQUNxQixHQUFHLENBQXhCLFVBQXFCLENBQXJCLFlBQXFCLEtBRnZCLGFBQUEsRUFHRTtBQUNBO0FBQ0EsYUFBQSxLQUFBO0FBQ0Q7O0FBRUQsV0FBQSxJQUFBO0FBQ0Q7QUFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJvdW5kcywgT3B0aW9uIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBhc3NlcnQsIGNhc3RUb0Jyb3dzZXIsIGNsZWFyRWxlbWVudCwgdW53cmFwIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQge1xuICBJbnNlcnRQb3NpdGlvbixcbiAgTmFtZXNwYWNlLFxuICBTaW1wbGVEb2N1bWVudCxcbiAgU2ltcGxlRWxlbWVudCxcbiAgU2ltcGxlTm9kZSxcbn0gZnJvbSAnQHNpbXBsZS1kb20vaW50ZXJmYWNlJztcbmltcG9ydCB7IERPTU9wZXJhdGlvbnMsIG1vdmVOb2Rlc0JlZm9yZSB9IGZyb20gJy4uL2RvbS9vcGVyYXRpb25zJztcblxuZXhwb3J0IGNvbnN0IFNWR19OQU1FU1BBQ0UgPSBOYW1lc3BhY2UuU1ZHO1xuZXhwb3J0IHR5cGUgU1ZHX05BTUVTUEFDRSA9IHR5cGVvZiBTVkdfTkFNRVNQQUNFO1xuXG4vLyBQYXRjaDogICAgaW5zZXJ0QWRqYWNlbnRIVE1MIG9uIFNWRyBGaXhcbi8vIEJyb3dzZXJzOiBTYWZhcmksIElFLCBFZGdlLCBGaXJlZm94IH4zMy0zNFxuLy8gUmVhc29uOiAgIGluc2VydEFkamFjZW50SFRNTCBkb2VzIG5vdCBleGlzdCBvbiBTVkcgZWxlbWVudHMgaW4gU2FmYXJpLiBJdCBpc1xuLy8gICAgICAgICAgIHByZXNlbnQgYnV0IHRocm93cyBhbiBleGNlcHRpb24gb24gSUUgYW5kIEVkZ2UuIE9sZCB2ZXJzaW9ucyBvZlxuLy8gICAgICAgICAgIEZpcmVmb3ggY3JlYXRlIG5vZGVzIGluIHRoZSBpbmNvcnJlY3QgbmFtZXNwYWNlLlxuLy8gRml4OiAgICAgIFNpbmNlIElFIGFuZCBFZGdlIHNpbGVudGx5IGZhaWwgdG8gY3JlYXRlIFNWRyBub2RlcyB1c2luZ1xuLy8gICAgICAgICAgIGlubmVySFRNTCwgYW5kIGJlY2F1c2UgRmlyZWZveCBtYXkgY3JlYXRlIG5vZGVzIGluIHRoZSBpbmNvcnJlY3Rcbi8vICAgICAgICAgICBuYW1lc3BhY2UgdXNpbmcgaW5uZXJIVE1MIG9uIFNWRyBlbGVtZW50cywgYW4gSFRNTC1zdHJpbmcgd3JhcHBpbmdcbi8vICAgICAgICAgICBhcHByb2FjaCBpcyB1c2VkLiBBIHByZS9wb3N0IFNWRyB0YWcgaXMgYWRkZWQgdG8gdGhlIHN0cmluZywgdGhlblxuLy8gICAgICAgICAgIHRoYXQgd2hvbGUgc3RyaW5nIGlzIGFkZGVkIHRvIGEgZGl2LiBUaGUgY3JlYXRlZCBub2RlcyBhcmUgcGx1Y2tlZFxuLy8gICAgICAgICAgIG91dCBhbmQgYXBwbGllZCB0byB0aGUgdGFyZ2V0IGxvY2F0aW9uIG9uIERPTS5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNWR0lubmVySFRNTEZpeChcbiAgZG9jdW1lbnQ6IE9wdGlvbjxTaW1wbGVEb2N1bWVudD4sXG4gIERPTUNsYXNzOiB0eXBlb2YgRE9NT3BlcmF0aW9ucyxcbiAgc3ZnTmFtZXNwYWNlOiBTVkdfTkFNRVNQQUNFXG4pOiB0eXBlb2YgRE9NT3BlcmF0aW9ucyB7XG4gIGlmICghZG9jdW1lbnQpIHJldHVybiBET01DbGFzcztcblxuICBpZiAoIXNob3VsZEFwcGx5Rml4KGRvY3VtZW50LCBzdmdOYW1lc3BhY2UpKSB7XG4gICAgcmV0dXJuIERPTUNsYXNzO1xuICB9XG5cbiAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpIGFzIFNpbXBsZUVsZW1lbnQ7XG5cbiAgcmV0dXJuIGNsYXNzIERPTUNoYW5nZXNXaXRoU1ZHSW5uZXJIVE1MRml4IGV4dGVuZHMgRE9NQ2xhc3Mge1xuICAgIGluc2VydEhUTUxCZWZvcmUocGFyZW50OiBTaW1wbGVFbGVtZW50LCBuZXh0U2libGluZzogT3B0aW9uPFNpbXBsZU5vZGU+LCBodG1sOiBzdHJpbmcpOiBCb3VuZHMge1xuICAgICAgaWYgKGh0bWwgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5pbnNlcnRIVE1MQmVmb3JlKHBhcmVudCwgbmV4dFNpYmxpbmcsIGh0bWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSAhPT0gc3ZnTmFtZXNwYWNlKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5pbnNlcnRIVE1MQmVmb3JlKHBhcmVudCwgbmV4dFNpYmxpbmcsIGh0bWwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZml4U1ZHKHBhcmVudCwgZGl2LCBodG1sLCBuZXh0U2libGluZyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBmaXhTVkcoXG4gIHBhcmVudDogU2ltcGxlRWxlbWVudCxcbiAgZGl2OiBTaW1wbGVFbGVtZW50LFxuICBodG1sOiBzdHJpbmcsXG4gIHJlZmVyZW5jZTogT3B0aW9uPFNpbXBsZU5vZGU+XG4pOiBCb3VuZHMge1xuICBhc3NlcnQoaHRtbCAhPT0gJycsICdodG1sIGNhbm5vdCBiZSBlbXB0eScpO1xuXG4gIGxldCBzb3VyY2U6IFNpbXBsZU5vZGU7XG5cbiAgLy8gVGhpcyBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgZGVzY2VuZGFudHMgb2YgdGhlIDxmb3JlaWduT2JqZWN0PiBpbnRlZ3JhdGlvblxuICAvLyBwb2ludCBhcmUgcGFyc2VkIGluIHRoZSBIVE1MIG5hbWVzcGFjZVxuICBpZiAocGFyZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0ZPUkVJR05PQkpFQ1QnKSB7XG4gICAgLy8gSUUsIEVkZ2U6IGFsc28gZG8gbm90IGNvcnJlY3RseSBzdXBwb3J0IHVzaW5nIGBpbm5lckhUTUxgIG9uIFNWR1xuICAgIC8vIG5hbWVzcGFjZWQgZWxlbWVudHMuIFNvIGhlcmUgYSB3cmFwcGVyIGlzIHVzZWQuXG4gICAgbGV0IHdyYXBwZWRIdG1sID0gJzxzdmc+PGZvcmVpZ25PYmplY3Q+JyArIGh0bWwgKyAnPC9mb3JlaWduT2JqZWN0Pjwvc3ZnPic7XG5cbiAgICBjbGVhckVsZW1lbnQoZGl2KTtcbiAgICBkaXYuaW5zZXJ0QWRqYWNlbnRIVE1MKEluc2VydFBvc2l0aW9uLmFmdGVyYmVnaW4sIHdyYXBwZWRIdG1sKTtcblxuICAgIHNvdXJjZSA9IGRpdi5maXJzdENoaWxkIS5maXJzdENoaWxkITtcbiAgfSBlbHNlIHtcbiAgICAvLyBJRSwgRWRnZTogYWxzbyBkbyBub3QgY29ycmVjdGx5IHN1cHBvcnQgdXNpbmcgYGlubmVySFRNTGAgb24gU1ZHXG4gICAgLy8gbmFtZXNwYWNlZCBlbGVtZW50cy4gU28gaGVyZSBhIHdyYXBwZXIgaXMgdXNlZC5cbiAgICBsZXQgd3JhcHBlZEh0bWwgPSAnPHN2Zz4nICsgaHRtbCArICc8L3N2Zz4nO1xuXG4gICAgY2xlYXJFbGVtZW50KGRpdik7XG4gICAgZGl2Lmluc2VydEFkamFjZW50SFRNTChJbnNlcnRQb3NpdGlvbi5hZnRlcmJlZ2luLCB3cmFwcGVkSHRtbCk7XG5cbiAgICBzb3VyY2UgPSBkaXYuZmlyc3RDaGlsZCE7XG4gIH1cblxuICByZXR1cm4gbW92ZU5vZGVzQmVmb3JlKHNvdXJjZSwgcGFyZW50LCByZWZlcmVuY2UpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRBcHBseUZpeChkb2N1bWVudDogU2ltcGxlRG9jdW1lbnQsIHN2Z05hbWVzcGFjZTogU1ZHX05BTUVTUEFDRSkge1xuICBsZXQgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHN2Z05hbWVzcGFjZSwgJ3N2ZycpO1xuXG4gIHRyeSB7XG4gICAgc3ZnLmluc2VydEFkamFjZW50SFRNTChJbnNlcnRQb3NpdGlvbi5iZWZvcmVlbmQsICc8Y2lyY2xlPjwvY2lyY2xlPicpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUsIEVkZ2U6IFdpbGwgdGhyb3csIGluc2VydEFkamFjZW50SFRNTCBpcyB1bnN1cHBvcnRlZCBvbiBTVkdcbiAgICAvLyBTYWZhcmk6IFdpbGwgdGhyb3csIGluc2VydEFkamFjZW50SFRNTCBpcyBub3QgcHJlc2VudCBvbiBTVkdcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBGRjogT2xkIHZlcnNpb25zIHdpbGwgY3JlYXRlIGEgbm9kZSBpbiB0aGUgd3JvbmcgbmFtZXNwYWNlXG4gICAgaWYgKFxuICAgICAgc3ZnLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICYmXG4gICAgICBjYXN0VG9Ccm93c2VyKHVud3JhcChzdmcuZmlyc3RDaGlsZCksICdTVkcnKS5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0VcbiAgICApIHtcbiAgICAgIC8vIFRoZSB0ZXN0IHdvcmtlZCBhcyBleHBlY3RlZCwgbm8gZml4IHJlcXVpcmVkXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=