Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .changeset/slimdom-defaults-refactor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
2 changes: 2 additions & 0 deletions packages/rrweb-snapshot/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import snapshot, {
serializeNodeWithId,
transformAttribute,
ignoreAttribute,
slimDOMDefaults,
visitSnapshot,
cleanupSnapshot,
needMaskingText,
Expand All @@ -26,6 +27,7 @@ export {
createCache,
transformAttribute,
ignoreAttribute,
slimDOMDefaults,
visitSnapshot,
cleanupSnapshot,
needMaskingText,
Expand Down
57 changes: 32 additions & 25 deletions packages/rrweb-snapshot/src/snapshot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -190,10 +190,7 @@
} else if (name === 'xlink:href' && value[0] !== '#') {
// xlink:href starts with # is an id pointer
return absoluteToDoc(doc, value);
} else if (
name === 'background' &&
(tagName === 'table' || tagName === 'td' || tagName === 'th')
) {
} else if (name === 'background' && ['table', 'td', 'th'].includes(tagName)) {
return absoluteToDoc(doc, value);
} else if (name === 'srcset') {
return getAbsoluteSrcsetString(doc, value);
Expand All @@ -212,7 +209,7 @@
// eslint-disable-next-line @typescript-eslint/no-unused-vars
_value: unknown,
): boolean {
return (tagName === 'video' || tagName === 'audio') && name === 'autoplay';
return ['video', 'audio'].includes(tagName) && name === 'autoplay';
}

export function _isBlockedElement(
Expand Down Expand Up @@ -282,7 +279,7 @@
// should warn? maybe a text node isn't attached to a parent node yet?
return false;
} else {
el = dom.parentElement(node)!;

Check warning on line 282 in packages/rrweb-snapshot/src/snapshot.ts

View workflow job for this annotation

GitHub Actions / ESLint Report Analysis

packages/rrweb-snapshot/src/snapshot.ts#L282

[@typescript-eslint/no-non-null-assertion] Forbidden non-null assertion.
}
try {
if (typeof maskTextClass === 'string') {
Expand Down Expand Up @@ -616,7 +613,7 @@
}
}
// form fields
if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {
if (['input', 'textarea', 'select'].includes(tagName)) {
const value = (n as HTMLInputElement | HTMLTextAreaElement).value;
const checked = (n as HTMLInputElement).checked;
if (
Expand Down Expand Up @@ -702,10 +699,10 @@
const recordInlineImage = () => {
image.removeEventListener('load', recordInlineImage);
try {
canvasService!.width = image.naturalWidth;

Check warning on line 702 in packages/rrweb-snapshot/src/snapshot.ts

View workflow job for this annotation

GitHub Actions / ESLint Report Analysis

packages/rrweb-snapshot/src/snapshot.ts#L702

[@typescript-eslint/no-non-null-assertion] Forbidden non-null assertion.
canvasService!.height = image.naturalHeight;

Check warning on line 703 in packages/rrweb-snapshot/src/snapshot.ts

View workflow job for this annotation

GitHub Actions / ESLint Report Analysis

packages/rrweb-snapshot/src/snapshot.ts#L703

[@typescript-eslint/no-non-null-assertion] Forbidden non-null assertion.
canvasCtx!.drawImage(image, 0, 0);

Check warning on line 704 in packages/rrweb-snapshot/src/snapshot.ts

View workflow job for this annotation

GitHub Actions / ESLint Report Analysis

packages/rrweb-snapshot/src/snapshot.ts#L704

[@typescript-eslint/no-non-null-assertion] Forbidden non-null assertion.
attributes.rr_dataURL = canvasService!.toDataURL(

Check warning on line 705 in packages/rrweb-snapshot/src/snapshot.ts

View workflow job for this annotation

GitHub Actions / ESLint Report Analysis

packages/rrweb-snapshot/src/snapshot.ts#L705

[@typescript-eslint/no-non-null-assertion] Forbidden non-null assertion.
dataURLOptions.type,
dataURLOptions.quality,
);
Expand Down Expand Up @@ -733,7 +730,7 @@
else image.addEventListener('load', recordInlineImage);
}
// media elements
if (tagName === 'audio' || tagName === 'video') {
if (['audio', 'video'].includes(tagName)) {
const mediaAttributes = attributes as mediaAttributes;
mediaAttributes.rr_mediaState = (n as HTMLMediaElement).paused
? 'paused'
Expand Down Expand Up @@ -805,6 +802,32 @@
}
}

export function slimDOMDefaults(
_slimDOMOptions: SlimDOMOptions | 'all' | true | false | undefined,
) {
if (_slimDOMOptions === true || _slimDOMOptions === 'all') {
// if true: set of sensible options that should not throw away any information
return {
script: true,
comment: true,
headFavicon: true,
headWhitespace: true,
headMetaSocial: true,
headMetaRobots: true,
headMetaHttpEquiv: true,
headMetaVerification: true,
// the following are off for slimDOMOptions === true,
// as they destroy some (hidden) info:
headMetaAuthorship: _slimDOMOptions === 'all',
headMetaDescKeywords: _slimDOMOptions === 'all',
headTitleMutations: _slimDOMOptions === 'all',
};
} else if (_slimDOMOptions) {
return _slimDOMOptions;
}
return {};
}

function slimDOMExcluded(
sn: serializedNode,
slimDOMOptions: SlimDOMOptions,
Expand Down Expand Up @@ -1289,24 +1312,8 @@
password: true,
}
: maskAllInputs;
const slimDOMOptions: SlimDOMOptions =
slimDOM === true || slimDOM === 'all'
? // if true: set of sensible options that should not throw away any information
{
script: true,
comment: true,
headFavicon: true,
headWhitespace: true,
headMetaDescKeywords: slimDOM === 'all', // destructive
headMetaSocial: true,
headMetaRobots: true,
headMetaHttpEquiv: true,
headMetaAuthorship: true,
headMetaVerification: true,
}
: slimDOM === false
? {}
: slimDOM;
const slimDOMOptions = slimDOMDefaults(slimDOM);

return serializeNodeWithId(n, {
doc: n,
mirror,
Expand Down
28 changes: 3 additions & 25 deletions packages/rrweb/src/record/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {
snapshot,
slimDOMDefaults,
type MaskInputOptions,
type SlimDOMOptions,
createMirror,
} from 'rrweb-snapshot';
import { initObservers, mutationBuffers } from './observer';
Expand Down Expand Up @@ -160,26 +160,7 @@
? _maskInputOptions
: { password: true };

const slimDOMOptions: SlimDOMOptions =
_slimDOMOptions === true || _slimDOMOptions === 'all'
? {
script: true,
comment: true,
headFavicon: true,
headWhitespace: true,
headMetaSocial: true,
headMetaRobots: true,
headMetaHttpEquiv: true,
headMetaVerification: true,
// the following are off for slimDOMOptions === true,
// as they destroy some (hidden) info:
headMetaAuthorship: _slimDOMOptions === 'all',
headMetaDescKeywords: _slimDOMOptions === 'all',
headTitleMutations: _slimDOMOptions === 'all',
}
: _slimDOMOptions
? _slimDOMOptions
: {};
const slimDOMOptions = slimDOMDefaults(_slimDOMOptions);

polyfill();

Expand Down Expand Up @@ -557,7 +538,7 @@
plugins
?.filter((p) => p.observer)
?.map((p) => ({
observer: p.observer!,

Check warning on line 541 in packages/rrweb/src/record/index.ts

View workflow job for this annotation

GitHub Actions / ESLint Report Analysis

packages/rrweb/src/record/index.ts#L541

[@typescript-eslint/no-non-null-assertion] Forbidden non-null assertion.
options: p.options,
callback: (payload: object) =>
wrappedEmit({
Expand All @@ -575,7 +556,7 @@

iframeManager.addLoadListener((iframeEl) => {
try {
handlers.push(observe(iframeEl.contentDocument!));

Check warning on line 559 in packages/rrweb/src/record/index.ts

View workflow job for this annotation

GitHub Actions / ESLint Report Analysis

packages/rrweb/src/record/index.ts#L559

[@typescript-eslint/no-non-null-assertion] Forbidden non-null assertion.
} catch (error) {
// TODO: handle internal error
console.warn(error);
Expand All @@ -587,10 +568,7 @@
handlers.push(observe(document));
recording = true;
};
if (
document.readyState === 'interactive' ||
document.readyState === 'complete'
) {
if (['interactive', 'complete'].includes(document.readyState)) {
init();
} else {
handlers.push(
Expand Down
Loading