Merge "InlineEdit: Don't offer edit icon on binary files"
diff --git a/Documentation/rest-api-changes.txt b/Documentation/rest-api-changes.txt
index 284cc83..50a7a6f 100644
--- a/Documentation/rest-api-changes.txt
+++ b/Documentation/rest-api-changes.txt
@@ -3636,6 +3636,7 @@
 |`web_links`       |optional|
 Links to the file diff in external sites as a list of
 link:rest-api-changes.html#diff-web-link-info[DiffWebLinkInfo] entries.
+|`binary`          |not set if `false`|Whether the file is binary.
 |==========================
 
 [[diff-intraline-info]]
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchScript.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchScript.java
index 914e69f..046df1d 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchScript.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchScript.java
@@ -56,6 +56,7 @@
   protected boolean intralineDifference;
   protected boolean intralineFailure;
   protected boolean intralineTimeout;
+  protected boolean binary;
 
   public PatchScript(final Change.Key ck, final ChangeType ct, final String on,
       final String nn, final FileMode om, final FileMode nm,
@@ -64,7 +65,7 @@
       final List<Edit> e, final DisplayMethod ma, final DisplayMethod mb,
       final String mta, final String mtb, final CommentDetail cd,
       final List<Patch> hist, final boolean hf, final boolean id,
-      final boolean idf, final boolean idt) {
+      final boolean idf, final boolean idt, boolean bin) {
     changeId = ck;
     changeType = ct;
     oldName = on;
@@ -86,6 +87,7 @@
     intralineDifference = id;
     intralineFailure = idf;
     intralineTimeout = idt;
+    binary = bin;
   }
 
   protected PatchScript() {
@@ -194,4 +196,8 @@
     }
     return new EditList(edits, ctx, a.size(), b.size()).getHunks();
   }
+
+  public boolean isBinary() {
+    return binary;
+  }
 }
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DiffInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DiffInfo.java
index e58ffc5..62b1dc7 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DiffInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DiffInfo.java
@@ -32,6 +32,8 @@
   public List<ContentEntry> content;
   // Links to the file diff in external sites
   public List<DiffWebLinkInfo> webLinks;
+  // Binary file
+  public Boolean binary;
 
   public static enum IntraLineStatus {
     OK,
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java
index 8d94438..7140e07 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java
@@ -35,6 +35,7 @@
   public final native JsArrayString diff_header() /*-{ return this.diff_header; }-*/;
   public final native JsArray<Region> content() /*-{ return this.content; }-*/;
   public final native JsArray<DiffWebLinkInfo> web_links() /*-{ return this.web_links; }-*/;
+  public final native boolean binary() /*-{ return this.binary || false; }-*/;
 
   public final List<WebLinkInfo> side_by_side_web_links() {
     return filterWebLinks(DiffView.SIDE_BY_SIDE);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java
index 42dc700..1105476 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java
@@ -150,12 +150,12 @@
   }
 
   void set(DiffPreferences prefs, JsArray<RevisionInfo> list, DiffInfo info,
-      boolean editExists, int currentPatchSet, boolean open) {
+      boolean editExists, int currentPatchSet, boolean open, boolean binary) {
     this.changeType = info.change_type();
     patchSetSelectBoxA.setUpPatchSetNav(list, info.meta_a(), editExists,
-        currentPatchSet, open);
+        currentPatchSet, open, binary);
     patchSetSelectBoxB.setUpPatchSetNav(list, info.meta_b(), editExists,
-        currentPatchSet, open);
+        currentPatchSet, open, binary);
 
     JsArrayString hdr = info.diff_header();
     if (hdr != null) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java
index 0077fbc..aed2218 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java
@@ -82,7 +82,7 @@
   }
 
   void setUpPatchSetNav(JsArray<RevisionInfo> list, DiffInfo.FileMeta meta,
-      boolean editExists, int currentPatchSet, boolean open) {
+      boolean editExists, int currentPatchSet, boolean open, boolean binary) {
     InlineHyperlink baseLink = null;
     InlineHyperlink selectedLink = null;
     if (sideA) {
@@ -110,7 +110,7 @@
     if (!Patch.COMMIT_MSG.equals(path)) {
       linkPanel.add(createDownloadLink());
     }
-    if (open && idActive != null && Gerrit.isSignedIn()) {
+    if (!binary && open && idActive != null && Gerrit.isSignedIn()) {
       if ((editExists && idActive.get() == 0)
           || (!editExists && idActive.get() == currentPatchSet)) {
         linkPanel.add(createEditIcon());
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java
index f405cb6..5934c5d 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java
@@ -246,7 +246,7 @@
         JsArray<RevisionInfo> list = info.revisions().values();
         RevisionInfo.sortRevisionInfoByNumber(list);
         diffTable.set(prefs, list, diff, edit != null, currentPatchSet,
-            changeStatus.isOpen());
+            changeStatus.isOpen(), diff.binary());
         header.setChangeInfo(info);
       }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java
index 81f3b9b..8e3a5d1 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java
@@ -189,6 +189,9 @@
       result.webLinks = links.isEmpty() ? null : links.toList();
 
       if (!webLinksOnly) {
+        if (ps.isBinary()) {
+          result.binary = true;
+        }
         if (ps.getDisplayMethodA() != DisplayMethod.NONE) {
           result.metaA = new FileMeta();
           result.metaA.name = MoreObjects.firstNonNull(ps.getOldName(),
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
index 4bb85cb..d231664 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
@@ -213,7 +213,8 @@
         content.getHeaderLines(), diffPrefs, a.dst, b.dst, edits,
         a.displayMethod, b.displayMethod, a.mimeType.toString(),
         b.mimeType.toString(), comments, history, hugeFile,
-        intralineDifferenceIsPossible, intralineFailure, intralineTimeout);
+        intralineDifferenceIsPossible, intralineFailure, intralineTimeout,
+        content.getPatchType() == Patch.PatchType.BINARY);
   }
 
   private static boolean isModify(PatchListEntry content) {