Merge "Specify project in URLs"
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 c733ed4..67a8110 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router.js
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router.js
@@ -583,18 +583,26 @@
       } else if (params.view === Gerrit.Nav.View.CHANGE) {
         let range = this._getPatchRangeExpression(params);
         if (range.length) { range = '/' + range; }
-
-        url = `/c/${params.changeNum}${range}`;
+        if (params.project) {
+          url = `/c/${params.project}/+/${params.changeNum}${range}`;
+        } else {
+          url = `/c/${params.changeNum}${range}`;
+        }
       } else if (params.view === Gerrit.Nav.View.DIFF) {
         let range = this._getPatchRangeExpression(params);
         if (range.length) { range = '/' + range; }
 
-        url = `/c/${params.changeNum}${range}/${encode(params.path, true)}`;
-
+        let suffix = `${range}/${encode(params.path, true)}`;
         if (params.lineNum) {
-          url += '#';
-          if (params.leftSide) { url += 'b'; }
-          url += params.lineNum;
+          suffix += '#';
+          if (params.leftSide) { suffix += 'b'; }
+          suffix += params.lineNum;
+        }
+
+        if (params.project) {
+          url = `/c/${params.project}/+/${params.changeNum}${suffix}`;
+        } else {
+          url = `/c/${params.changeNum}${suffix}`;
         }
       } else {
         throw new Error('Can\'t generate');
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html
index 92d0fde..d1392ee 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html
@@ -65,14 +65,15 @@
         const params = {
           view: Gerrit.Nav.View.CHANGE,
           changeNum: '1234',
+          project: 'test',
         };
-        assert.equal(element._generateUrl(params), '/c/1234');
+        assert.equal(element._generateUrl(params), '/c/test/+/1234');
 
         params.patchNum = 10;
-        assert.equal(element._generateUrl(params), '/c/1234/10');
+        assert.equal(element._generateUrl(params), '/c/test/+/1234/10');
 
         params.basePatchNum = 5;
-        assert.equal(element._generateUrl(params), '/c/1234/5..10');
+        assert.equal(element._generateUrl(params), '/c/test/+/1234/5..10');
       });
 
       test('diff', () => {
@@ -82,24 +83,31 @@
           path: 'x+y/path.cpp',
           patchNum: 12,
         };
-        assert.equal(element._generateUrl(params), '/c/42/12/x%252By/path.cpp');
+        assert.equal(element._generateUrl(params),
+            '/c/42/12/x%252By/path.cpp');
+
+        params.project = 'test';
+        assert.equal(element._generateUrl(params),
+            '/c/test/+/42/12/x%252By/path.cpp');
 
         params.basePatchNum = 6;
         assert.equal(element._generateUrl(params),
-            '/c/42/6..12/x%252By/path.cpp');
+            '/c/test/+/42/6..12/x%252By/path.cpp');
 
         params.path = 'foo bar/my+file.txt%';
         params.patchNum = 2;
         delete params.basePatchNum;
         assert.equal(element._generateUrl(params),
-            '/c/42/2/foo+bar/my%252Bfile.txt%2525');
+            '/c/test/+/42/2/foo+bar/my%252Bfile.txt%2525');
 
         params.path = 'file.cpp';
         params.lineNum = 123;
-        assert.equal(element._generateUrl(params), '/c/42/2/file.cpp#123');
+        assert.equal(element._generateUrl(params),
+            '/c/test/+/42/2/file.cpp#123');
 
         params.leftSide = true;
-        assert.equal(element._generateUrl(params), '/c/42/2/file.cpp#b123');
+        assert.equal(element._generateUrl(params),
+            '/c/test/+/42/2/file.cpp#b123');
       });
     });
   });