From 3bf165275817bf890929da845061ec21bb25e890 Mon Sep 17 00:00:00 2001 From: Max Franz Date: Fri, 24 Jan 2020 14:37:01 -0500 Subject: [PATCH] Renderer-calculated style values for an edge may not be fresh on call to getter #2608 Rendered style is generally recalculated at the start of a frame rather than synchronously at the time of dirtying. This avoids redundant calculations. Further an edge is not explicitly dirtied when at least one of its connected nodes changes in dimensions (position, width, etc.). Instead, it is implicitly marked as dirty via the `cleanConnected` flag on the node. An immediate, synchronous recalculation of rendered style may happen for public functions that read rendered style, such as `edge.midpoint()`. For this case, `recalculateRenderedStyle()` must check whether an edge is implicitly dirty via `cleanConnected`. --- .../renderer/base/coord-ele-math/rendered-style.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/extensions/renderer/base/coord-ele-math/rendered-style.js b/src/extensions/renderer/base/coord-ele-math/rendered-style.js index aed055a64..41a556e21 100644 --- a/src/extensions/renderer/base/coord-ele-math/rendered-style.js +++ b/src/extensions/renderer/base/coord-ele-math/rendered-style.js @@ -75,8 +75,10 @@ BRp.onUpdateEleCalcs = function( fn ){ }; BRp.recalculateRenderedStyle = function( eles, useCache ){ - var edges = []; - var nodes = []; + let isCleanConnected = ele => ele._private.rstyle.cleanConnected; + + let edges = []; + let nodes = []; // the renderer can't be used for calcs when destroyed, e.g. ele.boundingBox() if( this.destroyed ){ return; } @@ -89,6 +91,12 @@ BRp.recalculateRenderedStyle = function( eles, useCache ){ var _p = ele._private; var rstyle = _p.rstyle; + // an edge may be implicitly dirty b/c of one of its connected nodes + // (and a request for recalc may come in between frames) + if( ele.isEdge() && (!isCleanConnected(ele.source()) || !isCleanConnected(ele.target())) ){ + rstyle.clean = false; + } + // only update if dirty and in graph if( (useCache && rstyle.clean) || ele.removed() ){ continue; }