diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBox.java index 87073af212..63b8cca195 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBox.java @@ -17,8 +17,6 @@ package com.google.gerrit.client.diff; import com.google.gerrit.client.changes.CommentInfo; import com.google.gerrit.client.diff.PaddingManager.PaddingWidgetWrapper; import com.google.gerrit.client.diff.SidePanel.GutterWrapper; -import com.google.gwt.core.client.Scheduler; -import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOutHandler; import com.google.gwt.event.dom.client.MouseOverEvent; @@ -82,9 +80,9 @@ abstract class CommentBox extends Composite { if (!getCommentInfo().has_line()) { return; } - Scheduler.get().scheduleDeferred(new ScheduledCommand() { + parent.defer(new Runnable() { @Override - public void execute() { + public void run() { assert selfWidgetWrapper != null; selfWidgetWrapper.getWidget().changed(); if (diffChunkInfo != null) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DraftBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DraftBox.java index 23d50a17df..d5cab44392 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DraftBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DraftBox.java @@ -25,7 +25,6 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.RepeatingCommand; -import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.dom.client.Element; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; @@ -236,12 +235,7 @@ class DraftBox extends CommentBox { getCm().focus(); getSelfWidgetWrapper().getWidget().clear(); getGutterWrapper().remove(); - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - resizePaddingWidget(); - } - }); + resizePaddingWidget(); } @UiHandler("message") 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 315876ff70..02d7be5933 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 @@ -134,6 +134,7 @@ public class SideBySide2 extends Screen { private KeyCommandSet keysComment; private KeyCommandSet keysOpenByEnter; private List handlers; + private List deferred; public SideBySide2( PatchSet.Id base, @@ -605,6 +606,7 @@ public class SideBySide2 extends Screen { } CommentBox addCommentBox(CommentInfo info, CommentBox box) { + box.setParent(this); diffTable.add(box); DisplaySide side = box.getSide(); CodeMirror cm = getCmFromSide(side); @@ -643,7 +645,6 @@ public class SideBySide2 extends Screen { LineWidget boxWidget = addLineWidget(cm, line, box, config); box.setPaddingManager(manager); box.setSelfWidgetWrapper(new PaddingWidgetWrapper(boxWidget, box.getElement())); - box.setParent(this); if (otherChunk == null) { box.setDiffChunkInfo(myChunk); } @@ -966,9 +967,9 @@ public class SideBySide2 extends Screen { * key (or j/k) is held down. Performance on Chrome is fine * without the deferral. */ - Scheduler.get().scheduleDeferred(new ScheduledCommand() { + defer(new Runnable() { @Override - public void execute() { + public void run() { LineHandle handle = cm.getLineHandleVisualStart( cm.getCursor("end").getLine()); if (cm.hasActiveLine() && cm.getActiveLine().equals(handle)) { @@ -1203,6 +1204,33 @@ public class SideBySide2 extends Screen { return (index + diffChunks.size()) % diffChunks.size(); } + void defer(Runnable thunk) { + if (deferred == null) { + final ArrayList list = new ArrayList(); + deferred = list; + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + @Override + public void execute() { + deferred = null; + cmA.operation(new Runnable() { + @Override + public void run() { + cmB.operation(new Runnable() { + @Override + public void run() { + for (Runnable thunk : list) { + thunk.run(); + } + } + }); + } + }); + } + }); + } + deferred.add(thunk); + } + void resizePaddingOnOtherSide(DisplaySide mySide, int line) { CodeMirror cm = getCmFromSide(mySide); LineHandle handle = cm.getLineHandle(line); @@ -1258,9 +1286,9 @@ public class SideBySide2 extends Screen { lineActiveBoxMap.get(handle).resizePaddingWidget(); } if (linePaddingOnOtherSideMap.containsKey(handle)) { - Scheduler.get().scheduleDeferred(new ScheduledCommand() { + defer(new Runnable() { @Override - public void execute() { + public void run() { resizePaddingOnOtherSide(side, instance.getLineNumber(handle)); } });