Call Gerrit.Nav.upgradeUrl from valid views

The migration to project-based URLs has made evident the need for some
alias in gr-navigation to `history.replaceState`. This change calls
the function `upgradeUrl` within gr-diff-view and gr-change-view iff the
project returned by getChangeDetail differs from the one set on
app.params.

Bug: Issue 6708
Change-Id: I7b542ddb989527b6a89ccdfd79846808835ed5a3
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..fce9c27 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
@@ -160,10 +160,17 @@
     },
 
     _getChangeDetail(changeNum) {
-      return this.$.restAPI.getDiffChangeDetail(changeNum).then(
-          change => {
-            this._change = change;
-          });
+      return this.$.restAPI.getDiffChangeDetail(changeNum).then(change => {
+        this._change = change;
+        this._upgradeUrl(change, this.params);
+      });
+    },
+
+    _upgradeUrl(change, params) {
+      const project = change.project;
+      if (!params.project || project !== params.project) {
+        Gerrit.Nav.upgradeUrl(Object.assign({}, params, {project}));
+      }
     },
 
     _getFiles(changeNum, patchRangeRecord) {
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 1503f93f..afba895 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
@@ -463,6 +463,7 @@
       stub('gr-rest-api-interface', {
         getDiffComments() { return Promise.resolve({}); },
       });
+      sandbox.stub(element, '_upgradeUrl');
       const saveReviewedStub = sandbox.stub(element, '_saveReviewedState',
           () => Promise.resolve());
       sandbox.stub(element.$.diff, 'reload');
@@ -497,6 +498,7 @@
       stub('gr-rest-api-interface', {
         getDiffComments() { return Promise.resolve({}); },
       });
+      sandbox.stub(element, '_upgradeUrl');
       sandbox.stub(element.$.diff, 'reload');
       sandbox.stub(element, '_loadHash');
 
@@ -734,5 +736,31 @@
         assert.isNull(result.next);
       });
     });
+
+    suite('_upgradeUrl calls', () => {
+      let upgradeStub;
+      const mockChange = {project: 'test'};
+
+      setup(() => {
+        upgradeStub = sandbox.stub(window.Gerrit.Nav, 'upgradeUrl');
+      });
+
+      test('app.params.project undefined', () => {
+        element._upgradeUrl(mockChange, {});
+        assert.isTrue(upgradeStub.called);
+        assert.deepEqual(upgradeStub.lastCall.args[0], mockChange);
+      });
+
+      test('app.params.project differs from change.project', () => {
+        element._upgradeUrl(mockChange, {project: 'demo'});
+        assert.isTrue(upgradeStub.called);
+        assert.deepEqual(upgradeStub.lastCall.args[0], mockChange);
+      });
+
+      test('app.params.project === change.project', () => {
+        element._upgradeUrl(mockChange, {project: 'test'});
+        assert.isFalse(upgradeStub.called);
+      });
+    });
   });
 </script>