Show file weblinks (e.g. gitles) in diff view

Bug: Issue 4205
Change-Id: Ib5c832bb29453aa51ebe73732c7b8e6885e7e12f
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 6ed6cf7..2573ad1 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
@@ -172,6 +172,7 @@
             path="[[_path]]"
             change-num="[[_changeNum]]"
             patch-range="[[_patchRange]]"
+            files-weblinks="[[_filesWeblinks]]"
             available-patches="[[_computeAvailablePatches(_change.revisions)]]">
         </gr-patch-range-select>
         <div>
@@ -199,10 +200,12 @@
             on-save="_handlePrefsSave"
             on-cancel="_handlePrefsCancel"></gr-diff-preferences>
       </gr-overlay>
-      <gr-diff id="diff"
+      <gr-diff
+          id="diff"
           project="[[_change.project]]"
           commit="[[_change.current_revision]]"
           is-image-diff="{{_isImageDiff}}"
+          files-weblinks="{{_filesWeblinks}}"
           change-num="[[_changeNum]]"
           patch-range="[[_patchRange]]"
           path="[[_path]]"
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 f7a73cf..3c3536b 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
@@ -81,9 +81,10 @@
       _userPrefs: Object,
       _diffMode: {
         type: String,
-        computed: '_getDiffViewMode(changeViewState.diffMode, _userPrefs)'
+        computed: '_getDiffViewMode(changeViewState.diffMode, _userPrefs)',
       },
       _isImageDiff: Boolean,
+      _filesWeblinks: Object,
     },
 
     behaviors: [
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 b0c1731..3e0bc33 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
@@ -51,6 +51,11 @@
         computed: '_computeIsImageDiff(_diff)',
         notify: true,
       },
+      filesWeblinks: {
+        type: Object,
+        value: function() { return {}; },
+        notify: true,
+      },
 
       _loggedIn: {
         type: Boolean,
@@ -353,7 +358,13 @@
           this.patchRange.basePatchNum,
           this.patchRange.patchNum,
           this.path,
-          this._handleGetDiffError.bind(this));
+          this._handleGetDiffError.bind(this)).then(function(diff) {
+               this.filesWeblinks = {
+                 meta_a: diff.meta_a && diff.meta_a.web_links,
+                 meta_b: diff.meta_b && diff.meta_b.web_links,
+               };
+               return diff;
+             }.bind(this));
     },
 
     _getDiffComments: 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 b2481c7..00cced6 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
@@ -56,6 +56,27 @@
         });
       });
 
+      test('loads files weblinks', function(done) {
+        var diffStub = sinon.stub(element.$.restAPI, 'getDiff').returns(
+            Promise.resolve({
+              meta_a: {
+                web_links: 'foo',
+              },
+              meta_b: {
+                web_links: 'bar',
+              },
+            }));
+        element.patchRange = {};
+        element._getDiff().then(function() {
+          assert.deepEqual(element.filesWeblinks, {
+            meta_a: 'foo',
+            meta_b: 'bar',
+          });
+          done();
+        });
+        diffStub.restore();
+      });
+
       test('remove comment', function() {
         element._comments = {
           meta: {
diff --git a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html
index b0ee0b73..c496703 100644
--- a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html
+++ b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html
@@ -38,6 +38,12 @@
         </template>
       </select>
     </span>
+    <span is="dom-if" if="[[filesWeblinks.meta_a]]">
+      <template is="dom-repeat" items="[[filesWeblinks.meta_a]]" as="weblink">
+        <a target="_blank"
+           href$="[[weblink.url]]">[[weblink.name]]</a>
+      </template>
+    </span>
     &rarr;
     <span class="patchRange">
       <select id="rightPatchSelect" on-change="_handlePatchChange">
@@ -47,6 +53,12 @@
               disabled$="[[_computeRightDisabled(patchNum, patchRange)]]">[[patchNum]]</option>
         </template>
       </select>
+      <span is="dom-if" if="[[filesWeblinks.meta_b]]">
+        <template is="dom-repeat" items="[[filesWeblinks.meta_b]]" as="weblink">
+          <a target="_blank"
+             href$="[[weblink.url]]">[[weblink.name]]</a>
+        </template>
+      </span>
     </span>
   </template>
   <script src="gr-patch-range-select.js"></script>
diff --git a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.js b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.js
index 3439ecd..24d36c4 100644
--- a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.js
+++ b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.js
@@ -20,6 +20,7 @@
     properties: {
       availablePatches: Array,
       changeNum: String,
+      filesWeblinks: Object,
       patchRange: Object,
       path: String,
     },
diff --git a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.html b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.html
index a7d909e..c7e1196 100644
--- a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.html
@@ -89,5 +89,28 @@
       rightSelectEl.value = '3';
       element.fire('change', {}, {node: leftSelectEl});
     });
+
+    test('filesWeblinks', function() {
+      element.filesWeblinks = {
+        meta_a: [
+          {
+            name: 'foo',
+            url: 'f.oo',
+          }
+        ],
+        meta_b: [
+          {
+            name: 'bar',
+            url: 'ba.r',
+          }
+        ],
+      };
+      flushAsynchronousOperations();
+      var domApi = Polymer.dom(element.root);
+      assert.equal(
+          domApi.querySelector('a[href="f.oo"]').textContent, 'foo');
+      assert.equal(
+          domApi.querySelector('a[href="ba.r"]').textContent, 'bar');
+    });
   });
 </script>