From: Jukka Kurkela Date: Sat, 14 Nov 2020 19:38:38 +0000 (+0200) Subject: Chart.register: preserve existing defaults (#8052) X-Git-Tag: v3.0.0-beta.7~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fde84f272acf441fbfb8d51931c2484e1d34c805;p=thirdparty%2FChart.js.git Chart.register: preserve existing defaults (#8052) --- diff --git a/src/core/core.typedRegistry.js b/src/core/core.typedRegistry.js index 7e70cb112..187a3d161 100644 --- a/src/core/core.typedRegistry.js +++ b/src/core/core.typedRegistry.js @@ -42,10 +42,6 @@ export default class TypedRegistry { return scope; } - if (Object.keys(defaults.get(scope)).length) { - throw new Error('Can not register "' + id + '", because "defaults.' + scope + '" would collide with existing defaults'); - } - items[id] = item; registerDefaults(item, scope, parentScope); @@ -81,10 +77,13 @@ export default class TypedRegistry { } function registerDefaults(item, scope, parentScope) { - // Inherit the parent's defaults - const itemDefaults = parentScope - ? Object.assign({}, defaults.get(parentScope), item.defaults) - : item.defaults; + // Inherit the parent's defaults and keep existing defaults + const itemDefaults = Object.assign( + Object.create(null), + parentScope && defaults.get(parentScope), + item.defaults, + defaults.get(scope) + ); defaults.set(scope, itemDefaults); diff --git a/test/specs/core.registry.tests.js b/test/specs/core.registry.tests.js index 8c349ab70..e93207dc0 100644 --- a/test/specs/core.registry.tests.js +++ b/test/specs/core.registry.tests.js @@ -284,14 +284,18 @@ describe('Chart.registry', function() { expect(afterUnregisterCount).withContext('afterUnregister').toBe(4); }); - it('should not register anything that would collide with existing defaults', function() { - Chart.defaults.controllers.test = {test: true}; + it('should preserve existing defaults', function() { + Chart.defaults.controllers.test = {test1: true}; + class testController extends Chart.DatasetController {} testController.id = 'test'; - expect(function() { - Chart.register(testController); - }).toThrow(new Error('Can not register "test", because "defaults.controllers.test" would collide with existing defaults')); - delete Chart.defaults.controllers.test; + testController.defaults = {test1: false, test2: true}; + + Chart.register(testController); + expect(Chart.defaults.controllers.test).toEqual({test1: true, test2: true}); + + Chart.unregister(testController); + expect(Chart.defaults.controllers.test).not.toBeDefined(); }); describe('should handle multiple items', function() {