Replace patchNum compare with utility function

In preparation for implementation of in-app editing, the instances of
parseInt(patchNum) must be swapped out, as a patchNum may now be either
a number or a string.

This change adds the patchNumEquals function to gr-patch-set-behavior,
and uses it everywhere patchNum is compared.

Bug: Issue 4437
Change-Id: Ib1176508cd88d60c79e952b99dd5f57b994baa77
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
index 32e14d2..3d5654e 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
@@ -553,9 +553,8 @@
     },
 
     _getRevision(change, patchNum) {
-      const num = window.parseInt(patchNum, 10);
       for (const rev of Object.values(change.revisions)) {
-        if (rev._number === num) {
+        if (this.patchNumEquals(rev._number, patchNum)) {
           return rev;
         }
       }
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
index f3c7cb1..b8aec60 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
@@ -360,7 +360,7 @@
     },
 
     _handlePatchChange(e) {
-      this._changePatchNum(parseInt(e.target.value, 10), true);
+      this._changePatchNum(e.target.value, true);
     },
 
     _handleReplyTap(e) {
@@ -595,7 +595,7 @@
 
     /**
      * Change active patch to the provided patch num.
-     * @param {number} patchNum the patchn number to be viewed.
+     * @param {number|string} patchNum the patchn number to be viewed.
      * @param {boolean} opt_forceParams When set to true, the resulting URL will
      *     always include the patch range, even if the requested patchNum is
      *     known to be the latest.
@@ -609,7 +609,7 @@
         } else {
           currentPatchNum = this.computeLatestPatchNum(this._allPatchSets);
         }
-        if (patchNum === currentPatchNum &&
+        if (this.patchNumEquals(patchNum, currentPatchNum) &&
             this._patchRange.basePatchNum === 'PARENT') {
           Gerrit.Nav.navigateToChange(this._change);
           return;
@@ -674,8 +674,8 @@
     },
 
     _computePatchInfoClass(patchNum, allPatchSets) {
-      if (parseInt(patchNum, 10) ===
-          this.computeLatestPatchNum(allPatchSets)) {
+      const latestNum = this.computeLatestPatchNum(allPatchSets);
+      if (this.patchNumEquals(patchNum, latestNum)) {
         return '';
       }
       return 'patchInfo--oldPatchSet';
@@ -931,8 +931,9 @@
 
             this._change = change;
             if (!this._patchRange || !this._patchRange.patchNum ||
-                    this._patchRange.patchNum === currentRevision._number) {
-                  // CommitInfo.commit is optional, and may need patching.
+                this.patchNumEquals(this._patchRange.patchNum,
+                    currentRevision._number)) {
+              // CommitInfo.commit is optional, and may need patching.
               if (!currentRevision.commit.commit) {
                 currentRevision.commit.commit = latestRevisionSha;
               }
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
index fb5d88b..db0a7c2 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
@@ -543,12 +543,12 @@
         numEvents++;
         if (numEvents == 1) {
           assert.isTrue(navigateToChangeStub.lastCall.calledWithExactly(
-              element._change, 1, 'PARENT'));
+              element._change, '1', 'PARENT'));
           selectEl.nativeSelect.value = '3';
           element.fire('change', {}, {node: selectEl.nativeSelect});
         } else if (numEvents == 2) {
           assert.isTrue(navigateToChangeStub.lastCall.calledWithExactly(
-              element._change, 3, 'PARENT'));
+              element._change, '3', 'PARENT'));
           done();
         }
       });
@@ -592,12 +592,12 @@
         numEvents++;
         if (numEvents == 1) {
           assert.isTrue(navigateToChangeStub.lastCall.calledWithExactly(
-              element._change, 1, 'PARENT'));
+              element._change, '1', 'PARENT'));
           selectEl.nativeSelect.value = '3';
           element.fire('change', {}, {node: selectEl.nativeSelect});
         } else if (numEvents == 2) {
           assert.isTrue(navigateToChangeStub.lastCall.calledWithExactly(
-              element._change, 3, 'PARENT'));
+              element._change, '3', 'PARENT'));
           done();
         }
       });
diff --git a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.html b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.html
index 18e958f..1d07cfe 100644
--- a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.html
+++ b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.html
@@ -14,8 +14,10 @@
 limitations under the License.
 -->
 
-<link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
+<link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
 <link rel="import" href="../../shared/gr-download-commands/gr-download-commands.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
diff --git a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.js b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.js
index 01a24c5..66ba86f 100644
--- a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.js
+++ b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.js
@@ -42,6 +42,7 @@
     },
 
     behaviors: [
+      Gerrit.PatchSetBehavior,
       Gerrit.RESTClientBehavior,
     ],
 
@@ -63,10 +64,10 @@
 
     _computeDownloadCommands(change, patchNum, _selectedScheme) {
       let commandObj;
-      for (const rev in change.revisions) {
-        if (change.revisions[rev]._number === parseInt(patchNum, 10) &&
-            change.revisions[rev].fetch.hasOwnProperty(_selectedScheme)) {
-          commandObj = change.revisions[rev].fetch[_selectedScheme].commands;
+      for (const rev of Object.values(change.revisions || {})) {
+        if (this.patchNumEquals(rev._number, patchNum) &&
+            rev.fetch.hasOwnProperty(_selectedScheme)) {
+          commandObj = rev.fetch[_selectedScheme].commands;
           break;
         }
       }
@@ -97,7 +98,7 @@
     _computeDownloadFilename(change, patchNum, zip) {
       let shortRev;
       for (const rev in change.revisions) {
-        if (change.revisions[rev]._number === parseInt(patchNum, 10)) {
+        if (this.patchNumEquals(change.revisions[rev]._number, patchNum)) {
           shortRev = rev.substr(0, 7);
           break;
         }
@@ -112,7 +113,7 @@
 
     _computeSchemes(change, patchNum) {
       for (const rev of Object.values(change.revisions || {})) {
-        if (rev._number === parseInt(patchNum, 10)) {
+        if (this.patchNumEquals(rev._number, patchNum)) {
           const fetch = rev.fetch;
           if (fetch) {
             return Object.keys(fetch).sort();
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js
index e86c088..1e9ec31 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js
@@ -305,7 +305,7 @@
 
     getCommentsForPath(comments, patchNum, path) {
       return (comments[path] || []).filter(c => {
-        return parseInt(c.patch_set, 10) === parseInt(patchNum, 10);
+        return this.patchNumEquals(c.patch_set, patchNum);
       });
     },
 
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.html b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.html
index 4fa3e2a..8c02e65 100644
--- a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.html
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.html
@@ -13,10 +13,11 @@
 See the License for the specific language governing permissions and
 limitations under the License.
 -->
+<link rel="import" href="../../../bower_components/polymer/polymer.html">
 
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
+<link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
 <link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
-<link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.js b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.js
index 01d7e8a..df2a5ed 100644
--- a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.js
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.js
@@ -63,6 +63,7 @@
 
     behaviors: [
       Gerrit.BaseUrlBehavior,
+      Gerrit.PatchSetBehavior,
       Gerrit.RESTClientBehavior,
     ],
 
@@ -246,7 +247,7 @@
       const connected = [];
       let changeRevision;
       for (const rev in change.revisions) {
-        if (change.revisions[rev]._number == patchNum) {
+        if (this.patchNumEquals(change.revisions[rev]._number, patchNum)) {
           changeRevision = rev;
         }
       }
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router.html b/polygerrit-ui/app/elements/core/gr-router/gr-router.html
index d311a6b..f07daa5 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router.html
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router.html
@@ -13,9 +13,11 @@
 See the License for the specific language governing permissions and
 limitations under the License.
 -->
-<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
+<link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
 <link rel="import" href="../../core/gr-navigation/gr-navigation.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../gr-reporting/gr-reporting.html">
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router.js b/polygerrit-ui/app/elements/core/gr-router/gr-router.js
index cc51d32..d3bdb89 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router.js
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router.js
@@ -38,6 +38,7 @@
   });
 
   const encode = window.Gerrit.URLEncodingBehavior.encodeURL;
+  const patchNumEquals = window.Gerrit.PatchSetBehavior.patchNumEquals;
 
   function startRouter(generateUrl) {
     const base = window.Gerrit.BaseUrlBehavior.getBaseUrl();
@@ -302,7 +303,8 @@
     });
 
     const normalizePatchRangeParams = params => {
-      if (params.basePatchNum && params.basePatchNum === params.patchNum) {
+      if (params.basePatchNum &&
+          patchNumEquals(params.basePatchNum, params.patchNum)) {
         params.basePatchNum = null;
         history.replaceState(null, null, generateUrl(params));
       } else if (params.basePatchNum && !params.patchNum) {
@@ -416,6 +418,7 @@
 
   Polymer({
     is: 'gr-router',
+    behaviors: [Gerrit.PatchSetBehavior],
     start() {
       if (!app) { return; }
       startRouter(this._generateUrl.bind(this));
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 70772b8..8bbb5c2 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
@@ -15,6 +15,7 @@
 -->
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
 <link rel="import" href="../../../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html">
 <link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
 <link rel="import" href="../../../bower_components/iron-dropdown/iron-dropdown.html">
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 168ec57..7181270 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
@@ -115,6 +115,7 @@
 
     behaviors: [
       Gerrit.KeyboardShortcutBehavior,
+      Gerrit.PatchSetBehavior,
       Gerrit.RESTClientBehavior,
     ],
 
@@ -714,11 +715,10 @@
      * @return {Promise} A promise that yields a comment map object.
      */
     _loadCommentMap() {
-      const filterByRange = comment => {
-        const patchNum = comment.patch_set + '';
-        return patchNum === this._patchRange.patchNum ||
-            patchNum === this._patchRange.basePatchNum;
-      };
+      const filterByRange = comment =>
+          this.patchNumEquals(comment.patch_set, this._patchRange.patchNum) ||
+            this.patchNumEquals(comment.patch_set,
+                this._patchRange.basePatchNum);
 
       return Promise.all([
         this.$.restAPI.getDiffComments(this._changeNum),
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.html b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.html
index 3cda49b..d8523cc 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.html
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.html
@@ -14,6 +14,8 @@
 limitations under the License.
 -->
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
 <link rel="import" href="../../core/gr-reporting/gr-reporting.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../gr-rest-api-interface/gr-rest-api-interface.html">
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js
index bcc764b..420d4af 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js
@@ -44,6 +44,8 @@
       },
     },
 
+    behaviors: [Gerrit.PatchSetBehavior],
+
     Element,
     EventType,
 
@@ -121,9 +123,9 @@
         const change = detail.change;
         const patchNum = detail.patchNum;
         let revision;
-        for (const rev in change.revisions) {
-          if (change.revisions[rev]._number == patchNum) {
-            revision = change.revisions[rev];
+        for (const rev of Object.values(change.revisions || {})) {
+          if (this.patchNumEquals(rev._number, patchNum)) {
+            revision = rev;
             break;
           }
         }