Files
testing-tool/entrypoints/background.ts
T
雨霖铃 0427f16cc9 fix: 修复右键菜单功能的多个逻辑漏洞
1. 修复时区硬编码问题 - 使用用户选择的时区而非固定 Asia/Shanghai
2. 修复 openPopup() 失败后数据残留 - 失败时清除 storage 中的待处理数据
3. 统一数据过期时间常量 - 导出 CONTEXT_MENU_DATA_EXPIRY_MS 并统一使用
4. 修复 featureKey 类型断言不安全 - 使用映射表处理非常规菜单 ID
2026-05-20 21:39:33 +08:00

79 lines
2.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import '../.wxt/types/imports.d.ts';
import { browser } from 'wxt/browser';
import { MessageAction, onMessage, sendMessage } from '@/utils/messages';
import { createAllContextMenus, parseContextMenuClick } from '@/utils/contextMenu';
import { saveContextMenuData } from '@/utils/useContextMenuData';
export default defineBackground(() => {
browser.runtime.onInstalled.addListener(() => {
createAllContextMenus();
});
browser.contextMenus.onClicked.addListener(async (info, _tab) => {
const result = parseContextMenuClick(info.menuItemId as string, info);
if (!result.success || !result.data) {
if (result.error) {
console.warn('[Context Menu]', result.error);
}
return;
}
const { featureKey, payload } = result.data;
try {
const sidePanelState = await browser.storage.local.get('sidePanelOpen');
const isSidePanelOpen = sidePanelState.sidePanelOpen === true;
if (isSidePanelOpen) {
await sendMessage(MessageAction.CONTEXT_MENU_CLICKED, { featureKey, payload });
return;
}
} catch {
// sidepanel 未打开或无法通信,继续执行其他方案
}
// 保存数据到 storagepopup 打开后会读取
await saveContextMenuData({ featureKey, payload });
// 打开 popup 弹窗
try {
await browser.action.openPopup();
} catch (err) {
console.error('[Context Menu] 打开 popup 失败:', err);
// 打开失败时清除残留数据,避免下次打开 popup 时误触发
await chrome.storage.local.remove('contextMenu/pendingData');
}
});
// 监听扩展图标点击事件,打开侧边栏
browser.action.onClicked.addListener(async (tab) => {
if (tab.id) {
try {
await browser.sidePanel.open({ tabId: tab.id });
} catch (err) {
console.error('Failed to open side panel:', err);
}
}
});
// 使用 @webext-core/messaging 处理消息
onMessage(MessageAction.RELOAD_TAB, async (message) => {
const { tabId, delay = 0 } = message.data;
const executeReload = () => {
browser.tabs.reload(tabId).catch((err) => {
console.error('Failed to reload tab:', err);
});
};
if (delay > 0) {
setTimeout(executeReload, delay);
} else {
executeReload();
}
return { success: true, message: '刷新请求已接收' };
});
});