From f6445cdf07df337ef829d27542823868d2a33873 Mon Sep 17 00:00:00 2001 From: wimrijnders Date: Fri, 13 Oct 2017 18:14:10 +0200 Subject: [PATCH] Network: Prevent crash when dataChanged is triggered during initialization (#3568) * Network: Prevent crash when dataChanged is triggered during initial setting of options Fixes #3562. Options `hidden` and `physics` can emit a `_dataChanged` event within `setOptions()`. If this happens when setting options during the initialization of the `Network` instance, this leads to an error thrown, because there is no DataSet instance connected yet to the instance. This bug was introduced in `v4.21.0`. Unit tests have been added for this case. * Edited comment --- lib/network/modules/EdgesHandler.js | 6 +++++- test/Network.test.js | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/network/modules/EdgesHandler.js b/lib/network/modules/EdgesHandler.js index e5935d20..2cad9bc6 100644 --- a/lib/network/modules/EdgesHandler.js +++ b/lib/network/modules/EdgesHandler.js @@ -461,8 +461,12 @@ class EdgesHandler { * @private */ _addMissingEdges() { - let edges = this.body.edges; let edgesData = this.body.data.edges; + if (edgesData === undefined || edgesData === null) { + return; // No edges DataSet yet; can happen on startup + } + + let edges = this.body.edges; let addIds = []; edgesData.forEach((edgeData, edgeId) => { diff --git a/test/Network.test.js b/test/Network.test.js index afec12c8..fea29b55 100644 --- a/test/Network.test.js +++ b/test/Network.test.js @@ -369,6 +369,27 @@ describe('Network', function () { }); + it('does not crash when dataChanged is triggered when setting options on first initialization ', function() { + // The init should succeed without an error thrown. + var options = { + nodes: { + physics: false // any value here triggered the error + } + }; + createSampleNetwork(options); + + // Do the other values as well that can cause this./ + // 'any values' applies here as well, expecting no throw + options = {edges: {physics: false}}; + createSampleNetwork(options); + + options = {nodes: {hidden: false}}; + createSampleNetwork(options); + + options = {edges: {hidden: false}}; + createSampleNetwork(options); + }); + describe('Node', function () { it('has known font options', function () {