From: Thorsten Lünborg Date: Fri, 21 Jan 2022 07:33:18 +0000 (+0100) Subject: fix(reactivity): mutating a readonly ref nested in a reactive object should fail... X-Git-Tag: v3.2.28~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=171f5e9c6008bf0dff565991f34b214da016dde0;p=thirdparty%2Fvuejs%2Fcore.git fix(reactivity): mutating a readonly ref nested in a reactive object should fail. (#5048) fix: #5042 --- diff --git a/packages/reactivity/__tests__/readonly.spec.ts b/packages/reactivity/__tests__/readonly.spec.ts index 1a7df0804e..72a873a016 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 97acf063f6..eed9dc8509 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)