Don't show next arrow when there are not more changes on next page

The logic hiding the next arrow on the change list view was incorrect
when there was a full page of results, but no more to dipslay.

The API includes an attribute _more_changes on the last item of the
array to let the client know whether or not there should be another
page. This change uses _more_changes instead of comparing to
_changesPerPage to take this edge case into account.

Bug: Issue 5622
Change-Id: I17dba2c807d152485494405fb412a502ba666df6
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.html b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.html
index 9c9a31a..057dd1d 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.html
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.html
@@ -62,7 +62,7 @@
             hidden$="[[_hidePrevArrow(_offset)]]" hidden>&larr; Prev</a>
         <a id="nextArrow"
             href$="[[_computeNavLink(_query, _offset, 1, _changesPerPage)]]"
-            hidden$="[[_hideNextArrow(_loading, _changesPerPage)]]" hidden>
+            hidden$="[[_hideNextArrow(_loading)]]" hidden>
           Next &rarr;</a>
       </nav>
     </div>
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.js b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.js
index fa68bc8..fc9b26f 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.js
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.js
@@ -134,8 +134,9 @@
       return offset === 0;
     },
 
-    _hideNextArrow: function(loading, changesPerPage) {
-      return loading || !this._changes || this._changes.length < changesPerPage;
+    _hideNextArrow: function(loading) {
+      return loading || !this._changes || !this._changes.length ||
+          !this._changes[this._changes.length - 1]._more_changes;
     },
 
     _handleNextPage: function() {
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.html b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.html
index 376c6ea..d99f251 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.html
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.html
@@ -86,16 +86,21 @@
 
     test('_hideNextArrow', function() {
       var loading = true;
-      var changesPerPage = 25;
-      assert.isTrue(element._hideNextArrow(loading, changesPerPage));
+      assert.isTrue(element._hideNextArrow(loading));
       loading = false;
-      assert.isTrue(element._hideNextArrow(loading, changesPerPage));
+      assert.isTrue(element._hideNextArrow(loading));
+      element._changes = [];
+      assert.isTrue(element._hideNextArrow(loading));
       element._changes =
-          Array.apply(null, Array(5)).map(Number.prototype.valueOf, 0);
-      assert.isTrue(element._hideNextArrow(loading, changesPerPage));
+          Array.apply(null, Array(5)).map(Object.prototype.valueOf, {});
+      assert.isTrue(element._hideNextArrow(loading));
       element._changes =
-          Array.apply(null, Array(25)).map(Number.prototype.valueOf, 0);
-      assert.isFalse(element._hideNextArrow(loading, changesPerPage));
+          Array.apply(null, Array(25)).map(Object.prototype.valueOf,
+          {_more_changes: true});
+      assert.isFalse(element._hideNextArrow(loading));
+      element._changes =
+          Array.apply(null, Array(25)).map(Object.prototype.valueOf, {});
+      assert.isTrue(element._hideNextArrow(loading));
     });
 
     test('_handleNextPage', function() {