]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Handle inextensible `dataset.data` array (#6060)
authorEvert Timberg <evert.timberg+github@gmail.com>
Mon, 11 Feb 2019 18:31:26 +0000 (13:31 -0500)
committerSimon Brunel <simonbrunel@users.noreply.github.com>
Mon, 11 Feb 2019 18:31:26 +0000 (19:31 +0100)
src/core/core.datasetController.js
test/specs/core.datasetController.tests.js

index 6a7d36f196b50c3e44815cd7fe29d90edfc4bc0e..afd021c1db1d9eaa6ccdc922a021385d0c417d9f 100644 (file)
@@ -225,7 +225,9 @@ helpers.extend(DatasetController.prototype, {
                                unlistenArrayEvents(me._data, me);
                        }
 
-                       listenArrayEvents(data, me);
+                       if (data && Object.isExtensible(data)) {
+                               listenArrayEvents(data, me);
+                       }
                        me._data = data;
                }
 
index 5ab9dd5f31fbeb10905efd0efdcbd8109ce2712b..8b5d6dec2e03f310630ddbd425b066e67e3da8b4 100644 (file)
@@ -38,6 +38,86 @@ describe('Chart.DatasetController', function() {
                });
        });
 
+       describe('inextensible data', function() {
+               it('should handle a frozen data object', function() {
+                       function createChart() {
+                               var data = Object.freeze([0, 1, 2, 3, 4, 5]);
+                               expect(Object.isExtensible(data)).toBeFalsy();
+
+                               var chart = acquireChart({
+                                       type: 'line',
+                                       data: {
+                                               datasets: [{
+                                                       data: data
+                                               }]
+                                       }
+                               });
+
+                               var dataset = chart.data.datasets[0];
+                               dataset.data = Object.freeze([5, 4, 3, 2, 1, 0]);
+                               expect(Object.isExtensible(dataset.data)).toBeFalsy();
+                               chart.update();
+
+                               // Tests that the unlisten path also works for frozen objects
+                               chart.destroy();
+                       }
+
+                       expect(createChart).not.toThrow();
+               });
+
+               it('should handle a sealed data object', function() {
+                       function createChart() {
+                               var data = Object.seal([0, 1, 2, 3, 4, 5]);
+                               expect(Object.isExtensible(data)).toBeFalsy();
+
+                               var chart = acquireChart({
+                                       type: 'line',
+                                       data: {
+                                               datasets: [{
+                                                       data: data
+                                               }]
+                                       }
+                               });
+
+                               var dataset = chart.data.datasets[0];
+                               dataset.data = Object.seal([5, 4, 3, 2, 1, 0]);
+                               expect(Object.isExtensible(dataset.data)).toBeFalsy();
+                               chart.update();
+
+                               // Tests that the unlisten path also works for frozen objects
+                               chart.destroy();
+                       }
+
+                       expect(createChart).not.toThrow();
+               });
+
+               it('should handle an unextendable data object', function() {
+                       function createChart() {
+                               var data = Object.preventExtensions([0, 1, 2, 3, 4, 5]);
+                               expect(Object.isExtensible(data)).toBeFalsy();
+
+                               var chart = acquireChart({
+                                       type: 'line',
+                                       data: {
+                                               datasets: [{
+                                                       data: data
+                                               }]
+                                       }
+                               });
+
+                               var dataset = chart.data.datasets[0];
+                               dataset.data = Object.preventExtensions([5, 4, 3, 2, 1, 0]);
+                               expect(Object.isExtensible(dataset.data)).toBeFalsy();
+                               chart.update();
+
+                               // Tests that the unlisten path also works for frozen objects
+                               chart.destroy();
+                       }
+
+                       expect(createChart).not.toThrow();
+               });
+       });
+
        it('should synchronize metadata when data are inserted or removed', function() {
                var data = [0, 1, 2, 3, 4, 5];
                var chart = acquireChart({