Fix infinite loop when updateOptions contains labelsDiv (or any other document node...
authorRobert Konigsberg <konigsberg@google.com>
Thu, 22 Sep 2011 14:38:07 +0000 (10:38 -0400)
committerRobert Konigsberg <konigsberg@google.com>
Thu, 22 Sep 2011 14:38:07 +0000 (10:38 -0400)
auto_tests/tests/update_options.js
dygraph-utils.js

index 21efeff..628f615 100644 (file)
@@ -19,7 +19,7 @@ UpdateOptionsTestCase.prototype.data = "X,Y1,Y2\n" +
   "2011-05-05,8,3\n";
 
 UpdateOptionsTestCase.prototype.setUp = function() {
-  document.body.innerHTML = "<div id='graph'></div>";
+  document.body.innerHTML = "<div id='graph'></div><div id='labels'>";
 };
 
 UpdateOptionsTestCase.prototype.tearDown = function() {
@@ -110,3 +110,12 @@ UpdateOptionsTestCase.prototype.testWidthChangeNeedsNewPoints = function() {
   this.unWrap(oldDrawGraph);
   assertTrue(graph._testDrawCalled);
 };
+
+// Test https://github.com/danvk/dygraphs/issues/87
+UpdateOptionsTestCase.prototype.testUpdateLabelsDivDoesntInfiniteLoop = function() {
+  var graphDiv = document.getElementById("graph");
+  var labelsDiv = document.getElementById("labels");
+  var graph = new Dygraph(graphDiv, this.data, this.opts);
+  graph.updateOptions({labelsDiv : labelsDiv});
+}
+
index 1b6a593..39fa2f5 100644 (file)
@@ -501,6 +501,9 @@ Dygraph.updateDeep = function (self, o) {
           self[k] = null;
         } else if (Dygraph.isArrayLike(o[k])) {
           self[k] = o[k].slice();
+        } else if (o[k] instanceof Node) {
+          // DOM objects are shallowly-copied.
+          self[k] = o[k];
         } else if (typeof(o[k]) == 'object') {
           if (typeof(self[k]) != 'object') {
             self[k] = {};