ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
86 lines (85 loc) • 11.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.domChanges = domChanges;
exports.treeConstruction = treeConstruction;
// Patch: Adjacent text node merging fix
// Browsers: IE, Edge, Firefox w/o inspector open
// Reason: These browsers will merge adjacent text nodes. For exmaple 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 domChanges(document, DOMChangesClass) {
if (!document) return DOMChangesClass;
if (!shouldApplyFix(document)) {
return DOMChangesClass;
}
return class DOMChangesWithTextNodeMergingFix extends DOMChangesClass {
constructor(document) {
super(document);
this.uselessComment = document.createComment('');
}
insertHTMLBefore(parent, nextSibling, html) {
if (html === null) {
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 treeConstruction(document, TreeConstructionClass) {
if (!document) return TreeConstructionClass;
if (!shouldApplyFix(document)) {
return TreeConstructionClass;
}
return class TreeConstructionWithTextNodeMergingFix extends TreeConstructionClass {
constructor(document) {
super(document);
this.uselessComment = this.createComment('');
}
insertHTMLBefore(parent, reference, html) {
if (html === null) {
return super.insertHTMLBefore(parent, reference, html);
}
let didSetUselessComment = false;
let nextPrevious = reference ? reference.previousSibling : parent.lastChild;
if (nextPrevious && nextPrevious instanceof Text) {
didSetUselessComment = true;
parent.insertBefore(this.uselessComment, reference);
}
let bounds = super.insertHTMLBefore(parent, reference, html);
if (didSetUselessComment) {
parent.removeChild(this.uselessComment);
}
return bounds;
}
};
}
function shouldApplyFix(document) {
let mergingTextDiv = document.createElement('div');
mergingTextDiv.innerHTML = 'first';
mergingTextDiv.insertAdjacentHTML('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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21wYXQvdGV4dC1ub2RlLW1lcmdpbmctZml4LmpzIl0sIm5hbWVzIjpbImRvbUNoYW5nZXMiLCJ0cmVlQ29uc3RydWN0aW9uIiwiZG9jdW1lbnQiLCJET01DaGFuZ2VzQ2xhc3MiLCJzaG91bGRBcHBseUZpeCIsIkRPTUNoYW5nZXNXaXRoVGV4dE5vZGVNZXJnaW5nRml4IiwiY29uc3RydWN0b3IiLCJ1c2VsZXNzQ29tbWVudCIsImNyZWF0ZUNvbW1lbnQiLCJpbnNlcnRIVE1MQmVmb3JlIiwicGFyZW50IiwibmV4dFNpYmxpbmciLCJodG1sIiwiZGlkU2V0VXNlbGVzc0NvbW1lbnQiLCJuZXh0UHJldmlvdXMiLCJwcmV2aW91c1NpYmxpbmciLCJsYXN0Q2hpbGQiLCJUZXh0IiwiaW5zZXJ0QmVmb3JlIiwiYm91bmRzIiwicmVtb3ZlQ2hpbGQiLCJUcmVlQ29uc3RydWN0aW9uQ2xhc3MiLCJUcmVlQ29uc3RydWN0aW9uV2l0aFRleHROb2RlTWVyZ2luZ0ZpeCIsInJlZmVyZW5jZSIsIm1lcmdpbmdUZXh0RGl2IiwiY3JlYXRlRWxlbWVudCIsImlubmVySFRNTCIsImluc2VydEFkamFjZW50SFRNTCIsImNoaWxkTm9kZXMiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiI7Ozs7O1FBWWdCQSxVLEdBQUFBLFU7UUE0QkFDLGdCLEdBQUFBLGdCO0FBeENoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRCxVQUFULENBQW9CRSxRQUFwQixFQUE4QkMsZUFBOUIsRUFBK0M7QUFDbEQsUUFBSSxDQUFDRCxRQUFMLEVBQWUsT0FBT0MsZUFBUDtBQUNmLFFBQUksQ0FBQ0MsZUFBZUYsUUFBZixDQUFMLEVBQStCO0FBQzNCLGVBQU9DLGVBQVA7QUFDSDtBQUNELFdBQU8sTUFBTUUsZ0NBQU4sU0FBK0NGLGVBQS9DLENBQStEO0FBQ2xFRyxvQkFBWUosUUFBWixFQUFzQjtBQUNsQixrQkFBTUEsUUFBTjtBQUNBLGlCQUFLSyxjQUFMLEdBQXNCTCxTQUFTTSxhQUFULENBQXVCLEVBQXZCLENBQXRCO0FBQ0g7QUFDREMseUJBQWlCQyxNQUFqQixFQUF5QkMsV0FBekIsRUFBc0NDLElBQXRDLEVBQTRDO0FBQ3hDLGdCQUFJQSxTQUFTLElBQWIsRUFBbUI7QUFDZix1QkFBTyxNQUFNSCxnQkFBTixDQUF1QkMsTUFBdkIsRUFBK0JDLFdBQS9CLEVBQTRDQyxJQUE1QyxDQUFQO0FBQ0g7QUFDRCxnQkFBSUMsdUJBQXVCLEtBQTNCO0FBQ0EsZ0JBQUlDLGVBQWVILGNBQWNBLFlBQVlJLGVBQTFCLEdBQTRDTCxPQUFPTSxTQUF0RTtBQUNBLGdCQUFJRixnQkFBZ0JBLHdCQUF3QkcsSUFBNUMsRUFBa0Q7QUFDOUNKLHVDQUF1QixJQUF2QjtBQUNBSCx1QkFBT1EsWUFBUCxDQUFvQixLQUFLWCxjQUF6QixFQUF5Q0ksV0FBekM7QUFDSDtBQUNELGdCQUFJUSxTQUFTLE1BQU1WLGdCQUFOLENBQXVCQyxNQUF2QixFQUErQkMsV0FBL0IsRUFBNENDLElBQTVDLENBQWI7QUFDQSxnQkFBSUMsb0JBQUosRUFBMEI7QUFDdEJILHVCQUFPVSxXQUFQLENBQW1CLEtBQUtiLGNBQXhCO0FBQ0g7QUFDRCxtQkFBT1ksTUFBUDtBQUNIO0FBcEJpRSxLQUF0RTtBQXNCSDtBQUNNLFNBQVNsQixnQkFBVCxDQUEwQkMsUUFBMUIsRUFBb0NtQixxQkFBcEMsRUFBMkQ7QUFDOUQsUUFBSSxDQUFDbkIsUUFBTCxFQUFlLE9BQU9tQixxQkFBUDtBQUNmLFFBQUksQ0FBQ2pCLGVBQWVGLFFBQWYsQ0FBTCxFQUErQjtBQUMzQixlQUFPbUIscUJBQVA7QUFDSDtBQUNELFdBQU8sTUFBTUMsc0NBQU4sU0FBcURELHFCQUFyRCxDQUEyRTtBQUM5RWYsb0JBQVlKLFFBQVosRUFBc0I7QUFDbEIsa0JBQU1BLFFBQU47QUFDQSxpQkFBS0ssY0FBTCxHQUFzQixLQUFLQyxhQUFMLENBQW1CLEVBQW5CLENBQXRCO0FBQ0g7QUFDREMseUJBQWlCQyxNQUFqQixFQUF5QmEsU0FBekIsRUFBb0NYLElBQXBDLEVBQTBDO0FBQ3RDLGdCQUFJQSxTQUFTLElBQWIsRUFBbUI7QUFDZix1QkFBTyxNQUFNSCxnQkFBTixDQUF1QkMsTUFBdkIsRUFBK0JhLFNBQS9CLEVBQTBDWCxJQUExQyxDQUFQO0FBQ0g7QUFDRCxnQkFBSUMsdUJBQXVCLEtBQTNCO0FBQ0EsZ0JBQUlDLGVBQWVTLFlBQVlBLFVBQVVSLGVBQXRCLEdBQXdDTCxPQUFPTSxTQUFsRTtBQUNBLGdCQUFJRixnQkFBZ0JBLHdCQUF3QkcsSUFBNUMsRUFBa0Q7QUFDOUNKLHVDQUF1QixJQUF2QjtBQUNBSCx1QkFBT1EsWUFBUCxDQUFvQixLQUFLWCxjQUF6QixFQUF5Q2dCLFNBQXpDO0FBQ0g7QUFDRCxnQkFBSUosU0FBUyxNQUFNVixnQkFBTixDQUF1QkMsTUFBdkIsRUFBK0JhLFNBQS9CLEVBQTBDWCxJQUExQyxDQUFiO0FBQ0EsZ0JBQUlDLG9CQUFKLEVBQTBCO0FBQ3RCSCx1QkFBT1UsV0FBUCxDQUFtQixLQUFLYixjQUF4QjtBQUNIO0FBQ0QsbUJBQU9ZLE1BQVA7QUFDSDtBQXBCNkUsS0FBbEY7QUFzQkg7QUFDRCxTQUFTZixjQUFULENBQXdCRixRQUF4QixFQUFrQztBQUM5QixRQUFJc0IsaUJBQWlCdEIsU0FBU3VCLGFBQVQsQ0FBdUIsS0FBdkIsQ0FBckI7QUFDQUQsbUJBQWVFLFNBQWYsR0FBMkIsT0FBM0I7QUFDQUYsbUJBQWVHLGtCQUFmLENBQWtDLFdBQWxDLEVBQStDLFFBQS9DO0FBQ0EsUUFBSUgsZUFBZUksVUFBZixDQUEwQkMsTUFBMUIsS0FBcUMsQ0FBekMsRUFBNEM7QUFDeEM7QUFDQSxlQUFPLEtBQVA7QUFDSDtBQUNELFdBQU8sSUFBUDtBQUNIIiwiZmlsZSI6ImxpYi9jb21wYXQvdGV4dC1ub2RlLW1lcmdpbmctZml4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gUGF0Y2g6ICAgIEFkamFjZW50IHRleHQgbm9kZSBtZXJnaW5nIGZpeFxuLy8gQnJvd3NlcnM6IElFLCBFZGdlLCBGaXJlZm94IHcvbyBpbnNwZWN0b3Igb3BlblxuLy8gUmVhc29uOiAgIFRoZXNlIGJyb3dzZXJzIHdpbGwgbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2Rlcy4gRm9yIGV4bWFwbGUgZ2l2ZW5cbi8vICAgICAgICAgICA8ZGl2PkhlbGxvPC9kaXY+IHdpdGggZGl2Lmluc2VydEFkamFjZW50SFRNTCgnIHdvcmxkJykgYnJvd3NlcnNcbi8vICAgICAgICAgICB3aXRoIHByb3BlciBiZWhhdmlvciB3aWxsIHBvcHVsYXRlIGRpdi5jaGlsZE5vZGVzIHdpdGggdHdvIGl0ZW1zLlxuLy8gICAgICAgICAgIFRoZXNlIGJyb3dzZXJzIHdpbGwgcG9wdWxhdGUgaXQgd2l0aCBvbmUgbWVyZ2VkIG5vZGUgaW5zdGVhZC5cbi8vIEZpeDogICAgICBBZGQgdGhlc2Ugbm9kZXMgdG8gYSB3cmFwcGVyIGVsZW1lbnQsIHRoZW4gaXRlcmF0ZSB0aGUgY2hpbGROb2Rlc1xuLy8gICAgICAgICAgIG9mIHRoYXQgd3JhcHBlciBhbmQgbW92ZSB0aGUgbm9kZXMgdG8gdGhlaXIgdGFyZ2V0IGxvY2F0aW9uLiBOb3RlXG4vLyAgICAgICAgICAgdGhhdCBwb3RlbnRpYWwgU1ZHIGJ1Z3Mgd2lsbCBoYXZlIGJlZW4gaGFuZGxlZCBiZWZvcmUgdGhpcyBmaXguXG4vLyAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgZml4IG11c3Qgb25seSBhcHBseSB0byB0aGUgcHJldmlvdXMgdGV4dCBub2RlLCBhc1xuLy8gICAgICAgICAgIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBpbnNlcnRIVE1MQmVmb3JlYCBhbHJlYWR5IGhhbmRsZXNcbi8vICAgICAgICAgICBmb2xsb3dpbmcgdGV4dCBub2RlcyBjb3JyZWN0bHkuXG5leHBvcnQgZnVuY3Rpb24gZG9tQ2hhbmdlcyhkb2N1bWVudCwgRE9NQ2hhbmdlc0NsYXNzKSB7XG4gICAgaWYgKCFkb2N1bWVudCkgcmV0dXJuIERPTUNoYW5nZXNDbGFzcztcbiAgICBpZiAoIXNob3VsZEFwcGx5Rml4KGRvY3VtZW50KSkge1xuICAgICAgICByZXR1cm4gRE9NQ2hhbmdlc0NsYXNzO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3MgRE9NQ2hhbmdlc1dpdGhUZXh0Tm9kZU1lcmdpbmdGaXggZXh0ZW5kcyBET01DaGFuZ2VzQ2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcihkb2N1bWVudCkge1xuICAgICAgICAgICAgc3VwZXIoZG9jdW1lbnQpO1xuICAgICAgICAgICAgdGhpcy51c2VsZXNzQ29tbWVudCA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJycpO1xuICAgICAgICB9XG4gICAgICAgIGluc2VydEhUTUxCZWZvcmUocGFyZW50LCBuZXh0U2libGluZywgaHRtbCkge1xuICAgICAgICAgICAgaWYgKGh0bWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnQsIG5leHRTaWJsaW5nLCBodG1sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBkaWRTZXRVc2VsZXNzQ29tbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IG5leHRQcmV2aW91cyA9IG5leHRTaWJsaW5nID8gbmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nIDogcGFyZW50Lmxhc3RDaGlsZDtcbiAgICAgICAgICAgIGlmIChuZXh0UHJldmlvdXMgJiYgbmV4dFByZXZpb3VzIGluc3RhbmNlb2YgVGV4dCkge1xuICAgICAgICAgICAgICAgIGRpZFNldFVzZWxlc3NDb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMudXNlbGVzc0NvbW1lbnQsIG5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBib3VuZHMgPSBzdXBlci5pbnNlcnRIVE1MQmVmb3JlKHBhcmVudCwgbmV4dFNpYmxpbmcsIGh0bWwpO1xuICAgICAgICAgICAgaWYgKGRpZFNldFVzZWxlc3NDb21tZW50KSB7XG4gICAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMudXNlbGVzc0NvbW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJvdW5kcztcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gdHJlZUNvbnN0cnVjdGlvbihkb2N1bWVudCwgVHJlZUNvbnN0cnVjdGlvbkNsYXNzKSB7XG4gICAgaWYgKCFkb2N1bWVudCkgcmV0dXJuIFRyZWVDb25zdHJ1Y3Rpb25DbGFzcztcbiAgICBpZiAoIXNob3VsZEFwcGx5Rml4KGRvY3VtZW50KSkge1xuICAgICAgICByZXR1cm4gVHJlZUNvbnN0cnVjdGlvbkNsYXNzO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3MgVHJlZUNvbnN0cnVjdGlvbldpdGhUZXh0Tm9kZU1lcmdpbmdGaXggZXh0ZW5kcyBUcmVlQ29uc3RydWN0aW9uQ2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcihkb2N1bWVudCkge1xuICAgICAgICAgICAgc3VwZXIoZG9jdW1lbnQpO1xuICAgICAgICAgICAgdGhpcy51c2VsZXNzQ29tbWVudCA9IHRoaXMuY3JlYXRlQ29tbWVudCgnJyk7XG4gICAgICAgIH1cbiAgICAgICAgaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnQsIHJlZmVyZW5jZSwgaHRtbCkge1xuICAgICAgICAgICAgaWYgKGh0bWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnQsIHJlZmVyZW5jZSwgaHRtbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZGlkU2V0VXNlbGVzc0NvbW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBuZXh0UHJldmlvdXMgPSByZWZlcmVuY2UgPyByZWZlcmVuY2UucHJldmlvdXNTaWJsaW5nIDogcGFyZW50Lmxhc3RDaGlsZDtcbiAgICAgICAgICAgIGlmIChuZXh0UHJldmlvdXMgJiYgbmV4dFByZXZpb3VzIGluc3RhbmNlb2YgVGV4dCkge1xuICAgICAgICAgICAgICAgIGRpZFNldFVzZWxlc3NDb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMudXNlbGVzc0NvbW1lbnQsIHJlZmVyZW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYm91bmRzID0gc3VwZXIuaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnQsIHJlZmVyZW5jZSwgaHRtbCk7XG4gICAgICAgICAgICBpZiAoZGlkU2V0VXNlbGVzc0NvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy51c2VsZXNzQ29tbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYm91bmRzO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNob3VsZEFwcGx5Rml4KGRvY3VtZW50KSB7XG4gICAgbGV0IG1lcmdpbmdUZXh0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgbWVyZ2luZ1RleHREaXYuaW5uZXJIVE1MID0gJ2ZpcnN0JztcbiAgICBtZXJnaW5nVGV4dERpdi5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsICdzZWNvbmQnKTtcbiAgICBpZiAobWVyZ2luZ1RleHREaXYuY2hpbGROb2Rlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgLy8gSXQgd29ya2VkIGFzIGV4cGVjdGVkLCBubyBmaXggcmVxdWlyZWRcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn0iXX0=