Merge branch 'main' into avm99963-monorail

Merged commit 4137ed7879acadbf891e8c471108acb874dae886.

GitOrigin-RevId: b6100ffc5b1da355a35f37b13fcaaf746ee8b307
diff --git a/static_src/elements/framework/links/mr-user-link/mr-user-link.js b/static_src/elements/framework/links/mr-user-link/mr-user-link.js
index c009f89..8e5be27 100644
--- a/static_src/elements/framework/links/mr-user-link/mr-user-link.js
+++ b/static_src/elements/framework/links/mr-user-link/mr-user-link.js
@@ -91,7 +91,7 @@
             rel="stylesheet">
       <i
         id="availability-icon"
-        class="material-icons inline-icon ${user.last_visit_timestamp ? "" : "inline-icon-unseen"}"
+        class=${"material-icons inline-icon ${user.last_visit_timestamp ? '': 'inline-icon-unseen'}"}
         title="${availability}"
         ?hidden="${!(this.showAvailabilityIcon && availability)}"
       >schedule</i>
diff --git a/static_src/elements/framework/links/mr-user-link/mr-user-link.test.js b/static_src/elements/framework/links/mr-user-link/mr-user-link.test.js
index 77af246..ec84074 100644
--- a/static_src/elements/framework/links/mr-user-link/mr-user-link.test.js
+++ b/static_src/elements/framework/links/mr-user-link/mr-user-link.test.js
@@ -139,7 +139,7 @@
     await element.updateComplete;
     getElements();
 
-    assert.isTrue(availabilityIcon.classList.contains("inline-icon-unseen"));
+    assert.isFalse(availabilityIcon.classList.contains("inline-icon-unseen"));
   });
 
   it('show availability user visited', async () => {
diff --git a/static_src/elements/framework/mr-header/mr-header.js b/static_src/elements/framework/mr-header/mr-header.js
index be6afad..5b9defa 100644
--- a/static_src/elements/framework/mr-header/mr-header.js
+++ b/static_src/elements/framework/mr-header/mr-header.js
@@ -341,12 +341,7 @@
       return `/p/${this.projectName}/issues/entry`;
     }
 
-    const token = prpcClient.token;
-
-    const customUrl = this.presentationConfig.customIssueEntryUrl;
-
-    return `${customUrl}?token=${token}&role=${
-      role}&continue=${this._wizardPostUrl}`;
+    return `/p/${this.projectName}/issues/wizard`;
   }
 
   /**
diff --git a/static_src/elements/framework/mr-header/mr-header.test.js b/static_src/elements/framework/mr-header/mr-header.test.js
index 277347f..e290584 100644
--- a/static_src/elements/framework/mr-header/mr-header.test.js
+++ b/static_src/elements/framework/mr-header/mr-header.test.js
@@ -84,9 +84,7 @@
       element.presentationConfig = {customIssueEntryUrl: 'https://issue.wizard'};
       element.userProjects = {ownerOf: ['not-proj']};
       element.userDisplayName = 'test@example.com';
-      assert.equal(element.issueEntryUrl,
-          'https://issue.wizard?token=token1&role=&' +
-          'continue=http://localhost/p/proj/issues/entry.do');
+      assert.equal(element.issueEntryUrl, '/p/proj/issues/wizard');
     });
 
     it('uses default issue filing URL when user is not logged in', () => {
diff --git a/static_src/elements/issue-detail/dialogs/mr-edit-description/mr-edit-description.js b/static_src/elements/issue-detail/dialogs/mr-edit-description/mr-edit-description.js
index 2a34b8f..0bee4d8 100644
--- a/static_src/elements/issue-detail/dialogs/mr-edit-description/mr-edit-description.js
+++ b/static_src/elements/issue-detail/dialogs/mr-edit-description/mr-edit-description.js
@@ -80,6 +80,7 @@
           id="description"
           class="content"
           @keyup=${this._setEditedDescription}
+          @beforeinput=${this._setEditedDescription}
           @change=${this._setEditedDescription}
           .value=${this._editedDescription}
         ></textarea>
diff --git a/static_src/elements/mr-app/mr-app.js b/static_src/elements/mr-app/mr-app.js
index c91511f..8fe3dad 100644
--- a/static_src/elements/mr-app/mr-app.js
+++ b/static_src/elements/mr-app/mr-app.js
@@ -30,6 +30,7 @@
 import {SHARED_STYLES} from 'shared/shared-styles.js';
 
 const QUERY_PARAMS_THAT_RESET_SCROLL = ['q', 'mode', 'id'];
+const GOOGLE_EMAIL_SUFFIX = '@google.com';
 
 /**
  * `<mr-app>`
@@ -256,6 +257,8 @@
   connectedCallback() {
     super.connectedCallback();
 
+    this._logGooglerUsage();
+
     // TODO(zhangtiff): Figure out some way to save Redux state between
     // page loads.
 
@@ -311,6 +314,21 @@
   }
 
   /**
+   * Helper to log how often Googlers access Monorail.
+   */
+  _logGooglerUsage() {
+    const email = this.userDisplayName;
+    if (!email) return;
+    if (!email.endsWith(GOOGLE_EMAIL_SUFFIX)) return;
+
+    const username = email.replace(GOOGLE_EMAIL_SUFFIX, '');
+
+    // Context: b/229758140
+    window.fetch(`https://buganizer.corp.google.com/action/yes?monorail=yes&username=${username}`,
+      {mode: 'no-cors'});
+  }
+
+  /**
    * Handler that runs on every single route change, before the new page has
    * loaded. This function should not use store.dispatch() or assign properties
    * on this because running these actions causes extra re-renders to happen.
@@ -513,7 +531,7 @@
 
     const mount = document.getElementById('reactMount');
 
-    renderWizard(mount);
+    renderWizard(mount, this.loginUrl, this.userDisplayName);
   }
 
   /**