UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

100 lines (83 loc) 11.5 kB
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } import { assert, clearElement } from '@glimmer/util'; import { moveNodesBefore } from '../dom/operations'; export 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. export 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 && 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>'; 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>'; clearElement(div); div.insertAdjacentHTML("afterbegin" /* afterbegin */ , _wrappedHtml); source = div.firstChild; } return 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBhdC9zdmctaW5uZXItaHRtbC1maXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxTQUFBLE1BQUEsRUFBQSxZQUFBLFFBQUEsZUFBQTtBQVFBLFNBQUEsZUFBQSxRQUFBLG1CQUFBO0FBRUEsT0FBTyxJQUFNLGFBQWEsR0FBQTtBQUFBO0FBQW5CLEMsQ0FHUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE9BQU0sU0FBQSxvQkFBQSxDQUFBLFFBQUEsRUFBQSxRQUFBLEVBQUEsWUFBQSxFQUd1QjtBQUUzQixNQUFJLENBQUosUUFBQSxFQUFlLE9BQUEsUUFBQTs7QUFFZixNQUFJLENBQUMsY0FBYyxDQUFBLFFBQUEsRUFBbkIsWUFBbUIsQ0FBbkIsRUFBNkM7QUFDM0MsV0FBQSxRQUFBO0FBQ0Q7O0FBRUQsTUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFSLGFBQUEsQ0FBVixLQUFVLENBQVY7QUFFQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFBQSxXQUNFLGdCQURGLEdBQ0UsMEJBQWdCLE1BQWhCLEVBQWdCLFdBQWhCLEVBQWdCLElBQWhCLEVBQXFGO0FBQ25GLFVBQUksSUFBSSxLQUFSLEVBQUEsRUFBaUI7QUFDZixtQ0FBTyxnQkFBUCxZQUFPLE1BQVAsRUFBTyxXQUFQLEVBQUEsSUFBQTtBQUNEOztBQUVELFVBQUksTUFBTSxDQUFOLFlBQUEsS0FBSixZQUFBLEVBQTBDO0FBQ3hDLG1DQUFPLGdCQUFQLFlBQU8sTUFBUCxFQUFPLFdBQVAsRUFBQSxJQUFBO0FBQ0Q7O0FBRUQsYUFBTyxNQUFNLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxJQUFBLEVBQWIsV0FBYSxDQUFiO0FBQ0QsS0FYSDs7QUFBQTtBQUFBLElBQU8sUUFBUDtBQWFEOztBQUVELFNBQUEsTUFBQSxDQUFBLE1BQUEsRUFBQSxHQUFBLEVBQUEsSUFBQSxFQUFBLFNBQUEsRUFJK0I7QUFBQSxXQUU3QixNQUFNLENBQUMsSUFBSSxLQUFMLEVBQUEsRUFGdUIsc0JBRXZCLENBRnVCO0FBSTdCLE1BSjZCLE1BSTdCLENBSjZCLENBTTdCO0FBQ0E7O0FBQ0EsTUFBSSxNQUFNLENBQU4sT0FBQSxDQUFBLFdBQUEsT0FBSixlQUFBLEVBQXNEO0FBQ3BEO0FBQ0E7QUFDQSxRQUFJLFdBQVcsR0FBRyx5QkFBQSxJQUFBLEdBQWxCLHdCQUFBO0FBRUEsSUFBQSxZQUFZLENBQVosR0FBWSxDQUFaO0FBQ0EsSUFBQSxHQUFHLENBQUgsa0JBQUEsQ0FBc0I7QUFBQTtBQUF0QixNQUFBLFdBQUE7QUFFQSxJQUFBLE1BQU0sR0FBRyxHQUFHLENBQUgsVUFBQSxDQUFULFVBQUE7QUFSRixHQUFBLE1BU087QUFDTDtBQUNBO0FBQ0EsUUFBSSxZQUFXLEdBQUcsVUFBQSxJQUFBLEdBQWxCLFFBQUE7O0FBRUEsSUFBQSxZQUFZLENBQVosR0FBWSxDQUFaO0FBQ0EsSUFBQSxHQUFHLENBQUgsa0JBQUEsQ0FBc0I7QUFBQTtBQUF0QixNQUFBLFlBQUE7QUFFQSxJQUFBLE1BQU0sR0FBRyxHQUFHLENBQVosVUFBQTtBQUNEOztBQUVELFNBQU8sZUFBZSxDQUFBLE1BQUEsRUFBQSxNQUFBLEVBQXRCLFNBQXNCLENBQXRCO0FBQ0Q7O0FBRUQsU0FBQSxjQUFBLENBQUEsUUFBQSxFQUFBLFlBQUEsRUFBNkU7QUFDM0UsTUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFSLGVBQUEsQ0FBQSxZQUFBLEVBQVYsS0FBVSxDQUFWOztBQUVBLE1BQUk7QUFDRixJQUFBLEdBQUcsQ0FBSCxrQkFBQSxDQUFzQjtBQUFBO0FBQXRCLE1BQUEsbUJBQUE7QUFERixHQUFBLENBRUUsT0FBQSxDQUFBLEVBQVUsQ0FDVjtBQUNBO0FBSkYsR0FBQSxTQUtVO0FBQ1I7QUFDQSxRQUNFLEdBQUcsQ0FBSCxVQUFBLENBQUEsTUFBQSxLQUFBLENBQUEsSUFDcUIsR0FBRyxDQUF4QixVQUFxQixDQUFyQixZQUFxQixLQUZ2QixhQUFBLEVBR0U7QUFDQTtBQUNBLGFBQUEsS0FBQTtBQUNEOztBQUVELFdBQUEsSUFBQTtBQUNEO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCb3VuZHMsIE9wdGlvbiB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0LCBjYXN0VG9Ccm93c2VyLCBjbGVhckVsZW1lbnQsIHVud3JhcCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHtcbiAgSW5zZXJ0UG9zaXRpb24sXG4gIE5hbWVzcGFjZSxcbiAgU2ltcGxlRG9jdW1lbnQsXG4gIFNpbXBsZUVsZW1lbnQsXG4gIFNpbXBsZU5vZGUsXG59IGZyb20gJ0BzaW1wbGUtZG9tL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBET01PcGVyYXRpb25zLCBtb3ZlTm9kZXNCZWZvcmUgfSBmcm9tICcuLi9kb20vb3BlcmF0aW9ucyc7XG5cbmV4cG9ydCBjb25zdCBTVkdfTkFNRVNQQUNFID0gTmFtZXNwYWNlLlNWRztcbmV4cG9ydCB0eXBlIFNWR19OQU1FU1BBQ0UgPSB0eXBlb2YgU1ZHX05BTUVTUEFDRTtcblxuLy8gUGF0Y2g6ICAgIGluc2VydEFkamFjZW50SFRNTCBvbiBTVkcgRml4XG4vLyBCcm93c2VyczogU2FmYXJpLCBJRSwgRWRnZSwgRmlyZWZveCB+MzMtMzRcbi8vIFJlYXNvbjogICBpbnNlcnRBZGphY2VudEhUTUwgZG9lcyBub3QgZXhpc3Qgb24gU1ZHIGVsZW1lbnRzIGluIFNhZmFyaS4gSXQgaXNcbi8vICAgICAgICAgICBwcmVzZW50IGJ1dCB0aHJvd3MgYW4gZXhjZXB0aW9uIG9uIElFIGFuZCBFZGdlLiBPbGQgdmVyc2lvbnMgb2Zcbi8vICAgICAgICAgICBGaXJlZm94IGNyZWF0ZSBub2RlcyBpbiB0aGUgaW5jb3JyZWN0IG5hbWVzcGFjZS5cbi8vIEZpeDogICAgICBTaW5jZSBJRSBhbmQgRWRnZSBzaWxlbnRseSBmYWlsIHRvIGNyZWF0ZSBTVkcgbm9kZXMgdXNpbmdcbi8vICAgICAgICAgICBpbm5lckhUTUwsIGFuZCBiZWNhdXNlIEZpcmVmb3ggbWF5IGNyZWF0ZSBub2RlcyBpbiB0aGUgaW5jb3JyZWN0XG4vLyAgICAgICAgICAgbmFtZXNwYWNlIHVzaW5nIGlubmVySFRNTCBvbiBTVkcgZWxlbWVudHMsIGFuIEhUTUwtc3RyaW5nIHdyYXBwaW5nXG4vLyAgICAgICAgICAgYXBwcm9hY2ggaXMgdXNlZC4gQSBwcmUvcG9zdCBTVkcgdGFnIGlzIGFkZGVkIHRvIHRoZSBzdHJpbmcsIHRoZW5cbi8vICAgICAgICAgICB0aGF0IHdob2xlIHN0cmluZyBpcyBhZGRlZCB0byBhIGRpdi4gVGhlIGNyZWF0ZWQgbm9kZXMgYXJlIHBsdWNrZWRcbi8vICAgICAgICAgICBvdXQgYW5kIGFwcGxpZWQgdG8gdGhlIHRhcmdldCBsb2NhdGlvbiBvbiBET00uXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTVkdJbm5lckhUTUxGaXgoXG4gIGRvY3VtZW50OiBPcHRpb248U2ltcGxlRG9jdW1lbnQ+LFxuICBET01DbGFzczogdHlwZW9mIERPTU9wZXJhdGlvbnMsXG4gIHN2Z05hbWVzcGFjZTogU1ZHX05BTUVTUEFDRVxuKTogdHlwZW9mIERPTU9wZXJhdGlvbnMge1xuICBpZiAoIWRvY3VtZW50KSByZXR1cm4gRE9NQ2xhc3M7XG5cbiAgaWYgKCFzaG91bGRBcHBseUZpeChkb2N1bWVudCwgc3ZnTmFtZXNwYWNlKSkge1xuICAgIHJldHVybiBET01DbGFzcztcbiAgfVxuXG4gIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSBhcyBTaW1wbGVFbGVtZW50O1xuXG4gIHJldHVybiBjbGFzcyBET01DaGFuZ2VzV2l0aFNWR0lubmVySFRNTEZpeCBleHRlbmRzIERPTUNsYXNzIHtcbiAgICBpbnNlcnRIVE1MQmVmb3JlKHBhcmVudDogU2ltcGxlRWxlbWVudCwgbmV4dFNpYmxpbmc6IE9wdGlvbjxTaW1wbGVOb2RlPiwgaHRtbDogc3RyaW5nKTogQm91bmRzIHtcbiAgICAgIGlmIChodG1sID09PSAnJykge1xuICAgICAgICByZXR1cm4gc3VwZXIuaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnQsIG5leHRTaWJsaW5nLCBodG1sKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgIT09IHN2Z05hbWVzcGFjZSkge1xuICAgICAgICByZXR1cm4gc3VwZXIuaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnQsIG5leHRTaWJsaW5nLCBodG1sKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpeFNWRyhwYXJlbnQsIGRpdiwgaHRtbCwgbmV4dFNpYmxpbmcpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZml4U1ZHKFxuICBwYXJlbnQ6IFNpbXBsZUVsZW1lbnQsXG4gIGRpdjogU2ltcGxlRWxlbWVudCxcbiAgaHRtbDogc3RyaW5nLFxuICByZWZlcmVuY2U6IE9wdGlvbjxTaW1wbGVOb2RlPlxuKTogQm91bmRzIHtcbiAgYXNzZXJ0KGh0bWwgIT09ICcnLCAnaHRtbCBjYW5ub3QgYmUgZW1wdHknKTtcblxuICBsZXQgc291cmNlOiBTaW1wbGVOb2RlO1xuXG4gIC8vIFRoaXMgaXMgaW1wb3J0YW50LCBiZWNhdXNlIGRlc2NlbmRhbnRzIG9mIHRoZSA8Zm9yZWlnbk9iamVjdD4gaW50ZWdyYXRpb25cbiAgLy8gcG9pbnQgYXJlIHBhcnNlZCBpbiB0aGUgSFRNTCBuYW1lc3BhY2VcbiAgaWYgKHBhcmVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdGT1JFSUdOT0JKRUNUJykge1xuICAgIC8vIElFLCBFZGdlOiBhbHNvIGRvIG5vdCBjb3JyZWN0bHkgc3VwcG9ydCB1c2luZyBgaW5uZXJIVE1MYCBvbiBTVkdcbiAgICAvLyBuYW1lc3BhY2VkIGVsZW1lbnRzLiBTbyBoZXJlIGEgd3JhcHBlciBpcyB1c2VkLlxuICAgIGxldCB3cmFwcGVkSHRtbCA9ICc8c3ZnPjxmb3JlaWduT2JqZWN0PicgKyBodG1sICsgJzwvZm9yZWlnbk9iamVjdD48L3N2Zz4nO1xuXG4gICAgY2xlYXJFbGVtZW50KGRpdik7XG4gICAgZGl2Lmluc2VydEFkamFjZW50SFRNTChJbnNlcnRQb3NpdGlvbi5hZnRlcmJlZ2luLCB3cmFwcGVkSHRtbCk7XG5cbiAgICBzb3VyY2UgPSBkaXYuZmlyc3RDaGlsZCEuZmlyc3RDaGlsZCE7XG4gIH0gZWxzZSB7XG4gICAgLy8gSUUsIEVkZ2U6IGFsc28gZG8gbm90IGNvcnJlY3RseSBzdXBwb3J0IHVzaW5nIGBpbm5lckhUTUxgIG9uIFNWR1xuICAgIC8vIG5hbWVzcGFjZWQgZWxlbWVudHMuIFNvIGhlcmUgYSB3cmFwcGVyIGlzIHVzZWQuXG4gICAgbGV0IHdyYXBwZWRIdG1sID0gJzxzdmc+JyArIGh0bWwgKyAnPC9zdmc+JztcblxuICAgIGNsZWFyRWxlbWVudChkaXYpO1xuICAgIGRpdi5pbnNlcnRBZGphY2VudEhUTUwoSW5zZXJ0UG9zaXRpb24uYWZ0ZXJiZWdpbiwgd3JhcHBlZEh0bWwpO1xuXG4gICAgc291cmNlID0gZGl2LmZpcnN0Q2hpbGQhO1xuICB9XG5cbiAgcmV0dXJuIG1vdmVOb2Rlc0JlZm9yZShzb3VyY2UsIHBhcmVudCwgcmVmZXJlbmNlKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQXBwbHlGaXgoZG9jdW1lbnQ6IFNpbXBsZURvY3VtZW50LCBzdmdOYW1lc3BhY2U6IFNWR19OQU1FU1BBQ0UpIHtcbiAgbGV0IHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzdmdOYW1lc3BhY2UsICdzdmcnKTtcblxuICB0cnkge1xuICAgIHN2Zy5pbnNlcnRBZGphY2VudEhUTUwoSW5zZXJ0UG9zaXRpb24uYmVmb3JlZW5kLCAnPGNpcmNsZT48L2NpcmNsZT4nKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElFLCBFZGdlOiBXaWxsIHRocm93LCBpbnNlcnRBZGphY2VudEhUTUwgaXMgdW5zdXBwb3J0ZWQgb24gU1ZHXG4gICAgLy8gU2FmYXJpOiBXaWxsIHRocm93LCBpbnNlcnRBZGphY2VudEhUTUwgaXMgbm90IHByZXNlbnQgb24gU1ZHXG4gIH0gZmluYWxseSB7XG4gICAgLy8gRkY6IE9sZCB2ZXJzaW9ucyB3aWxsIGNyZWF0ZSBhIG5vZGUgaW4gdGhlIHdyb25nIG5hbWVzcGFjZVxuICAgIGlmIChcbiAgICAgIHN2Zy5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgY2FzdFRvQnJvd3Nlcih1bndyYXAoc3ZnLmZpcnN0Q2hpbGQpLCAnU1ZHJykubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFXG4gICAgKSB7XG4gICAgICAvLyBUaGUgdGVzdCB3b3JrZWQgYXMgZXhwZWN0ZWQsIG5vIGZpeCByZXF1aXJlZFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9