@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
136 lines (112 loc) • 14.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.moveNodesBefore = moveNodesBefore;
exports.DOMOperations = exports.BLACKLIST_TABLE = void 0;
var _bounds = require("../bounds");
// http://www.w3.org/TR/html/syntax.html#html-integration-point
var SVG_INTEGRATION_POINTS = {
foreignObject: 1,
desc: 1,
title: 1
}; // http://www.w3.org/TR/html/syntax.html#adjust-svg-attributes
// TODO: Adjust SVG attributes
// http://www.w3.org/TR/html/syntax.html#parsing-main-inforeign
// TODO: Adjust SVG elements
// http://www.w3.org/TR/html/syntax.html#parsing-main-inforeign
var BLACKLIST_TABLE = Object.create(null);
exports.BLACKLIST_TABLE = BLACKLIST_TABLE;
var DOMOperations = /*#__PURE__*/function () {
function DOMOperations(document) {
this.document = document;
this.setupUselessElement();
} // split into separate method so that NodeDOMTreeConstruction
// can override it.
var _proto = DOMOperations.prototype;
_proto.setupUselessElement = function setupUselessElement() {
this.uselessElement = this.document.createElement('div');
};
_proto.createElement = function createElement(tag, context) {
var isElementInSVGNamespace, isHTMLIntegrationPoint;
if (context) {
isElementInSVGNamespace = context.namespaceURI === "http://www.w3.org/2000/svg"
/* SVG */
|| tag === 'svg';
isHTMLIntegrationPoint = !!SVG_INTEGRATION_POINTS[context.tagName];
} else {
isElementInSVGNamespace = tag === 'svg';
isHTMLIntegrationPoint = false;
}
if (isElementInSVGNamespace && !isHTMLIntegrationPoint) {
// FIXME: This does not properly handle <font> with color, face, or
// size attributes, which is also disallowed by the spec. We should fix
// this.
if (BLACKLIST_TABLE[tag]) {
throw new Error("Cannot create a " + tag + " inside an SVG context");
}
return this.document.createElementNS("http://www.w3.org/2000/svg"
/* SVG */
, tag);
} else {
return this.document.createElement(tag);
}
};
_proto.insertBefore = function insertBefore(parent, node, reference) {
parent.insertBefore(node, reference);
};
_proto.insertHTMLBefore = function insertHTMLBefore(parent, nextSibling, html) {
if (html === '') {
var comment = this.createComment('');
parent.insertBefore(comment, nextSibling);
return new _bounds.ConcreteBounds(parent, comment, comment);
}
var prev = nextSibling ? nextSibling.previousSibling : parent.lastChild;
var last;
if (nextSibling === null) {
parent.insertAdjacentHTML("beforeend"
/* beforeend */
, html);
last = parent.lastChild;
} else if (nextSibling instanceof HTMLElement) {
nextSibling.insertAdjacentHTML('beforebegin', html);
last = nextSibling.previousSibling;
} else {
// Non-element nodes do not support insertAdjacentHTML, so add an
// element and call it on that element. Then remove the element.
//
// This also protects Edge, IE and Firefox w/o the inspector open
// from merging adjacent text nodes. See ./compat/text-node-merging-fix.ts
var uselessElement = this.uselessElement;
parent.insertBefore(uselessElement, nextSibling);
uselessElement.insertAdjacentHTML("beforebegin"
/* beforebegin */
, html);
last = uselessElement.previousSibling;
parent.removeChild(uselessElement);
}
var first = prev ? prev.nextSibling : parent.firstChild;
return new _bounds.ConcreteBounds(parent, first, last);
};
_proto.createTextNode = function createTextNode(text) {
return this.document.createTextNode(text);
};
_proto.createComment = function createComment(data) {
return this.document.createComment(data);
};
return DOMOperations;
}();
exports.DOMOperations = DOMOperations;
function moveNodesBefore(source, target, nextSibling) {
var first = source.firstChild;
var last = first;
var current = first;
while (current) {
var next = current.nextSibling;
target.insertBefore(current, nextSibling);
last = current;
current = next;
}
return new _bounds.ConcreteBounds(target, first, last);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2RvbS9vcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBVUE7O0FBR0E7QUFDQSxJQUFNLHNCQUFzQixHQUFHO0FBQUUsRUFBQSxhQUFhLEVBQWYsQ0FBQTtBQUFvQixFQUFBLElBQUksRUFBeEIsQ0FBQTtBQUE2QixFQUFBLEtBQUssRUFBRTtBQUFwQyxDQUEvQixDLENBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDTyxJQUFNLGVBQWUsR0FBRyxNQUFNLENBQU4sTUFBQSxDQUF4QixJQUF3QixDQUF4Qjs7O0FBRVAsSUFBTSxhQUFOLEdBQUEsYUFBQSxZQUFBO0FBR0UsV0FBQSxhQUFBLENBQUEsUUFBQSxFQUE4QztBQUF4QixTQUFBLFFBQUEsR0FBQSxRQUFBO0FBQ3BCLFNBQUEsbUJBQUE7QUFKSixHQUFBLENBT0U7QUFDQTs7O0FBUkYsTUFBQSxNQUFBLEdBQUEsYUFBQSxDQUFBLFNBQUE7O0FBQUEsRUFBQSxNQUFBLENBQUEsbUJBQUEsR0FTWSxTQUFBLG1CQUFBLEdBQW1CO0FBQzNCLFNBQUEsY0FBQSxHQUFzQixLQUFBLFFBQUEsQ0FBQSxhQUFBLENBQXRCLEtBQXNCLENBQXRCO0FBVkosR0FBQTs7QUFBQSxFQUFBLE1BQUEsQ0FBQSxhQUFBLEdBYUUsU0FBQSxhQUFBLENBQUEsR0FBQSxFQUFBLE9BQUEsRUFBa0Q7QUFDaEQsUUFBQSx1QkFBQSxFQUFBLHNCQUFBOztBQUVBLFFBQUEsT0FBQSxFQUFhO0FBQ1gsTUFBQSx1QkFBdUIsR0FBRyxPQUFPLENBQVAsWUFBQSxLQUFvQjtBQUFBO0FBQXBCLFNBQTBDLEdBQUcsS0FBdkUsS0FBQTtBQUNBLE1BQUEsc0JBQXNCLEdBQUcsQ0FBQyxDQUFFLHNCQUF1QyxDQUFDLE9BQU8sQ0FBM0UsT0FBbUUsQ0FBbkU7QUFGRixLQUFBLE1BR087QUFDTCxNQUFBLHVCQUF1QixHQUFHLEdB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QUNBLE1BQUksSUFBSSxHQUFSLEtBQUE7QUFDQSxNQUFJLE9BQU8sR0FBWCxLQUFBOztBQUVBLFNBQUEsT0FBQSxFQUFnQjtBQUNkLFFBQUksSUFBSSxHQUF1QixPQUFPLENBQXRDLFdBQUE7QUFFQSxJQUFBLE1BQU0sQ0FBTixZQUFBLENBQUEsT0FBQSxFQUFBLFdBQUE7QUFFQSxJQUFBLElBQUksR0FBSixPQUFBO0FBQ0EsSUFBQSxPQUFPLEdBQVAsSUFBQTtBQUNEOztBQUVELFNBQU8sSUFBQSxzQkFBQSxDQUFBLE1BQUEsRUFBQSxLQUFBLEVBQVAsSUFBTyxDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBTaW1wbGVFbGVtZW50LFxuICBTaW1wbGVEb2N1bWVudCxcbiAgTmFtZXNwYWNlLFxuICBTaW1wbGVOb2RlLFxuICBJbnNlcnRQb3NpdGlvbixcbiAgU2ltcGxlVGV4dCxcbiAgU2ltcGxlQ29tbWVudCxcbn0gZnJvbSAnQHNpbXBsZS1kb20vaW50ZXJmYWNlJztcbmltcG9ydCB7IERpY3QsIE9wdGlvbiwgQm91bmRzIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb25jcmV0ZUJvdW5kcyB9IGZyb20gJy4uL2JvdW5kcyc7XG5pbXBvcnQgeyBleHBlY3QgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbC9zeW50YXguaHRtbCNodG1sLWludGVncmF0aW9uLXBvaW50XG5jb25zdCBTVkdfSU5URUdSQVRJT05fUE9JTlRTID0geyBmb3JlaWduT2JqZWN0OiAxLCBkZXNjOiAxLCB0aXRsZTogMSB9O1xuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sL3N5bnRheC5odG1sI2FkanVzdC1zdmctYXR0cmlidXRlc1xuLy8gVE9ETzogQWRqdXN0IFNWRyBhdHRyaWJ1dGVzXG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWwvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluZm9yZWlnblxuLy8gVE9ETzogQWRqdXN0IFNWRyBlbGVtZW50c1xuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmZvcmVpZ25cbmV4cG9ydCBjb25zdCBCTEFDS0xJU1RfVEFCTEUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5leHBvcnQgY2xhc3MgRE9NT3BlcmF0aW9ucyB7XG4gIHByb3RlY3RlZCB1c2VsZXNzRWxlbWVudCE6IFNpbXBsZUVsZW1lbnQ7IC8vIFNldCBieSB0aGlzLnNldHVwVXNlbGVzc0VsZW1lbnQoKSBpbiBjb25zdHJ1Y3RvclxuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBkb2N1bWVudDogU2ltcGxlRG9jdW1lbnQpIHtcbiAgICB0aGlzLnNldHVwVXNlbGVzc0VsZW1lbnQoKTtcbiAgfVxuXG4gIC8vIHNwbGl0IGludG8gc2VwYXJhdGUgbWV0aG9kIHNvIHRoYXQgTm9kZURPTVRyZWVDb25zdHJ1Y3Rpb25cbiAgLy8gY2FuIG92ZXJyaWRlIGl0LlxuICBwcm90ZWN0ZWQgc2V0dXBVc2VsZXNzRWxlbWVudCgpIHtcbiAgICB0aGlzLnVzZWxlc3NFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgfVxuXG4gIGNyZWF0ZUVsZW1lbnQodGFnOiBzdHJpbmcsIGNvbnRleHQ/OiBTaW1wbGVFbGVtZW50KTogU2ltcGxlRWxlbWVudCB7XG4gICAgbGV0IGlzRWxlbWVudEluU1ZHTmFtZXNwYWNlOiBib29sZWFuLCBpc0hUTUxJbnRlZ3JhdGlvblBvaW50OiBib29sZWFuO1xuXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlzRWxlbWVudEluU1ZHTmFtZXNwYWNlID0gY29udGV4dC5uYW1lc3BhY2VVUkkgPT09IE5hbWVzcGFjZS5TVkcgfHwgdGFnID09PSAnc3ZnJztcbiAgICAgIGlzSFRNTEludGVncmF0aW9uUG9pbnQgPSAhIShTVkdfSU5URUdSQVRJT05fUE9JTlRTIGFzIERpY3Q8bnVtYmVyPilbY29udGV4dC50YWdOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNFbGVtZW50SW5TVkdOYW1lc3BhY2UgPSB0YWcgPT09ICdzdmcnO1xuICAgICAgaXNIVE1MSW50ZWdyYXRpb25Qb2ludCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpc0VsZW1lbnRJblNWR05hbWVzcGFjZSAmJiAhaXNIVE1MSW50ZWdyYXRpb25Qb2ludCkge1xuICAgICAgLy8gRklYTUU6IFRoaXMgZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIDxmb250PiB3aXRoIGNvbG9yLCBmYWNlLCBvclxuICAgICAgLy8gc2l6ZSBhdHRyaWJ1dGVzLCB3aGljaCBpcyBhbHNvIGRpc2FsbG93ZWQgYnkgdGhlIHNwZWMuIFdlIHNob3VsZCBmaXhcbiAgICAgIC8vIHRoaXMuXG4gICAgICBpZiAoQkxBQ0tMSVNUX1RBQkxFW3RhZ10pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY3JlYXRlIGEgJHt0YWd9IGluc2lkZSBhbiBTVkcgY29udGV4dGApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoTmFtZXNwYWNlLlNWRywgdGFnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuICAgIH1cbiAgfVxuXG4gIGluc2VydEJlZm9yZShwYXJlbnQ6IFNpbXBsZUVsZW1lbnQsIG5vZGU6IFNpbXBsZU5vZGUsIHJlZmVyZW5jZTogT3B0aW9uPFNpbXBsZU5vZGU+KSB7XG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCByZWZlcmVuY2UpO1xuICB9XG5cbiAgaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnQ6IFNpbXBsZUVsZW1lbnQsIG5leHRTaWJsaW5nOiBPcHRpb248U2ltcGxlTm9kZT4sIGh0bWw6IHN0cmluZyk6IEJvdW5kcyB7XG4gICAgaWYgKGh0bWwgPT09ICcnKSB7XG4gICAgICBsZXQgY29tbWVudCA9IHRoaXMuY3JlYXRlQ29tbWVudCgnJyk7XG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNvbW1lbnQsIG5leHRTaWJsaW5nKTtcbiAgICAgIHJldHVybiBuZXcgQ29uY3JldGVCb3VuZHMocGFyZW50LCBjb21tZW50LCBjb21tZW50KTtcbiAgICB9XG5cbiAgICBsZXQgcHJldiA9IG5leHRTaWJsaW5nID8gbmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nIDogcGFyZW50Lmxhc3RDaGlsZDtcbiAgICBsZXQgbGFzdDogU2ltcGxlTm9kZTtcblxuICAgIGlmIChuZXh0U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgcGFyZW50Lmluc2VydEFkamFjZW50SFRNTChJbnNlcnRQb3NpdGlvbi5iZWZvcmVlbmQsIGh0bWwpO1xuICAgICAgbGFzdCA9IGV4cGVjdChwYXJlbnQubGFzdENoaWxkLCAnYnVnIGluIGluc2VydEFkamFjZW50SFRNTD8nKTtcbiAgICB9IGVsc2UgaWYgKG5leHRTaWJsaW5nIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgIG5leHRTaWJsaW5nLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlYmVnaW4nLCBodG1sKTtcbiAgICAgIGxhc3QgPSBleHBlY3QobmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nLCAnYnVnIGluIGluc2VydEFkamFjZW50SFRNTD8nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm9uLWVsZW1lbnQgbm9kZXMgZG8gbm90IHN1cHBvcnQgaW5zZXJ0QWRqYWNlbnRIVE1MLCBzbyBhZGQgYW5cbiAgICAgIC8vIGVsZW1lbnQgYW5kIGNhbGwgaXQgb24gdGhhdCBlbGVtZW50LiBUaGVuIHJlbW92ZSB0aGUgZWxlbWVudC5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIGFsc28gcHJvdGVjdHMgRWRnZSwgSUUgYW5kIEZpcmVmb3ggdy9vIHRoZSBpbnNwZWN0b3Igb3BlblxuICAgICAgLy8gZnJvbSBtZXJnaW5nIGFkamFjZW50IHRleHQgbm9kZXMuIFNlZSAuL2NvbXBhdC90ZXh0LW5vZGUtbWVyZ2luZy1maXgudHNcbiAgICAgIGxldCB7IHVzZWxlc3NFbGVtZW50IH0gPSB0aGlzO1xuXG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHVzZWxlc3NFbGVtZW50LCBuZXh0U2libGluZyk7XG4gICAgICB1c2VsZXNzRWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwoSW5zZXJ0UG9zaXRpb24uYmVmb3JlYmVnaW4sIGh0bWwpO1xuICAgICAgbGFzdCA9IGV4cGVjdCh1c2VsZXNzRWxlbWVudC5wcmV2aW91c1NpYmxpbmcsICdidWcgaW4gaW5zZXJ0QWRqYWNlbnRIVE1MPycpO1xuICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKHVzZWxlc3NFbGVtZW50KTtcbiAgICB9XG5cbiAgICBsZXQgZmlyc3QgPSBleHBlY3QocHJldiA/IHByZXYubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZCwgJ2J1ZyBpbiBpbnNlcnRBZGphY2VudEhUTUw/Jyk7XG4gICAgcmV0dXJuIG5ldyBDb25jcmV0ZUJvdW5kcyhwYXJlbnQsIGZpcnN0LCBsYXN0KTtcbiAgfVxuXG4gIGNyZWF0ZVRleHROb2RlKHRleHQ6IHN0cmluZyk6IFNpbXBsZVRleHQge1xuICAgIHJldHVybiB0aGlzLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO1xuICB9XG5cbiAgY3JlYXRlQ29tbWVudChkYXRhOiBzdHJpbmcpOiBTaW1wbGVDb21tZW50IHtcbiAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5jcmVhdGVDb21tZW50KGRhdGEpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb3ZlTm9kZXNCZWZvcmUoXG4gIHNvdXJjZTogU2ltcGxlTm9kZSxcbiAgdGFyZ2V0OiBTaW1wbGVFbGVtZW50LFxuICBuZXh0U2libGluZzogT3B0aW9uPFNpbXBsZU5vZGU+XG4pOiBCb3VuZHMge1xuICBsZXQgZmlyc3QgPSBleHBlY3Qoc291cmNlLmZpcnN0Q2hpbGQsICdzb3VyY2UgaXMgZW1wdHknKTtcbiAgbGV0IGxhc3Q6IFNpbXBsZU5vZGUgPSBmaXJzdDtcbiAgbGV0IGN1cnJlbnQ6IE9wdGlvbjxTaW1wbGVOb2RlPiA9IGZpcnN0O1xuXG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgbGV0IG5leHQ6IE9wdGlvbjxTaW1wbGVOb2RlPiA9IGN1cnJlbnQubmV4dFNpYmxpbmc7XG5cbiAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKGN1cnJlbnQsIG5leHRTaWJsaW5nKTtcblxuICAgIGxhc3QgPSBjdXJyZW50O1xuICAgIGN1cnJlbnQgPSBuZXh0O1xuICB9XG5cbiAgcmV0dXJuIG5ldyBDb25jcmV0ZUJvdW5kcyh0YXJnZXQsIGZpcnN0LCBsYXN0KTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=