Re-render the result graphs when the available space changes. Use a ResizeObserver to detect when the graph container changes size, and use it to re-render the D3 graph. Addresses https://github.com/WebKit/MotionMark/issues/114
diff --git a/MotionMark/resources/debug-runner/graph.js b/MotionMark/resources/debug-runner/graph.js index b4ca40f..7971acc 100644 --- a/MotionMark/resources/debug-runner/graph.js +++ b/MotionMark/resources/debug-runner/graph.js
@@ -29,6 +29,11 @@ updateGraphData(testResult, testData, options) { var element = document.getElementById("test-graph-data"); + + // Remember the latest data so we can re-render when the element is resized. + this._lastRenderArgs = { testResult, testData, options }; + this._observeResize(element); + element.innerHTML = ""; element._testResult = testResult; element._options = options; @@ -59,6 +64,33 @@ this.onGraphTypeChanged(); } + _observeResize(element) + { + if (this._resizeObserver) + return; + + // Seed with the current size so the initial (synchronous) observer callback, + // which fires right after the first render, doesn't trigger a redundant re-render. + const initialSize = GeometryHelpers.elementClientSize(element); + let lastWidth = initialSize.width; + let lastHeight = initialSize.height; + this._resizeObserver = new ResizeObserver(() => { + if (!this._lastRenderArgs) + return; + + const size = GeometryHelpers.elementClientSize(element); + // Ignore spurious callbacks (e.g. when the section is hidden) and no-op size changes. + if (!size.width || !size.height || (size.width === lastWidth && size.height === lastHeight)) + return; + lastWidth = size.width; + lastHeight = size.height; + + const args = this._lastRenderArgs; + this.updateGraphData(args.testResult, args.testData, args.options); + }); + this._resizeObserver.observe(element); + } + _addRegressionLine(parent, xScale, yScale, points, range, isAlongYAxis) { var polygon = [];