ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
90 lines (86 loc) • 12.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.domChanges = domChanges;
exports.treeConstruction = treeConstruction;
var _bounds = require('../bounds');
var _helper = require('../dom/helper');
let innerHTMLWrapper = {
colgroup: { depth: 2, before: '<table><colgroup>', after: '</colgroup></table>' },
table: { depth: 1, before: '<table>', after: '</table>' },
tbody: { depth: 2, before: '<table><tbody>', after: '</tbody></table>' },
tfoot: { depth: 2, before: '<table><tfoot>', after: '</tfoot></table>' },
thead: { depth: 2, before: '<table><thead>', after: '</thead></table>' },
tr: { depth: 3, before: '<table><tbody><tr>', after: '</tr></tbody></table>' }
};
// Patch: innerHTML Fix
// Browsers: IE9
// Reason: IE9 don't allow us to set innerHTML on col, colgroup, frameset,
// html, style, table, tbody, tfoot, thead, title, tr.
// Fix: Wrap the innerHTML we are about to set in its parents, apply the
// wrapped innerHTML on a div, then move the unwrapped nodes into the
// target position.
function domChanges(document, DOMChangesClass) {
if (!document) return DOMChangesClass;
if (!shouldApplyFix(document)) {
return DOMChangesClass;
}
let div = document.createElement('div');
return class DOMChangesWithInnerHTMLFix extends DOMChangesClass {
insertHTMLBefore(parent, nextSibling, html) {
if (html === null || html === '') {
return super.insertHTMLBefore(parent, nextSibling, html);
}
let parentTag = parent.tagName.toLowerCase();
let wrapper = innerHTMLWrapper[parentTag];
if (wrapper === undefined) {
return super.insertHTMLBefore(parent, nextSibling, html);
}
return fixInnerHTML(parent, wrapper, div, html, nextSibling);
}
};
}
function treeConstruction(document, DOMTreeConstructionClass) {
if (!document) return DOMTreeConstructionClass;
if (!shouldApplyFix(document)) {
return DOMTreeConstructionClass;
}
let div = document.createElement('div');
return class DOMTreeConstructionWithInnerHTMLFix extends DOMTreeConstructionClass {
insertHTMLBefore(parent, referenceNode, html) {
if (html === null || html === '') {
return super.insertHTMLBefore(parent, referenceNode, html);
}
let parentTag = parent.tagName.toLowerCase();
let wrapper = innerHTMLWrapper[parentTag];
if (wrapper === undefined) {
return super.insertHTMLBefore(parent, referenceNode, html);
}
return fixInnerHTML(parent, wrapper, div, html, referenceNode);
}
};
}
function fixInnerHTML(parent, wrapper, div, html, reference) {
let wrappedHtml = wrapper.before + html + wrapper.after;
div.innerHTML = wrappedHtml;
let parentNode = div;
for (let i = 0; i < wrapper.depth; i++) {
parentNode = parentNode.childNodes[0];
}
let [first, last] = (0, _helper.moveNodesBefore)(parentNode, parent, reference);
return new _bounds.ConcreteBounds(parent, first, last);
}
function shouldApplyFix(document) {
let table = document.createElement('table');
try {
table.innerHTML = '<tbody></tbody>';
} catch (e) {} finally {
if (table.childNodes.length !== 0) {
// It worked as expected, no fix required
return false;
}
}
return true;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21wYXQvaW5uZXItaHRtbC1maXguanMiXSwibmFtZXMiOlsiZG9tQ2hhbmdlcyIsInRyZWVDb25zdHJ1Y3Rpb24iLCJpbm5lckhUTUxXcmFwcGVyIiwiY29sZ3JvdXAiLCJkZXB0aCIsImJlZm9yZSIsImFmdGVyIiwidGFibGUiLCJ0Ym9keSIsInRmb290IiwidGhlYWQiLCJ0ciIsImRvY3VtZW50IiwiRE9NQ2hhbmdlc0NsYXNzIiwic2hvdWxkQXBwbHlGaXgiLCJkaXYiLCJjcmVhdGVFbGVtZW50IiwiRE9NQ2hhbmdlc1dpdGhJbm5lckhUTUxGaXgiLCJpbnNlcnRIVE1MQmVmb3JlIiwicGFyZW50IiwibmV4dFNpYmxpbmciLCJodG1sIiwicGFyZW50VGFnIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwid3JhcHBlciIsInVuZGVmaW5lZCIsImZpeElubmVySFRNTCIsIkRPTVRyZWVDb25zdHJ1Y3Rpb25DbGFzcyIsIkRPTVRyZWVDb25zdHJ1Y3Rpb25XaXRoSW5uZXJIVE1MRml4IiwicmVmZXJlbmNlTm9kZSIsInJlZmVyZW5jZSIsIndyYXBwZWRIdG1sIiwiaW5uZXJIVE1MIiwicGFyZW50Tm9kZSIsImkiLCJjaGlsZE5vZGVzIiwiZmlyc3QiLCJsYXN0IiwiZSIsImxlbmd0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7UUFpQmdCQSxVLEdBQUFBLFU7UUFvQkFDLGdCLEdBQUFBLGdCOztBQXJDaEI7O0FBQ0E7O0FBQ0EsSUFBSUMsbUJBQW1CO0FBQ25CQyxjQUFVLEVBQUVDLE9BQU8sQ0FBVCxFQUFZQyxRQUFRLG1CQUFwQixFQUF5Q0MsT0FBTyxxQkFBaEQsRUFEUztBQUVuQkMsV0FBTyxFQUFFSCxPQUFPLENBQVQsRUFBWUMsUUFBUSxTQUFwQixFQUErQkMsT0FBTyxVQUF0QyxFQUZZO0FBR25CRSxXQUFPLEVBQUVKLE9BQU8sQ0FBVCxFQUFZQyxRQUFRLGdCQUFwQixFQUFzQ0MsT0FBTyxrQkFBN0MsRUFIWTtBQUluQkcsV0FBTyxFQUFFTCxP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LEdBQWdCRCxXQUFoQjtBQUNBLFFBQUlFLGFBQWFuQixHQUFqQjtBQUNBLFNBQUssSUFBSW9CLElBQUksQ0FBYixFQUFnQkEsSUFBSVYsUUFBUXJCLEtBQTVCLEVBQW1DK0IsR0FBbkMsRUFBd0M7QUFDcENELHFCQUFhQSxXQUFXRSxVQUFYLENBQXNCLENBQXRCLENBQWI7QUFDSDtBQUNELFFBQUksQ0FBQ0MsS0FBRCxFQUFRQyxJQUFSLElBQWdCLDZCQUFnQkosVUFBaEIsRUFBNEJmLE1BQTVCLEVBQW9DWSxTQUFwQyxDQUFwQjtBQUNBLFdBQU8sMkJBQW1CWixNQUFuQixFQUEyQmtCLEtBQTNCLEVBQWtDQyxJQUFsQyxDQUFQO0FBQ0g7QUFDRCxTQUFTeEIsY0FBVCxDQUF3QkYsUUFBeEIsRUFBa0M7QUFDOUIsUUFBSUwsUUFBUUssU0FBU0ksYUFBVCxDQUF1QixPQUF2QixDQUFaO0FBQ0EsUUFBSTtBQUNBVCxjQUFNMEIsU0FBTixHQUFrQixpQkFBbEI7QUFDSCxLQUZELENBRUUsT0FBT00sQ0FBUCxFQUFVLENBQUUsQ0FGZCxTQUV1QjtBQUNuQixZQUFJaEMsTUFBTTZCLFVBQU4sQ0FBaUJJLE1BQWpCLEtBQTRCLENBQWhDLEVBQW1DO0FBQy9CO0FBQ0EsbUJBQU8sS0FBUDtBQUNIO0FBQ0o7QUFDRCxXQUFPLElBQVA7QUFDSCIsImZpbGUiOiJsaWIvY29tcGF0L2lubmVyLWh0bWwtZml4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uY3JldGVCb3VuZHMgfSBmcm9tICcuLi9ib3VuZHMnO1xuaW1wb3J0IHsgbW92ZU5vZGVzQmVmb3JlIH0gZnJvbSAnLi4vZG9tL2hlbHBlcic7XG5sZXQgaW5uZXJIVE1MV3JhcHBlciA9IHtcbiAgICBjb2xncm91cDogeyBkZXB0aDogMiwgYmVmb3JlOiAnPHRhYmxlPjxjb2xncm91cD4nLCBhZnRlcjogJzwvY29sZ3JvdXA+PC90YWJsZT4nIH0sXG4gICAgdGFibGU6IHsgZGVwdGg6IDEsIGJlZm9yZTogJzx0YWJsZT4nLCBhZnRlcjogJzwvdGFibGU+JyB9LFxuICAgIHRib2R5OiB7IGRlcHRoOiAyLCBiZWZvcmU6ICc8dGFibGU+PHRib2R5PicsIGFmdGVyOiAnPC90Ym9keT48L3RhYmxlPicgfSxcbiAgICB0Zm9vdDogeyBkZXB0aDogMiwgYmVmb3JlOiAnPHRhYmxlPjx0Zm9vdD4nLCBhZnRlcjogJzwvdGZvb3Q+PC90YWJsZT4nIH0sXG4gICAgdGhlYWQ6IHsgZGVwdGg6IDIsIGJlZm9yZTogJzx0YWJsZT48dGhlYWQ+JywgYWZ0ZXI6ICc8L3RoZWFkPjwvdGFibGU+JyB9LFxuICAgIHRyOiB7IGRlcHRoOiAzLCBiZWZvcmU6ICc8dGFibGU+PHRib2R5Pjx0cj4nLCBhZnRlcjogJzwvdHI+PC90Ym9keT48L3RhYmxlPicgfVxufTtcbi8vIFBhdGNoOiAgICBpbm5lckhUTUwgRml4XG4vLyBCcm93c2VyczogSUU5XG4vLyBSZWFzb246ICAgSUU5IGRvbid0IGFsbG93IHVzIHRvIHNldCBpbm5lckhUTUwgb24gY29sLCBjb2xncm91cCwgZnJhbWVzZXQsXG4vLyAgICAgICAgICAgaHRtbCwgc3R5bGUsIHRhYmxlLCB0Ym9keSwgdGZvb3QsIHRoZWFkLCB0aXRsZSwgdHIuXG4vLyBGaXg6ICAgICAgV3JhcCB0aGUgaW5uZXJIVE1MIHdlIGFyZSBhYm91dCB0byBzZXQgaW4gaXRzIHBhcmVudHMsIGFwcGx5IHRoZVxuLy8gICAgICAgICAgIHdyYXBwZWQgaW5uZXJIVE1MIG9uIGEgZGl2LCB0aGVuIG1vdmUgdGhlIHVud3JhcHBlZCBub2RlcyBpbnRvIHRoZVxuLy8gICAgICAgICAgIHRhcmdldCBwb3NpdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBkb21DaGFuZ2VzKGRvY3VtZW50LCBET01DaGFuZ2VzQ2xhc3MpIHtcbiAgICBpZiAoIWRvY3VtZW50KSByZXR1cm4gRE9NQ2hhbmdlc0NsYXNzO1xuICAgIGlmICghc2hvdWxkQXBwbHlGaXgoZG9jdW1lbnQpKSB7XG4gICAgICAgIHJldHVybiBET01DaGFuZ2VzQ2xhc3M7XG4gICAgfVxuICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICByZXR1cm4gY2xhc3MgRE9NQ2hhbmdlc1dpdGhJbm5lckhUTUxGaXggZXh0ZW5kcyBET01DaGFuZ2VzQ2xhc3Mge1xuICAgICAgICBpbnNlcnRIVE1MQmVmb3JlKHBhcmVudCwgbmV4dFNpYmxpbmcsIGh0bWwpIHtcbiAgICAgICAgICAgIGlmIChodG1sID09PSBudWxsIHx8IGh0bWwgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmluc2VydEhUTUxCZWZvcmUocGFyZW50LCBuZXh0U2libGluZywgaHRtbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcGFyZW50VGFnID0gcGFyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGxldCB3cmFwcGVyID0gaW5uZXJIVE1MV3JhcHBlcltwYXJlbnRUYWddO1xuICAgICAgICAgICAgaWYgKHdyYXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5pbnNlcnRIVE1MQmVmb3JlKHBhcmVudCwgbmV4dFNpYmxpbmcsIGh0bWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZpeElubmVySFRNTChwYXJlbnQsIHdyYXBwZXIsIGRpdiwgaHRtbCwgbmV4dFNpYmxpbmcpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0cmVlQ29uc3RydWN0aW9uKGRvY3VtZW50LCBET01UcmVlQ29uc3RydWN0aW9uQ2xhc3MpIHtcbiAgICBpZiAoIWRvY3VtZW50KSByZXR1cm4gRE9NVHJlZUNvbnN0cnVjdGlvbkNsYXNzO1xuICAgIGlmICghc2hvdWxkQXBwbHlGaXgoZG9jdW1lbnQpKSB7XG4gICAgICAgIHJldHVybiBET01UcmVlQ29uc3RydWN0aW9uQ2xhc3M7XG4gICAgfVxuICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICByZXR1cm4gY2xhc3MgRE9NVHJlZUNvbnN0cnVjdGlvbldpdGhJbm5lckhUTUxGaXggZXh0ZW5kcyBET01UcmVlQ29uc3RydWN0aW9uQ2xhc3Mge1xuICAgICAgICBpbnNlcnRIVE1MQmVmb3JlKHBhcmVudCwgcmVmZXJlbmNlTm9kZSwgaHRtbCkge1xuICAgICAgICAgICAgaWYgKGh0bWwgPT09IG51bGwgfHwgaHRtbCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnQsIHJlZmVyZW5jZU5vZGUsIGh0bWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHBhcmVudFRhZyA9IHBhcmVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBsZXQgd3JhcHBlciA9IGlubmVySFRNTFdyYXBwZXJbcGFyZW50VGFnXTtcbiAgICAgICAgICAgIGlmICh3cmFwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnQsIHJlZmVyZW5jZU5vZGUsIGh0bWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZpeElubmVySFRNTChwYXJlbnQsIHdyYXBwZXIsIGRpdiwgaHRtbCwgcmVmZXJlbmNlTm9kZSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gZml4SW5uZXJIVE1MKHBhcmVudCwgd3JhcHBlciwgZGl2LCBodG1sLCByZWZlcmVuY2UpIHtcbiAgICBsZXQgd3JhcHBlZEh0bWwgPSB3cmFwcGVyLmJlZm9yZSArIGh0bWwgKyB3cmFwcGVyLmFmdGVyO1xuICAgIGRpdi5pbm5lckhUTUwgPSB3cmFwcGVkSHRtbDtcbiAgICBsZXQgcGFyZW50Tm9kZSA9IGRpdjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdyYXBwZXIuZGVwdGg7IGkrKykge1xuICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5jaGlsZE5vZGVzWzBdO1xuICAgIH1cbiAgICBsZXQgW2ZpcnN0LCBsYXN0XSA9IG1vdmVOb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBwYXJlbnQsIHJlZmVyZW5jZSk7XG4gICAgcmV0dXJuIG5ldyBDb25jcmV0ZUJvdW5kcyhwYXJlbnQsIGZpcnN0LCBsYXN0KTtcbn1cbmZ1bmN0aW9uIHNob3VsZEFwcGx5Rml4KGRvY3VtZW50KSB7XG4gICAgbGV0IHRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGFibGUnKTtcbiAgICB0cnkge1xuICAgICAgICB0YWJsZS5pbm5lckhUTUwgPSAnPHRib2R5PjwvdGJvZHk+JztcbiAgICB9IGNhdGNoIChlKSB7fSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHRhYmxlLmNoaWxkTm9kZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAvLyBJdCB3b3JrZWQgYXMgZXhwZWN0ZWQsIG5vIGZpeCByZXF1aXJlZFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufSJdfQ==