@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
75 lines (59 loc) • 8.2 kB
JavaScript
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
// 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.
export function applyTextNodeMergingFix(document, DOMClass) {
if (!document) return DOMClass;
if (!shouldApplyFix(document)) {
return DOMClass;
}
return /*#__PURE__*/function (_DOMClass) {
_inheritsLoose(DOMChangesWithTextNodeMergingFix, _DOMClass);
function DOMChangesWithTextNodeMergingFix(document) {
var _this;
_this = _DOMClass.call(this, document) || this;
_this.uselessComment = document.createComment('');
return _this;
}
var _proto = DOMChangesWithTextNodeMergingFix.prototype;
_proto.insertHTMLBefore = function insertHTMLBefore(parent, nextSibling, html) {
if (html === '') {
return _DOMClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html);
}
var didSetUselessComment = false;
var nextPrevious = nextSibling ? nextSibling.previousSibling : parent.lastChild;
if (nextPrevious && nextPrevious instanceof Text) {
didSetUselessComment = true;
parent.insertBefore(this.uselessComment, nextSibling);
}
var bounds = _DOMClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html);
if (didSetUselessComment) {
parent.removeChild(this.uselessComment);
}
return bounds;
};
return DOMChangesWithTextNodeMergingFix;
}(DOMClass);
}
function shouldApplyFix(document) {
var 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBhdC90ZXh0LW5vZGUtbWVyZ2luZy1maXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFNLFNBQUEsdUJBQUEsQ0FBQSxRQUFBLEVBQUEsUUFBQSxFQUUwQjtBQUU5QixNQUFJLENBQUosUUFBQSxFQUFlLE9BQUEsUUFBQTs7QUFFZixNQUFJLENBQUMsY0FBYyxDQUFuQixRQUFtQixDQUFuQixFQUErQjtBQUM3QixXQUFBLFFBQUE7QUFDRDs7QUFFRDtBQUFBOztBQUdFLDhDQUFBLFFBQUEsRUFBb0M7QUFBQTs7QUFDbEMsbUNBQUEsUUFBQTtBQUNBLFlBQUEsY0FBQSxHQUFzQixRQUFRLENBQVIsYUFBQSxDQUF0QixFQUFzQixDQUF0QjtBQUZrQztBQUduQzs7QUFOSDs7QUFBQSxXQVFFLGdCQVJGLEdBUUUsMEJBQWdCLE1BQWhCLEVBQWdCLFdBQWhCLEVBQWdCLElBQWhCLEVBQXFGO0FBQ25GLFVBQUksSUFBSSxLQUFSLEVBQUEsRUFBaUI7QUFDZixtQ0FBTyxnQkFBUCxZQUFPLE1BQVAsRUFBTyxXQUFQLEVBQUEsSUFBQTtBQUNEOztBQUVELFVBQUksb0JBQW9CLEdBQXhCLEtBQUE7QUFFQSxVQUFJLFlBQVksR0FBRyxXQUFXLEdBQUcsV0FBVyxDQUFkLGVBQUEsR0FBaUMsTUFBTSxDQUFyRSxTQUFBOztBQUVBLFVBQUksWUFBWSxJQUFJLFlBQVksWUFBaEMsSUFBQSxFQUFrRDtBQUNoRCxRQUFBLG9CQUFvQixHQUFwQixJQUFBO0FBQ0EsUUFBQSxNQUFNLENBQU4sWUFBQSxDQUFvQixLQUFwQixjQUFBLEVBQUEsV0FBQTtBQUNEOztBQUVELFVBQUksTUFBTSx1QkFBRyxnQkFBSCxZQUFHLE1BQUgsRUFBRyxXQUFILEVBQVYsSUFBVSxDQUFWOztBQUVBLFVBQUEsb0JBQUEsRUFBMEI7QUFDeEIsUUFBQSxNQUFNLENBQU4sV0FBQSxDQUFtQixLQUFuQixjQUFBO0FBQ0Q7O0FBRUQsYUFBQSxNQUFBO0FBQ0QsS0E3Qkg7O0FBQUE7QUFBQSxJQUFPLFFBQVA7QUErQkQ7O0FBRUQsU0FBQSxjQUFBLENBQUEsUUFBQSxFQUFnRDtBQUM5QyxNQUFJLGNBQWMsR0FBRyxRQUFRLENBQVIsYUFBQSxDQUFyQixLQUFxQixDQUFyQjtBQUVBLEVBQUEsY0FBYyxDQUFkLFdBQUEsQ0FBMkIsUUFBUSxDQUFSLGNBQUEsQ0FBM0IsT0FBMkIsQ0FBM0I7QUFDQSxFQUFBLGNBQWMsQ0FBZCxrQkFBQSxDQUFpQztBQUFBO0FBQWpDLElBQUEsUUFBQTs7QUFFQSxNQUFJLGNBQWMsQ0FBZCxVQUFBLENBQUEsTUFBQSxLQUFKLENBQUEsRUFBNEM7QUFDMUM7QUFDQSxXQUFBLEtBQUE7QUFDRDs7QUFFRCxTQUFBLElBQUE7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJvdW5kcywgT3B0aW9uIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICBJbnNlcnRQb3NpdGlvbixcbiAgU2ltcGxlQ29tbWVudCxcbiAgU2ltcGxlRG9jdW1lbnQsXG4gIFNpbXBsZUVsZW1lbnQsXG4gIFNpbXBsZU5vZGUsXG59IGZyb20gJ0BzaW1wbGUtZG9tL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBET01PcGVyYXRpb25zIH0gZnJvbSAnLi4vZG9tL29wZXJhdGlvbnMnO1xuXG4vLyBQYXRjaDogICAgQWRqYWNlbnQgdGV4dCBub2RlIG1lcmdpbmcgZml4XG4vLyBCcm93c2VyczogSUUsIEVkZ2UsIEZpcmVmb3ggdy9vIGluc3BlY3RvciBvcGVuXG4vLyBSZWFzb246ICAgVGhlc2UgYnJvd3NlcnMgd2lsbCBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzLiBGb3IgZXhhbXBsZSBnaXZlblxuLy8gICAgICAgICAgIDxkaXY+SGVsbG88L2Rpdj4gd2l0aCBkaXYuaW5zZXJ0QWRqYWNlbnRIVE1MKCcgd29ybGQnKSBicm93c2Vyc1xuLy8gICAgICAgICAgIHdpdGggcHJvcGVyIGJlaGF2aW9yIHdpbGwgcG9wdWxhdGUgZGl2LmNoaWxkTm9kZXMgd2l0aCB0d28gaXRlbXMuXG4vLyAgICAgICAgICAgVGhlc2UgYnJvd3NlcnMgd2lsbCBwb3B1bGF0ZSBpdCB3aXRoIG9uZSBtZXJnZWQgbm9kZSBpbnN0ZWFkLlxuLy8gRml4OiAgICAgIEFkZCB0aGVzZSBub2RlcyB0byBhIHdyYXBwZXIgZWxlbWVudCwgdGhlbiBpdGVyYXRlIHRoZSBjaGlsZE5vZGVzXG4vLyAgICAgICAgICAgb2YgdGhhdCB3cmFwcGVyIGFuZCBtb3ZlIHRoZSBub2RlcyB0byB0aGVpciB0YXJnZXQgbG9jYXRpb24uIE5vdGVcbi8vICAgICAgICAgICB0aGF0IHBvdGVudGlhbCBTVkcgYnVncyB3aWxsIGhhdmUgYmVlbiBoYW5kbGVkIGJlZm9yZSB0aGlzIGZpeC5cbi8vICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBmaXggbXVzdCBvbmx5IGFwcGx5IHRvIHRoZSBwcmV2aW91cyB0ZXh0IG5vZGUsIGFzXG4vLyAgICAgICAgICAgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGluc2VydEhUTUxCZWZvcmVgIGFscmVhZHkgaGFuZGxlc1xuLy8gICAgICAgICAgIGZvbGxvd2luZyB0ZXh0IG5vZGVzIGNvcnJlY3RseS5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVRleHROb2RlTWVyZ2luZ0ZpeChcbiAgZG9jdW1lbnQ6IE9wdGlvbjxTaW1wbGVEb2N1bWVudD4sXG4gIERPTUNsYXNzOiB0eXBlb2YgRE9NT3BlcmF0aW9uc1xuKTogdHlwZW9mIERPTU9wZXJhdGlvbnMge1xuICBpZiAoIWRvY3VtZW50KSByZXR1cm4gRE9NQ2xhc3M7XG5cbiAgaWYgKCFzaG91bGRBcHBseUZpeChkb2N1bWVudCkpIHtcbiAgICByZXR1cm4gRE9NQ2xhc3M7XG4gIH1cblxuICByZXR1cm4gY2xhc3MgRE9NQ2hhbmdlc1dpdGhUZXh0Tm9kZU1lcmdpbmdGaXggZXh0ZW5kcyBET01DbGFzcyB7XG4gICAgcHJpdmF0ZSB1c2VsZXNzQ29tbWVudDogU2ltcGxlQ29tbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKGRvY3VtZW50OiBTaW1wbGVEb2N1bWVudCkge1xuICAgICAgc3VwZXIoZG9jdW1lbnQpO1xuICAgICAgdGhpcy51c2VsZXNzQ29tbWVudCA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJycpO1xuICAgIH1cblxuICAgIGluc2VydEhUTUxCZWZvcmUocGFyZW50OiBTaW1wbGVFbGVtZW50LCBuZXh0U2libGluZzogT3B0aW9uPFNpbXBsZU5vZGU+LCBodG1sOiBzdHJpbmcpOiBCb3VuZHMge1xuICAgICAgaWYgKGh0bWwgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5pbnNlcnRIVE1MQmVmb3JlKHBhcmVudCwgbmV4dFNpYmxpbmcsIGh0bWwpO1xuICAgICAgfVxuXG4gICAgICBsZXQgZGlkU2V0VXNlbGVzc0NvbW1lbnQgPSBmYWxzZTtcblxuICAgICAgbGV0IG5leHRQcmV2aW91cyA9IG5leHRTaWJsaW5nID8gbmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nIDogcGFyZW50Lmxhc3RDaGlsZDtcblxuICAgICAgaWYgKG5leHRQcmV2aW91cyAmJiBuZXh0UHJldmlvdXMgaW5zdGFuY2VvZiBUZXh0KSB7XG4gICAgICAgIGRpZFNldFVzZWxlc3NDb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0aGlzLnVzZWxlc3NDb21tZW50LCBuZXh0U2libGluZyk7XG4gICAgICB9XG5cbiAgICAgIGxldCBib3VuZHMgPSBzdXBlci5pbnNlcnRIVE1MQmVmb3JlKHBhcmVudCwgbmV4dFNpYmxpbmcsIGh0bWwpO1xuXG4gICAgICBpZiAoZGlkU2V0VXNlbGVzc0NvbW1lbnQpIHtcbiAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMudXNlbGVzc0NvbW1lbnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYm91bmRzO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQXBwbHlGaXgoZG9jdW1lbnQ6IFNpbXBsZURvY3VtZW50KSB7XG4gIGxldCBtZXJnaW5nVGV4dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gIG1lcmdpbmdUZXh0RGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdmaXJzdCcpKTtcbiAgbWVyZ2luZ1RleHREaXYuaW5zZXJ0QWRqYWNlbnRIVE1MKEluc2VydFBvc2l0aW9uLmJlZm9yZWVuZCwgJ3NlY29uZCcpO1xuXG4gIGlmIChtZXJnaW5nVGV4dERpdi5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMikge1xuICAgIC8vIEl0IHdvcmtlZCBhcyBleHBlY3RlZCwgbm8gZml4IHJlcXVpcmVkXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9