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:
parent
f7c739ae4e
commit
070e712508
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user