From dd97a2589b8b686f273550f3e9e6ce370b25c10d Mon Sep 17 00:00:00 2001 From: Alessandro Bono Date: Mon, 8 Aug 2022 12:19:51 +0200 Subject: [PATCH] gdmUtil: Refactor on no-more-messages case There are few places where we want to perform an action when no more messages are present. Create a function that covers this use case and use it. Part-of: --- js/gdm/util.js | 63 +++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/js/gdm/util.js b/js/gdm/util.js index 55d7c67c1..006841f45 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js @@ -273,16 +273,13 @@ var ShellUserVerifier = class extends Signals.EventEmitter { this._userVerifierChoiceList.call_select_choice(serviceName, key, this._cancellable, null); } - answerQuery(serviceName, answer) { - if (!this.hasPendingMessages) { + async answerQuery(serviceName, answer) { + try { + await this._handlePendingMessages(); this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null); - } else { - const cancellable = this._cancellable; - let signalId = this.connect('no-more-messages', () => { - this.disconnect(signalId); - if (!cancellable.is_cancelled()) - this._userVerifier.call_answer_query(serviceName, answer, cancellable, null); - }); + } catch (e) { + if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) + logError(e); } } @@ -702,7 +699,7 @@ var ShellUserVerifier = class extends Signals.EventEmitter { (this._reauthOnly || this._failCounter < this.allowedFailures); } - _verificationFailed(serviceName, shouldRetry) { + async _verificationFailed(serviceName, shouldRetry) { if (serviceName === FINGERPRINT_SERVICE_NAME) { if (this._fingerprintFailedId) GLib.source_remove(this._fingerprintFailedId); @@ -716,34 +713,36 @@ var ShellUserVerifier = class extends Signals.EventEmitter { const doneTrying = !shouldRetry || !this._canRetry(); - if (doneTrying) { - this._disconnectSignals(); - - // eslint-disable-next-line no-lonely-if - if (!this.hasPendingMessages) { - this._cancelAndReset(); - } else { - const cancellable = this._cancellable; - let signalId = this.connect('no-more-messages', () => { - this.disconnect(signalId); - if (!cancellable.is_cancelled()) - this._cancelAndReset(); - }); - } - } - this.emit('verification-failed', serviceName, !doneTrying); + try { + if (doneTrying) { + this._disconnectSignals(); + await this._handlePendingMessages(); + this._cancelAndReset(); + } - if (!this.hasPendingMessages) { + await this._handlePendingMessages(); this._retry(serviceName); - } else { - const cancellable = this._cancellable; + } catch (e) { + if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) + logError(e); + } + } + + _handlePendingMessages() { + if (!this.hasPendingMessage) + return Promise.resolve(); + + const cancellable = this._cancellable; + return new Promise((resolve, reject) => { let signalId = this.connect('no-more-messages', () => { this.disconnect(signalId); - if (!cancellable.is_cancelled()) - this._retry(serviceName); + if (cancellable.is_cancelled()) + reject(new GLib.Error(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED, 'Operation was cancelled')); + else + resolve(); }); - } + }); } _onServiceUnavailable(_client, serviceName, errorMessage) {