From 684b918915d5ffa1f9c19f3d4dedd9e61622201a 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 | 37 ++++++++++++++++++++++---------- js/gdm/loginDialog.js | 1 - js/gdm/util.js | 4 ++-- js/ui/components/keyring.js | 26 +++++++++++----------- js/ui/components/networkAgent.js | 21 ++++++++++-------- js/ui/components/polkitAgent.js | 9 +++----- js/ui/shellMountOperation.js | 22 ++++++++++--------- js/ui/unlockDialog.js | 1 - 8 files changed, 69 insertions(+), 52 deletions(-) diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js index 6af342761..cb39104e1 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -98,14 +98,23 @@ var AuthPrompt = GObject.registerClass({ }); this.add_child(this._label); - this._entry = new St.Entry({ + + let entryParams = { 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 }); + }; + this._entry = null; + + this._textEntry = new St.Entry(entryParams); + ShellEntry.addContextMenu(this._textEntry, { actionMode: Shell.ActionMode.NONE }); + + this._passwordEntry = new St.PasswordEntry(entryParams); + ShellEntry.addContextMenu(this._passwordEntry, { actionMode: Shell.ActionMode.NONE }); + + this._entry = this._passwordEntry; this.add_child(this._entry); this._entry.grab_key_focus(); @@ -195,7 +204,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 +224,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 +378,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/loginDialog.js b/js/gdm/loginDialog.js index e5383a3a6..2fd24eafd 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js @@ -896,7 +896,6 @@ var LoginDialog = GObject.registerClass({ } _askForUsernameAndBeginVerification() { - this._authPrompt.setPasswordChar(''); this._authPrompt.setQuestion(_("Username: ")); this._showRealmLoginHint(this._realmManager.loginFormat); 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..c01e09b82 100644 --- a/js/ui/components/keyring.js +++ b/js/ui/components/keyring.js @@ -70,12 +70,13 @@ 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 - ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true }); + this._passwordEntry = new St.PasswordEntry({ + style_class: 'prompt-dialog-password-entry', + text: '', + can_focus: true, + x_expand: true, + }); + ShellEntry.addContextMenu(this._passwordEntry); this._passwordEntry.clutter_text.connect('activate', this._onPasswordActivate.bind(this)); this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, { @@ -102,12 +103,13 @@ 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 - ShellEntry.addContextMenu(this._confirmEntry, { isPassword: true }); + this._confirmEntry = new St.PasswordEntry({ + style_class: 'prompt-dialog-password-entry', + text: '', + can_focus: true, + x_expand: true, + }); + ShellEntry.addContextMenu(this._confirmEntry); this._confirmEntry.clutter_text.connect('activate', this._onConfirmActivate.bind(this)); if (rtl) { layout.attach(this._confirmEntry, 0, row, 1, 1); diff --git a/js/ui/components/networkAgent.js b/js/ui/components/networkAgent.js index 251438683..ab7cc88da 100644 --- a/js/ui/components/networkAgent.js +++ b/js/ui/components/networkAgent.js @@ -54,12 +54,18 @@ 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 }); - ShellEntry.addContextMenu(secret.entry, - { isPassword: secret.password }); + 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); if (secret.validate) secret.valid = secret.validate(secret); @@ -93,9 +99,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..e57b2cdc7 100644 --- a/js/ui/components/polkitAgent.js +++ b/js/ui/components/polkitAgent.js @@ -90,13 +90,13 @@ 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, x_expand: true, }); - ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true }); + ShellEntry.addContextMenu(this._passwordEntry); this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this)); this._passwordEntry.bind_property('reactive', this._passwordEntry.clutter_text, 'editable', @@ -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..ca06873c3 100644 --- a/js/ui/shellMountOperation.js +++ b/js/ui/shellMountOperation.js @@ -326,12 +326,13 @@ 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 }); + ShellEntry.addContextMenu(this._pimEntry); if (rtl) { layout.attach(this._pimEntry, 0, 0, 1, 1); @@ -355,12 +356,13 @@ 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 }); + ShellEntry.addContextMenu(this._passwordEntry); this.setInitialKeyFocus(this._passwordEntry); this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, { animate: true, diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js index 6584bea45..b0f5fcf64 100644 --- a/js/ui/unlockDialog.js +++ b/js/ui/unlockDialog.js @@ -41,7 +41,6 @@ var UnlockDialog = GObject.registerClass({ this._authPrompt.connect('failed', this._fail.bind(this)); this._authPrompt.connect('cancelled', this._fail.bind(this)); this._authPrompt.connect('reset', this._onReset.bind(this)); - this._authPrompt.setPasswordChar('\u25cf'); this._authPrompt.nextButton.label = _("Unlock"); this._promptBox.add_child(this._authPrompt);