ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
88 lines (83 loc) • 12.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SVG_NAMESPACE = undefined;
exports.domChanges = domChanges;
exports.treeConstruction = treeConstruction;
var _bounds = require('../bounds');
var _helper = require('../dom/helper');
var _util = require('@glimmer/util');
const SVG_NAMESPACE = exports.SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
// Patch: insertAdjacentHTML on SVG Fix
// Browsers: Safari, IE, Edge, Firefox ~33-34
// Reason: insertAdjacentHTML does not exist on SVG elements in Safari. It is
// present but throws an exception on IE and Edge. Old versions of
// Firefox create nodes in the incorrect namespace.
// Fix: Since IE and Edge silently fail to create SVG nodes using
// innerHTML, and because Firefox may create nodes in the incorrect
// namespace using innerHTML on SVG elements, an HTML-string wrapping
// approach is used. A pre/post SVG tag is added to the string, then
// that whole string is added to a div. The created nodes are plucked
// out and applied to the target location on DOM.
function domChanges(document, DOMChangesClass, svgNamespace) {
if (!document) return DOMChangesClass;
if (!shouldApplyFix(document, svgNamespace)) {
return DOMChangesClass;
}
let div = document.createElement('div');
return class DOMChangesWithSVGInnerHTMLFix extends DOMChangesClass {
insertHTMLBefore(parent, nextSibling, html) {
if (html === null || html === '') {
return super.insertHTMLBefore(parent, nextSibling, html);
}
if (parent.namespaceURI !== svgNamespace) {
return super.insertHTMLBefore(parent, nextSibling, html);
}
return fixSVG(parent, div, html, nextSibling);
}
};
}
function treeConstruction(document, TreeConstructionClass, svgNamespace) {
if (!document) return TreeConstructionClass;
if (!shouldApplyFix(document, svgNamespace)) {
return TreeConstructionClass;
}
let div = document.createElement('div');
return class TreeConstructionWithSVGInnerHTMLFix extends TreeConstructionClass {
insertHTMLBefore(parent, reference, html) {
if (html === null || html === '') {
return super.insertHTMLBefore(parent, reference, html);
}
if (parent.namespaceURI !== svgNamespace) {
return super.insertHTMLBefore(parent, reference, html);
}
return fixSVG(parent, div, html, reference);
}
};
}
function fixSVG(parent, div, html, reference) {
// IE, Edge: also do not correctly support using `innerHTML` on SVG
// namespaced elements. So here a wrapper is used.
let wrappedHtml = '<svg>' + html + '</svg>';
div.innerHTML = wrappedHtml;
let [first, last] = (0, _helper.moveNodesBefore)(div.firstChild, parent, reference);
return new _bounds.ConcreteBounds(parent, first, last);
}
function shouldApplyFix(document, svgNamespace) {
let svg = document.createElementNS(svgNamespace, 'svg');
try {
svg['insertAdjacentHTML']('beforeend', '<circle></circle>');
} catch (e) {
// IE, Edge: Will throw, insertAdjacentHTML is unsupported on SVG
// Safari: Will throw, insertAdjacentHTML is not present on SVG
} finally {
// FF: Old versions will create a node in the wrong namespace
if (svg.childNodes.length === 1 && (0, _util.unwrap)(svg.firstChild).namespaceURI === SVG_NAMESPACE) {
// The test worked as expected, no fix required
return false;
}
return true;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21wYXQvc3ZnLWlubmVyLWh0bWwtZml4LmpzIl0sIm5hbWVzIjpbImRvbUNoYW5nZXMiLCJ0cmVlQ29uc3RydWN0aW9uIiwiU1ZHX05BTUVTUEFDRSIsImRvY3VtZW50IiwiRE9NQ2hhbmdlc0NsYXNzIiwic3ZnTmFtZXNwYWNlIiwic2hvdWxkQXBwbHlGaXgiLCJkaXYiLCJjcmVhdGVFbGVtZW50IiwiRE9NQ2hhbmdlc1dpdGhTVkdJbm5lckhUTUxGaXgiLCJpbnNlcnRIVE1MQmVmb3JlIiwicGFyZW50IiwibmV4dFNpYmxpbmciLCJodG1sIiwibmFtZXNwYWNlVVJJIiwiZml4U1ZHIiwiVHJlZUNvbnN0cnVjdGlvbkNsYXNzIiwiVHJlZUNvbnN0cnVjdGlvbldpdGhTVkdJbm5lckhUTUxGaXgiLCJyZWZlcmVuY2UiLCJ3cmFwcGVkSHRtbCIsImlubmVySFRNTCIsImZpcnN0IiwibGFzdCIsImZpcnN0Q2hpbGQiLCJzdmciLCJjcmVhdGVFbGVtZW50TlMiLCJlIiwiY2hpbGROb2RlcyIsImxlbmd0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O1FBZWdCQSxVLEdBQUFBLFU7UUFrQkFDLGdCLEdBQUFBLGdCOztBQWpDaEI7O0FBQ0E7O0FBQ0E7O0FBQ08sTUFBTUMsd0NBQWdCLDRCQUF0QjtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRixVQUFULENBQW9CRyxRQUFwQixFQUE4QkMsZUFBOUIsRUFBK0NDLFlBQS9DLEVBQTZEO0FBQ2hFLFFBQUksQ0FBQ0YsUUFBTCxFQUFlLE9BQU9DLGVBQVA7QUFDZixRQUFJLENBQUNFLGVBQWVILFFBQWYsRUFBeUJFLFlBQXpCLENBQUwsRUFBNkM7QUFDekMsZUFBT0QsZUFBUDtBQUNIO0FBQ0QsUUFBSUcsTUFBTUosU0FBU0ssYUFBVCxDQUF1QixLQUF2QixDQUFWO0FBQ0EsV0FBTyxNQUFNQyw2QkFBTixTQUE0Q0wsZUFBNUMsQ0FBNEQ7QUFDL0RNLHlCQUFpQkMsTUFBakIsRUFBeUJDLFdBQXpCLEVBQXNDQyxJQUF0QyxFQUE0QztBQUN4QyxnQkFBSUEsU0FBUyxJQUFULElBQWlCQSxTQUFTLEVBQTlCLEVBQWtDO0FBQzlCLHVCQUFPLE1BQU1ILGdCQUFOLENBQXVCQyxNQUF2QixFQUErQkMsV0FBL0IsRUFBNENDLElBQTVDLENBQVA7QUFDSDtBQUNELGdCQUFJRixPQUFPRyxZQUFQLEtBQXdCVCxZQUE1QixFQUEwQztBQUN0Qyx1QkFBTyxNQUFNSyxnQkFBTixDQUF1QkMsTUFBdkIsRUFBK0JDLFdBQS9CLEVBQTRDQyxJQUE1QyxDQUFQO0FBQ0g7QUFDRCxtQkFBT0UsT0FBT0osTUFBUCxFQUFlSixHQUFmLEVBQW9CTSxJQUFwQixFQUEwQkQsV0FBMUIsQ0FBUDtBQUNIO0FBVDhELEtBQW5FO0FBV0g7QUFDTSxTQUFTWCxnQkFBVCxDQUEwQkUsUUFBMUIsRUFBb0NhLHFCQUFwQyxFQUEyRFgsWUFBM0QsRUFBeUU7QUFDNUUsUUFBSSxDQUFDRixRQUFMLEVBQWUsT0FBT2EscUJBQVA7QUFDZixRQUFJLENBQUNWLGVBQWVILFFBQWYsRUFBeUJFLFlBQXpCLENBQUwsRUFBNkM7QUFDekMsZUFBT1cscUJBQVA7QUFDSDtBQUNELFFBQUlULE1BQU1KLFNBQVNLLGFBQVQsQ0FBdUIsS0FBdkIsQ0FBVjtBQUNBLFdBQU8sTUFBTVMsbUNBQU4sU0FBa0RELHFCQUFsRCxDQUF3RTtBQUMzRU4seUJBQWlCQyxNQUFqQixFQUF5Qk8sU0FBekIsRUFBb0NMLElBQXBDLEVBQTBDO0FBQ3RDLGdCQUFJQSxTQUFTLElBQVQsSUFBaUJBLFNBQVMsRUFBOUIsRUFBa0M7QUFDOUIsdUJBQU8sTUFBTUgsZ0JBQU4sQ0FBdUJDLE1BQXZCLEVBQStCTyxTQUEvQixFQUEwQ0wsSUFBMUMsQ0FBUDtBQUNIO0FBQ0QsZ0JBQUlGLE9BQU9HLFlBQVAsS0FBd0JULFlBQTVCLEVBQTBDO0FBQ3RDLHVCQUFPLE1BQU1LLGdCQUFOLENBQXVCQyxNQUF2QixFQUErQk8sU0FBL0IsRUFBMENMLElBQTFDLENBQVA7QUFDSDtBQUNELG1CQUFPRSxPQUFPSixNQUFQLEVBQWVKLEdBQWYsRUFBb0JNLElBQXBCLEVBQTBCSyxTQUExQixDQUFQO0FBQ0g7QUFUMEUsS0FBL0U7QUFXSDtBQUNELFNBQVNILE1BQVQsQ0FBZ0JKLE1BQWhCLEVBQXdCSixHQUF4QixFQUE2Qk0sSUFBN0IsRUFBbUNLLFNBQW5DLEVBQThDO0FBQzFDO0FBQ0E7QUFDQSxRQUFJQyxjQUFjLFVBQVVOLElBQVYsR0FBaUIsUUFBbkM7QUFDQU4sUUFBSWEsU0FBSixHQUFnQkQsV0FBaEI7QUFDQSxRQUFJLENBQUNFLEtBQUQsRUFBUUMsSUFBUixJQUFnQiw2QkFBZ0JmLElBQUlnQixVQUFwQixFQUFnQ1osTUFBaEMsRUFBd0NPLFNBQXhDLENBQXBCO0FBQ0EsV0FBTywyQkFBbUJQLE1BQW5CLEVBQTJCVSxLQUEzQixFQUFrQ0MsSUFBbEMsQ0FBUDtBQUNIO0FBQ0QsU0FBU2hCLGNBQVQsQ0FBd0JILFFBQXhCLEVBQWtDRSxZQUFsQyxFQUFnRDtBQUM1QyxRQUFJbUIsTUFBTXJCLFNBQVNzQixlQUFULENBQXlCcEIsWUFBekIsRUFBdUMsS0FBdkMsQ0FBVjtBQUNBLFFBQUk7QUFDQW1CLFlBQUksb0JBQUosRUFBMEIsV0FBMUIsRUFBdUMsbUJBQXZDO0FBQ0gsS0FGRCxDQUVFLE9BQU9FLENBQVAsRUFBVTtBQUNSO0FBQ0E7QUFDSCxLQUxELFNBS1U7QUFDTjtBQUNBLFlBQUlGLElBQUlHLFVBQUosQ0FBZUMsTUFBZixLQUEwQixDQUExQixJQUErQixrQkFBT0osSUFBSUQsVUFBWCxFQUF1QlQsWUFBdkIsS0FBd0NaLGFBQTNFLEVBQTBGO0FBQ3RGO0FBQ0EsbUJBQU8sS0FBUDtBQUNIO0FBQ0QsZUFBTyxJQUFQO0FBQ0g7QUFDSiIsImZpbGUiOiJsaWIvY29tcGF0L3N2Zy1pbm5lci1odG1sLWZpeC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmNyZXRlQm91bmRzIH0gZnJvbSAnLi4vYm91bmRzJztcbmltcG9ydCB7IG1vdmVOb2Rlc0JlZm9yZSB9IGZyb20gJy4uL2RvbS9oZWxwZXInO1xuaW1wb3J0IHsgdW53cmFwIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5leHBvcnQgY29uc3QgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4vLyBQYXRjaDogICAgaW5zZXJ0QWRqYWNlbnRIVE1MIG9uIFNWRyBGaXhcbi8vIEJyb3dzZXJzOiBTYWZhcmksIElFLCBFZGdlLCBGaXJlZm94IH4zMy0zNFxuLy8gUmVhc29uOiAgIGluc2VydEFkamFjZW50SFRNTCBkb2VzIG5vdCBleGlzdCBvbiBTVkcgZWxlbWVudHMgaW4gU2FmYXJpLiBJdCBpc1xuLy8gICAgICAgICAgIHByZXNlbnQgYnV0IHRocm93cyBhbiBleGNlcHRpb24gb24gSUUgYW5kIEVkZ2UuIE9sZCB2ZXJzaW9ucyBvZlxuLy8gICAgICAgICAgIEZpcmVmb3ggY3JlYXRlIG5vZGVzIGluIHRoZSBpbmNvcnJlY3QgbmFtZXNwYWNlLlxuLy8gRml4OiAgICAgIFNpbmNlIElFIGFuZCBFZGdlIHNpbGVudGx5IGZhaWwgdG8gY3JlYXRlIFNWRyBub2RlcyB1c2luZ1xuLy8gICAgICAgICAgIGlubmVySFRNTCwgYW5kIGJlY2F1c2UgRmlyZWZveCBtYXkgY3JlYXRlIG5vZGVzIGluIHRoZSBpbmNvcnJlY3Rcbi8vICAgICAgICAgICBuYW1lc3BhY2UgdXNpbmcgaW5uZXJIVE1MIG9uIFNWRyBlbGVtZW50cywgYW4gSFRNTC1zdHJpbmcgd3JhcHBpbmdcbi8vICAgICAgICAgICBhcHByb2FjaCBpcyB1c2VkLiBBIHByZS9wb3N0IFNWRyB0YWcgaXMgYWRkZWQgdG8gdGhlIHN0cmluZywgdGhlblxuLy8gICAgICAgICAgIHRoYXQgd2hvbGUgc3RyaW5nIGlzIGFkZGVkIHRvIGEgZGl2LiBUaGUgY3JlYXRlZCBub2RlcyBhcmUgcGx1Y2tlZFxuLy8gICAgICAgICAgIG91dCBhbmQgYXBwbGllZCB0byB0aGUgdGFyZ2V0IGxvY2F0aW9uIG9uIERPTS5cbmV4cG9ydCBmdW5jdGlvbiBkb21DaGFuZ2VzKGRvY3VtZW50LCBET01DaGFuZ2VzQ2xhc3MsIHN2Z05hbWVzcGFjZSkge1xuICAgIGlmICghZG9jdW1lbnQpIHJldHVybiBET01DaGFuZ2VzQ2xhc3M7XG4gICAgaWYgKCFzaG91bGRBcHBseUZpeChkb2N1bWVudCwgc3ZnTmFtZXNwYWNlKSkge1xuICAgICAgICByZXR1cm4gRE9NQ2hhbmdlc0NsYXNzO1xuICAgIH1cbiAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcmV0dXJuIGNsYXNzIERPTUNoYW5nZXNXaXRoU1ZHSW5uZXJIVE1MRml4IGV4dGVuZHMgRE9NQ2hhbmdlc0NsYXNzIHtcbiAgICAgICAgaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnQsIG5leHRTaWJsaW5nLCBodG1sKSB7XG4gICAgICAgICAgICBpZiAoaHRtbCA9PT0gbnVsbCB8fCBodG1sID09PSAnJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5pbnNlcnRIVE1MQmVmb3JlKHBhcmVudCwgbmV4dFNpYmxpbmcsIGh0bWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgIT09IHN2Z05hbWVzcGFjZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5pbnNlcnRIVE1MQmVmb3JlKHBhcmVudCwgbmV4dFNpYmxpbmcsIGh0bWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZpeFNWRyhwYXJlbnQsIGRpdiwgaHRtbCwgbmV4dFNpYmxpbmcpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0cmVlQ29uc3RydWN0aW9uKGRvY3VtZW50LCBUcmVlQ29uc3RydWN0aW9uQ2xhc3MsIHN2Z05hbWVzcGFjZSkge1xuICAgIGlmICghZG9jdW1lbnQpIHJldHVybiBUcmVlQ29uc3RydWN0aW9uQ2xhc3M7XG4gICAgaWYgKCFzaG91bGRBcHBseUZpeChkb2N1bWVudCwgc3ZnTmFtZXNwYWNlKSkge1xuICAgICAgICByZXR1cm4gVHJlZUNvbnN0cnVjdGlvbkNsYXNzO1xuICAgIH1cbiAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcmV0dXJuIGNsYXNzIFRyZWVDb25zdHJ1Y3Rpb25XaXRoU1ZHSW5uZXJIVE1MRml4IGV4dGVuZHMgVHJlZUNvbnN0cnVjdGlvbkNsYXNzIHtcbiAgICAgICAgaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnQsIHJlZmVyZW5jZSwgaHRtbCkge1xuICAgICAgICAgICAgaWYgKGh0bWwgPT09IG51bGwgfHwgaHRtbCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnQsIHJlZmVyZW5jZSwgaHRtbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSAhPT0gc3ZnTmFtZXNwYWNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmluc2VydEhUTUxCZWZvcmUocGFyZW50LCByZWZlcmVuY2UsIGh0bWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZpeFNWRyhwYXJlbnQsIGRpdiwgaHRtbCwgcmVmZXJlbmNlKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBmaXhTVkcocGFyZW50LCBkaXYsIGh0bWwsIHJlZmVyZW5jZSkge1xuICAgIC8vIElFLCBFZGdlOiBhbHNvIGRvIG5vdCBjb3JyZWN0bHkgc3VwcG9ydCB1c2luZyBgaW5uZXJIVE1MYCBvbiBTVkdcbiAgICAvLyBuYW1lc3BhY2VkIGVsZW1lbnRzLiBTbyBoZXJlIGEgd3JhcHBlciBpcyB1c2VkLlxuICAgIGxldCB3cmFwcGVkSHRtbCA9ICc8c3ZnPicgKyBodG1sICsgJzwvc3ZnPic7XG4gICAgZGl2LmlubmVySFRNTCA9IHdyYXBwZWRIdG1sO1xuICAgIGxldCBbZmlyc3QsIGxhc3RdID0gbW92ZU5vZGVzQmVmb3JlKGRpdi5maXJzdENoaWxkLCBwYXJlbnQsIHJlZmVyZW5jZSk7XG4gICAgcmV0dXJuIG5ldyBDb25jcmV0ZUJvdW5kcyhwYXJlbnQsIGZpcnN0LCBsYXN0KTtcbn1cbmZ1bmN0aW9uIHNob3VsZEFwcGx5Rml4KGRvY3VtZW50LCBzdmdOYW1lc3BhY2UpIHtcbiAgICBsZXQgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHN2Z05hbWVzcGFjZSwgJ3N2ZycpO1xuICAgIHRyeSB7XG4gICAgICAgIHN2Z1snaW5zZXJ0QWRqYWNlbnRIVE1MJ10oJ2JlZm9yZWVuZCcsICc8Y2lyY2xlPjwvY2lyY2xlPicpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSUUsIEVkZ2U6IFdpbGwgdGhyb3csIGluc2VydEFkamFjZW50SFRNTCBpcyB1bnN1cHBvcnRlZCBvbiBTVkdcbiAgICAgICAgLy8gU2FmYXJpOiBXaWxsIHRocm93LCBpbnNlcnRBZGphY2VudEhUTUwgaXMgbm90IHByZXNlbnQgb24gU1ZHXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gRkY6IE9sZCB2ZXJzaW9ucyB3aWxsIGNyZWF0ZSBhIG5vZGUgaW4gdGhlIHdyb25nIG5hbWVzcGFjZVxuICAgICAgICBpZiAoc3ZnLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICYmIHVud3JhcChzdmcuZmlyc3RDaGlsZCkubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgICAvLyBUaGUgdGVzdCB3b3JrZWQgYXMgZXhwZWN0ZWQsIG5vIGZpeCByZXF1aXJlZFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn0iXX0=