[gnome-shell] networkAgent: Make searching VPN binaries asynchronous



commit b97fc02e57da616424952e9c3cbef25525524c5d
Author: Florian Müllner <fmuellner gnome org>
Date:   Sat Mar 14 22:01:00 2020 +0100

    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 c0f00f5a2a..05d52ee868 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(
@@ -758,11 +760,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)');
 
@@ -778,11 +780,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)) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]