Add raw diff download link to PG diff-view

A dependent change added the ability to download a single file diff to
Gerrit. This change utilizes that new feature via a download link in the
diff-view.

Feature: Issue 4669
Change-Id: I87ef2324ff2cd7fab6eb4b2e066dd08defe7c4f0
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
index ec37c06..4770340 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
@@ -17,6 +17,7 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../bower_components/iron-dropdown/iron-dropdown.html">
 <link rel="import" href="../../../behaviors/keyboard-shortcut-behavior.html">
+<link rel="import" href="../../../behaviors/rest-client-behavior.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
 <link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
@@ -43,13 +44,17 @@
         display: flex;
         justify-content: space-between;
       }
+      .patchRangeLeft {
+        display: flex;
+      }
       .titleHeader {
         padding: .75em var(--default-horizontal-margin);
       }
       .patchRangeHeader {
         margin: 0 var(--default-horizontal-margin) .75em;
       }
-      .navLink:not([href]) {
+      .navLink:not([href]),
+      .downloadLink:not([href]) {
         color: #999;
       }
       .reviewed {
@@ -119,6 +124,9 @@
       #modeSelect {
         margin-left: .5em;
       }
+      .separator {
+        margin: 0 .25em;
+      }
       @media screen and (max-width: 50em) {
         .dash {
           display: none;
@@ -194,13 +202,20 @@
       </div>
       <div class="loading" hidden$="[[!_loading]]">Loading...</div>
       <div class="patchRangeHeader" hidden hidden$="[[_loading]]">
-        <gr-patch-range-select
-            path="[[_path]]"
-            change-num="[[_changeNum]]"
-            patch-range="[[_patchRange]]"
-            files-weblinks="[[_filesWeblinks]]"
-            available-patches="[[_computeAvailablePatches(_change.revisions)]]">
-        </gr-patch-range-select>
+        <div class="patchRangeLeft">
+          <gr-patch-range-select
+              path="[[_path]]"
+              change-num="[[_changeNum]]"
+              patch-range="[[_patchRange]]"
+              files-weblinks="[[_filesWeblinks]]"
+              available-patches="[[_computeAvailablePatches(_change.revisions)]]">
+          </gr-patch-range-select>
+          <span class="separator">/</span>
+          <a class="downloadLink"
+              href$="[[_computeDownloadLink(_changeNum, _patchRange, _path)]]">
+            Download
+          </a>
+        </div>
         <div>
           <select
               id="modeSelect"
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
index a1060ab..7c5001d 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
@@ -91,6 +91,7 @@
 
     behaviors: [
       Gerrit.KeyboardShortcutBehavior,
+      Gerrit.RESTClientBehavior,
     ],
 
     observers: [
@@ -551,5 +552,11 @@
     _handleDropdownChange: function(e) {
       e.target.blur();
     },
+
+    _computeDownloadLink: function(changeNum, patchRange, path) {
+      var url = this.changeBaseURL(changeNum, patchRange.patchNum);
+      url += '/patch?zip&path=' + encodeURIComponent(path);
+      return url;
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
index 893f907..b0a0666 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
@@ -379,6 +379,19 @@
       assert.equal(linkEls[1].getAttribute('href'), '/c/42/10/glados.txt');
     });
 
+    test('download link', function() {
+      element._changeNum = '42';
+      element._patchRange = {
+        basePatchNum: 'PARENT',
+        patchNum: '10',
+      };
+      element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
+      element._path = 'glados.txt';
+      flushAsynchronousOperations();
+      assert.equal(element.$$('.downloadLink').getAttribute('href'),
+          '/changes/42/revisions/10/patch?zip&path=glados.txt');
+    });
+
     test('prev/next links with patch range', function() {
       element._changeNum = '42';
       element._patchRange = {