extensionSystem: Add debug logging

Now that we can use console.debug() to log messages that aren't
shown by default, we can be a lot more verbose without spamming
the system log.

Use that to all extension state changes, which can be useful for
debugging.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3058>
This commit is contained in:
Florian Müllner 2023-12-15 18:05:43 +01:00 committed by Marge Bot
parent f7c739ae4e
commit 070e712508

View File

@ -21,6 +21,10 @@ const EXTENSION_DISABLE_VERSION_CHECK_KEY = 'disable-extension-version-validatio
const UPDATE_CHECK_TIMEOUT = 24 * 60 * 60; // 1 day in seconds const UPDATE_CHECK_TIMEOUT = 24 * 60 * 60; // 1 day in seconds
function stateToString(state) {
return Object.keys(ExtensionState).find(k => ExtensionState[k] === state);
}
export class ExtensionManager extends Signals.EventEmitter { export class ExtensionManager extends Signals.EventEmitter {
constructor() { constructor() {
super(); super();
@ -150,6 +154,14 @@ export class ExtensionManager extends Signals.EventEmitter {
delete extension.stylesheet; delete extension.stylesheet;
} }
_changeExtensionState(extension, newState) {
const strState = stateToString(newState);
console.debug(`Changing state of extension ${extension.uuid} to ${strState}`);
extension.state = newState;
this.emit('extension-state-changed', extension);
}
_extensionSupportsSessionMode(uuid) { _extensionSupportsSessionMode(uuid) {
const extension = this.lookup(uuid); const extension = this.lookup(uuid);
@ -173,8 +185,7 @@ export class ExtensionManager extends Signals.EventEmitter {
if (extension.state !== ExtensionState.ENABLED) if (extension.state !== ExtensionState.ENABLED)
return; return;
extension.state = ExtensionState.DISABLING; this._changeExtensionState(extension, ExtensionState.DISABLING);
this.emit('extension-state-changed', extension);
// "Rebase" the extension order by disabling and then enabling extensions // "Rebase" the extension order by disabling and then enabling extensions
// in order to help prevent conflicts. // in order to help prevent conflicts.
@ -191,6 +202,7 @@ export class ExtensionManager extends Signals.EventEmitter {
for (let i = 0; i < orderReversed.length; i++) { for (let i = 0; i < orderReversed.length; i++) {
let otherUuid = orderReversed[i]; let otherUuid = orderReversed[i];
try { try {
console.debug(`Temporarily disable extension ${otherUuid}`);
this.lookup(otherUuid).stateObj.disable(); this.lookup(otherUuid).stateObj.disable();
} catch (e) { } catch (e) {
this.logExtensionError(otherUuid, e); this.logExtensionError(otherUuid, e);
@ -208,6 +220,7 @@ export class ExtensionManager extends Signals.EventEmitter {
for (let i = 0; i < order.length; i++) { for (let i = 0; i < order.length; i++) {
let otherUuid = order[i]; let otherUuid = order[i];
try { try {
console.debug(`Re-enable extension ${otherUuid}`);
// eslint-disable-next-line no-await-in-loop // eslint-disable-next-line no-await-in-loop
await this.lookup(otherUuid).stateObj.enable(); await this.lookup(otherUuid).stateObj.enable();
} catch (e) { } catch (e) {
@ -217,10 +230,8 @@ export class ExtensionManager extends Signals.EventEmitter {
this._extensionOrder.splice(orderIdx, 1); this._extensionOrder.splice(orderIdx, 1);
if (extension.state !== ExtensionState.ERROR) { if (extension.state !== ExtensionState.ERROR)
extension.state = ExtensionState.DISABLED; this._changeExtensionState(extension, ExtensionState.DISABLED);
this.emit('extension-state-changed', extension);
}
} }
async _callExtensionEnable(uuid) { async _callExtensionEnable(uuid) {
@ -238,8 +249,7 @@ export class ExtensionManager extends Signals.EventEmitter {
if (extension.state !== ExtensionState.DISABLED) if (extension.state !== ExtensionState.DISABLED)
return; return;
extension.state = ExtensionState.ENABLING; this._changeExtensionState(extension, ExtensionState.ENABLING);
this.emit('extension-state-changed', extension);
try { try {
this._loadExtensionStylesheet(extension); this._loadExtensionStylesheet(extension);
@ -250,9 +260,8 @@ export class ExtensionManager extends Signals.EventEmitter {
try { try {
await extension.stateObj.enable(); await extension.stateObj.enable();
extension.state = ExtensionState.ENABLED; this._changeExtensionState(extension, ExtensionState.ENABLED);
this._extensionOrder.push(uuid); this._extensionOrder.push(uuid);
this.emit('extension-state-changed', extension);
} catch (e) { } catch (e) {
this._unloadExtensionStylesheet(extension); this._unloadExtensionStylesheet(extension);
this.logExtensionError(uuid, e); this.logExtensionError(uuid, e);
@ -353,6 +362,7 @@ export class ExtensionManager extends Signals.EventEmitter {
const message = error instanceof Error const message = error instanceof Error
? error.message : error.toString(); ? error.message : error.toString();
console.debug(`Changing state of extension ${uuid} to ERROR`);
extension.error = message; extension.error = message;
extension.state = ExtensionState.ERROR; extension.state = ExtensionState.ERROR;
if (!extension.errors) if (!extension.errors)
@ -442,30 +452,33 @@ export class ExtensionManager extends Signals.EventEmitter {
} }
async loadExtension(extension) { async loadExtension(extension) {
const {uuid} = extension;
console.debug(`Loading extension ${uuid}`);
// Default to error, we set success as the last step // Default to error, we set success as the last step
extension.state = ExtensionState.ERROR; extension.state = ExtensionState.ERROR;
if (this._checkVersion && this._isOutOfDate(extension)) { if (this._checkVersion && this._isOutOfDate(extension)) {
extension.state = ExtensionState.OUT_OF_DATE; extension.state = ExtensionState.OUT_OF_DATE;
} else if (!this._canLoad(extension)) { } else if (!this._canLoad(extension)) {
this.logExtensionError(extension.uuid, new Error( this.logExtensionError(uuid, new Error(
'A different version was loaded previously. You need to log out for changes to take effect.')); 'A different version was loaded previously. You need to log out for changes to take effect.'));
} else { } else {
let enabled = this._enabledExtensions.includes(extension.uuid) && const enabled = this._enabledExtensions.includes(uuid) &&
this._extensionSupportsSessionMode(extension.uuid); this._extensionSupportsSessionMode(uuid);
if (enabled) { if (enabled) {
if (!await this._callExtensionInit(extension.uuid)) if (!await this._callExtensionInit(uuid))
return; return;
if (extension.state === ExtensionState.DISABLED) if (extension.state === ExtensionState.DISABLED)
await this._callExtensionEnable(extension.uuid); await this._callExtensionEnable(uuid);
} else { } else {
extension.state = ExtensionState.INITIALIZED; extension.state = ExtensionState.INITIALIZED;
} }
this._unloadedExtensions.delete(extension.uuid); this._unloadedExtensions.delete(uuid);
} }
console.debug(`Extension ${uuid} in state ${stateToString(extension.state)} after loading`);
this._updateCanChange(extension); this._updateCanChange(extension);
this.emit('extension-state-changed', extension); this.emit('extension-state-changed', extension);
} }
@ -478,8 +491,7 @@ export class ExtensionManager extends Signals.EventEmitter {
// broke too much. // broke too much.
await this._callExtensionDisable(uuid); await this._callExtensionDisable(uuid);
extension.state = ExtensionState.UNINSTALLED; this._changeExtensionState(extension, ExtensionState.UNINSTALLED);
this.emit('extension-state-changed', extension);
// The extension is now cached and it's impossible to load a different version // The extension is now cached and it's impossible to load a different version
if (type === ExtensionType.PER_USER && extension.isImported) if (type === ExtensionType.PER_USER && extension.isImported)
@ -548,8 +560,7 @@ export class ExtensionManager extends Signals.EventEmitter {
} }
extension.stateObj = extensionState; extension.stateObj = extensionState;
extension.state = ExtensionState.DISABLED; this._changeExtensionState(extension, ExtensionState.DISABLED);
this.emit('extension-loaded', uuid);
return true; return true;
} }