Gr-diff retrofit: implement re-render.

Feature: Issue 3910
Change-Id: Ia85bb2302f8435fd6066873ce87bc9c08b9c63b1
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js
index 3f71892..01aaa9c 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js
@@ -172,9 +172,9 @@
     },
 
     _rowHasSide: function(row) {
-      var selector = '.content';
-      selector += this.side === DiffSides.LEFT ? '.left' : '.right';
-      return row.querySelector(selector);
+      var selector = (this.side === DiffSides.LEFT ? '.left' : '.right') +
+          ' + .content';
+      return !!row.querySelector(selector);
     },
 
     _isFirstRowOfChunk: function(row) {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
index 4cbe10f..df91a38 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
@@ -339,14 +339,17 @@
     },
 
     _render: function() {
-      this._clearDiffContent();
-      this._builder = this._getDiffBuilder(this._diff, this._comments,
-          this.prefs);
-      this._builder.emitDiff(this._diff.content);
+      this._builder =
+          this._getDiffBuilder(this._diff, this._comments, this.prefs);
+      this._renderDiff();
+    },
 
+    _renderDiff: function() {
+      this._clearDiffContent();
+      this._builder.emitDiff();
       this.async(function() {
         this.fire('render', null, {bubbles: false});
-      }.bind(this), 1);
+      }, 1);
     },
 
     _clearDiffContent: function() {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.html b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.html
index cb091c9..d03831f 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.html
@@ -343,5 +343,30 @@
         element.reload();
       });
     });
+
+    suite('renderDiff', function() {
+      setup(function(done) {
+        sinon.stub(element, 'fire');
+        element._builder = {
+          emitDiff: sinon.stub(),
+        };
+        element._renderDiff();
+        flush(function() {
+          done();
+        });
+      });
+
+      teardown(function() {
+        element.fire.restore();
+      });
+
+      test('fires render', function() {
+        assert(element.fire.calledWithExactly(
+            'render', null, {bubbles: false}));
+      });
+      test('calls emitDiff on builder', function() {
+        assert(element._builder.emitDiff.calledOnce);
+      });
+    });
   });
 </script>