diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js index 1880e36..996b363 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -263,10 +263,8 @@ const AuthPrompt = new Lang.Class({ }, _onReset: function() { - if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED) { - this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; - this.reset(); - } + this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; + this.reset(); }, addActorToDefaultButtonWell: function(actor) { diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js index eb94554..fb3cf70 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js @@ -907,6 +907,10 @@ const LoginDialog = new Lang.Class({ Main.ctrlAltTabManager.removeGroup(this.dialogLayout); }, + cancel: function() { + this._authPrompt.cancel(); + }, + addCharacter: function(unichar) { this._authPrompt.addCharacter(unichar); }, diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js index a929451..dde7b82 100644 --- a/js/ui/extensionSystem.js +++ b/js/ui/extensionSystem.js @@ -76,7 +76,11 @@ function disableExtension(uuid) { theme.unload_stylesheet(extension.stylesheet.get_path()); } - extension.stateObj.disable(); + try { + extension.stateObj.disable(); + } catch(e) { + logExtensionError(uuid, e); + } for (let i = 0; i < order.length; i++) { let uuid = order[i]; @@ -89,8 +93,10 @@ function disableExtension(uuid) { extensionOrder.splice(orderIdx, 1); - extension.state = ExtensionState.DISABLED; - _signals.emit('extension-state-changed', extension); + if ( extension.state != ExtensionState.ERROR ) { + extension.state = ExtensionState.DISABLED; + _signals.emit('extension-state-changed', extension); + } } function enableExtension(uuid) { @@ -117,10 +123,15 @@ function enableExtension(uuid) { } } - extension.stateObj.enable(); - - extension.state = ExtensionState.ENABLED; - _signals.emit('extension-state-changed', extension); + try { + extension.stateObj.enable(); + extension.state = ExtensionState.ENABLED; + _signals.emit('extension-state-changed', extension); + return; + } catch(e) { + logExtensionError(uuid, e); + return; + } } function logExtensionError(uuid, error) { @@ -150,7 +161,8 @@ function loadExtension(extension) { } else { let enabled = enabledExtensions.indexOf(extension.uuid) != -1; if (enabled) { - initExtension(extension.uuid); + if (!initExtension(extension.uuid)) + return; if (extension.state == ExtensionState.DISABLED) enableExtension(extension.uuid); } else { @@ -205,7 +217,12 @@ function initExtension(uuid) { extensionModule = extension.imports.extension; if (extensionModule.init) { - extensionState = extensionModule.init(extension); + try { + extensionState = extensionModule.init(extension); + } catch(e) { + logExtensionError(uuid, e); + return false; + } } if (!extensionState) @@ -214,6 +231,7 @@ function initExtension(uuid) { extension.state = ExtensionState.DISABLED; _signals.emit('extension-loaded', uuid); + return true; } function getEnabledExtensions() { @@ -235,11 +253,7 @@ function onEnabledExtensionsChanged() { newEnabledExtensions.filter(function(uuid) { return enabledExtensions.indexOf(uuid) == -1; }).forEach(function(uuid) { - try { enableExtension(uuid); - } catch(e) { - logExtensionError(uuid, e); - } }); // Find and disable all the newly disabled extensions: UUIDs found in the @@ -247,11 +261,7 @@ function onEnabledExtensionsChanged() { enabledExtensions.filter(function(item) { return newEnabledExtensions.indexOf(item) == -1; }).forEach(function(uuid) { - try { disableExtension(uuid); - } catch(e) { - logExtensionError(uuid, e); - } }); enabledExtensions = newEnabledExtensions; @@ -263,11 +273,7 @@ function _loadExtensions() { let finder = new ExtensionUtils.ExtensionFinder(); finder.connect('extension-found', function(signals, extension) { - try { - loadExtension(extension); - } catch(e) { - logExtensionError(extension.uuid, e); - } + loadExtension(extension); }); finder.scanExtensions(); } diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js index c66c9f6..d290a3d 100644 --- a/js/ui/messageTray.js +++ b/js/ui/messageTray.js @@ -2392,6 +2392,13 @@ const MessageTray = new Lang.Class({ // _updateState() figures out what (if anything) needs to be done // at the present time. _updateState: function() { + // If our state changes caused _updateState to be called, + // just exit now to prevent reentrancy issues. + if (this._updatingState) + return; + + this._updatingState = true; + // Filter out acknowledged notifications. this._notificationQueue = this._notificationQueue.filter(function(n) { return !n.acknowledged; @@ -2474,6 +2481,8 @@ const MessageTray = new Lang.Class({ } else if (desktopCloneIsVisible && !desktopCloneShouldBeVisible) { this._hideDesktopClone(); } + + this._updatingState = false; }, _tween: function(actor, statevar, value, params) { @@ -2838,13 +2847,13 @@ const MessageTray = new Lang.Class({ Lang.bind(this, this._onSourceDoneDisplayingContent)); this._summaryBoxPointer.bin.child = child; - this._grabHelper.grab({ actor: this._summaryBoxPointer.bin.child, - onUngrab: Lang.bind(this, this._onSummaryBoxPointerUngrabbed) }); - this._summaryBoxPointer.actor.opacity = 0; this._summaryBoxPointer.actor.show(); this._adjustSummaryBoxPointerPosition(); + this._grabHelper.grab({ actor: this._summaryBoxPointer.bin.child, + onUngrab: Lang.bind(this, this._onSummaryBoxPointerUngrabbed) }); + this._summaryBoxPointerState = State.SHOWING; this._summaryBoxPointer.show(BoxPointer.PopupAnimation.FULL, Lang.bind(this, function() { this._summaryBoxPointerState = State.SHOWN;