fix(TriggerIcon): 添加扩展上下文检查避免无效操作

在恢复和保存位置前检查扩展上下文是否有效
添加处理扩展上下文失效错误的逻辑
这个提交包含在:
Zain 2025-11-25 18:34:16 +08:00
父节点 2e5f50251d
当前提交 e0bf4e5f35
共有 2 个文件被更改,包括 47 次插入 和 2 次删除

查看文件

@ -72,7 +72,6 @@
"floating-panel.css",
"useTheme.js",
"useTheme.css",
"QueryPreview.js",
"search-engine-selectors.js"
],
"matches": [
@ -88,4 +87,4 @@
},
"minimum_chrome_version": "91"
}
}

查看文件

@ -85,6 +85,12 @@ export class TriggerIcon {
*/
private async restorePosition(): Promise<void> {
try {
if (!this.isExtensionContextValid()) {
console.warn('[SSP] Skip restoring position: extension context unavailable');
this.setDefaultPosition();
return;
}
const result = await chrome.storage.local.get('trigger_button_position');
const saved = result.trigger_button_position as TriggerButtonPosition | undefined;
@ -101,6 +107,11 @@ export class TriggerIcon {
this.setDefaultPosition();
}
} catch (error) {
if (this.isContextInvalidationError(error)) {
console.warn('[SSP] Skip restoring position: extension context invalidated');
return;
}
console.error('[SSP] Failed to restore position:', error);
this.setDefaultPosition();
}
@ -253,9 +264,19 @@ export class TriggerIcon {
};
try {
if (!this.isExtensionContextValid()) {
console.warn('[SSP] Skip saving position: extension context unavailable');
return;
}
await chrome.storage.local.set({ trigger_button_position: position });
console.log('[SSP] Position saved:', position);
} catch (error) {
if (this.isContextInvalidationError(error)) {
console.warn('[SSP] Skip saving position: extension context invalidated');
return;
}
console.error('[SSP] Failed to save position:', error);
}
}
@ -321,4 +342,29 @@ export class TriggerIcon {
this.element = null;
}
}
/**
* 判断扩展上下文是否可用
*/
private isExtensionContextValid(): boolean {
return typeof chrome !== 'undefined' && !!chrome.runtime?.id;
}
/**
* 判断是否为扩展上下文失效错误
*/
private isContextInvalidationError(error: unknown): boolean {
if (!error) return false;
const message =
typeof error === 'string'
? error
: error instanceof Error
? error.message
: typeof (error as { message?: unknown }).message === 'string'
? String((error as { message?: unknown }).message)
: null;
return typeof message === 'string' && message.includes('Extension context invalidated');
}
}