From e0bf4e5f358f9362955f6af787333c62d6244c68 Mon Sep 17 00:00:00 2001 From: Zain Date: Tue, 25 Nov 2025 18:34:16 +0800 Subject: [PATCH] =?UTF-8?q?fix(TriggerIcon):=20=E6=B7=BB=E5=8A=A0=E6=89=A9?= =?UTF-8?q?=E5=B1=95=E4=B8=8A=E4=B8=8B=E6=96=87=E6=A3=80=E6=9F=A5=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E6=97=A0=E6=95=88=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在恢复和保存位置前检查扩展上下文是否有效 添加处理扩展上下文失效错误的逻辑 --- public/manifest.json | 3 +- src/content/components/TriggerIcon.ts | 46 +++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/public/manifest.json b/public/manifest.json index 846c474..2cb99ba 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -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" -} \ No newline at end of file +} diff --git a/src/content/components/TriggerIcon.ts b/src/content/components/TriggerIcon.ts index 7b7c863..6e97576 100644 --- a/src/content/components/TriggerIcon.ts +++ b/src/content/components/TriggerIcon.ts @@ -85,6 +85,12 @@ export class TriggerIcon { */ private async restorePosition(): Promise { 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'); + } }