126 lines
3.8 KiB
JavaScript
126 lines
3.8 KiB
JavaScript
// Service Worker - 后台脚本
|
||
|
||
// 扩展安装时执行
|
||
chrome.runtime.onInstalled.addListener((details) => {
|
||
console.log('扩展已安装', details.reason);
|
||
|
||
// 初始化存储
|
||
chrome.storage.local.set({
|
||
visitCount: 0,
|
||
installedAt: Date.now()
|
||
});
|
||
});
|
||
|
||
// 监听来自其他脚本的消息
|
||
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
||
console.log('收到消息:', request, '来自:', sender);
|
||
|
||
if (request.action === 'getData') {
|
||
// 处理获取数据的请求
|
||
chrome.storage.local.get(null, (data) => {
|
||
sendResponse({ success: true, data });
|
||
});
|
||
return true; // 保持消息通道开启以支持异步响应
|
||
}
|
||
|
||
if (request.action === 'saveData') {
|
||
// 处理保存数据的请求
|
||
chrome.storage.local.set(request.data, () => {
|
||
sendResponse({ success: true });
|
||
});
|
||
return true;
|
||
}
|
||
|
||
sendResponse({ success: false, error: '未知操作' });
|
||
});
|
||
|
||
// 监听标签页更新
|
||
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
|
||
if (changeInfo.status === 'complete' && tab.url) {
|
||
console.log('页面加载完成:', tab.url);
|
||
}
|
||
});
|
||
|
||
// ==================== 书签事件监听 ====================
|
||
|
||
// 书签创建
|
||
chrome.bookmarks.onCreated.addListener((id, bookmark) => {
|
||
console.log('📌 书签已创建:', bookmark);
|
||
// bookmark 包含: id, parentId, index, url, title, dateAdded
|
||
notifyBookmarkEvent('created', bookmark);
|
||
});
|
||
|
||
// 书签删除
|
||
chrome.bookmarks.onRemoved.addListener((id, removeInfo) => {
|
||
console.log('🗑️ 书签已删除:', removeInfo);
|
||
// removeInfo 包含: parentId, index, node (被删除的书签信息)
|
||
notifyBookmarkEvent('removed', removeInfo.node);
|
||
});
|
||
|
||
// 书签修改(标题或URL)
|
||
chrome.bookmarks.onChanged.addListener((id, changeInfo) => {
|
||
console.log('✏️ 书签已修改:', id, changeInfo);
|
||
// changeInfo 包含: title, url
|
||
notifyBookmarkEvent('changed', { id, ...changeInfo });
|
||
});
|
||
|
||
// 书签移动
|
||
chrome.bookmarks.onMoved.addListener((id, moveInfo) => {
|
||
console.log('📁 书签已移动:', id, moveInfo);
|
||
// moveInfo 包含: parentId, index, oldParentId, oldIndex
|
||
notifyBookmarkEvent('moved', { id, ...moveInfo });
|
||
});
|
||
|
||
// 通知书签事件(可选:存储到本地或发送通知)
|
||
async function notifyBookmarkEvent(type, data) {
|
||
// 获取现有的事件记录
|
||
const result = await chrome.storage.local.get(['bookmarkEvents']);
|
||
const events = result.bookmarkEvents || [];
|
||
|
||
// 添加新事件(保留最近50条)
|
||
events.unshift({
|
||
type,
|
||
data,
|
||
timestamp: Date.now()
|
||
});
|
||
|
||
if (events.length > 50) {
|
||
events.pop();
|
||
}
|
||
|
||
await chrome.storage.local.set({ bookmarkEvents: events });
|
||
console.log(`书签事件已记录: ${type}`);
|
||
}
|
||
|
||
// ==================== 变通方案:监控导航来源 ====================
|
||
|
||
// 虽然无法直接监控书签点击,但可以通过 webNavigation 监控导航
|
||
// 结合书签列表进行匹配判断
|
||
chrome.webNavigation.onCommitted.addListener(async (details) => {
|
||
// 只处理主框架导航
|
||
if (details.frameId !== 0) return;
|
||
|
||
// transitionType 可能的值:
|
||
// - "link" - 点击链接
|
||
// - "typed" - 地址栏输入
|
||
// - "auto_bookmark" - 从书签打开(但这个值很少出现)
|
||
// - "generated" - 其他方式
|
||
|
||
if (details.transitionType === 'auto_bookmark') {
|
||
console.log('🔖 可能从书签打开:', details.url);
|
||
}
|
||
|
||
// 另一种方式:检查URL是否在书签中
|
||
if (details.transitionType === 'typed' || details.transitionType === 'generated') {
|
||
try {
|
||
const bookmarks = await chrome.bookmarks.search({ url: details.url });
|
||
if (bookmarks.length > 0) {
|
||
console.log('📖 访问了已收藏的网址:', details.url, bookmarks[0].title);
|
||
}
|
||
} catch (e) {
|
||
// 忽略错误
|
||
}
|
||
}
|
||
});
|
||
|