UNPKG

core-outline

Version:

A React component for Core&Outline

1,337 lines (1,329 loc) 247 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var React = require('react'); var uuid = require('uuid'); var engine_ioClient = require('engine.io-client'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var React__default = /*#__PURE__*/_interopDefaultLegacy(React); function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _regeneratorRuntime() { _regeneratorRuntime = function () { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function (t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function (t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function (e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function () { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function (e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function (t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function (t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function (t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function (t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function (e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } var NodeType; (function (NodeType) { NodeType[NodeType["Document"] = 0] = "Document"; NodeType[NodeType["DocumentType"] = 1] = "DocumentType"; NodeType[NodeType["Element"] = 2] = "Element"; NodeType[NodeType["Text"] = 3] = "Text"; NodeType[NodeType["CDATA"] = 4] = "CDATA"; NodeType[NodeType["Comment"] = 5] = "Comment"; })(NodeType || (NodeType = {})); function isElement(n) { return n.nodeType === n.ELEMENT_NODE; } function isShadowRoot(n) { var host = n === null || n === void 0 ? void 0 : n.host; return Boolean((host === null || host === void 0 ? void 0 : host.shadowRoot) === n); } function isNativeShadowDom(shadowRoot) { return Object.prototype.toString.call(shadowRoot) === '[object ShadowRoot]'; } function fixBrowserCompatibilityIssuesInCSS(cssText) { if (cssText.includes(' background-clip: text;') && !cssText.includes(' -webkit-background-clip: text;')) { cssText = cssText.replace(' background-clip: text;', ' -webkit-background-clip: text; background-clip: text;'); } return cssText; } function getCssRulesString(s) { try { var rules = s.rules || s.cssRules; return rules ? fixBrowserCompatibilityIssuesInCSS(Array.from(rules).map(getCssRuleString).join('')) : null; } catch (error) { return null; } } function getCssRuleString(rule) { var cssStringified = rule.cssText; if (isCSSImportRule(rule)) { try { cssStringified = getCssRulesString(rule.styleSheet) || cssStringified; } catch (_a) { } } return cssStringified; } function isCSSImportRule(rule) { return 'styleSheet' in rule; } var Mirror = (function () { function Mirror() { this.idNodeMap = new Map(); this.nodeMetaMap = new WeakMap(); } Mirror.prototype.getId = function (n) { var _a; if (!n) return -1; var id = (_a = this.getMeta(n)) === null || _a === void 0 ? void 0 : _a.id; return id !== null && id !== void 0 ? id : -1; }; Mirror.prototype.getNode = function (id) { return this.idNodeMap.get(id) || null; }; Mirror.prototype.getIds = function () { return Array.from(this.idNodeMap.keys()); }; Mirror.prototype.getMeta = function (n) { return this.nodeMetaMap.get(n) || null; }; Mirror.prototype.removeNodeFromMap = function (n) { var _this = this; var id = this.getId(n); this.idNodeMap["delete"](id); if (n.childNodes) { n.childNodes.forEach(function (childNode) { return _this.removeNodeFromMap(childNode); }); } }; Mirror.prototype.has = function (id) { return this.idNodeMap.has(id); }; Mirror.prototype.hasNode = function (node) { return this.nodeMetaMap.has(node); }; Mirror.prototype.add = function (n, meta) { var id = meta.id; this.idNodeMap.set(id, n); this.nodeMetaMap.set(n, meta); }; Mirror.prototype.replace = function (id, n) { var oldNode = this.getNode(id); if (oldNode) { var meta = this.nodeMetaMap.get(oldNode); if (meta) this.nodeMetaMap.set(n, meta); } this.idNodeMap.set(id, n); }; Mirror.prototype.reset = function () { this.idNodeMap = new Map(); this.nodeMetaMap = new WeakMap(); }; return Mirror; }()); function createMirror() { return new Mirror(); } function maskInputValue(_a) { var maskInputOptions = _a.maskInputOptions, tagName = _a.tagName, type = _a.type, value = _a.value, maskInputFn = _a.maskInputFn; var text = value || ''; if (maskInputOptions[tagName.toLowerCase()] || maskInputOptions[type]) { if (maskInputFn) { text = maskInputFn(text); } else { text = '*'.repeat(text.length); } } return text; } var ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__'; function is2DCanvasBlank(canvas) { var ctx = canvas.getContext('2d'); if (!ctx) return true; var chunkSize = 50; for (var x = 0; x < canvas.width; x += chunkSize) { for (var y = 0; y < canvas.height; y += chunkSize) { var getImageData = ctx.getImageData; var originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData ? getImageData[ORIGINAL_ATTRIBUTE_NAME] : getImageData; var pixelBuffer = new Uint32Array(originalGetImageData.call(ctx, x, y, Math.min(chunkSize, canvas.width - x), Math.min(chunkSize, canvas.height - y)).data.buffer); if (pixelBuffer.some(function (pixel) { return pixel !== 0; })) return false; } } return true; } var _id = 1; var tagNameRegex = new RegExp('[^a-z0-9-_:]'); var IGNORED_NODE = -2; function genId() { return _id++; } function getValidTagName(element) { if (element instanceof HTMLFormElement) { return 'form'; } var processedTagName = element.tagName.toLowerCase().trim(); if (tagNameRegex.test(processedTagName)) { return 'div'; } return processedTagName; } function stringifyStyleSheet(sheet) { return sheet.cssRules ? Array.from(sheet.cssRules) .map(function (rule) { return rule.cssText || ''; }) .join('') : ''; } function extractOrigin(url) { var origin = ''; if (url.indexOf('//') > -1) { origin = url.split('/').slice(0, 3).join('/'); } else { origin = url.split('/')[0]; } origin = origin.split('?')[0]; return origin; } var canvasService; var canvasCtx; var URL_IN_CSS_REF = /url\((?:(')([^']*)'|(")(.*?)"|([^)]*))\)/gm; var RELATIVE_PATH = /^(?!www\.|(?:http|ftp)s?:\/\/|[A-Za-z]:\\|\/\/|#).*/; var DATA_URI = /^(data:)([^,]*),(.*)/i; function absoluteToStylesheet(cssText, href) { return (cssText || '').replace(URL_IN_CSS_REF, function (origin, quote1, path1, quote2, path2, path3) { var filePath = path1 || path2 || path3; var maybeQuote = quote1 || quote2 || ''; if (!filePath) { return origin; } if (!RELATIVE_PATH.test(filePath)) { return "url(".concat(maybeQuote).concat(filePath).concat(maybeQuote, ")"); } if (DATA_URI.test(filePath)) { return "url(".concat(maybeQuote).concat(filePath).concat(maybeQuote, ")"); } if (filePath[0] === '/') { return "url(".concat(maybeQuote).concat(extractOrigin(href) + filePath).concat(maybeQuote, ")"); } var stack = href.split('/'); var parts = filePath.split('/'); stack.pop(); for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) { var part = parts_1[_i]; if (part === '.') { continue; } else if (part === '..') { stack.pop(); } else { stack.push(part); } } return "url(".concat(maybeQuote).concat(stack.join('/')).concat(maybeQuote, ")"); }); } var SRCSET_NOT_SPACES = /^[^ \t\n\r\u000c]+/; var SRCSET_COMMAS_OR_SPACES = /^[, \t\n\r\u000c]+/; function getAbsoluteSrcsetString(doc, attributeValue) { if (attributeValue.trim() === '') { return attributeValue; } var pos = 0; function collectCharacters(regEx) { var chars; var match = regEx.exec(attributeValue.substring(pos)); if (match) { chars = match[0]; pos += chars.length; return chars; } return ''; } var output = []; while (true) { collectCharacters(SRCSET_COMMAS_OR_SPACES); if (pos >= attributeValue.length) { break; } var url = collectCharacters(SRCSET_NOT_SPACES); if (url.slice(-1) === ',') { url = absoluteToDoc(doc, url.substring(0, url.length - 1)); output.push(url); } else { var descriptorsStr = ''; url = absoluteToDoc(doc, url); var inParens = false; while (true) { var c = attributeValue.charAt(pos); if (c === '') { output.push((url + descriptorsStr).trim()); break; } else if (!inParens) { if (c === ',') { pos += 1; output.push((url + descriptorsStr).trim()); break; } else if (c === '(') { inParens = true; } } else { if (c === ')') { inParens = false; } } descriptorsStr += c; pos += 1; } } } return output.join(', '); } function absoluteToDoc(doc, attributeValue) { if (!attributeValue || attributeValue.trim() === '') { return attributeValue; } var a = doc.createElement('a'); a.href = attributeValue; return a.href; } function isSVGElement(el) { return Boolean(el.tagName === 'svg' || el.ownerSVGElement); } function getHref() { var a = document.createElement('a'); a.href = ''; return a.href; } function transformAttribute(doc, tagName, name, value) { if (name === 'src' || (name === 'href' && value && !(tagName === 'use' && value[0] === '#'))) { return absoluteToDoc(doc, value); } else if (name === 'xlink:href' && value && value[0] !== '#') { return absoluteToDoc(doc, value); } else if (name === 'background' && value && (tagName === 'table' || tagName === 'td' || tagName === 'th')) { return absoluteToDoc(doc, value); } else if (name === 'srcset' && value) { return getAbsoluteSrcsetString(doc, value); } else if (name === 'style' && value) { return absoluteToStylesheet(value, getHref()); } else if (tagName === 'object' && name === 'data' && value) { return absoluteToDoc(doc, value); } else { return value; } } function _isBlockedElement(element, blockClass, blockSelector) { if (typeof blockClass === 'string') { if (element.classList.contains(blockClass)) { return true; } } else { for (var eIndex = element.classList.length; eIndex--;) { var className = element.classList[eIndex]; if (blockClass.test(className)) { return true; } } } if (blockSelector) { return element.matches(blockSelector); } return false; } function classMatchesRegex(node, regex, checkAncestors) { if (!node) return false; if (node.nodeType !== node.ELEMENT_NODE) { if (!checkAncestors) return false; return classMatchesRegex(node.parentNode, regex, checkAncestors); } for (var eIndex = node.classList.length; eIndex--;) { var className = node.classList[eIndex]; if (regex.test(className)) { return true; } } if (!checkAncestors) return false; return classMatchesRegex(node.parentNode, regex, checkAncestors); } function needMaskingText(node, maskTextClass, maskTextSelector) { var el = node.nodeType === node.ELEMENT_NODE ? node : node.parentElement; if (el === null) return false; if (typeof maskTextClass === 'string') { if (el.classList.contains(maskTextClass)) return true; if (el.closest(".".concat(maskTextClass))) return true; } else { if (classMatchesRegex(el, maskTextClass, true)) return true; } if (maskTextSelector) { if (el.matches(maskTextSelector)) return true; if (el.closest(maskTextSelector)) return true; } return false; } function onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) { var win = iframeEl.contentWindow; if (!win) { return; } var fired = false; var readyState; try { readyState = win.document.readyState; } catch (error) { return; } if (readyState !== 'complete') { var timer_1 = setTimeout(function () { if (!fired) { listener(); fired = true; } }, iframeLoadTimeout); iframeEl.addEventListener('load', function () { clearTimeout(timer_1); fired = true; listener(); }); return; } var blankUrl = 'about:blank'; if (win.location.href !== blankUrl || iframeEl.src === blankUrl || iframeEl.src === '') { setTimeout(listener, 0); return iframeEl.addEventListener('load', listener); } iframeEl.addEventListener('load', listener); } function onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) { var fired = false; var styleSheetLoaded; try { styleSheetLoaded = link.sheet; } catch (error) { return; } if (styleSheetLoaded) return; var timer = setTimeout(function () { if (!fired) { listener(); fired = true; } }, styleSheetLoadTimeout); link.addEventListener('load', function () { clearTimeout(timer); fired = true; listener(); }); } function serializeNode(n, options) { var doc = options.doc, mirror = options.mirror, blockClass = options.blockClass, blockSelector = options.blockSelector, maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, inlineStylesheet = options.inlineStylesheet, _a = options.maskInputOptions, maskInputOptions = _a === void 0 ? {} : _a, maskTextFn = options.maskTextFn, maskInputFn = options.maskInputFn, _b = options.dataURLOptions, dataURLOptions = _b === void 0 ? {} : _b, inlineImages = options.inlineImages, recordCanvas = options.recordCanvas, keepIframeSrcFn = options.keepIframeSrcFn, _c = options.newlyAddedElement, newlyAddedElement = _c === void 0 ? false : _c; var rootId = getRootId(doc, mirror); switch (n.nodeType) { case n.DOCUMENT_NODE: if (n.compatMode !== 'CSS1Compat') { return { type: NodeType.Document, childNodes: [], compatMode: n.compatMode }; } else { return { type: NodeType.Document, childNodes: [] }; } case n.DOCUMENT_TYPE_NODE: return { type: NodeType.DocumentType, name: n.name, publicId: n.publicId, systemId: n.systemId, rootId: rootId }; case n.ELEMENT_NODE: return serializeElementNode(n, { doc: doc, blockClass: blockClass, blockSelector: blockSelector, inlineStylesheet: inlineStylesheet, maskInputOptions: maskInputOptions, maskInputFn: maskInputFn, dataURLOptions: dataURLOptions, inlineImages: inlineImages, recordCanvas: recordCanvas, keepIframeSrcFn: keepIframeSrcFn, newlyAddedElement: newlyAddedElement, rootId: rootId }); case n.TEXT_NODE: return serializeTextNode(n, { maskTextClass: maskTextClass, maskTextSelector: maskTextSelector, maskTextFn: maskTextFn, rootId: rootId }); case n.CDATA_SECTION_NODE: return { type: NodeType.CDATA, textContent: '', rootId: rootId }; case n.COMMENT_NODE: return { type: NodeType.Comment, textContent: n.textContent || '', rootId: rootId }; default: return false; } } function getRootId(doc, mirror) { if (!mirror.hasNode(doc)) return undefined; var docId = mirror.getId(doc); return docId === 1 ? undefined : docId; } function serializeTextNode(n, options) { var _a; var maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, maskTextFn = options.maskTextFn, rootId = options.rootId; var parentTagName = n.parentNode && n.parentNode.tagName; var textContent = n.textContent; var isStyle = parentTagName === 'STYLE' ? true : undefined; var isScript = parentTagName === 'SCRIPT' ? true : undefined; if (isStyle && textContent) { try { if (n.nextSibling || n.previousSibling) { } else if ((_a = n.parentNode.sheet) === null || _a === void 0 ? void 0 : _a.cssRules) { textContent = stringifyStyleSheet(n.parentNode.sheet); } } catch (err) { console.warn("Cannot get CSS styles from text's parentNode. Error: ".concat(err), n); } textContent = absoluteToStylesheet(textContent, getHref()); } if (isScript) { textContent = 'SCRIPT_PLACEHOLDER'; } if (!isStyle && !isScript && textContent && needMaskingText(n, maskTextClass, maskTextSelector)) { textContent = maskTextFn ? maskTextFn(textContent) : textContent.replace(/[\S]/g, '*'); } return { type: NodeType.Text, textContent: textContent || '', isStyle: isStyle, rootId: rootId }; } function serializeElementNode(n, options) { var doc = options.doc, blockClass = options.blockClass, blockSelector = options.blockSelector, inlineStylesheet = options.inlineStylesheet, _a = options.maskInputOptions, maskInputOptions = _a === void 0 ? {} : _a, maskInputFn = options.maskInputFn, _b = options.dataURLOptions, dataURLOptions = _b === void 0 ? {} : _b, inlineImages = options.inlineImages, recordCanvas = options.recordCanvas, keepIframeSrcFn = options.keepIframeSrcFn, _c = options.newlyAddedElement, newlyAddedElement = _c === void 0 ? false : _c, rootId = options.rootId; var needBlock = _isBlockedElement(n, blockClass, blockSelector); var tagName = getValidTagName(n); var attributes = {}; var len = n.attributes.length; for (var i = 0; i < len; i++) { var attr = n.attributes[i]; attributes[attr.name] = transformAttribute(doc, tagName, attr.name, attr.value); } if (tagName === 'link' && inlineStylesheet) { var stylesheet = Array.from(doc.styleSheets).find(function (s) { return s.href === n.href; }); var cssText = null; if (stylesheet) { cssText = getCssRulesString(stylesheet); } if (cssText) { delete attributes.rel; delete attributes.href; attributes._cssText = absoluteToStylesheet(cssText, stylesheet.href); } } if (tagName === 'style' && n.sheet && !(n.innerText || n.textContent || '').trim().length) { var cssText = getCssRulesString(n.sheet); if (cssText) { attributes._cssText = absoluteToStylesheet(cssText, getHref()); } } if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') { var value = n.value; var checked = n.checked; if (attributes.type !== 'radio' && attributes.type !== 'checkbox' && attributes.type !== 'submit' && attributes.type !== 'button' && value) { attributes.value = maskInputValue({ type: attributes.type, tagName: tagName, value: value, maskInputOptions: maskInputOptions, maskInputFn: maskInputFn }); } else if (checked) { attributes.checked = checked; } } if (tagName === 'option') { if (n.selected && !maskInputOptions['select']) { attributes.selected = true; } else { delete attributes.selected; } } if (tagName === 'canvas' && recordCanvas) { if (n.__context === '2d') { if (!is2DCanvasBlank(n)) { attributes.rr_dataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality); } } else if (!('__context' in n)) { var canvasDataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality); var blankCanvas = document.createElement('canvas'); blankCanvas.width = n.width; blankCanvas.height = n.height; var blankCanvasDataURL = blankCanvas.toDataURL(dataURLOptions.type, dataURLOptions.quality); if (canvasDataURL !== blankCanvasDataURL) { attributes.rr_dataURL = canvasDataURL; } } } if (tagName === 'img' && inlineImages) { if (!canvasService) { canvasService = doc.createElement('canvas'); canvasCtx = canvasService.getContext('2d'); } var image_1 = n; var oldValue_1 = image_1.crossOrigin; image_1.crossOrigin = 'anonymous'; var recordInlineImage = function () { try { canvasService.width = image_1.naturalWidth; canvasService.height = image_1.naturalHeight; canvasCtx.drawImage(image_1, 0, 0); attributes.rr_dataURL = canvasService.toDataURL(dataURLOptions.type, dataURLOptions.quality); } catch (err) { console.warn("Cannot inline img src=".concat(image_1.currentSrc, "! Error: ").concat(err)); } oldValue_1 ? (attributes.crossOrigin = oldValue_1) : image_1.removeAttribute('crossorigin'); }; if (image_1.complete && image_1.naturalWidth !== 0) recordInlineImage(); else image_1.onload = recordInlineImage; } if (tagName === 'audio' || tagName === 'video') { attributes.rr_mediaState = n.paused ? 'paused' : 'played'; attributes.rr_mediaCurrentTime = n.currentTime; } if (!newlyAddedElement) { if (n.scrollLeft) { attributes.rr_scrollLeft = n.scrollLeft; } if (n.scrollTop) { attributes.rr_scrollTop = n.scrollTop; } } if (needBlock) { var _d = n.getBoundingClientRect(), width = _d.width, height = _d.height; attributes = { "class": attributes["class"], rr_width: "".concat(width, "px"), rr_height: "".concat(height, "px") }; } if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src)) { if (!n.contentDocument) { attributes.rr_src = attributes.src; } delete attributes.src; } return { type: NodeType.Element, tagName: tagName, attributes: attributes, childNodes: [], isSVG: isSVGElement(n) || undefined, needBlock: needBlock, rootId: rootId }; } function lowerIfExists(maybeAttr) { if (maybeAttr === undefined) { return ''; } else { return maybeAttr.toLowerCase(); } } function slimDOMExcluded(sn, slimDOMOptions) { if (slimDOMOptions.comment && sn.type === NodeType.Comment) { return true; } else if (sn.type === NodeType.Element) { if (slimDOMOptions.script && (sn.tagName === 'script' || (sn.tagName === 'link' && sn.attributes.rel === 'preload' && sn.attributes.as === 'script') || (sn.tagName === 'link' && sn.attributes.rel === 'prefetch' && typeof sn.attributes.href === 'string' && sn.attributes.href.endsWith('.js')))) { return true; } else if (slimDOMOptions.headFavicon && ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') || (sn.tagName === 'meta' && (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) || lowerIfExists(sn.attributes.name) === 'application-name' || lowerIfExists(sn.attributes.rel) === 'icon' || lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' || lowerIfExists(sn.attributes.rel) === 'shortcut icon')))) { return true; } else if (sn.tagName === 'meta') { if (slimDOMOptions.headMetaDescKeywords && lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) { return true; } else if (slimDOMOptions.headMetaSocial && (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) || lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) || lowerIfExists(sn.attributes.name) === 'pinterest')) { return true; } else if (slimDOMOptions.headMetaRobots && (lowerIfExists(sn.attributes.name) === 'robots' || lowerIfExists(sn.attributes.name) === 'googlebot' || lowerIfExists(sn.attributes.name) === 'bingbot')) { return true; } else if (slimDOMOptions.headMetaHttpEquiv && sn.attributes['http-equiv'] !== undefined) { return true; } else if (slimDOMOptions.headMetaAuthorship && (lowerIfExists(sn.attributes.name) === 'author' || lowerIfExists(sn.attributes.name) === 'generator' || lowerIfExists(sn.attributes.name) === 'framework' || lowerIfExists(sn.attributes.name) === 'publisher' || lowerIfExists(sn.attributes.name) === 'progid' || lowerIfExists(sn.attributes.property).match(/^article:/) || lowerIfExists(sn.attributes.property).match(/^product:/))) { return true; } else if (slimDOMOptions.headMetaVerification && (lowerIfExists(sn.attributes.name) === 'google-site-verification' || lowerIfExists(sn.attributes.name) === 'yandex-verification' || lowerIfExists(sn.attributes.name) === 'csrf-token' || lowerIfExists(sn.attributes.name) === 'p:domain_verify' || lowerIfExists(sn.attributes.name) === 'verify-v1' || lowerIfExists(sn.attributes.name) === 'verification' || lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')) { return true; } } } return false; } function serializeNodeWithId(n, options) { var doc = options.doc, mirror = options.mirror, blockClass = options.blockClass, blockSelector = options.blockSelector, maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, _a = options.skipChild, skipChild = _a === void 0 ? false : _a, _b = options.inlineStylesheet, inlineStylesheet = _b === void 0 ? true : _b, _c = options.maskInputOptions, maskInputOptions = _c === void 0 ? {} : _c, maskTextFn = options.maskTextFn, maskInputFn = options.maskInputFn, slimDOMOptions = options.slimDOMOptions, _d = options.dataURLOptions, dataURLOptions = _d === void 0 ? {} : _d, _e = options.inlineImages, inlineImages = _e === void 0 ? false : _e, _f = options.recordCanvas, recordCanvas = _f === void 0 ? false : _f, onSerialize = options.onSerialize, onIframeLoad = options.onIframeLoad, _g = options.iframeLoadTimeout, iframeLoadTimeout = _g === void 0 ? 5000 : _g, onStylesheetLoad = options.onStylesheetLoad, _h = options.stylesheetLoadTimeout, stylesheetLoadTimeout = _h === void 0 ? 5000 : _h, _j = options.keepIframeSrcFn, keepIframeSrcFn = _j === void 0 ? function () { return false; } : _j, _k = options.newlyAddedElement, newlyAddedElement = _k === void 0 ? false : _k; var _l = options.preserveWhiteSpace, preserveWhiteSpace = _l === void 0 ? true : _l; var _serializedNode = serializeNode(n, { doc: doc, mirror: mirror, blockClass: blockClass, blockSelector: blockSelector, maskTextClass: maskTextClass, maskTextSelector: maskTextSelector, inlineStylesheet: inlineStylesheet, maskInputOptions: maskInputOptions, maskTextFn: maskTextFn, maskInputFn: maskInputFn, dataURLOptions: dataURLOptions, inlineImages: inlineImages, recordCanvas: recordCanvas, keepIframeSrcFn: keepIframeSrcFn, newlyAddedElement: newlyAddedElement }); if (!_serializedNode) { console.warn(n, 'not serialized'); return null; } var id; if (mirror.hasNode(n)) { id = mirror.getId(n); } else if (slimDOMExcluded(_serializedNode, slimDOMOptions) || (!preserveWhiteSpace && _serializedNode.type === NodeType.Text && !_serializedNode.isStyle && !_serializedNode.textContent.replace(/^\s+|\s+$/gm, '').length)) { id = IGNORED_NODE; } else { id = genId(); } var serializedNode = Object.assign(_serializedNode, { id: id }); mirror.add(n, serializedNode); if (id === IGNORED_NODE) { return null; } if (onSerialize) { onSerialize(n); } var recordChild = !skipChild; if (serializedNode.type === NodeType.Element) { recordChild = recordChild && !serializedNode.needBlock; delete serializedNode.needBlock; var shadowRoot = n.shadowRoot; if (shadowRoot && isNativeShadowDom(shadowRoot)) serializedNode.isShadowHost = true; } if ((serializedNode.type === NodeType.Document || serializedNode.type === NodeType.Element) && recordChild) { if (slimDOMOptions.headWhitespace && serializedNode.type === NodeType.Element && serializedNode.tagName === 'head') { preserveWhiteSpace = false; } var bypassOptions = { doc: doc, mirror: mirror, blockClass: blockClass, blockSelector: blockSelector, maskTextClass: maskTextClass, maskTextSelector: maskTextSelector, skipChild: skipChild, inlineStylesheet: inlineStylesheet, maskInputOptions: maskInputOptions, maskTextFn: maskTextFn, maskInputFn: maskInputFn, slimDOMOptions: slimDOMOptions, dataURLOptions: dataURLOptions, inlineImages: inlineImages, recordCanvas: recordCanvas, preserveWhiteSpace: preserveWhiteSpace, onSerialize: onSerialize, onIframeLoad: onIframeLoad, iframeLoadTimeout: iframeLoadTimeout, onStylesheetLoad: onStylesheetLoad, stylesheetLoadTimeout: stylesheetLoadTimeout, keepIframeSrcFn: keepIframeSrcFn }; for (var _i = 0, _m = Array.from(n.childNodes); _i < _m.length; _i++) { var childN = _m[_i]; var serializedChildNode = serializeNodeWithId(childN, bypassOptions); if (serializedChildNode) { serializedNode.childNodes.push(serializedChildNode); } } if (isElement(n) && n.shadowRoot) { for (var _o = 0, _p = Array.from(n.shadowRoot.childNodes); _o < _p.length; _o++) { var childN = _p[_o]; var serializedChildNode = serializeNodeWithId(childN, bypassOptions); if (serializedChildNode) { isNativeShadowDom(n.shadowRoot) && (serializedChildNode.isShadow = true); serializedNode.childNodes.push(serializedChildNode); } } } } if (n.parentNode && isShadowRoot(n.parentNode) && isNativeShadowDom(n.parentNode)) { serializedNode.isShadow = true; } if (serializedNode.type === NodeType.Element && serializedNode.tagName === 'iframe') { onceIframeLoaded(n, function () { var iframeDoc = n.contentDocument; if (iframeDoc && onIframeLoad) { var serializedIframeNode = serializeNodeWithId(iframeDoc, { doc: iframeDoc, mirror: mirror, blockClass: blockClass, blockSelector: blockSelector, maskTextClass: maskTextClass, maskTextSelector: maskTextSelector, skipChild: false, inlineStylesheet: inlineStylesheet, maskInputOptions: maskInputOptions, maskTextFn: maskTextFn, maskInputFn: maskInputFn, slimDOMOptions: slimDOMOptions, dataURLOptions: dataURLOptions, inlineImages: inlineImages, recordCanvas: recordCanvas, preserveWhiteSpace: preserveWhiteSpace, onSerialize: onSerialize, onIframeLoad: onIframeLoad, iframeLoadTimeout: iframeLoadTimeout, onStylesheetLoad: onStylesheetLoad, stylesheetLoadTimeout: stylesheetLoadTimeout, keepIframeSrcFn: keepIframeSrcFn }); if (serializedIframeNode) { onIframeLoad(n, serializedIframeNode); } } }, iframeLoadTimeout); } if (serializedNode.type === NodeType.Element && serializedNode.tagName === 'link' && serializedNode.attributes.rel === 'stylesheet') { onceStylesheetLoaded(n, function () { if (onStylesheetLoad) { var serializedLinkNode = serializeNodeWithId(n, { doc: doc, mirror: mirror, blockClass: blockClass, blockSelector: blockSelector, maskTextClass: maskTextClass, maskTextSelector: maskTextSelector, skipChild: false, inlineStylesheet: inlineStylesheet, maskInputOptions: maskInputOptions, maskTextFn: maskTextFn, maskInputFn: maskInputFn, slimDOMOptions: slimDOMOptions, dataURLOptions: dataURLOptions, inlineImages: inlineImages, recordCanvas: recordCanvas, preserveWhiteSpace: preserveWhiteSpace, onSerial