Files
testing-tool/entrypoints/background.ts
T
雨霖铃 c5b51a9b33 refactor(qrcode): 国际化补充、质量保障与错误处理优化
- 补充 i18n 翻译键(generateMode, parseMode, pasteHint 等)
- 创建 useDebounce Hook 实现输入防抖 (200ms)
- 使用 useRef 解决 useEffect 无限循环问题
- 编写 pages/QrCode 单元测试 (7 个用例)
- 优化右键菜单错误处理,改进用户提示
- 运行 603 个测试全部通过
2026-05-20 22:42:33 +08:00

80 lines
2.5 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) {
// openPopup 在无活动窗口时会失败(如窗口失焦、特殊页面等)
// 数据已保存到 storage,用户手动打开 popup 仍可正常使用
console.warn('[Context Menu] 自动打开 popup 失败,请手动点击扩展图标:', err);
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: '刷新请求已接收' };
});
});