Merge "Inject InitStep members again before calling postRun." into stable-2.9
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java
index 7d8ee97..881bcec 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java
@@ -43,7 +43,7 @@
 import com.google.gwt.core.client.Scheduler.ScheduledCommand;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.NativeEvent;
-import com.google.gwt.dom.client.Style.Unit;
+import com.google.gwt.dom.client.Style;
 import com.google.gwt.event.dom.client.FocusEvent;
 import com.google.gwt.event.dom.client.FocusHandler;
 import com.google.gwt.event.dom.client.KeyCodes;
@@ -101,6 +101,7 @@
   private CodeMirror cmB;
   private Element columnMarginA;
   private Element columnMarginB;
+  private double charWidthPx;
   private HandlerRegistration resizeHandler;
   private DiffInfo diff;
   private boolean largeFile;
@@ -580,13 +581,32 @@
   }
 
   void setLineLength(int columns) {
-    columnMarginA.getStyle().setMarginLeft(
-        columns * cmA.defaultCharWidth()
-        + cmA.getGutterElement().getOffsetWidth(), Unit.PX);
+    double w = columns * getCharWidthPx();
+    columnMarginA.getStyle().setMarginLeft(w, Style.Unit.PX);
+    columnMarginB.getStyle().setMarginLeft(w, Style.Unit.PX);
+  }
 
-    columnMarginB.getStyle().setMarginLeft(
-        columns * cmB.defaultCharWidth()
-        + cmB.getGutterElement().getOffsetWidth(), Unit.PX);
+  private double getCharWidthPx() {
+    if (charWidthPx <= 1) {
+      int len = 100;
+      StringBuilder s = new StringBuilder();
+      for (int i = 0; i < len; i++) {
+        s.append('m');
+      }
+      Element e = DOM.createSpan();
+      e.getStyle().setDisplay(Style.Display.INLINE_BLOCK);
+      e.setInnerText(s.toString());
+
+      cmA.getMoverElement().appendChild(e);
+      double a = ((double) e.getOffsetWidth()) / len;
+      e.removeFromParent();
+
+      cmB.getMoverElement().appendChild(e);
+      double b = ((double) e.getOffsetWidth()) / len;
+      e.removeFromParent();
+      charWidthPx = Math.max(a, b);
+    }
+    return charWidthPx;
   }
 
   void setShowLineNumbers(boolean b) {