From 90991d714491f55a204a5f6c1b55e97a1aeda1f0 Mon Sep 17 00:00:00 2001 From: Florian Metz Date: Wed, 11 Dec 2024 11:26:25 +0100 Subject: [PATCH 1/3] fix(storage): data clone issues --- packages/fake-browser/src/apis/storage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fake-browser/src/apis/storage.ts b/packages/fake-browser/src/apis/storage.ts index c334616..d460a2d 100644 --- a/packages/fake-browser/src/apis/storage.ts +++ b/packages/fake-browser/src/apis/storage.ts @@ -68,7 +68,7 @@ function defineStorageArea(area: StorageArea): StorageAreaWithTrigger { }, async set(items) { const changes: Record = {}; - for (const [key, newValue] of Object.entries(items)) { + for (const [key, newValue] of Object.entries(JSON.parse(JSON.stringigy(items)))) { // ignore undefined values if (newValue === undefined) continue; From 0717e33f174780df97b44b957ec90422c9d09f13 Mon Sep 17 00:00:00 2001 From: Florian Metz Date: Wed, 11 Dec 2024 13:19:57 +0100 Subject: [PATCH 2/3] fix(storage): ensure nested objects are not mutated on set operation --- bun.lockb | Bin 585552 -> 585552 bytes .../fake-browser/src/apis/storage.test.ts | 10 ++++++++++ packages/fake-browser/src/apis/storage.ts | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index e5d268d90797537503a47aecd1373e5a8a35d0c3..68eb4fcd958edbb775296d0e5c1dbbc83503ff78 100755 GIT binary patch delta 398 zcmca`Px-<<x9jVB;ptuA8lro5?24|jPwi*rx%v6NpBZ& zVk=-`d^Ek;g{=|jyX|bQY#|`;PLFYCI|uasbR7@2G$xA))2Dc_88JCe*nYx;jpLbO z8PJQ|!0=LjtG?TKW5vC(OHW^MklkYX<^$|M j+W#G7-~R6)N1oQ?AC($Fudy&PPX1V_zx~7;jt(XOA`Ow~ delta 407 zcmca`Px-<<{7ir?E1f>E9eAYR1I0w|{e&xELeT zrvA-~B;ptu`!_R6i7N|SK67rS&`-&ewQj$X1*hh|-K=5TFr6`B^2;mstbh9%7=kC~ zp0RG$xH?_qD&rGQZJ-5LfEF-p7rn-qu8YdImD_$uk?HiZ=}%8Ec~8G_f{Ax}FOb!4 zaFS`e!AWM9qUjI9SXj3AShFl)np_YqGI>EXOS_33%XSkx)`B^FPZ=2)&I0iTAZBFP zzUdaL86)Gf?JsY$o@Zx#x_#$kR>@e7I0HRH13d$V?YA7*L>W0iP62`Gg(Ym#+l8Fi z3YZxCr#HK>H3I#)oz0ak1myAQG45>VfB`XG$Ac}6>1qG;DIRP_OdtBUpYUMgc&4Zf z^d>hj#FXEv?>64pu|*Ha2Zf+%V8!lFmNzY(w|~@QKQwVV+d=jp)6-1Y^``$nz|KC^ gf { expect(globalListener).toBeCalledWith(changes, 'sync'); }); }); + + it('setting a nested object should not mutate the original object', async () => { + const a = { a: { a: 1, b: [{ c: 1 }] } }; + await fakeBrowser.storage.local.set(a); + const b = await fakeBrowser.storage.local.get(); + b.a.a = 2; + b.a.b[0].c = 2; + expect(a.a.a === 1).toBe(true); + expect(a.a.b[0].c === 1).toBe(true); + }); }); diff --git a/packages/fake-browser/src/apis/storage.ts b/packages/fake-browser/src/apis/storage.ts index d460a2d..fd3d65a 100644 --- a/packages/fake-browser/src/apis/storage.ts +++ b/packages/fake-browser/src/apis/storage.ts @@ -68,7 +68,7 @@ function defineStorageArea(area: StorageArea): StorageAreaWithTrigger { }, async set(items) { const changes: Record = {}; - for (const [key, newValue] of Object.entries(JSON.parse(JSON.stringigy(items)))) { + for (const [key, newValue] of Object.entries(JSON.parse(JSON.stringify(items)))) { // ignore undefined values if (newValue === undefined) continue; From fc799a168264d5bacfbf0e2a4ff942ddca4e4033 Mon Sep 17 00:00:00 2001 From: Florian Metz Date: Wed, 11 Dec 2024 13:44:54 +0100 Subject: [PATCH 3/3] Update packages/fake-browser/src/apis/storage.test.ts Co-authored-by: Bas van Zanten --- packages/fake-browser/src/apis/storage.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/fake-browser/src/apis/storage.test.ts b/packages/fake-browser/src/apis/storage.test.ts index d12fdac..5f3e66f 100644 --- a/packages/fake-browser/src/apis/storage.test.ts +++ b/packages/fake-browser/src/apis/storage.test.ts @@ -127,7 +127,7 @@ describe('Fake Storage API', () => { const b = await fakeBrowser.storage.local.get(); b.a.a = 2; b.a.b[0].c = 2; - expect(a.a.a === 1).toBe(true); - expect(a.a.b[0].c === 1).toBe(true); + expect(a.a.a).toBe(1); + expect(a.a.b[0].c).toBe(1); }); });