From b0b8ab6c734cd52ad9497287e901a1b3399fe175 Mon Sep 17 00:00:00 2001 From: Umang Jain Date: Thu, 12 Dec 2019 15:02:53 +0530 Subject: [PATCH] js: Use StPasswordEntry for password entry fields Use the new StPasswordEntry for password entry fields and remove all direct handling of clutter text of the entry via clutter_text_set_password_char to show/hide the password text. StPasswordEntry will provides a peek-password-icon which will allow to show/hide the password present in the field to the user in subsequent commits. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/619 --- js/gdm/authPrompt.js | 36 +++++++++++++++++++++++--------- js/gdm/util.js | 4 ++-- js/ui/components/keyring.js | 22 ++++++++++--------- js/ui/components/networkAgent.js | 18 +++++++++------- js/ui/components/polkitAgent.js | 7 ++----- js/ui/shellMountOperation.js | 18 +++++++++------- 6 files changed, 63 insertions(+), 42 deletions(-) diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js index 6af342761..5068adaad 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -98,14 +98,24 @@ var AuthPrompt = GObject.registerClass({ }); this.add_child(this._label); - this._entry = new St.Entry({ + this._entry = null; + + this._textEntry = new St.Entry({ + style_class: 'login-dialog-prompt-entry', + can_focus: true, + x_expand: false, + y_expand: true, + }); + ShellEntry.addContextMenu(this._textEntry, { actionMode: Shell.ActionMode.NONE }); + this._passwordEntry = new St.PasswordEntry({ style_class: 'login-dialog-prompt-entry', can_focus: true, x_expand: false, y_expand: true, }); - ShellEntry.addContextMenu(this._entry, { isPassword: true, actionMode: Shell.ActionMode.NONE }); + ShellEntry.addContextMenu(this._passwordEntry, { actionMode: Shell.ActionMode.NONE }); + this._entry = this._passwordEntry; this.add_child(this._entry); this._entry.grab_key_focus(); @@ -195,7 +205,17 @@ var AuthPrompt = GObject.registerClass({ }); } - _onAskQuestion(verifier, serviceName, question, passwordChar) { + _updateEntry(secret) { + if (secret && (this._entry != this._passwordEntry)) { + this.replace_child(this._entry, this._passwordEntry); + this._entry = this._passwordEntry; + } else if (!secret && (this._entry != this._textEntry)) { + this.replace_child(this._entry, this._textEntry); + this._entry = this._textEntry; + } + } + + _onAskQuestion(verifier, serviceName, question, secret) { if (this._queryingService) this.clear(); @@ -205,10 +225,11 @@ var AuthPrompt = GObject.registerClass({ this._preemptiveAnswer = null; return; } - this.setPasswordChar(passwordChar); + + this._updateEntry(secret); this.setQuestion(question); - if (passwordChar) { + if (secret) { if (this._userVerifier.reauthenticating) this.nextButton.label = _("Unlock"); else @@ -358,11 +379,6 @@ var AuthPrompt = GObject.registerClass({ this.stopSpinning(); } - setPasswordChar(passwordChar) { - this._entry.clutter_text.set_password_char(passwordChar); - this._entry.menu.isPassword = passwordChar != ''; - } - setQuestion(question) { this._label.set_text(question); diff --git a/js/gdm/util.js b/js/gdm/util.js index 824b301b9..53b0079f6 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js @@ -485,7 +485,7 @@ var ShellUserVerifier = class { if (!this.serviceIsForeground(serviceName)) return; - this.emit('ask-question', serviceName, question, ''); + this.emit('ask-question', serviceName, question, false); } _onSecretInfoQuery(client, serviceName, secretQuestion) { @@ -498,7 +498,7 @@ var ShellUserVerifier = class { return; } - this.emit('ask-question', serviceName, secretQuestion, '\u25cf'); + this.emit('ask-question', serviceName, secretQuestion, true); } _onReset() { diff --git a/js/ui/components/keyring.js b/js/ui/components/keyring.js index 8d0eccaa6..3e049e466 100644 --- a/js/ui/components/keyring.js +++ b/js/ui/components/keyring.js @@ -70,11 +70,12 @@ class KeyringDialog extends ModalDialog.ModalDialog { y_align: Clutter.ActorAlign.CENTER }); label.set_text(_("Password:")); label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; - this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry', - text: '', - can_focus: true, - x_expand: true }); - this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE + this._passwordEntry = new St.PasswordEntry({ + style_class: 'prompt-dialog-password-entry', + text: '', + can_focus: true, + x_expand: true, + }); ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true }); this._passwordEntry.clutter_text.connect('activate', this._onPasswordActivate.bind(this)); @@ -102,11 +103,12 @@ class KeyringDialog extends ModalDialog.ModalDialog { x_align: Clutter.ActorAlign.START, y_align: Clutter.ActorAlign.CENTER }); label.set_text(_("Type again:")); - this._confirmEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry', - text: '', - can_focus: true, - x_expand: true }); - this._confirmEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE + this._confirmEntry = new St.PasswordEntry({ + style_class: 'prompt-dialog-password-entry', + text: '', + can_focus: true, + x_expand: true, + }); ShellEntry.addContextMenu(this._confirmEntry, { isPassword: true }); this._confirmEntry.clutter_text.connect('activate', this._onConfirmActivate.bind(this)); if (rtl) { diff --git a/js/ui/components/networkAgent.js b/js/ui/components/networkAgent.js index 251438683..7b30b4c55 100644 --- a/js/ui/components/networkAgent.js +++ b/js/ui/components/networkAgent.js @@ -54,10 +54,17 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog { let reactive = secret.key != null; - secret.entry = new St.Entry({ style_class: 'prompt-dialog-password-entry', - text: secret.value, can_focus: reactive, - reactive, - x_expand: true }); + let entryParams = { + style_class: 'prompt-dialog-password-entry', + text: secret.value, + can_focus: reactive, + reactive, + x_expand: true, + }; + if (secret.password) + secret.entry = new St.PasswordEntry(entryParams); + else + secret.entry = new St.Entry(entryParams); ShellEntry.addContextMenu(secret.entry, { isPassword: secret.password }); @@ -93,9 +100,6 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog { layout.attach(secret.entry, 1, pos, 1, 1); } pos++; - - if (secret.password) - secret.entry.clutter_text.set_password_char('\u25cf'); } contentBox.messageBox.add(secretTable); diff --git a/js/ui/components/polkitAgent.js b/js/ui/components/polkitAgent.js index 4af2df391..254676cab 100644 --- a/js/ui/components/polkitAgent.js +++ b/js/ui/components/polkitAgent.js @@ -90,7 +90,7 @@ var AuthenticationDialog = GObject.registerClass({ y_align: Clutter.ActorAlign.CENTER, }); this._passwordBox.add_child(this._passwordLabel); - this._passwordEntry = new St.Entry({ + this._passwordEntry = new St.PasswordEntry({ style_class: 'prompt-dialog-password-entry', text: "", can_focus: true, @@ -278,10 +278,7 @@ var AuthenticationDialog = GObject.registerClass({ else this._passwordLabel.set_text(request); - if (echoOn) - this._passwordEntry.clutter_text.set_password_char(''); - else - this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE + this._passwordEntry.password_visible = echoOn; this._passwordBox.show(); this._passwordEntry.set_text(''); diff --git a/js/ui/shellMountOperation.js b/js/ui/shellMountOperation.js index 68a6d3286..7157ad085 100644 --- a/js/ui/shellMountOperation.js +++ b/js/ui/shellMountOperation.js @@ -326,11 +326,12 @@ var ShellMountPasswordDialog = GObject.registerClass({ this._pimLabel = new St.Label({ style_class: 'prompt-dialog-password-label', text: _("PIM Number"), y_align: Clutter.ActorAlign.CENTER }); - this._pimEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry', - can_focus: true, - x_expand: true }); + this._pimEntry = new St.PasswordEntry({ + style_class: 'prompt-dialog-password-entry', + can_focus: true, + x_expand: true, + }); this._pimEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this)); - this._pimEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE ShellEntry.addContextMenu(this._pimEntry, { isPassword: true }); if (rtl) { @@ -355,11 +356,12 @@ var ShellMountPasswordDialog = GObject.registerClass({ this._passwordLabel = new St.Label({ style_class: 'prompt-dialog-password-label', text: _("Password"), y_align: Clutter.ActorAlign.CENTER }); - this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry', - can_focus: true, - x_expand: true }); + this._passwordEntry = new St.PasswordEntry({ + style_class: 'prompt-dialog-password-entry', + can_focus: true, + x_expand: true, + }); this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this)); - this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true }); this.setInitialKeyFocus(this._passwordEntry); this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, {