From 171f5e9c6008bf0dff565991f34b214da016dde0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorsten=20L=C3=BCnborg?= Date: Fri, 21 Jan 2022 08:33:18 +0100 Subject: [PATCH] fix(reactivity): mutating a readonly ref nested in a reactive object should fail. (#5048) fix: #5042 --- packages/reactivity/__tests__/readonly.spec.ts | 11 +++++++++++ packages/reactivity/src/baseHandlers.ts | 3 +++ 2 files changed, 14 insertions(+) diff --git a/packages/reactivity/__tests__/readonly.spec.ts b/packages/reactivity/__tests__/readonly.spec.ts index 1a7df0804e0..72a873a016e 100644 --- a/packages/reactivity/__tests__/readonly.spec.ts +++ b/packages/reactivity/__tests__/readonly.spec.ts @@ -474,4 +474,15 @@ describe('reactivity/readonly', () => { expect(rr.foo).toBe(r) expect(isReadonly(rr.foo)).toBe(true) }) + + test('attemptingt to write to a readonly ref nested in a reactive object should fail', () => { + const r = ref(false) + const ror = readonly(r) + const obj = reactive({ ror }) + try { + obj.ror = true + } catch (e) {} + + expect(obj.ror).toBe(false) + }) }) diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 97acf063f67..eed9dc8509f 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -150,6 +150,9 @@ function createSetter(shallow = false) { receiver: object ): boolean { let oldValue = (target as any)[key] + if (isReadonly(oldValue) && isRef(oldValue)) { + return false + } if (!shallow && !isReadonly(value)) { if (!isShallow(value)) { value = toRaw(value)