/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import { html, classMap } from "chrome://global/content/vendor/lit.all.mjs"; import { MozLitElement } from "chrome://global/content/lit-utils.mjs"; import { editableFieldTemplate, stylesTemplate } from "./input-field.mjs"; class LoginPasswordField extends MozLitElement { static CONCEALED_PASSWORD_TEXT = " ".repeat(8); static properties = { _value: { type: String, state: true }, readonly: { type: Boolean, reflect: true }, visible: { type: Boolean, reflect: true }, }; static queries = { input: "input", button: "button", }; set value(newValue) { this._value = newValue; } get #type() { return this.visible ? "text" : "password"; } get #password() { return this.readonly && !this.visible ? LoginPasswordField.CONCEALED_PASSWORD_TEXT : this._value; } render() { return html` ${stylesTemplate()} ${editableFieldTemplate({ type: this.#type, value: this.#password, labelId: "login-item-password-label", disabled: this.readonly, onFocus: this.handleFocus, onBlur: this.handleBlur, })} `; } handleFocus(ev) { if (ev.relatedTarget !== this.button) { this.visible = true; } } handleBlur(ev) { if (ev.relatedTarget !== this.button) { this.visible = false; } } toggleVisibility() { this.visible = !this.visible; if (this.visible) { this.onPasswordVisible?.(); } this.input.focus(); } } customElements.define("login-password-field", LoginPasswordField);