From: Jukka Kurkela Date: Tue, 23 Feb 2021 17:46:31 +0000 (+0200) Subject: Fix set/delete oprations on Proxies (#8506) X-Git-Tag: v3.0.0-beta.12~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=639c34f89e881bbdc6018dd17921c502d5100a3c;p=thirdparty%2FChart.js.git Fix set/delete oprations on Proxies (#8506) --- diff --git a/src/helpers/helpers.config.js b/src/helpers/helpers.config.js index fb60c81c4..7fd5674ad 100644 --- a/src/helpers/helpers.config.js +++ b/src/helpers/helpers.config.js @@ -22,6 +22,16 @@ export function _createResolver(scopes, prefixes = [''], rootScopes = scopes, fa override: (scope) => _createResolver([scope, ...scopes], prefixes, rootScopes, fallback), }; return new Proxy(cache, { + /** + * A trap for the delete operator. + */ + deleteProperty(target, prop) { + delete target[prop]; // remove from cache + delete target._keys; // remove cached keys + delete scopes[0][prop]; // remove from top level scope + return true; + }, + /** * A trap for getting property values. */ @@ -63,8 +73,10 @@ export function _createResolver(scopes, prefixes = [''], rootScopes = scopes, fa * A trap for setting property values. */ set(target, prop, value) { - scopes[0][prop] = value; - return delete target[prop]; + scopes[0][prop] = value; // set to top level scope + delete target[prop]; // remove from cache + delete target._keys; // remove cached keys + return true; } }); } @@ -89,6 +101,15 @@ export function _attachContext(proxy, context, subProxy, descriptorDefaults) { override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults) }; return new Proxy(cache, { + /** + * A trap for the delete operator. + */ + deleteProperty(target, prop) { + delete target[prop]; // remove from cache + delete proxy[prop]; // remove from proxy + return true; + }, + /** * A trap for getting property values. */ @@ -130,8 +151,9 @@ export function _attachContext(proxy, context, subProxy, descriptorDefaults) { * A trap for setting property values. */ set(target, prop, value) { - proxy[prop] = value; - return delete target[prop]; + proxy[prop] = value; // set to proxy + delete target[prop]; // remove from cache + return true; } }); } diff --git a/test/specs/helpers.config.tests.js b/test/specs/helpers.config.tests.js index 86bee170e..e9a22a137 100644 --- a/test/specs/helpers.config.tests.js +++ b/test/specs/helpers.config.tests.js @@ -637,6 +637,23 @@ describe('Chart.helpers.config', function() { expect(opts instanceof Options).toBeTrue(); expect(opts.getter).toEqual('options getter'); + + expect('test' in opts).toBeFalse(); + expect(opts.test).toBeUndefined(); + + opts.test = true; + expect('test' in opts).toBeTrue(); + expect(opts.test).toBeTrue(); + + delete opts.test; + expect('test' in opts).toBeFalse(); + + opts.test = (ctx) => ctx.index; + expect('test' in opts).toBeTrue(); + expect(opts.test).toBe(1); + + delete opts.test; + expect('test' in opts).toBeFalse(); }); describe('_indexable and _scriptable', function() {