Merge "Update regex for topic page to match any character"
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
index 55c84c1..c05b865 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
@@ -1371,13 +1371,12 @@
     if (!this._patchRange)
       throw new Error('missing required _patchRange property');
     const hash = PREFIX + e.detail.id;
-    const url = GerritNav.getUrlForChange(
-      this._change,
-      this._patchRange.patchNum,
-      this._patchRange.basePatchNum,
-      this._editMode,
-      hash
-    );
+    const url = GerritNav.getUrlForChange(this._change, {
+      patchNum: this._patchRange.patchNum,
+      basePatchNum: this._patchRange.basePatchNum,
+      isEdit: this._editMode,
+      messageHash: hash,
+    });
     history.replaceState(null, '', url);
   }
 
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts
index fbdef64..21c5f03 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts
@@ -399,7 +399,7 @@
       new CustomEvent('message-anchor-tap', {detail: {id: 'a12345'}})
     );
 
-    assert.equal(getUrlStub.lastCall.args[4], '#message-a12345');
+    assert.equal(getUrlStub.lastCall.args[1]!.messageHash, '#message-a12345');
     assert.isTrue(replaceStateStub.called);
   });
 
diff --git a/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation.ts b/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation.ts
index 5f4dfb1..f73b703 100644
--- a/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation.ts
+++ b/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation.ts
@@ -389,6 +389,10 @@
   forceReload?: boolean;
 }
 
+interface ChangeUrlParams extends NavigateToChangeParams {
+  messageHash?: string;
+}
+
 // TODO(dmfilippov) Convert to class, extract consts, give better name and
 // expose as a service from appContext
 export const GerritNav = {
@@ -563,12 +567,9 @@
    */
   getUrlForChange(
     change: Pick<ChangeInfo, '_number' | 'project' | 'internalHost'>,
-    patchNum?: PatchSetNum,
-    basePatchNum?: BasePatchSetNum,
-    isEdit?: boolean,
-    messageHash?: string,
-    forceReload?: boolean
+    options: ChangeUrlParams = {}
   ) {
+    let {patchNum, basePatchNum, isEdit, messageHash, forceReload} = options;
     if (basePatchNum === ParentPatchSetNum) {
       basePatchNum = undefined;
     }
@@ -615,14 +616,12 @@
   ) {
     const {patchNum, basePatchNum, isEdit, forceReload, redirect} = options;
     this._navigate(
-      this.getUrlForChange(
-        change,
+      this.getUrlForChange(change, {
         patchNum,
         basePatchNum,
         isEdit,
-        undefined,
-        forceReload
-      ),
+        forceReload,
+      }),
       redirect
     );
   },
diff --git a/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation_test.js b/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation_test.js
index 93a1e9e..40a06bc 100644
--- a/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation_test.js
+++ b/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation_test.js
@@ -20,7 +20,7 @@
 
 suite('gr-navigation tests', () => {
   test('invalid patch ranges throw exceptions', () => {
-    assert.throw(() => GerritNav.getUrlForChange('123', undefined, 12));
+    assert.throw(() => GerritNav.getUrlForChange('123', {basePatchNum: 12}));
     assert.throw(() => GerritNav.getUrlForDiff('123', 'x.c', undefined, 12));
   });
 
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
index 8767924..8daddde 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
@@ -1254,11 +1254,10 @@
     if (!patchRange) return '';
 
     const range = this._getChangeUrlRange(patchRange, revisions);
-    return GerritNav.getUrlForChange(
-      change,
-      range.patchNum,
-      range.basePatchNum
-    );
+    return GerritNav.getUrlForChange(change, {
+      patchNum: range.patchNum,
+      basePatchNum: range.basePatchNum,
+    });
   }
 
   _navigateToChange(
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js
index 7fa7abb..8c39882 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js
@@ -1038,7 +1038,8 @@
         sinon.stub(
             GerritNav
             , 'getUrlForChange')
-            .callsFake((c, pn, bpn) => `${c._number}-${pn}-${bpn}`);
+            .callsFake((c, ops) =>
+              `${c._number}-${ops.patchNum}-${ops.basePatchNum}`);
       });
 
       test('_formattedFiles', () => {
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts
index f0e727f..9890bb2 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts
@@ -238,6 +238,7 @@
   [paramName: string]: string | undefined | null | number;
   s: string;
   n?: number;
+  p?: string;
 }
 
 interface QuerySuggestedReviewersParams {