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 = [];