Convert gr-http-password to lit element

Change-Id: Id088b8d8a95aff1bf9c713e872bae8a6f3ec1fa3
diff --git a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.ts b/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.ts
index b018d33..d7e16db 100644
--- a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.ts
+++ b/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.ts
@@ -14,17 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import '../../../styles/gr-form-styles';
 import '../../shared/gr-button/gr-button';
-import {GrButton} from '../../shared/gr-button/gr-button';
 import '../../shared/gr-copy-clipboard/gr-copy-clipboard';
 import '../../shared/gr-overlay/gr-overlay';
-import '../../../styles/shared-styles';
-import {PolymerElement} from '@polymer/polymer/polymer-element';
-import {htmlTemplate} from './gr-http-password_html';
-import {property, customElement} from '@polymer/decorators';
 import {GrOverlay} from '../../shared/gr-overlay/gr-overlay';
 import {appContext} from '../../../services/app-context';
+import {formStyles} from '../../../styles/gr-form-styles';
+import {sharedStyles} from '../../../styles/shared-styles';
+import {GrLitElement} from '../../lit/gr-lit-element';
+import {css, customElement, html, property, query} from 'lit-element';
 
 declare global {
   interface HTMLElementTagNameMap {
@@ -32,18 +30,10 @@
   }
 }
 
-export interface GrHttpPassword {
-  $: {
-    generatedPasswordOverlay: GrOverlay;
-    generateButton: GrButton;
-  };
-}
-
 @customElement('gr-http-password')
