From d12dd1491f8a31c40de50b958c500208b4c2980d Mon Sep 17 00:00:00 2001 From: Rui Matos Date: Wed, 6 Jul 2011 20:43:49 +0100 Subject: [PATCH] runDialog: catch exceptions from Gio.app_info_launch_default_for_uri() An uncaught exception here would mean that the dialog wouldn't close. https://bugzilla.gnome.org/show_bug.cgi?id=653700 --- js/ui/runDialog.js | 55 ++++++++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/js/ui/runDialog.js b/js/ui/runDialog.js index 5152ecb7b..bd6fc25ae 100644 --- a/js/ui/runDialog.js +++ b/js/ui/runDialog.js @@ -333,33 +333,46 @@ __proto__: ModalDialog.ModalDialog.prototype, if (GLib.file_test(path, GLib.FileTest.EXISTS)) { let file = Gio.file_new_for_path(path); - Gio.app_info_launch_default_for_uri(file.get_uri(), - global.create_app_launch_context()); - } else { - this._commandError = true; - - this._errorMessage.set_text(e.message); - - if (!this._errorBox.visible) { - let [errorBoxMinHeight, errorBoxNaturalHeight] = this._errorBox.get_preferred_height(-1); - - let parentActor = this._errorBox.get_parent(); - Tweener.addTween(parentActor, - { height: parentActor.height + errorBoxNaturalHeight, - time: DIALOG_GROW_TIME, - transition: 'easeOutQuad', - onComplete: Lang.bind(this, - function() { - parentActor.set_height(-1); - this._errorBox.show(); - }) - }); + try { + Gio.app_info_launch_default_for_uri(file.get_uri(), + global.create_app_launch_context()); + } catch (e) { + // The exception from gjs contains an error string like: + // Error invoking Gio.app_info_launch_default_for_uri: No application + // is registered as handling this file + // We are only interested in the part after the first colon. + let message = e.message.replace(/[^:]*: *(.+)/, '$1'); + this._showError(message); } + } else { + this._showError(e.message); } } } }, + _showError : function(message) { + this._commandError = true; + + this._errorMessage.set_text(message); + + if (!this._errorBox.visible) { + let [errorBoxMinHeight, errorBoxNaturalHeight] = this._errorBox.get_preferred_height(-1); + + let parentActor = this._errorBox.get_parent(); + Tweener.addTween(parentActor, + { height: parentActor.height + errorBoxNaturalHeight, + time: DIALOG_GROW_TIME, + transition: 'easeOutQuad', + onComplete: Lang.bind(this, + function() { + parentActor.set_height(-1); + this._errorBox.show(); + }) + }); + } + }, + open: function() { this._history.lastItem(); this._errorBox.hide();