notificationDaemon: Catch exceptions while loading notifications
An Endless OS system was found in the wild with a malformed .local/share/gnome-shell/notifications which causes _loadNotifications() to raise an exception. This exception was not previously handled and bubbles all the way out to gnome_shell_plugin_start(), whereupon the shell exit(1)s. The user could no longer log into their computer. Handle exceptions from _loadNotifications(), log them, and attempt to continue. Ensure that this._isLoading is set to 'false' even on error, so that future calls to _saveNotifications() can overwrite the (corrupt) state file. https://gitlab.gnome.org/GNOME/gnome-shell/issues/1552
This commit is contained in:
parent
a207f67f73
commit
e5cde4700f
@ -750,29 +750,33 @@ var GtkNotificationDaemon = class GtkNotificationDaemon {
|
|||||||
_loadNotifications() {
|
_loadNotifications() {
|
||||||
this._isLoading = true;
|
this._isLoading = true;
|
||||||
|
|
||||||
let value = global.get_persistent_state('a(sa(sv))', 'notifications');
|
try {
|
||||||
if (value) {
|
let value = global.get_persistent_state('a(sa(sv))', 'notifications');
|
||||||
let sources = value.deep_unpack();
|
if (value) {
|
||||||
sources.forEach(([appId, notifications]) => {
|
let sources = value.deep_unpack();
|
||||||
if (notifications.length == 0)
|
sources.forEach(([appId, notifications]) => {
|
||||||
return;
|
if (notifications.length == 0)
|
||||||
|
|
||||||
let source;
|
|
||||||
try {
|
|
||||||
source = this._ensureAppSource(appId);
|
|
||||||
} catch (e) {
|
|
||||||
if (e instanceof InvalidAppError)
|
|
||||||
return;
|
return;
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
|
|
||||||
notifications.forEach(([notificationId, notification]) => {
|
let source;
|
||||||
source.addNotification(notificationId, notification.deep_unpack(), false);
|
try {
|
||||||
|
source = this._ensureAppSource(appId);
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof InvalidAppError)
|
||||||
|
return;
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
notifications.forEach(([notificationId, notification]) => {
|
||||||
|
source.addNotification(notificationId, notification.deep_unpack(), false);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
|
} catch (e) {
|
||||||
|
logError(e, 'Failed to load saved notifications');
|
||||||
|
} finally {
|
||||||
|
this._isLoading = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._isLoading = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_saveNotifications() {
|
_saveNotifications() {
|
||||||
|
Loading…
Reference in New Issue
Block a user