UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

135 lines (112 loc) 13.7 kB
"use strict"; 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 const 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 const BLACKLIST_TABLE = Object.create(null); exports.BLACKLIST_TABLE = BLACKLIST_TABLE; class DOMOperations { constructor(document) { this.document = document; this.setupUselessElement(); } // split into separate method so that NodeDOMTreeConstruction // can override it. setupUselessElement() { this.uselessElement = this.document.createElement('div'); } createElement(tag, context) { let 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); } } insertBefore(parent, node, reference) { parent.insertBefore(node, reference); } insertHTMLBefore(parent, nextSibling, html) { if (html === '') { let comment = this.createComment(''); parent.insertBefore(comment, nextSibling); return new _bounds.ConcreteBounds(parent, comment, comment); } let prev = nextSibling ? nextSibling.previousSibling : parent.lastChild; let 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 let { uselessElement } = this; parent.insertBefore(uselessElement, nextSibling); uselessElement.insertAdjacentHTML("beforebegin" /* beforebegin */ , html); last = uselessElement.previousSibling; parent.removeChild(uselessElement); } let first = prev ? prev.nextSibling : parent.firstChild; return new _bounds.ConcreteBounds(parent, first, last); } createTextNode(text) { return this.document.createTextNode(text); } createComment(data) { return this.document.createComment(data); } } exports.DOMOperations = DOMOperations; function moveNodesBefore(source, target, nextSibling) { let first = source.firstChild; let last = first; let current = first; while (current) { let 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2RvbS9vcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBVUE7O0FBR0E7QUFDQSxNQUFNLHNCQUFzQixHQUFHO0FBQUUsRUFBQSxhQUFhLEVBQWYsQ0FBQTtBQUFvQixFQUFBLElBQUksRUFBeEIsQ0FBQTtBQUE2QixFQUFBLEtBQUssRUFBRTtBQUFwQyxDQUEvQixDLENBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDTyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQU4sTUFBQSxDQUF4QixJQUF3QixDQUF4Qjs7O0FBRUQsTUFBQSxhQUFBLENBQW9CO0FBR3hCLEVBQUEsV0FBQSxDQUFBLFFBQUEsRUFBOEM7QUFBeEIsU0FBQSxRQUFBLEdBQUEsUUFBQTtBQUNwQixTQUFBLG1CQUFBO0FBSnNCLEdBQUEsQ0FPeEI7QUFDQTs7O0FBQ1UsRUFBQSxtQkFBbUIsR0FBQTtBQUMzQixTQUFBLGNBQUEsR0FBc0IsS0FBQSxRQUFBLENBQUEsYUFBQSxDQUF0QixLQUFzQixDQUF0QjtBQUNEOztBQUVELEVBQUEsYUFBYSxDQUFBLEdBQUEsRUFBQSxPQUFBLEVBQXFDO0FBQ2hELFFBQUEsdUJBQUEsRUFBQSxzQkFBQTs7QUFFQSxRQUFBLE9BQUEsRUFBYTtBQUNYLE1BQUEsdUJBQXVCLEdBQUcsT0FBTyxDQUFQLFlBQUEsS0FBb0I7QUFBQTtBQUFwQixTQUEwQyxHQUFHLEtBQXZFLEtBQUE7QUFDQSxNQUFBLHNCQUFzQixHQUFHLENBQUMsQ0FBRSxzQkFBdUMsQ0FBQyxPQUFPLENBQTNFLE9BQW1FLENBQW5FO0FBRkYsS0FBQSxNQUdPO0FBQ0wsTUFBQSx1QkFBdUIsR0FBRyxHQUFHLEtBQTdCLEtBQUE7QUFDQSxNQUFBLHNCQUFzQixHQUF0QixLQUFBO0FBQ0Q7O0FBRUQsUUFBSSx1QkFBdUIsSUFBSSxDQUEvQixzQkFBQSxFQUF3RDtBQUN0RDtBQUNB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LElBQU8sQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgU2ltcGxlRWxlbWVudCxcbiAgU2ltcGxlRG9jdW1lbnQsXG4gIE5hbWVzcGFjZSxcbiAgU2ltcGxlTm9kZSxcbiAgSW5zZXJ0UG9zaXRpb24sXG4gIFNpbXBsZVRleHQsXG4gIFNpbXBsZUNvbW1lbnQsXG59IGZyb20gJ0BzaW1wbGUtZG9tL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBEaWN0LCBPcHRpb24sIEJvdW5kcyB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29uY3JldGVCb3VuZHMgfSBmcm9tICcuLi9ib3VuZHMnO1xuaW1wb3J0IHsgZXhwZWN0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWwvc3ludGF4Lmh0bWwjaHRtbC1pbnRlZ3JhdGlvbi1wb2ludFxuY29uc3QgU1ZHX0lOVEVHUkFUSU9OX1BPSU5UUyA9IHsgZm9yZWlnbk9iamVjdDogMSwgZGVzYzogMSwgdGl0bGU6IDEgfTtcblxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbC9zeW50YXguaHRtbCNhZGp1c3Qtc3ZnLWF0dHJpYnV0ZXNcbi8vIFRPRE86IEFkanVzdCBTVkcgYXR0cmlidXRlc1xuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmZvcmVpZ25cbi8vIFRPRE86IEFkanVzdCBTVkcgZWxlbWVudHNcblxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbC9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5mb3JlaWduXG5leHBvcnQgY29uc3QgQkxBQ0tMSVNUX1RBQkxFID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuZXhwb3J0IGNsYXNzIERPTU9wZXJhdGlvbnMge1xuICBwcm90ZWN0ZWQgdXNlbGVzc0VsZW1lbnQhOiBTaW1wbGVFbGVtZW50OyAvLyBTZXQgYnkgdGhpcy5zZXR1cFVzZWxlc3NFbGVtZW50KCkgaW4gY29uc3RydWN0b3JcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgZG9jdW1lbnQ6IFNpbXBsZURvY3VtZW50KSB7XG4gICAgdGhpcy5zZXR1cFVzZWxlc3NFbGVtZW50KCk7XG4gIH1cblxuICAvLyBzcGxpdCBpbnRvIHNlcGFyYXRlIG1ldGhvZCBzbyB0aGF0IE5vZGVET01UcmVlQ29uc3RydWN0aW9uXG4gIC8vIGNhbiBvdmVycmlkZSBpdC5cbiAgcHJvdGVjdGVkIHNldHVwVXNlbGVzc0VsZW1lbnQoKSB7XG4gICAgdGhpcy51c2VsZXNzRWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIH1cblxuICBjcmVhdGVFbGVtZW50KHRhZzogc3RyaW5nLCBjb250ZXh0PzogU2ltcGxlRWxlbWVudCk6IFNpbXBsZUVsZW1lbnQge1xuICAgIGxldCBpc0VsZW1lbnRJblNWR05hbWVzcGFjZTogYm9vbGVhbiwgaXNIVE1MSW50ZWdyYXRpb25Qb2ludDogYm9vbGVhbjtcblxuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICBpc0VsZW1lbnRJblNWR05hbWVzcGFjZSA9IGNvbnRleHQubmFtZXNwYWNlVVJJID09PSBOYW1lc3BhY2UuU1ZHIHx8IHRhZyA9PT0gJ3N2Zyc7XG4gICAgICBpc0hUTUxJbnRlZ3JhdGlvblBvaW50ID0gISEoU1ZHX0lOVEVHUkFUSU9OX1BPSU5UUyBhcyBEaWN0PG51bWJlcj4pW2NvbnRleHQudGFnTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzRWxlbWVudEluU1ZHTmFtZXNwYWNlID0gdGFnID09PSAnc3ZnJztcbiAgICAgIGlzSFRNTEludGVncmF0aW9uUG9pbnQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoaXNFbGVtZW50SW5TVkdOYW1lc3BhY2UgJiYgIWlzSFRNTEludGVncmF0aW9uUG9pbnQpIHtcbiAgICAgIC8vIEZJWE1FOiBUaGlzIGRvZXMgbm90IHByb3Blcmx5IGhhbmRsZSA8Zm9udD4gd2l0aCBjb2xvciwgZmFjZSwgb3JcbiAgICAgIC8vIHNpemUgYXR0cmlidXRlcywgd2hpY2ggaXMgYWxzbyBkaXNhbGxvd2VkIGJ5IHRoZSBzcGVjLiBXZSBzaG91bGQgZml4XG4gICAgICAvLyB0aGlzLlxuICAgICAgaWYgKEJMQUNLTElTVF9UQUJMRVt0YWddKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBhICR7dGFnfSBpbnNpZGUgYW4gU1ZHIGNvbnRleHRgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKE5hbWVzcGFjZS5TVkcsIHRhZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgICB9XG4gIH1cblxuICBpbnNlcnRCZWZvcmUocGFyZW50OiBTaW1wbGVFbGVtZW50LCBub2RlOiBTaW1wbGVOb2RlLCByZWZlcmVuY2U6IE9wdGlvbjxTaW1wbGVOb2RlPikge1xuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgcmVmZXJlbmNlKTtcbiAgfVxuXG4gIGluc2VydEhUTUxCZWZvcmUocGFyZW50OiBTaW1wbGVFbGVtZW50LCBuZXh0U2libGluZzogT3B0aW9uPFNpbXBsZU5vZGU+LCBodG1sOiBzdHJpbmcpOiBCb3VuZHMge1xuICAgIGlmIChodG1sID09PSAnJykge1xuICAgICAgbGV0IGNvbW1lbnQgPSB0aGlzLmNyZWF0ZUNvbW1lbnQoJycpO1xuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjb21tZW50LCBuZXh0U2libGluZyk7XG4gICAgICByZXR1cm4gbmV3IENvbmNyZXRlQm91bmRzKHBhcmVudCwgY29tbWVudCwgY29tbWVudCk7XG4gICAgfVxuXG4gICAgbGV0IHByZXYgPSBuZXh0U2libGluZyA/IG5leHRTaWJsaW5nLnByZXZpb3VzU2libGluZyA6IHBhcmVudC5sYXN0Q2hpbGQ7XG4gICAgbGV0IGxhc3Q6IFNpbXBsZU5vZGU7XG5cbiAgICBpZiAobmV4dFNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIHBhcmVudC5pbnNlcnRBZGphY2VudEhUTUwoSW5zZXJ0UG9zaXRpb24uYmVmb3JlZW5kLCBodG1sKTtcbiAgICAgIGxhc3QgPSBleHBlY3QocGFyZW50Lmxhc3RDaGlsZCwgJ2J1ZyBpbiBpbnNlcnRBZGphY2VudEhUTUw/Jyk7XG4gICAgfSBlbHNlIGlmIChuZXh0U2libGluZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICBuZXh0U2libGluZy5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWJlZ2luJywgaHRtbCk7XG4gICAgICBsYXN0ID0gZXhwZWN0KG5leHRTaWJsaW5nLnByZXZpb3VzU2libGluZywgJ2J1ZyBpbiBpbnNlcnRBZGphY2VudEhUTUw/Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vbi1lbGVtZW50IG5vZGVzIGRvIG5vdCBzdXBwb3J0IGluc2VydEFkamFjZW50SFRNTCwgc28gYWRkIGFuXG4gICAgICAvLyBlbGVtZW50IGFuZCBjYWxsIGl0IG9uIHRoYXQgZWxlbWVudC4gVGhlbiByZW1vdmUgdGhlIGVsZW1lbnQuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBhbHNvIHByb3RlY3RzIEVkZ2UsIElFIGFuZCBGaXJlZm94IHcvbyB0aGUgaW5zcGVjdG9yIG9wZW5cbiAgICAgIC8vIGZyb20gbWVyZ2luZyBhZGphY2VudCB0ZXh0IG5vZGVzLiBTZWUgLi9jb21wYXQvdGV4dC1ub2RlLW1lcmdpbmctZml4LnRzXG4gICAgICBsZXQgeyB1c2VsZXNzRWxlbWVudCB9ID0gdGhpcztcblxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh1c2VsZXNzRWxlbWVudCwgbmV4dFNpYmxpbmcpO1xuICAgICAgdXNlbGVzc0VsZW1lbnQuaW5zZXJ0QWRqYWNlbnRIVE1MKEluc2VydFBvc2l0aW9uLmJlZm9yZWJlZ2luLCBodG1sKTtcbiAgICAgIGxhc3QgPSBleHBlY3QodXNlbGVzc0VsZW1lbnQucHJldmlvdXNTaWJsaW5nLCAnYnVnIGluIGluc2VydEFkamFjZW50SFRNTD8nKTtcbiAgICAgIHBhcmVudC5yZW1vdmVDaGlsZCh1c2VsZXNzRWxlbWVudCk7XG4gICAgfVxuXG4gICAgbGV0IGZpcnN0ID0gZXhwZWN0KHByZXYgPyBwcmV2Lm5leHRTaWJsaW5nIDogcGFyZW50LmZpcnN0Q2hpbGQsICdidWcgaW4gaW5zZXJ0QWRqYWNlbnRIVE1MPycpO1xuICAgIHJldHVybiBuZXcgQ29uY3JldGVCb3VuZHMocGFyZW50LCBmaXJzdCwgbGFzdCk7XG4gIH1cblxuICBjcmVhdGVUZXh0Tm9kZSh0ZXh0OiBzdHJpbmcpOiBTaW1wbGVUZXh0IHtcbiAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTtcbiAgfVxuXG4gIGNyZWF0ZUNvbW1lbnQoZGF0YTogc3RyaW5nKTogU2ltcGxlQ29tbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQuY3JlYXRlQ29tbWVudChkYXRhKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbW92ZU5vZGVzQmVmb3JlKFxuICBzb3VyY2U6IFNpbXBsZU5vZGUsXG4gIHRhcmdldDogU2ltcGxlRWxlbWVudCxcbiAgbmV4dFNpYmxpbmc6IE9wdGlvbjxTaW1wbGVOb2RlPlxuKTogQm91bmRzIHtcbiAgbGV0IGZpcnN0ID0gZXhwZWN0KHNvdXJjZS5maXJzdENoaWxkLCAnc291cmNlIGlzIGVtcHR5Jyk7XG4gIGxldCBsYXN0OiBTaW1wbGVOb2RlID0gZmlyc3Q7XG4gIGxldCBjdXJyZW50OiBPcHRpb248U2ltcGxlTm9kZT4gPSBmaXJzdDtcblxuICB3aGlsZSAoY3VycmVudCkge1xuICAgIGxldCBuZXh0OiBPcHRpb248U2ltcGxlTm9kZT4gPSBjdXJyZW50Lm5leHRTaWJsaW5nO1xuXG4gICAgdGFyZ2V0Lmluc2VydEJlZm9yZShjdXJyZW50LCBuZXh0U2libGluZyk7XG5cbiAgICBsYXN0ID0gY3VycmVudDtcbiAgICBjdXJyZW50ID0gbmV4dDtcbiAgfVxuXG4gIHJldHVybiBuZXcgQ29uY3JldGVCb3VuZHModGFyZ2V0LCBmaXJzdCwgbGFzdCk7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9