@highlight-run/rrweb 2.1.5 → 2.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/plugins/console-record.js +3 -3
  2. package/dist/plugins/console-record.min.js +3 -3
  3. package/dist/plugins/console-record.min.js.map +1 -1
  4. package/dist/plugins/console-replay.js +0 -0
  5. package/dist/plugins/console-replay.min.js +0 -0
  6. package/dist/plugins/console-replay.min.js.map +1 -1
  7. package/dist/plugins/sequential-id-record.js +0 -0
  8. package/dist/plugins/sequential-id-record.min.js +0 -0
  9. package/dist/plugins/sequential-id-record.min.js.map +0 -0
  10. package/dist/plugins/sequential-id-replay.js +0 -0
  11. package/dist/plugins/sequential-id-replay.min.js +0 -0
  12. package/dist/plugins/sequential-id-replay.min.js.map +0 -0
  13. package/dist/record/rrweb-record-pack.js +1 -1
  14. package/dist/record/rrweb-record-pack.min.js +1 -1
  15. package/dist/record/rrweb-record-pack.min.js.map +1 -1
  16. package/dist/record/rrweb-record.js +3 -3
  17. package/dist/record/rrweb-record.min.js +3 -3
  18. package/dist/record/rrweb-record.min.js.map +1 -1
  19. package/dist/replay/rrweb-replay-unpack.css +0 -0
  20. package/dist/replay/rrweb-replay-unpack.js +4 -4
  21. package/dist/replay/rrweb-replay-unpack.min.css +0 -0
  22. package/dist/replay/rrweb-replay-unpack.min.css.map +0 -0
  23. package/dist/replay/rrweb-replay-unpack.min.js +4 -4
  24. package/dist/replay/rrweb-replay-unpack.min.js.map +1 -1
  25. package/dist/replay/rrweb-replay.css +0 -0
  26. package/dist/replay/rrweb-replay.js +4 -4
  27. package/dist/replay/rrweb-replay.min.css +0 -0
  28. package/dist/replay/rrweb-replay.min.css.map +0 -0
  29. package/dist/replay/rrweb-replay.min.js +4 -4
  30. package/dist/replay/rrweb-replay.min.js.map +1 -1
  31. package/dist/rrweb-all.css +0 -0
  32. package/dist/rrweb-all.js +12 -12
  33. package/dist/rrweb-all.min.css +0 -0
  34. package/dist/rrweb-all.min.css.map +0 -0
  35. package/dist/rrweb-all.min.js +12 -12
  36. package/dist/rrweb-all.min.js.map +1 -1
  37. package/dist/rrweb.css +0 -0
  38. package/dist/rrweb.js +5 -5
  39. package/dist/rrweb.min.css +0 -0
  40. package/dist/rrweb.min.css.map +0 -0
  41. package/dist/rrweb.min.js +5 -5
  42. package/dist/rrweb.min.js.map +1 -1
  43. package/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js +0 -0
  44. package/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js +0 -0
  45. package/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +0 -0
  46. package/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js +0 -0
  47. package/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js +0 -0
  48. package/es/rrweb/_virtual/image-bitmap-data-url-worker.js +1 -1
  49. package/es/rrweb/all.css +0 -0
  50. package/es/rrweb/ext/@xstate/fsm/es/index.js +0 -0
  51. package/es/rrweb/ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js +0 -0
  52. package/es/rrweb/ext/fflate/esm/browser.js +0 -0
  53. package/es/rrweb/ext/mitt/dist/mitt.mjs.js +0 -0
  54. package/es/rrweb/ext/tslib/tslib.es6.js +0 -0
  55. package/es/rrweb/packages/rrdom/es/rrdom.js +0 -0
  56. package/es/rrweb/packages/rrweb/src/entries/all.js +0 -0
  57. package/es/rrweb/packages/rrweb/src/index.js +0 -0
  58. package/es/rrweb/packages/rrweb/src/packer/base.js +0 -0
  59. package/es/rrweb/packages/rrweb/src/packer/pack.js +0 -0
  60. package/es/rrweb/packages/rrweb/src/packer/unpack.js +0 -0
  61. package/es/rrweb/packages/rrweb/src/plugins/console/record/error-stack-parser.js +0 -0
  62. package/es/rrweb/packages/rrweb/src/plugins/console/record/index.js +0 -0
  63. package/es/rrweb/packages/rrweb/src/plugins/console/record/stringify.js +0 -0
  64. package/es/rrweb/packages/rrweb/src/plugins/console/replay/index.js +0 -0
  65. package/es/rrweb/packages/rrweb/src/plugins/sequential-id/record/index.js +0 -0
  66. package/es/rrweb/packages/rrweb/src/plugins/sequential-id/replay/index.js +0 -0
  67. package/es/rrweb/packages/rrweb/src/record/iframe-manager.js +0 -0
  68. package/es/rrweb/packages/rrweb/src/record/index.js +5 -1
  69. package/es/rrweb/packages/rrweb/src/record/mutation.js +0 -0
  70. package/es/rrweb/packages/rrweb/src/record/observer.js +0 -0
  71. package/es/rrweb/packages/rrweb/src/record/observers/canvas/2d.js +0 -0
  72. package/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas-manager.js +21 -7
  73. package/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas.js +0 -0
  74. package/es/rrweb/packages/rrweb/src/record/observers/canvas/serialize-args.js +0 -0
  75. package/es/rrweb/packages/rrweb/src/record/observers/canvas/webgl.js +0 -0
  76. package/es/rrweb/packages/rrweb/src/record/shadow-dom-manager.js +0 -0
  77. package/es/rrweb/packages/rrweb/src/record/stylesheet-manager.js +0 -0
  78. package/es/rrweb/packages/rrweb/src/replay/canvas/2d.js +0 -0
  79. package/es/rrweb/packages/rrweb/src/replay/canvas/deserialize-args.js +0 -0
  80. package/es/rrweb/packages/rrweb/src/replay/canvas/index.js +0 -0
  81. package/es/rrweb/packages/rrweb/src/replay/canvas/webgl.js +0 -0
  82. package/es/rrweb/packages/rrweb/src/replay/index.js +0 -0
  83. package/es/rrweb/packages/rrweb/src/replay/machine.js +0 -0
  84. package/es/rrweb/packages/rrweb/src/replay/smoothscroll.js +0 -0
  85. package/es/rrweb/packages/rrweb/src/replay/styles/inject-style.js +0 -0
  86. package/es/rrweb/packages/rrweb/src/replay/timer.js +0 -0
  87. package/es/rrweb/packages/rrweb/src/types.js +0 -0
  88. package/es/rrweb/packages/rrweb/src/utils.js +0 -0
  89. package/es/rrweb/packages/rrweb-snapshot/es/rrweb-snapshot.js +17 -9
  90. package/lib/plugins/console-record.js +0 -0
  91. package/lib/plugins/console-replay.js +0 -0
  92. package/lib/plugins/sequential-id-record.js +0 -0
  93. package/lib/plugins/sequential-id-replay.js +0 -0
  94. package/lib/record/rrweb-record-pack.js +1 -1
  95. package/lib/record/rrweb-record.js +44 -18
  96. package/lib/replay/rrweb-replay-unpack.css +0 -0
  97. package/lib/replay/rrweb-replay-unpack.js +0 -0
  98. package/lib/replay/rrweb-replay.css +0 -0
  99. package/lib/replay/rrweb-replay.js +0 -0
  100. package/lib/rrweb-all.css +0 -0
  101. package/lib/rrweb-all.js +44 -18
  102. package/lib/rrweb.css +0 -0
  103. package/lib/rrweb.js +44 -18
  104. package/package.json +3 -3
  105. package/typings/record/observers/canvas/canvas-manager.d.ts +3 -0
  106. package/typings/types.d.ts +11 -1
