Skip to content

Commit

Permalink
Sync from source repo branch (#4)
Browse files Browse the repository at this point in the history
* Fix up the 'should replace the existing DOM nodes on iframe navigation with `isAttachIframe`' test (rrweb-io#1636)

- it was working for me when the test was run in isolation (`-t` option), but when the entire cross-origin-iframes test was run, the change of iframe contents didn't seem to happen in time

* [chore]: Update actions/upload-artifact to v4 (rrweb-io#1643)

* update actions/upload-artifact to v4

---------

Co-authored-by: Eoghan Murray <[email protected]>

* Fix a code path where masking could be skipped on textareas (rrweb-io#1599)

* Fixes rrweb-io#1596

* [chore] Cache yarn packages for CI (rrweb-io#1646)

* [chore] Cache yarn packages for CI

* Cache yarn in release.yml

* [chore] Update deprecated download artifact on CI (rrweb-io#1647)

* I'm merging even though ESLint is stlll failing in Github Actions as I believe it's running actions _without_ this PR applied yet

---------

Co-authored-by: Eoghan Murray <[email protected]>
Co-authored-by: Kevin Townsend <[email protected]>
Co-authored-by: Justin Halsall <[email protected]>
  • Loading branch information
4 people authored Feb 5, 2025
1 parent b6585e6 commit 3e6ea35
Show file tree
Hide file tree
Showing 12 changed files with 1,012 additions and 7 deletions.
2 changes: 2 additions & 0 deletions .changeset/blank-dev-changset.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
2 changes: 2 additions & 0 deletions .changeset/dirty-pets-fly.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
2 changes: 2 additions & 0 deletions .changeset/fuzzy-mugs-march.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
2 changes: 2 additions & 0 deletions .changeset/lucky-donuts-hammer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
5 changes: 5 additions & 0 deletions .changeset/textarea-inner-html.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"rrweb": patch
---

#1596 Add masking for innerText mutations on textarea elements
1 change: 1 addition & 0 deletions .github/workflows/ci-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: lts/*
cache: 'yarn'

- name: Install Dependencies
run: yarn install --frozen-lockfile
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: lts/*
cache: 'yarn'

- name: Install Dependencies
run: |
Expand Down
10 changes: 9 additions & 1 deletion packages/rrweb/src/record/mutation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -533,10 +533,18 @@ export default class MutationBuffer {
this.attributes.push(item);
this.attributeMap.set(textarea, item);
}
item.attributes.value = Array.from(
const value = Array.from(
dom.childNodes(textarea),
(cn) => dom.textContent(cn) || '',
).join('');
item.attributes.value = maskInputValue({
element: textarea,
maskInputOptions: this.maskInputOptions,
tagName: textarea.tagName,
type: getInputType(textarea),
value,
maskInputFn: this.maskInputFn,
});
};

private processMutation = (m: mutationRecord) => {
Expand Down
133 changes: 129 additions & 4 deletions packages/rrweb/test/__snapshots__/integration.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -9964,6 +9964,21 @@ exports[`record integration tests > should not record input values if dynamicall
{
\\"parentId\\": 14,
\\"nextId\\": 16,
\\"node\\": {
\\"type\\": 2,
\\"tagName\\": \\"textarea\\",
\\"attributes\\": {
\\"id\\": \\"textarea\\",
\\"size\\": \\"50\\",
\\"value\\": \\"*************************\\"
},
\\"childNodes\\": [],
\\"id\\": 21
}
},
{
\\"parentId\\": 14,
\\"nextId\\": 21,
\\"node\\": {
\\"type\\": 2,
\\"tagName\\": \\"input\\",
Expand All @@ -9973,7 +9988,7 @@ exports[`record integration tests > should not record input values if dynamicall
\\"value\\": \\"**********************\\"
},
\\"childNodes\\": [],
\\"id\\": 21
\\"id\\": 22
}
}
]
Expand All @@ -9985,6 +10000,15 @@ exports[`record integration tests > should not record input values if dynamicall
\\"source\\": 5,
\\"text\\": \\"**********************\\",
\\"isChecked\\": false,
\\"id\\": 22
}
},
{
\\"type\\": 3,
\\"data\\": {
\\"source\\": 5,
\\"text\\": \\"*************************\\",
\\"isChecked\\": false,
\\"id\\": 21
}
},
Expand All @@ -9993,7 +10017,7 @@ exports[`record integration tests > should not record input values if dynamicall
\\"data\\": {
\\"source\\": 2,
\\"type\\": 5,
\\"id\\": 21
\\"id\\": 22
}
},
{
Expand All @@ -10002,7 +10026,7 @@ exports[`record integration tests > should not record input values if dynamicall
\\"source\\": 5,
\\"text\\": \\"***********************\\",
\\"isChecked\\": false,
\\"id\\": 21
\\"id\\": 22
}
},
{
Expand All @@ -10011,7 +10035,7 @@ exports[`record integration tests > should not record input values if dynamicall
\\"source\\": 5,
\\"text\\": \\"************************\\",
\\"isChecked\\": false,
\\"id\\": 21
\\"id\\": 22
}
},
{
Expand All @@ -10020,8 +10044,109 @@ exports[`record integration tests > should not record input values if dynamicall
\\"source\\": 5,
\\"text\\": \\"*************************\\",
\\"isChecked\\": false,
\\"id\\": 22
}
},
{
\\"type\\": 3,
\\"data\\": {
\\"source\\": 2,
\\"type\\": 6,
\\"id\\": 22
}
},
{
\\"type\\": 3,
\\"data\\": {
\\"source\\": 2,
\\"type\\": 5,
\\"id\\": 21
}
},
{
\\"type\\": 3,
\\"data\\": {
\\"source\\": 5,
\\"text\\": \\"**************************\\",
\\"isChecked\\": false,
\\"id\\": 21
}
},
{
\\"type\\": 3,
\\"data\\": {
\\"source\\": 5,
\\"text\\": \\"***************************\\",
\\"isChecked\\": false,
\\"id\\": 21
}
},
{
\\"type\\": 3,
\\"data\\": {
\\"source\\": 5,
\\"text\\": \\"****************************\\",
\\"isChecked\\": false,
\\"id\\": 21
}
},
{
\\"type\\": 3,
\\"data\\": {
\\"source\\": 5,
\\"text\\": \\"**********************************************\\",
\\"isChecked\\": false,
\\"id\\": 22
}
},
{
\\"type\\": 3,
\\"data\\": {
\\"source\\": 5,
\\"text\\": \\"*************************************************\\",
\\"isChecked\\": false,
\\"id\\": 21
}
},
{
\\"type\\": 3,
\\"data\\": {
\\"source\\": 0,
\\"texts\\": [],
\\"attributes\\": [
{
\\"id\\": 22,
\\"attributes\\": {
\\"value\\": \\"**********************************************************************************************\\"
}
},
{
\\"id\\": 21,
\\"attributes\\": {
\\"value\\": \\"*************************************************************************************************\\"
}
}
],
\\"removes\\": [],
\\"adds\\": []
}
},
{
\\"type\\": 3,
\\"data\\": {
\\"source\\": 0,
\\"texts\\": [],
\\"attributes\\": [
{
\\"id\\": 21,
\\"attributes\\": {
\\"value\\": \\"****************************************************************\\"
}
}
],
\\"removes\\": [],
\\"adds\\": []
}
}
]"
`;
Expand Down
37 changes: 37 additions & 0 deletions packages/rrweb/test/integration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -783,9 +783,46 @@ describe('record integration tests', function (this: ISuite) {

const nextElement = document.querySelector('#one')!;
nextElement.parentNode!.insertBefore(el, nextElement);

const ta = document.createElement('textarea');
ta.size = 50;
ta.id = 'textarea';
ta.setAttribute('size', '50');
ta.value = 'textarea should be masked';

nextElement.parentNode!.insertBefore(ta, nextElement);
});

await page.type('#input', 'moo');
await page.type('#textarea', 'boo');

await page.evaluate(() => {
const el = document.querySelector('input');
el.value = 'input attribute mutation should also be masked';

const ta = document.querySelector('textarea');
ta.value = 'textarea attribute mutation should also be masked';
});

await page.evaluate(() => {
const el = document.querySelector('input');
el.setAttribute(
'value',
"input attribute mutation should also be masked (even though the new value doesn't take effect)",
);

const ta = document.querySelector('textarea');
ta.setAttribute(
'value',
"textarea attribute mutation should also be masked (even though the new value doesn't take effect)",
);
});

await page.evaluate(() => {
const ta = document.querySelector('textarea');
ta.innerText =
'textarea attribute mutation via innerText should also be masked ';
});

await assertSnapshot(page);
});
Expand Down
Loading

0 comments on commit 3e6ea35

Please sign in to comment.