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'); + } }