@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
72 lines (58 loc) • 7.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.applyTextNodeMergingFix = applyTextNodeMergingFix;
// Patch: Adjacent text node merging fix
// Browsers: IE, Edge, Firefox w/o inspector open
// Reason: These browsers will merge adjacent text nodes. For example given
// <div>Hello</div> with div.insertAdjacentHTML(' world') browsers
// with proper behavior will populate div.childNodes with two items.
// These browsers will populate it with one merged node instead.
// Fix: Add these nodes to a wrapper element, then iterate the childNodes
// of that wrapper and move the nodes to their target location. Note
// that potential SVG bugs will have been handled before this fix.
// Note that this fix must only apply to the previous text node, as
// the base implementation of `insertHTMLBefore` already handles
// following text nodes correctly.
function applyTextNodeMergingFix(document, DOMClass) {
if (!document) return DOMClass;
if (!shouldApplyFix(document)) {
return DOMClass;
}
return class DOMChangesWithTextNodeMergingFix extends DOMClass {
constructor(document) {
super(document);
this.uselessComment = document.createComment('');
}
insertHTMLBefore(parent, nextSibling, html) {
if (html === '') {
return super.insertHTMLBefore(parent, nextSibling, html);
}
let didSetUselessComment = false;
let nextPrevious = nextSibling ? nextSibling.previousSibling : parent.lastChild;
if (nextPrevious && nextPrevious instanceof Text) {
didSetUselessComment = true;
parent.insertBefore(this.uselessComment, nextSibling);
}
let bounds = super.insertHTMLBefore(parent, nextSibling, html);
if (didSetUselessComment) {
parent.removeChild(this.uselessComment);
}
return bounds;
}
};
}
function shouldApplyFix(document) {
let mergingTextDiv = document.createElement('div');
mergingTextDiv.appendChild(document.createTextNode('first'));
mergingTextDiv.insertAdjacentHTML("beforeend"
/* beforeend */
, 'second');
if (mergingTextDiv.childNodes.length === 2) {
// It worked as expected, no fix required
return false;
}
return true;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBhdC90ZXh0LW5vZGUtbWVyZ2luZy1maXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNNLFNBQUEsdUJBQUEsQ0FBQSxRQUFBLEVBQUEsUUFBQSxFQUUwQjtBQUU5QixNQUFJLENBQUosUUFBQSxFQUFlLE9BQUEsUUFBQTs7QUFFZixNQUFJLENBQUMsY0FBYyxDQUFuQixRQUFtQixDQUFuQixFQUErQjtBQUM3QixXQUFBLFFBQUE7QUFDRDs7QUFFRCxTQUFPLE1BQUEsZ0NBQUEsU0FBQSxRQUFBLENBQXVEO0FBRzVELElBQUEsV0FBQSxDQUFBLFFBQUEsRUFBb0M7QUFDbEMsWUFBQSxRQUFBO0FBQ0EsV0FBQSxjQUFBLEdBQXNCLFFBQVEsQ0FBUixhQUFBLENBQXRCLEVBQXNCLENBQXRCO0FBQ0Q7O0FBRUQsSUFBQSxnQkFBZ0IsQ0FBQSxNQUFBLEVBQUEsV0FBQSxFQUFBLElBQUEsRUFBcUU7QUFDbkYsVUFBSSxJQUFJLEtBQVIsRUFBQSxFQUFpQjtBQUNmLGVBQU8sTUFBQSxnQkFBQSxDQUFBLE1BQUEsRUFBQSxXQUFBLEVBQVAsSUFBTyxDQUFQO0FBQ0Q7O0FBRUQsVUFBSSxvQkFBb0IsR0FBeEIsS0FBQTtBQUVBLFVBQUksWUFBWSxHQUFHLFdBQVcsR0FBRyxXQUFXLENBQWQsZUFBQSxHQUFpQyxNQUFNLENBQXJFLFNBQUE7O0FBRUEsVUFBSSxZQUFZLElBQUksWUFBWSxZQUFoQyxJQUFBLEVBQWtEO0FBQ2hELFFBQUEsb0JBQW9CLEdBQXBCLElBQUE7QUFDQSxRQUFBLE1BQU0sQ0FBTixZQUFBLENBQW9CLEtBQXBCLGNBQUEsRUFBQSxXQUFBO0FBQ0Q7O0FBRUQsVUFBSSxNQUFNLEdBQUcsTUFBQSxnQkFBQSxDQUFBLE1BQUEsRUFBQSxXQUFBLEVBQWIsSUFBYSxDQUFiOztBQUVBLFVBQUEsb0JBQUEsRUFBMEI7QUFDeEIsUUFBQSxNQUFNLENBQU4sV0FBQSxDQUFtQixLQUFuQixjQUFBO0FBQ0Q7O0FBRUQsYUFBQSxNQUFBO0FBQ0Q7O0FBN0IyRCxHQUE5RDtBQStCRDs7QUFFRCxTQUFBLGNBQUEsQ0FBQSxRQUFBLEVBQWdEO0FBQzlDLE1BQUksY0FBYyxHQUFHLFFBQVEsQ0FBUixhQUFBLENBQXJCLEtBQXFCLENBQXJCO0FBRUEsRUFBQSxjQUFjLENBQWQsV0FBQSxDQUEyQixRQUFRLENBQVIsY0FBQSxDQUEzQixPQUEyQixDQUEzQjtBQUNBLEVBQUEsY0FBYyxDQUFkLGtCQUFBLENBQWlDO0FBQUE7QUFBakMsSUFBQSxRQUFBOztBQUVBLE1BQUksY0FBYyxDQUFkLFVBQUEsQ0FBQSxNQUFBLEtBQUosQ0FBQSxFQUE0QztBQUMxQztBQUNBLFdBQUEsS0FBQTtBQUNEOztBQUVELFNBQUEsSUFBQTtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQm91bmRzLCBPcHRpb24gfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIEluc2VydFBvc2l0aW9uLFxuICBTaW1wbGVDb21tZW50LFxuICBTaW1wbGVEb2N1bWVudCxcbiAgU2ltcGxlRWxlbWVudCxcbiAgU2ltcGxlTm9kZSxcbn0gZnJvbSAnQHNpbXBsZS1kb20vaW50ZXJmYWNlJztcbmltcG9ydCB7IERPTU9wZXJhdGlvbnMgfSBmcm9tICcuLi9kb20vb3BlcmF0aW9ucyc7XG5cbi8vIFBhdGNoOiAgICBBZGphY2VudCB0ZXh0IG5vZGUgbWVyZ2luZyBmaXhcbi8vIEJyb3dzZXJzOiBJRSwgRWRnZSwgRmlyZWZveCB3L28gaW5zcGVjdG9yIG9wZW5cbi8vIFJlYXNvbjogICBUaGVzZSBicm93c2VycyB3aWxsIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXMuIEZvciBleGFtcGxlIGdpdmVuXG4vLyAgICAgICAgICAgPGRpdj5IZWxsbzwvZGl2PiB3aXRoIGRpdi5pbnNlcnRBZGphY2VudEhUTUwoJyB3b3JsZCcpIGJyb3dzZXJzXG4vLyAgICAgICAgICAgd2l0aCBwcm9wZXIgYmVoYXZpb3Igd2lsbCBwb3B1bGF0ZSBkaXYuY2hpbGROb2RlcyB3aXRoIHR3byBpdGVtcy5cbi8vICAgICAgICAgICBUaGVzZSBicm93c2VycyB3aWxsIHBvcHVsYXRlIGl0IHdpdGggb25lIG1lcmdlZCBub2RlIGluc3RlYWQuXG4vLyBGaXg6ICAgICAgQWRkIHRoZXNlIG5vZGVzIHRvIGEgd3JhcHBlciBlbGVtZW50LCB0aGVuIGl0ZXJhdGUgdGhlIGNoaWxkTm9kZXNcbi8vICAgICAgICAgICBvZiB0aGF0IHdyYXBwZXIgYW5kIG1vdmUgdGhlIG5vZGVzIHRvIHRoZWlyIHRhcmdldCBsb2NhdGlvbi4gTm90ZVxuLy8gICAgICAgICAgIHRoYXQgcG90ZW50aWFsIFNWRyBidWdzIHdpbGwgaGF2ZSBiZWVuIGhhbmRsZWQgYmVmb3JlIHRoaXMgZml4LlxuLy8gICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIGZpeCBtdXN0IG9ubHkgYXBwbHkgdG8gdGhlIHByZXZpb3VzIHRleHQgbm9kZSwgYXNcbi8vICAgICAgICAgICB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgaW5zZXJ0SFRNTEJlZm9yZWAgYWxyZWFkeSBoYW5kbGVzXG4vLyAgICAgICAgICAgZm9sbG93aW5nIHRleHQgbm9kZXMgY29ycmVjdGx5LlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VGV4dE5vZGVNZXJnaW5nRml4KFxuICBkb2N1bWVudDogT3B0aW9uPFNpbXBsZURvY3VtZW50PixcbiAgRE9NQ2xhc3M6IHR5cGVvZiBET01PcGVyYXRpb25zXG4pOiB0eXBlb2YgRE9NT3BlcmF0aW9ucyB7XG4gIGlmICghZG9jdW1lbnQpIHJldHVybiBET01DbGFzcztcblxuICBpZiAoIXNob3VsZEFwcGx5Rml4KGRvY3VtZW50KSkge1xuICAgIHJldHVybiBET01DbGFzcztcbiAgfVxuXG4gIHJldHVybiBjbGFzcyBET01DaGFuZ2VzV2l0aFRleHROb2RlTWVyZ2luZ0ZpeCBleHRlbmRzIERPTUNsYXNzIHtcbiAgICBwcml2YXRlIHVzZWxlc3NDb21tZW50OiBTaW1wbGVDb21tZW50O1xuXG4gICAgY29uc3RydWN0b3IoZG9jdW1lbnQ6IFNpbXBsZURvY3VtZW50KSB7XG4gICAgICBzdXBlcihkb2N1bWVudCk7XG4gICAgICB0aGlzLnVzZWxlc3NDb21tZW50ID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnJyk7XG4gICAgfVxuXG4gICAgaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnQ6IFNpbXBsZUVsZW1lbnQsIG5leHRTaWJsaW5nOiBPcHRpb248U2ltcGxlTm9kZT4sIGh0bWw6IHN0cmluZyk6IEJvdW5kcyB7XG4gICAgICBpZiAoaHRtbCA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmluc2VydEhUTUxCZWZvcmUocGFyZW50LCBuZXh0U2libGluZywgaHRtbCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBkaWRTZXRVc2VsZXNzQ29tbWVudCA9IGZhbHNlO1xuXG4gICAgICBsZXQgbmV4dFByZXZpb3VzID0gbmV4dFNpYmxpbmcgPyBuZXh0U2libGluZy5wcmV2aW91c1NpYmxpbmcgOiBwYXJlbnQubGFzdENoaWxkO1xuXG4gICAgICBpZiAobmV4dFByZXZpb3VzICYmIG5leHRQcmV2aW91cyBpbnN0YW5jZW9mIFRleHQpIHtcbiAgICAgICAgZGlkU2V0VXNlbGVzc0NvbW1lbnQgPSB0cnVlO1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMudXNlbGVzc0NvbW1lbnQsIG5leHRTaWJsaW5nKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGJvdW5kcyA9IHN1cGVyLmluc2VydEhUTUxCZWZvcmUocGFyZW50LCBuZXh0U2libGluZywgaHRtbCk7XG5cbiAgICAgIGlmIChkaWRTZXRVc2VsZXNzQ29tbWVudCkge1xuICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy51c2VsZXNzQ29tbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBib3VuZHM7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBzaG91bGRBcHBseUZpeChkb2N1bWVudDogU2ltcGxlRG9jdW1lbnQpIHtcbiAgbGV0IG1lcmdpbmdUZXh0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgbWVyZ2luZ1RleHREaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ2ZpcnN0JykpO1xuICBtZXJnaW5nVGV4dERpdi5pbnNlcnRBZGphY2VudEhUTUwoSW5zZXJ0UG9zaXRpb24uYmVmb3JlZW5kLCAnc2Vjb25kJyk7XG5cbiAgaWYgKG1lcmdpbmdUZXh0RGl2LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyKSB7XG4gICAgLy8gSXQgd29ya2VkIGFzIGV4cGVjdGVkLCBubyBmaXggcmVxdWlyZWRcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=