From 0a50b6ea0178c6a92d8fe3dc19d689b47d55898a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sat, 14 Mar 2020 22:01:00 +0100 Subject: [PATCH] networkAgent: Make searching VPN binaries asynchronous Doing blocking IO in a graphical UI is bad, doing it in the compositor is much much worse. So even if handling VPN requests is a relatively rare event, doing it asynchronously is better. https://gitlab.gnome.org/GNOME/gnome-shell/issues/2386 --- js/ui/components/networkAgent.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/js/ui/components/networkAgent.js b/js/ui/components/networkAgent.js index e1d688343..7af6214f3 100644 --- a/js/ui/components/networkAgent.js +++ b/js/ui/components/networkAgent.js @@ -4,13 +4,15 @@ const { Clutter, Gio, GLib, GObject, NM, Pango, Shell, St } = imports.gi; const Signals = imports.signals; -const Config = imports.misc.config; const Dialog = imports.ui.dialog; const Main = imports.ui.main; const MessageTray = imports.ui.messageTray; const ModalDialog = imports.ui.modalDialog; const ShellEntry = imports.ui.shellEntry; +Gio._promisify(Shell.NetworkAgent.prototype, + 'search_vpn_plugin', 'search_vpn_plugin_finish'); + const VPN_UI_GROUP = 'VPN Plugin UI'; var NetworkSecretDialog = GObject.registerClass( @@ -761,11 +763,11 @@ var NetworkAgent = class { } } - _vpnRequest(requestId, connection, hints, flags) { + async _vpnRequest(requestId, connection, hints, flags) { let vpnSetting = connection.get_setting_vpn(); let serviceType = vpnSetting.service_type; - let binary = this._findAuthBinary(serviceType); + let binary = await this._findAuthBinary(serviceType); if (!binary) { log('Invalid VPN service type (cannot find authentication binary)'); @@ -781,11 +783,15 @@ var NetworkAgent = class { this._vpnRequests[requestId] = vpnRequest; } - _findAuthBinary(serviceType) { - const plugin = NM.VpnPluginInfo.new_search_file(null, serviceType); + async _findAuthBinary(serviceType) { + let plugin; - if (plugin === null) + try { + plugin = await this._native.search_vpn_plugin(serviceType); + } catch (e) { + logError(e); return null; + } const fileName = plugin.get_auth_dialog(); if (!GLib.file_test(fileName, GLib.FileTest.IS_EXECUTABLE)) {