-export class GrHttpPassword extends PolymerElement {
-  static get template() {
-    return htmlTemplate;
-  }
+export class GrHttpPassword extends GrLitElement {
+  @query('#generatedPasswordOverlay')
+  generatedPasswordOverlay?: GrOverlay;
 
   @property({type: String})
   _username?: string;
@@ -86,16 +76,100 @@
     return Promise.all(promises);
   }
 
+  static get styles() {
+    return [
+      sharedStyles,
+      formStyles,
+      css`
+        .password {
+          font-family: var(--monospace-font-family);
+          font-size: var(--font-size-mono);
+          line-height: var(--line-height-mono);
+        }
+        #generatedPasswordOverlay {
+          padding: var(--spacing-xxl);
+          width: 50em;
+        }
+        #generatedPasswordDisplay {
+          margin: var(--spacing-l) 0;
+        }
+        #generatedPasswordDisplay .title {
+          width: unset;
+        }
+        #generatedPasswordDisplay .value {
+          font-family: var(--monospace-font-family);
+          font-size: var(--font-size-mono);
+          line-height: var(--line-height-mono);
+        }
+        #passwordWarning {
+          font-style: italic;
+          text-align: center;
+        }
+        .closeButton {
+          bottom: 2em;
+          position: absolute;
+          right: 2em;
+        }
+      `,
+    ];
+  }
+
+  render() {
+    return html` <div class="gr-form-styles">
+        <div ?hidden=${this._passwordUrl}>
+          <section>
+            <span class="title">Username</span>
+            <span class="value">${this._username ?? ''}</span>
+          </section>
+          <gr-button id="generateButton" @click=${this._handleGenerateTap}
+            >Generate new password</gr-button
+          >
+        </div>
+        <span ?hidden=${!this._passwordUrl}>
+          <a href="${this._passwordUrl}" target="_blank" rel="noopener">
+            Obtain password</a
+          >
+          (opens in a new tab)
+        </span>
+      </div>
+      <gr-overlay
+        id="generatedPasswordOverlay"
+        @iron-overlay-closed=${this._generatedPasswordOverlayClosed}
+        with-backdrop=""
+      >
+        <div class="gr-form-styles">
+          <section id="generatedPasswordDisplay">
+            <span class="title">New Password:</span>
+            <span class="value">${this._generatedPassword}</span>
+            <gr-copy-clipboard
+              hasTooltip=""
+              buttonTitle="Copy password to clipboard"
+              hideInput=""
+              .text="${this._generatedPassword}"
+            >
+            </gr-copy-clipboard>
+          </section>
+          <section id="passwordWarning">
+            This password will not be displayed again.<br />
+            If you lose it, you will need to generate a new one.
+          </section>
+          <gr-button link="" class="closeButton" @click=${this._closeOverlay}
+            >Close</gr-button
+          >
+        </div>
+      </gr-overlay>`;
+  }
+
   _handleGenerateTap() {
     this._generatedPassword = 'Generating...';
-    this.$.generatedPasswordOverlay.open();
+    this.generatedPasswordOverlay?.open();
     this.restApiService.generateAccountHttpPassword().then(newPassword => {
       this._generatedPassword = newPassword;
     });
   }
 
   _closeOverlay() {
-    this.$.generatedPasswordOverlay.close();
+    this.generatedPasswordOverlay?.close();
   }
 
   _generatedPasswordOverlayClosed() {
diff --git a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password_html.ts b/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password_html.ts
deleted file mode 100644
index 811b85c..0000000
--- a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password_html.ts
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * @license
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import {html} from '@polymer/polymer/lib/utils/html-tag';
-
-export const htmlTemplate = html`
-  <style include="shared-styles">
-    .password {
-      font-family: var(--monospace-font-family);
-      font-size: var(--font-size-mono);
-      line-height: var(--line-height-mono);
-    }
-    #generatedPasswordOverlay {
-      padding: var(--spacing-xxl);
-      width: 50em;
-    }
-    #generatedPasswordDisplay {
-      margin: var(--spacing-l) 0;
-    }
-    #generatedPasswordDisplay .title {
-      width: unset;
-    }
-    #generatedPasswordDisplay .value {
-      font-family: var(--monospace-font-family);
-      font-size: var(--font-size-mono);
-      line-height: var(--line-height-mono);
-    }
-    #passwordWarning {
-      font-style: italic;
-      text-align: center;
-    }
-    .closeButton {
-      bottom: 2em;
-      position: absolute;
-      right: 2em;
-    }
-  </style>
-  <style include="gr-form-styles">
-    /* Workaround for empty style block - see https://github.com/Polymer/tools/issues/408 */
-  </style>
-  <div class="gr-form-styles">
-    <div hidden$="[[_passwordUrl]]">
-      <section>
-        <span class="title">Username</span>
-        <span class="value">[[_username]]</span>
-      </section>
-      <gr-button id="generateButton" on-click="_handleGenerateTap"
-        >Generate new password</gr-button
-      >
-    </div>
-    <span hidden$="[[!_passwordUrl]]">
-      <a href$="[[_passwordUrl]]" target="_blank" rel="noopener">
-        Obtain password</a
-      >
-      (opens in a new tab)
-    </span>
-  </div>
-  <gr-overlay
-    id="generatedPasswordOverlay"
-    on-iron-overlay-closed="_generatedPasswordOverlayClosed"
-    with-backdrop=""
-  >
-    <div class="gr-form-styles">
-      <section id="generatedPasswordDisplay">
-        <span class="title">New Password:</span>
-        <span class="value">[[_generatedPassword]]</span>
-        <gr-copy-clipboard
-          hasTooltip=""
-          buttonTitle="Copy password to clipboard"
-          hideInput=""
-          text="[[_generatedPassword]]"
-        >
-        </gr-copy-clipboard>
-      </section>
-      <section id="passwordWarning">
-        This password will not be displayed again.<br />
-        If you lose it, you will need to generate a new one.
-      </section>
-      <gr-button link="" class="closeButton" on-click="_closeOverlay"
-        >Close</gr-button
-      >
-    </div>
-  </gr-overlay>
-`;
diff --git a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password_test.ts b/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password_test.ts
index 16ea501..004f18f 100644
--- a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password_test.ts
+++ b/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password_test.ts
@@ -25,6 +25,8 @@
   createServerInfo,
 } from '../../../test/test-data-generators';
 import {AccountDetailInfo, ServerInfo} from '../../../types/common';
+import {queryAndAssert} from '../../../test/test-utils';
+import {GrButton} from '../../shared/gr-button/gr-button';
 
 const basicFixture = fixtureFromElement('gr-http-password');
 
@@ -47,7 +49,7 @@
   });
 
   test('generate password', () => {
-    const button = element.$.generateButton;
+    const button = queryAndAssert<GrButton>(element, '#generateButton');
     const nextPassword = 'the new password';
     let generateResolve: (value: string | PromiseLike<string>) => void;
     const generateStub = stubRestApi('generateAccountHttpPassword').callsFake(