Redirect user to previously visited page after login

When a user logs in from any page, it expectes to be back on the same
page after the successful login. Gerrit's `/login` endpoint already
supports redirecting to the previously visited page, but that
information was not forwarded from the frontend.

To update the `href` in the login URL, we need to subscribe for
`nav-report` events. But as the event is emitted, before
`window.location` is updated, we also need to delay reading of the
current browser URL, until all other events are processed. This way, by
using `setTimeout`, we can reliably update the login link `href`.

But: Issue 325838103
Change-Id: Icc6498b48fac011a2bc2e92700ff216d781eb993
diff --git a/github-plugin/src/main/ts/gr-github-oauth-progress.ts b/github-plugin/src/main/ts/gr-github-oauth-progress.ts
index 3b53d47..8ed9e07 100644
--- a/github-plugin/src/main/ts/gr-github-oauth-progress.ts
+++ b/github-plugin/src/main/ts/gr-github-oauth-progress.ts
@@ -14,6 +14,8 @@
 
     @state() loggedIn?: boolean
 
+    @state() currentNavigationPath?: string;
+
     override connectedCallback() {
         super.connectedCallback();
         const restApi = this.plugin.restApi();
@@ -21,6 +23,13 @@
             restApi.getConfig().then(config => this.authInfo = config?.auth);
         }
         restApi.getLoggedIn().then(loggedIn => this.loggedIn = loggedIn);
+        document.addEventListener(
+          'nav-report',
+          // the `nav-report` event is emitted before `window.location` is updated, in order
+          // to get the current location, we need to delay `this.updateLocationPath` execution
+          // by putting it on the end of processing queue
+          () => setTimeout(() => this.updateLocationPath(), 0));
+        this.updateLocationPath();
     }
 
     static override get styles() {
@@ -52,9 +61,13 @@
         if (!this.authInfo || this.loggedIn !== false) {
             return
         }
+        const loginWithRedirect = new URL(this.authInfo.login_url ?? "/", window.location.origin);
+        if (this.currentNavigationPath) {
+          loginWithRedirect.pathname = loginWithRedirect.pathname + this.currentNavigationPath;
+        }
 
         return html`
-            <a class="loginButton" href=${this.authInfo.login_url} @click=${this.showModal}>
+            <a class="loginButton" href="${loginWithRedirect}" @click=${this.showModal}>
                 ${this.authInfo.login_text}
             </a>
             <dialog id="gitHubOAuthProgress">
@@ -66,6 +79,10 @@
         `
     }
 
+    private updateLocationPath() {
+        this.currentNavigationPath = window.location.pathname;
+    }
+
     private showModal() {
         setTimeout(() => this.gitHubOAuthProgress?.showModal(), 550);
     }