package/lib/rrweb-all.js CHANGED
@@ -575,8 +575,8 @@ function serializeTextNode(n, options) {
575
575
  }
576
576
  function serializeElementNode(n, options) {
577
577
  var doc = options.doc, blockClass = options.blockClass, blockSelector = options.blockSelector, inlineStylesheet = options.inlineStylesheet, _a = options.maskInputOptions, maskInputOptions = _a === void 0 ? {} : _a, maskInputFn = options.maskInputFn, maskTextClass = options.maskTextClass, _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, enableStrictPrivacy = options.enableStrictPrivacy, rootId = options.rootId;
578
- var needBlock = _isBlockedElement(n, blockClass, blockSelector) ||
579
- _isBlockedElement(n, maskTextClass, null);
578
+ var needBlock = _isBlockedElement(n, blockClass, blockSelector);
579
+ var needMask = _isBlockedElement(n, maskTextClass, null);
580
580
  var tagName = getValidTagName$1(n);
581
581
  var attributes = {};
582
582
  var len = n.attributes.length;
@@ -650,7 +650,11 @@ function serializeElementNode(n, options) {
650
650
  }
651
651
  }
652
652
  }
653
- if (tagName === 'img' && inlineImages && !needBlock) {
653
+ if (tagName === 'img' &&
654
+ inlineImages &&
655
+ !needBlock &&
656
+ !needMask &&
657
+ !enableStrictPrivacy) {
654
658
  if (!canvasService) {
655
659
  canvasService = doc.createElement('canvas');
656
660
  canvasCtx = canvasService.getContext('2d');
@@ -691,14 +695,16 @@ function serializeElementNode(n, options) {
691
695
  attributes.rr_scrollTop = n.scrollTop;
692
696
  }
693
697
  }
694
- if (needBlock || (tagName === 'img' && enableStrictPrivacy)) {
698
+ if (needBlock || needMask || (tagName === 'img' && enableStrictPrivacy)) {
695
699
  var _d = n.getBoundingClientRect(), width = _d.width, height = _d.height;
696
700
  attributes = {
697
701
  "class": attributes["class"],
698
702
  rr_width: "".concat(width, "px"),
699
703
  rr_height: "".concat(height, "px")
700
704
  };
701
- needBlock = true;
705
+ if (enableStrictPrivacy) {
706
+ needBlock = true;
707
+ }
702
708
  }
703
709
  if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src)) {
704
710
  if (!n.contentDocument) {
@@ -706,9 +712,6 @@ function serializeElementNode(n, options) {
706
712
  }
707
713
  delete attributes.src;
708
714
  }
709
- if (needBlock && tagName === 'img') {
710
- delete attributes.src;
711
- }
712
715
  return {
713
716
  type: NodeType$2.Element,
714
717
  tagName: tagName,
@@ -716,6 +719,7 @@ function serializeElementNode(n, options) {
716
719
  childNodes: [],
717
720
  isSVG: isSVGElement(n) || undefined,
718
721
  needBlock: needBlock,
722
+ needMask: needMask,
719
723
  rootId: rootId
720
724
  };
721
725
  }
@@ -849,13 +853,17 @@ function serializeNodeWithId(n, options) {
849
853
  var strictPrivacy = enableStrictPrivacy;
850
854
  if (serializedNode.type === NodeType$2.Element) {
851
855
  recordChild = recordChild && !serializedNode.needBlock;
852
- strictPrivacy = !!serializedNode.needBlock;
856
+ strictPrivacy =
857
+ enableStrictPrivacy ||
858
+ !!serializedNode.needBlock ||
859
+ !!serializedNode.needMask;
853
860
  if (strictPrivacy && serializedNode.tagName === 'img') {
854
861
  var clone = n.cloneNode();
855
862
  clone.src = '';
856
863
  mirror.add(clone, serializedNode);
857
864
  }
858
865
  delete serializedNode.needBlock;
866
+ delete serializedNode.needMask;
859
867
  var shadowRoot = n.shadowRoot;
860
868
  if (shadowRoot && isNativeShadowDom(shadowRoot))
861
869
  serializedNode.isShadowHost = true;
@@ -3903,7 +3911,7 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
3903
3911
  return createBase64WorkerFactory$1(base64, sourcemapArg, enableUnicodeArg);
3904
3912
  }
3905
3913
 
3906
- var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLg0KDQogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkNCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsDQogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1INCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SDQogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQogICAgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgew0KICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0NCiAgICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQ0KICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOw0KICAgICAgICB9KTsNCiAgICB9CgogICAgLyoKICAgICAqIGJhc2U2NC1hcnJheWJ1ZmZlciAxLjAuMSA8aHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlcj4KICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBOaWtsYXMgdm9uIEhlcnR6ZW4gPGh0dHBzOi8vaGVydHplbi5jb20+CiAgICAgKiBSZWxlYXNlZCB1bmRlciBNSVQgTGljZW5zZQogICAgICovCiAgICB2YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CiAgICAvLyBVc2UgYSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgaW5kZXguCiAgICB2YXIgbG9va3VwID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gW10gOiBuZXcgVWludDhBcnJheSgyNTYpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewogICAgICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7CiAgICB9CiAgICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gKGFycmF5YnVmZmVyKSB7CiAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykgewogICAgICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTsKICAgICAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107CiAgICAgICAgfQogICAgICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2U2NDsKICAgIH07CgogICAgY29uc3QgbGFzdEJsb2JNYXAgPSBuZXcgTWFwKCk7DQogICAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gbmV3IE1hcCgpOw0KICAgIGZ1bmN0aW9uIGdldFRyYW5zcGFyZW50QmxvYkZvcih3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7DQogICAgICAgICAgICBjb25zdCBpZCA9IGAke3dpZHRofS0ke2hlaWdodH1gOw0KICAgICAgICAgICAgaWYgKHRyYW5zcGFyZW50QmxvYk1hcC5oYXMoaWQpKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc3BhcmVudEJsb2JNYXAuZ2V0KGlkKTsNCiAgICAgICAgICAgIGNvbnN0IG9mZnNjcmVlbiA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7DQogICAgICAgICAgICBvZmZzY3JlZW4uZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSB5aWVsZCBvZmZzY3JlZW4uY29udmVydFRvQmxvYigpOw0KICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSB5aWVsZCBibG9iLmFycmF5QnVmZmVyKCk7DQogICAgICAgICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOw0KICAgICAgICAgICAgdHJhbnNwYXJlbnRCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgICAgIHJldHVybiBiYXNlNjQ7DQogICAgICAgIH0pOw0KICAgIH0NCiAgICBjb25zdCB3b3JrZXIgPSBzZWxmOw0KICAgIHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkgew0KICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgew0KICAgICAgICAgICAgaWYgKCEoJ09mZnNjcmVlbkNhbnZhcycgaW4gZ2xvYmFsVGhpcykpDQogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5wb3N0TWVzc2FnZSh7IGlkOiBlLmRhdGEuaWQgfSk7DQogICAgICAgICAgICBjb25zdCB7IGlkLCBiaXRtYXAsIHdpZHRoLCBoZWlnaHQgfSA9IGUuZGF0YTsNCiAgICAgICAgICAgIGNvbnN0IHRyYW5zcGFyZW50QmFzZTY0ID0gZ2V0VHJhbnNwYXJlbnRCbG9iRm9yKHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgIGNvbnN0IGN0eCA9IG9mZnNjcmVlbi5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApOw0KICAgICAgICAgICAgYml0bWFwLmNsb3NlKCk7DQogICAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgb2Zmc2NyZWVuLmNvbnZlcnRUb0Jsb2IoKTsNCiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBibG9iLnR5cGU7DQogICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IHlpZWxkIGJsb2IuYXJyYXlCdWZmZXIoKTsNCiAgICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGVuY29kZShhcnJheUJ1ZmZlcik7DQogICAgICAgICAgICBpZiAoIWxhc3RCbG9iTWFwLmhhcyhpZCkgJiYgKHlpZWxkIHRyYW5zcGFyZW50QmFzZTY0KSA9PT0gYmFzZTY0KSB7DQogICAgICAgICAgICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOw0KICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZXIucG9zdE1lc3NhZ2UoeyBpZCB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChsYXN0QmxvYk1hcC5nZXQoaWQpID09PSBiYXNlNjQpDQogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5wb3N0TWVzc2FnZSh7IGlkIH0pOw0KICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICBpZCwNCiAgICAgICAgICAgICAgICB0eXBlLA0KICAgICAgICAgICAgICAgIGJhc2U2NCwNCiAgICAgICAgICAgICAgICB3aWR0aCwNCiAgICAgICAgICAgICAgICBoZWlnaHQsDQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGxhc3RCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgfSk7DQogICAgfTsKCn0pKCk7Cgo=', null, false);
3914
+ var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLg0KDQogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkNCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsDQogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1INCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SDQogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQogICAgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgew0KICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0NCiAgICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQ0KICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOw0KICAgICAgICB9KTsNCiAgICB9CgogICAgLyoKICAgICAqIGJhc2U2NC1hcnJheWJ1ZmZlciAxLjAuMSA8aHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlcj4KICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBOaWtsYXMgdm9uIEhlcnR6ZW4gPGh0dHBzOi8vaGVydHplbi5jb20+CiAgICAgKiBSZWxlYXNlZCB1bmRlciBNSVQgTGljZW5zZQogICAgICovCiAgICB2YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CiAgICAvLyBVc2UgYSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgaW5kZXguCiAgICB2YXIgbG9va3VwID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gW10gOiBuZXcgVWludDhBcnJheSgyNTYpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewogICAgICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7CiAgICB9CiAgICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gKGFycmF5YnVmZmVyKSB7CiAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykgewogICAgICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTsKICAgICAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107CiAgICAgICAgfQogICAgICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2U2NDsKICAgIH07CgogICAgY29uc3QgbGFzdEJsb2JNYXAgPSBuZXcgTWFwKCk7DQogICAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gbmV3IE1hcCgpOw0KICAgIGZ1bmN0aW9uIGdldFRyYW5zcGFyZW50QmxvYkZvcih3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7DQogICAgICAgICAgICBjb25zdCBpZCA9IGAke3dpZHRofS0ke2hlaWdodH1gOw0KICAgICAgICAgICAgaWYgKHRyYW5zcGFyZW50QmxvYk1hcC5oYXMoaWQpKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc3BhcmVudEJsb2JNYXAuZ2V0KGlkKTsNCiAgICAgICAgICAgIGNvbnN0IG9mZnNjcmVlbiA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7DQogICAgICAgICAgICBvZmZzY3JlZW4uZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSB5aWVsZCBvZmZzY3JlZW4uY29udmVydFRvQmxvYigpOw0KICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSB5aWVsZCBibG9iLmFycmF5QnVmZmVyKCk7DQogICAgICAgICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOw0KICAgICAgICAgICAgdHJhbnNwYXJlbnRCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgICAgIHJldHVybiBiYXNlNjQ7DQogICAgICAgIH0pOw0KICAgIH0NCiAgICBjb25zdCB3b3JrZXIgPSBzZWxmOw0KICAgIHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkgew0KICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgew0KICAgICAgICAgICAgaWYgKCEoJ09mZnNjcmVlbkNhbnZhcycgaW4gZ2xvYmFsVGhpcykpDQogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5wb3N0TWVzc2FnZSh7IGlkOiBlLmRhdGEuaWQgfSk7DQogICAgICAgICAgICBjb25zdCB7IGlkLCBiaXRtYXAsIHdpZHRoLCBoZWlnaHQsIGNhbnZhc1dpZHRoLCBjYW52YXNIZWlnaHQgfSA9IGUuZGF0YTsNCiAgICAgICAgICAgIGNvbnN0IHRyYW5zcGFyZW50QmFzZTY0ID0gZ2V0VHJhbnNwYXJlbnRCbG9iRm9yKHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgIGNvbnN0IGN0eCA9IG9mZnNjcmVlbi5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgYml0bWFwLmNsb3NlKCk7DQogICAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgb2Zmc2NyZWVuLmNvbnZlcnRUb0Jsb2IoKTsNCiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBibG9iLnR5cGU7DQogICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IHlpZWxkIGJsb2IuYXJyYXlCdWZmZXIoKTsNCiAgICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGVuY29kZShhcnJheUJ1ZmZlcik7DQogICAgICAgICAgICBpZiAoIWxhc3RCbG9iTWFwLmhhcyhpZCkgJiYgKHlpZWxkIHRyYW5zcGFyZW50QmFzZTY0KSA9PT0gYmFzZTY0KSB7DQogICAgICAgICAgICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOw0KICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZXIucG9zdE1lc3NhZ2UoeyBpZCB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChsYXN0QmxvYk1hcC5nZXQoaWQpID09PSBiYXNlNjQpDQogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5wb3N0TWVzc2FnZSh7IGlkIH0pOw0KICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICBpZCwNCiAgICAgICAgICAgICAgICB0eXBlLA0KICAgICAgICAgICAgICAgIGJhc2U2NCwNCiAgICAgICAgICAgICAgICB3aWR0aCwNCiAgICAgICAgICAgICAgICBoZWlnaHQsDQogICAgICAgICAgICAgICAgY2FudmFzV2lkdGgsDQogICAgICAgICAgICAgICAgY2FudmFzSGVpZ2h0LA0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBsYXN0QmxvYk1hcC5zZXQoaWQsIGJhc2U2NCk7DQogICAgICAgIH0pOw0KICAgIH07Cgp9KSgpOwoK', null, false);
3907
3915
  /* eslint-enable */
3908
3916
 
3909
3917
  class CanvasManager {
@@ -3928,7 +3936,7 @@ class CanvasManager {
3928
3936
  if (recordCanvas && sampling === 'all')
3929
3937
  this.initCanvasMutationObserver(win, blockClass);
3930
3938
  if (recordCanvas && typeof sampling === 'number')
3931
- this.initCanvasFPSObserver(sampling, win, blockClass);
3939
+ this.initCanvasFPSObserver(sampling, win, blockClass, options.resizeQuality, options.resizeFactor, options.maxSnapshotDimension);
3932
3940
  }
3933
3941
  reset() {
3934
3942
  this.pendingCanvasMutations.clear();
@@ -3946,7 +3954,7 @@ class CanvasManager {
3946
3954
  unlock() {
3947
3955
  this.locked = false;
3948
3956
  }
3949
- initCanvasFPSObserver(fps, win, blockClass) {
3957
+ initCanvasFPSObserver(fps, win, blockClass, resizeQuality, resizeFactor, maxSnapshotDimension) {
3950
3958
  const canvasContextReset = initCanvasContextObserver(win, blockClass);
3951
3959
  const snapshotInProgressMap = new Map();
3952
3960
  const worker = new WorkerFactory();
@@ -3955,14 +3963,14 @@ class CanvasManager {
3955
3963
  snapshotInProgressMap.set(id, false);
3956
3964
  if (!('base64' in e.data))
3957
3965
  return;
3958
- const { base64, type, width, height } = e.data;
3966
+ const { base64, type, canvasWidth, canvasHeight } = e.data;
3959
3967
  this.mutationCb({
3960
3968
  id,
3961
3969
  type: CanvasContext['2D'],
3962
3970
  commands: [
3963
3971
  {
3964
3972
  property: 'clearRect',
3965
- args: [0, 0, width, height],
3973
+ args: [0, 0, canvasWidth, canvasHeight],
3966
3974
  },
3967
3975
  {
3968
3976
  property: 'drawImage',
@@ -3979,6 +3987,8 @@ class CanvasManager {
3979
3987
  },
3980
3988
  0,
3981
3989
  0,
3990
+ canvasWidth,
3991
+ canvasHeight,
3982
3992
  ],
3983
3993
  },
3984
3994
  ],
@@ -4011,12 +4021,24 @@ class CanvasManager {
4011
4021
  if (canvas.width === 0 || canvas.height === 0) {
4012
4022
  return;
4013
4023
  }
4014
- const bitmap = yield createImageBitmap(canvas);
4024
+ if (maxSnapshotDimension) {
4025
+ const maxDim = Math.max(canvas.width, canvas.height);
4026
+ resizeFactor = Math.min(resizeFactor || 1, maxSnapshotDimension / maxDim);
4027
+ }
4028
+ const width = canvas.width * (resizeFactor || 1);
4029
+ const height = canvas.height * (resizeFactor || 1);
4030
+ const bitmap = yield createImageBitmap(canvas, {
4031
+ resizeQuality: resizeQuality || 'low',
4032
+ resizeWidth: width,
4033
+ resizeHeight: height,
4034
+ });
4015
4035
  worker.postMessage({
4016
4036
  id,
4017
4037
  bitmap,
4018
- width: canvas.width,
4019
- height: canvas.height,
4038
+ width,
4039
+ height,
4040
+ canvasWidth: canvas.width,
4041
+ canvasHeight: canvas.height,
4020
4042
  }, [bitmap]);
4021
4043
  }));
4022
4044
  rafId = requestAnimationFrame(takeCanvasSnapshots);
@@ -4110,6 +4132,7 @@ let wrappedEmit;
4110
4132
  let takeFullSnapshot;
4111
4133
  const mirror = createMirror$2();
4112
4134
  function record(options = {}) {
4135
+ var _a, _b, _c, _d;
4113
4136
  const { emit, checkoutEveryNms, checkoutEveryNth, blockClass = 'highlight-block', blockSelector = null, ignoreClass = 'highlight-ignore', maskTextClass = 'highlight-mask', maskTextSelector = null, inlineStylesheet = true, maskAllInputs, maskInputOptions: _maskInputOptions, slimDOMOptions: _slimDOMOptions, maskInputFn, maskTextFn = obfuscateText, hooks, packFn, sampling = {}, mousemoveWait, recordCanvas = false, userTriggeredOnInput = false, collectFonts = false, inlineImages = false, plugins, keepIframeSrcFn = () => false, enableStrictPrivacy = false, } = options;
4114
4137
  if (!emit) {
4115
4138
  throw new Error('emit function is required');
@@ -4223,7 +4246,10 @@ function record(options = {}) {
4223
4246
  win: window,
4224
4247
  blockClass,
4225
4248
  mirror,
4226
- sampling: sampling.canvas,
4249
+ sampling: (_a = sampling === null || sampling === void 0 ? void 0 : sampling.canvas) === null || _a === void 0 ? void 0 : _a.fps,
4250
+ resizeQuality: (_b = sampling === null || sampling === void 0 ? void 0 : sampling.canvas) === null || _b === void 0 ? void 0 : _b.resizeQuality,
4251
+ resizeFactor: (_c = sampling === null || sampling === void 0 ? void 0 : sampling.canvas) === null || _c === void 0 ? void 0 : _c.resizeFactor,
4252
+ maxSnapshotDimension: (_d = sampling === null || sampling === void 0 ? void 0 : sampling.canvas) === null || _d === void 0 ? void 0 : _d.maxSnapshotDimension,
4227
4253
  });
4228
4254
  const shadowDomManager = new ShadowDomManager({
4229
4255
  mutationCb: wrappedMutationEmit,
package/lib/rrweb.css CHANGED
File without changes
package/lib/rrweb.js CHANGED
@@ -575,8 +575,8 @@ function serializeTextNode(n, options) {
575
575
  }
576
576
  function serializeElementNode(n, options) {
577
577
  var doc = options.doc, blockClass = options.blockClass, blockSelector = options.blockSelector, inlineStylesheet = options.inlineStylesheet, _a = options.maskInputOptions, maskInputOptions = _a === void 0 ? {} : _a, maskInputFn = options.maskInputFn, maskTextClass = options.maskTextClass, _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, enableStrictPrivacy = options.enableStrictPrivacy, rootId = options.rootId;
578
- var needBlock = _isBlockedElement(n, blockClass, blockSelector) ||
579
- _isBlockedElement(n, maskTextClass, null);
578
+ var needBlock = _isBlockedElement(n, blockClass, blockSelector);
579
+ var needMask = _isBlockedElement(n, maskTextClass, null);
580
580
  var tagName = getValidTagName$1(n);
581
581
  var attributes = {};
582
582
  var len = n.attributes.length;
@@ -650,7 +650,11 @@ function serializeElementNode(n, options) {
650
650
  }
651
651
  }
652
652
  }
653
- if (tagName === 'img' && inlineImages && !needBlock) {
653
+ if (tagName === 'img' &&
654
+ inlineImages &&
655
+ !needBlock &&
656
+ !needMask &&
657
+ !enableStrictPrivacy) {
654
658
  if (!canvasService) {
655
659
  canvasService = doc.createElement('canvas');
656
660
  canvasCtx = canvasService.getContext('2d');
@@ -691,14 +695,16 @@ function serializeElementNode(n, options) {
691
695
  attributes.rr_scrollTop = n.scrollTop;
692
696
  }
693
697
  }
694
- if (needBlock || (tagName === 'img' && enableStrictPrivacy)) {
698
+ if (needBlock || needMask || (tagName === 'img' && enableStrictPrivacy)) {
695
699
  var _d = n.getBoundingClientRect(), width = _d.width, height = _d.height;
696
700
  attributes = {
697
701
  "class": attributes["class"],
698
702
  rr_width: "".concat(width, "px"),
699
703
  rr_height: "".concat(height, "px")
700
704
  };
701
- needBlock = true;
705
+ if (enableStrictPrivacy) {
706
+ needBlock = true;
707
+ }
702
708
  }
703
709
  if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src)) {
704
710
  if (!n.contentDocument) {
@@ -706,9 +712,6 @@ function serializeElementNode(n, options) {
706
712
  }
707
713
  delete attributes.src;
708
714
  }
709
- if (needBlock && tagName === 'img') {
710
- delete attributes.src;
711
- }
712
715
  return {
713
716
  type: NodeType$2.Element,
714
717
  tagName: tagName,
@@ -716,6 +719,7 @@ function serializeElementNode(n, options) {
716
719
  childNodes: [],
717
720
  isSVG: isSVGElement(n) || undefined,
718
721
  needBlock: needBlock,
722
+ needMask: needMask,
719
723
  rootId: rootId
720
724
  };
721
725
  }
@@ -849,13 +853,17 @@ function serializeNodeWithId(n, options) {
849
853
  var strictPrivacy = enableStrictPrivacy;
850
854
  if (serializedNode.type === NodeType$2.Element) {
851
855
  recordChild = recordChild && !serializedNode.needBlock;
852
- strictPrivacy = !!serializedNode.needBlock;
856
+ strictPrivacy =
857
+ enableStrictPrivacy ||
858
+ !!serializedNode.needBlock ||
859
+ !!serializedNode.needMask;
853
860
  if (strictPrivacy && serializedNode.tagName === 'img') {
854
861
  var clone = n.cloneNode();
855
862
  clone.src = '';
856
863
  mirror.add(clone, serializedNode);
857
864
  }
858
865
  delete serializedNode.needBlock;
866
+ delete serializedNode.needMask;
859
867
  var shadowRoot = n.shadowRoot;
860
868
  if (shadowRoot && isNativeShadowDom(shadowRoot))
861
869
  serializedNode.isShadowHost = true;
@@ -3903,7 +3911,7 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
3903
3911
  return createBase64WorkerFactory$1(base64, sourcemapArg, enableUnicodeArg);
3904
3912
  }
3905
3913
 
3906
- var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLg0KDQogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkNCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsDQogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1INCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SDQogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQogICAgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgew0KICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0NCiAgICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQ0KICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOw0KICAgICAgICB9KTsNCiAgICB9CgogICAgLyoKICAgICAqIGJhc2U2NC1hcnJheWJ1ZmZlciAxLjAuMSA8aHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlcj4KICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBOaWtsYXMgdm9uIEhlcnR6ZW4gPGh0dHBzOi8vaGVydHplbi5jb20+CiAgICAgKiBSZWxlYXNlZCB1bmRlciBNSVQgTGljZW5zZQogICAgICovCiAgICB2YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CiAgICAvLyBVc2UgYSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgaW5kZXguCiAgICB2YXIgbG9va3VwID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gW10gOiBuZXcgVWludDhBcnJheSgyNTYpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewogICAgICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7CiAgICB9CiAgICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gKGFycmF5YnVmZmVyKSB7CiAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykgewogICAgICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTsKICAgICAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107CiAgICAgICAgfQogICAgICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2U2NDsKICAgIH07CgogICAgY29uc3QgbGFzdEJsb2JNYXAgPSBuZXcgTWFwKCk7DQogICAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gbmV3IE1hcCgpOw0KICAgIGZ1bmN0aW9uIGdldFRyYW5zcGFyZW50QmxvYkZvcih3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7DQogICAgICAgICAgICBjb25zdCBpZCA9IGAke3dpZHRofS0ke2hlaWdodH1gOw0KICAgICAgICAgICAgaWYgKHRyYW5zcGFyZW50QmxvYk1hcC5oYXMoaWQpKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc3BhcmVudEJsb2JNYXAuZ2V0KGlkKTsNCiAgICAgICAgICAgIGNvbnN0IG9mZnNjcmVlbiA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7DQogICAgICAgICAgICBvZmZzY3JlZW4uZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSB5aWVsZCBvZmZzY3JlZW4uY29udmVydFRvQmxvYigpOw0KICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSB5aWVsZCBibG9iLmFycmF5QnVmZmVyKCk7DQogICAgICAgICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOw0KICAgICAgICAgICAgdHJhbnNwYXJlbnRCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgICAgIHJldHVybiBiYXNlNjQ7DQogICAgICAgIH0pOw0KICAgIH0NCiAgICBjb25zdCB3b3JrZXIgPSBzZWxmOw0KICAgIHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkgew0KICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgew0KICAgICAgICAgICAgaWYgKCEoJ09mZnNjcmVlbkNhbnZhcycgaW4gZ2xvYmFsVGhpcykpDQogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5wb3N0TWVzc2FnZSh7IGlkOiBlLmRhdGEuaWQgfSk7DQogICAgICAgICAgICBjb25zdCB7IGlkLCBiaXRtYXAsIHdpZHRoLCBoZWlnaHQgfSA9IGUuZGF0YTsNCiAgICAgICAgICAgIGNvbnN0IHRyYW5zcGFyZW50QmFzZTY0ID0gZ2V0VHJhbnNwYXJlbnRCbG9iRm9yKHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgIGNvbnN0IGN0eCA9IG9mZnNjcmVlbi5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApOw0KICAgICAgICAgICAgYml0bWFwLmNsb3NlKCk7DQogICAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgb2Zmc2NyZWVuLmNvbnZlcnRUb0Jsb2IoKTsNCiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBibG9iLnR5cGU7DQogICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IHlpZWxkIGJsb2IuYXJyYXlCdWZmZXIoKTsNCiAgICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGVuY29kZShhcnJheUJ1ZmZlcik7DQogICAgICAgICAgICBpZiAoIWxhc3RCbG9iTWFwLmhhcyhpZCkgJiYgKHlpZWxkIHRyYW5zcGFyZW50QmFzZTY0KSA9PT0gYmFzZTY0KSB7DQogICAgICAgICAgICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOw0KICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZXIucG9zdE1lc3NhZ2UoeyBpZCB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChsYXN0QmxvYk1hcC5nZXQoaWQpID09PSBiYXNlNjQpDQogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5wb3N0TWVzc2FnZSh7IGlkIH0pOw0KICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICBpZCwNCiAgICAgICAgICAgICAgICB0eXBlLA0KICAgICAgICAgICAgICAgIGJhc2U2NCwNCiAgICAgICAgICAgICAgICB3aWR0aCwNCiAgICAgICAgICAgICAgICBoZWlnaHQsDQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGxhc3RCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgfSk7DQogICAgfTsKCn0pKCk7Cgo=', null, false);
3914
+ var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLg0KDQogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkNCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsDQogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1INCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SDQogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQogICAgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgew0KICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0NCiAgICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQ0KICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOw0KICAgICAgICB9KTsNCiAgICB9CgogICAgLyoKICAgICAqIGJhc2U2NC1hcnJheWJ1ZmZlciAxLjAuMSA8aHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlcj4KICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBOaWtsYXMgdm9uIEhlcnR6ZW4gPGh0dHBzOi8vaGVydHplbi5jb20+CiAgICAgKiBSZWxlYXNlZCB1bmRlciBNSVQgTGljZW5zZQogICAgICovCiAgICB2YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CiAgICAvLyBVc2UgYSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgaW5kZXguCiAgICB2YXIgbG9va3VwID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gW10gOiBuZXcgVWludDhBcnJheSgyNTYpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewogICAgICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7CiAgICB9CiAgICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gKGFycmF5YnVmZmVyKSB7CiAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykgewogICAgICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTsKICAgICAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107CiAgICAgICAgfQogICAgICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2U2NDsKICAgIH07CgogICAgY29uc3QgbGFzdEJsb2JNYXAgPSBuZXcgTWFwKCk7DQogICAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gbmV3IE1hcCgpOw0KICAgIGZ1bmN0aW9uIGdldFRyYW5zcGFyZW50QmxvYkZvcih3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7DQogICAgICAgICAgICBjb25zdCBpZCA9IGAke3dpZHRofS0ke2hlaWdodH1gOw0KICAgICAgICAgICAgaWYgKHRyYW5zcGFyZW50QmxvYk1hcC5oYXMoaWQpKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc3BhcmVudEJsb2JNYXAuZ2V0KGlkKTsNCiAgICAgICAgICAgIGNvbnN0IG9mZnNjcmVlbiA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7DQogICAgICAgICAgICBvZmZzY3JlZW4uZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSB5aWVsZCBvZmZzY3JlZW4uY29udmVydFRvQmxvYigpOw0KICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSB5aWVsZCBibG9iLmFycmF5QnVmZmVyKCk7DQogICAgICAgICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOw0KICAgICAgICAgICAgdHJhbnNwYXJlbnRCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgICAgIHJldHVybiBiYXNlNjQ7DQogICAgICAgIH0pOw0KICAgIH0NCiAgICBjb25zdCB3b3JrZXIgPSBzZWxmOw0KICAgIHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkgew0KICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgew0KICAgICAgICAgICAgaWYgKCEoJ09mZnNjcmVlbkNhbnZhcycgaW4gZ2xvYmFsVGhpcykpDQogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5wb3N0TWVzc2FnZSh7IGlkOiBlLmRhdGEuaWQgfSk7DQogICAgICAgICAgICBjb25zdCB7IGlkLCBiaXRtYXAsIHdpZHRoLCBoZWlnaHQsIGNhbnZhc1dpZHRoLCBjYW52YXNIZWlnaHQgfSA9IGUuZGF0YTsNCiAgICAgICAgICAgIGNvbnN0IHRyYW5zcGFyZW50QmFzZTY0ID0gZ2V0VHJhbnNwYXJlbnRCbG9iRm9yKHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgIGNvbnN0IGN0eCA9IG9mZnNjcmVlbi5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgYml0bWFwLmNsb3NlKCk7DQogICAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgb2Zmc2NyZWVuLmNvbnZlcnRUb0Jsb2IoKTsNCiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBibG9iLnR5cGU7DQogICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IHlpZWxkIGJsb2IuYXJyYXlCdWZmZXIoKTsNCiAgICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGVuY29kZShhcnJheUJ1ZmZlcik7DQogICAgICAgICAgICBpZiAoIWxhc3RCbG9iTWFwLmhhcyhpZCkgJiYgKHlpZWxkIHRyYW5zcGFyZW50QmFzZTY0KSA9PT0gYmFzZTY0KSB7DQogICAgICAgICAgICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOw0KICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZXIucG9zdE1lc3NhZ2UoeyBpZCB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChsYXN0QmxvYk1hcC5nZXQoaWQpID09PSBiYXNlNjQpDQogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5wb3N0TWVzc2FnZSh7IGlkIH0pOw0KICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICBpZCwNCiAgICAgICAgICAgICAgICB0eXBlLA0KICAgICAgICAgICAgICAgIGJhc2U2NCwNCiAgICAgICAgICAgICAgICB3aWR0aCwNCiAgICAgICAgICAgICAgICBoZWlnaHQsDQogICAgICAgICAgICAgICAgY2FudmFzV2lkdGgsDQogICAgICAgICAgICAgICAgY2FudmFzSGVpZ2h0LA0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBsYXN0QmxvYk1hcC5zZXQoaWQsIGJhc2U2NCk7DQogICAgICAgIH0pOw0KICAgIH07Cgp9KSgpOwoK', null, false);
3907
3915
  /* eslint-enable */
3908
3916
 
3909
3917
  class CanvasManager {
@@ -3928,7 +3936,7 @@ class CanvasManager {
3928
3936
  if (recordCanvas && sampling === 'all')
3929
3937
  this.initCanvasMutationObserver(win, blockClass);
3930
3938
  if (recordCanvas && typeof sampling === 'number')
3931
- this.initCanvasFPSObserver(sampling, win, blockClass);
3939
+ this.initCanvasFPSObserver(sampling, win, blockClass, options.resizeQuality, options.resizeFactor, options.maxSnapshotDimension);
3932
3940
  }
3933
3941
  reset() {
3934
3942
  this.pendingCanvasMutations.clear();
@@ -3946,7 +3954,7 @@ class CanvasManager {
3946
3954
  unlock() {
3947
3955
  this.locked = false;
3948
3956
  }
3949
- initCanvasFPSObserver(fps, win, blockClass) {
3957
+ initCanvasFPSObserver(fps, win, blockClass, resizeQuality, resizeFactor, maxSnapshotDimension) {
3950
3958
  const canvasContextReset = initCanvasContextObserver(win, blockClass);
3951
3959
  const snapshotInProgressMap = new Map();
3952
3960
  const worker = new WorkerFactory();
@@ -3955,14 +3963,14 @@ class CanvasManager {
3955
3963
  snapshotInProgressMap.set(id, false);
3956
3964
  if (!('base64' in e.data))
3957
3965
  return;
3958
- const { base64, type, width, height } = e.data;
3966
+ const { base64, type, canvasWidth, canvasHeight } = e.data;
3959
3967
  this.mutationCb({
3960
3968
  id,
3961
3969
  type: CanvasContext['2D'],
3962
3970
  commands: [
3963
3971
  {
3964
3972
  property: 'clearRect',
3965
- args: [0, 0, width, height],
3973
+ args: [0, 0, canvasWidth, canvasHeight],
3966
3974
  },
3967
3975
  {
3968
3976
  property: 'drawImage',
@@ -3979,6 +3987,8 @@ class CanvasManager {
3979
3987
  },
3980
3988
  0,
3981
3989
  0,
3990
+ canvasWidth,
3991
+ canvasHeight,
3982
3992
  ],
3983
3993
  },
3984
3994
  ],
@@ -4011,12 +4021,24 @@ class CanvasManager {
4011
4021
  if (canvas.width === 0 || canvas.height === 0) {
4012
4022
  return;
4013
4023
  }
4014
- const bitmap = yield createImageBitmap(canvas);
4024
+ if (maxSnapshotDimension) {
4025
+ const maxDim = Math.max(canvas.width, canvas.height);
4026
+ resizeFactor = Math.min(resizeFactor || 1, maxSnapshotDimension / maxDim);
4027
+ }
4028
+ const width = canvas.width * (resizeFactor || 1);
4029
+ const height = canvas.height * (resizeFactor || 1);
4030
+ const bitmap = yield createImageBitmap(canvas, {
4031
+ resizeQuality: resizeQuality || 'low',
4032
+ resizeWidth: width,
4033
+ resizeHeight: height,
4034
+ });
4015
4035
  worker.postMessage({
4016
4036
  id,
4017
4037
  bitmap,
4018
- width: canvas.width,
4019
- height: canvas.height,
4038
+ width,
4039
+ height,
4040
+ canvasWidth: canvas.width,
4041
+ canvasHeight: canvas.height,
4020
4042
  }, [bitmap]);
4021
4043
  }));
4022
4044
  rafId = requestAnimationFrame(takeCanvasSnapshots);
@@ -4110,6 +4132,7 @@ let wrappedEmit;
4110
4132
  let takeFullSnapshot;
4111
4133
  const mirror = createMirror$2();
4112
4134
  function record(options = {}) {
4135
+ var _a, _b, _c, _d;
4113
4136
  const { emit, checkoutEveryNms, checkoutEveryNth, blockClass = 'highlight-block', blockSelector = null, ignoreClass = 'highlight-ignore', maskTextClass = 'highlight-mask', maskTextSelector = null, inlineStylesheet = true, maskAllInputs, maskInputOptions: _maskInputOptions, slimDOMOptions: _slimDOMOptions, maskInputFn, maskTextFn = obfuscateText, hooks, packFn, sampling = {}, mousemoveWait, recordCanvas = false, userTriggeredOnInput = false, collectFonts = false, inlineImages = false, plugins, keepIframeSrcFn = () => false, enableStrictPrivacy = false, } = options;
4114
4137
  if (!emit) {
4115
4138
  throw new Error('emit function is required');
@@ -4223,7 +4246,10 @@ function record(options = {}) {
4223
4246
  win: window,
4224
4247
  blockClass,
4225
4248
  mirror,
4226
- sampling: sampling.canvas,
4249
+ sampling: (_a = sampling === null || sampling === void 0 ? void 0 : sampling.canvas) === null || _a === void 0 ? void 0 : _a.fps,
4250
+ resizeQuality: (_b = sampling === null || sampling === void 0 ? void 0 : sampling.canvas) === null || _b === void 0 ? void 0 : _b.resizeQuality,
4251
+ resizeFactor: (_c = sampling === null || sampling === void 0 ? void 0 : sampling.canvas) === null || _c === void 0 ? void 0 : _c.resizeFactor,
4252
+ maxSnapshotDimension: (_d = sampling === null || sampling === void 0 ? void 0 : sampling.canvas) === null || _d === void 0 ? void 0 : _d.maxSnapshotDimension,
4227
4253
  });
4228
4254
  const shadowDomManager = new ShadowDomManager({
4229
4255
  mutationCb: wrappedMutationEmit,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@highlight-run/rrweb",
3
- "version": "2.1.5",
3
+ "version": "2.1.8",
4
4
  "description": "record and replay the web",
5
5
  "scripts": {
6
6
  "prepare": "npm run prepack",
@@ -76,12 +76,12 @@
76
76
  },
77
77
  "dependencies": {
78
78
  "@highlight-run/rrdom": "0.1.17",
79
- "@highlight-run/rrweb-snapshot": "1.1.28",
79
+ "@highlight-run/rrweb-snapshot": "1.1.30",
80
80
  "@types/css-font-loading-module": "0.0.7",
81
81
  "@xstate/fsm": "^1.4.0",
82
82
  "base64-arraybuffer": "^1.0.1",
83
83
  "fflate": "^0.4.4",
84
84
  "mitt": "^3.0.0"
85
85
  },
86
- "gitHead": "5dc82d5d41dfdeb937efd030deaf377b3301b97d"
86
+ "gitHead": "ef09ecc9bc1fc3b9469a96e37f232b139e303c9b"
87
87
  }
@@ -24,6 +24,9 @@ export declare class CanvasManager {
24
24
  blockClass: blockClass;
25
25
  mirror: Mirror;
26
26
  sampling?: 'all' | number;
27
+ resizeQuality?: 'pixelated' | 'low' | 'medium' | 'high';
28
+ resizeFactor?: number;
29
+ maxSnapshotDimension?: number;
27
30
  });
28
31
  private processMutation;
29
32
  private initCanvasFPSObserver;
@@ -128,6 +128,12 @@ export declare type canvasEventWithTime = eventWithTime & {
128
128
  };
129
129
  export declare type blockClass = string | RegExp;
130
130
  export declare type maskTextClass = string | RegExp;
131
+ export declare type CanvasSamplingStrategy = Partial<{
132
+ fps: 'all' | number;
133
+ resizeFactor: number;
134
+ resizeQuality: 'pixelated' | 'low' | 'medium' | 'high';
135
+ maxSnapshotDimension: number;
136
+ }>;
131
137
  export declare type SamplingStrategy = Partial<{
132
138
  mousemove: boolean | number;
133
139
  mousemoveCallback: number;
@@ -135,7 +141,7 @@ export declare type SamplingStrategy = Partial<{
135
141
  scroll: number;
136
142
  media: number;
137
143
  input: 'all' | 'last';
138
- canvas: 'all' | number;
144
+ canvas: CanvasSamplingStrategy;
139
145
  }>;
140
146
  export declare type RecordPlugin<TOptions = unknown> = {
141
147
  name: string;
@@ -387,6 +393,8 @@ export declare type ImageBitmapDataURLWorkerParams = {
387
393
  bitmap: ImageBitmap;
388
394
  width: number;
389
395
  height: number;
396
+ canvasWidth: number;
397
+ canvasHeight: number;
390
398
  };
391
399
  export declare type ImageBitmapDataURLWorkerResponse = {
392
400
  id: number;
@@ -396,6 +404,8 @@ export declare type ImageBitmapDataURLWorkerResponse = {
396
404
  base64: string;
397
405
  width: number;
398
406
  height: number;
407
+ canvasWidth: number;
408
+ canvasHeight: number;
399
409
  };
400
410
  export declare type fontParam = {
401
411
  family: string;