-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbackground.js
More file actions
160 lines (144 loc) · 4.21 KB
/
background.js
File metadata and controls
160 lines (144 loc) · 4.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
// background.js
// 存储已打开的标签页ID
let openedTabs = [];
/**
* 在新窗口中打开链接
* @param {Array<string>} links - 要打开的链接数组
* @param {number} delay - 链接打开之间的延迟时间(毫秒)
*/
function openLinksInNewWindow(links, delay = 20) {
if (!links || links.length === 0) return;
// 清空之前存储的标签页ID
openedTabs = [];
// 创建一个新窗口
chrome.windows.create({
url: links[0], // 第一个链接作为新窗口的第一个标签页
type: 'normal'
}, (window) => {
if (window && window.tabs && window.tabs[0]) {
// 存储第一个标签页的ID
openedTabs.push(window.tabs[0].id);
}
// 打开剩余的链接作为新标签页,添加延迟
for (let i = 1; i < links.length; i++) {
setTimeout(() => {
chrome.tabs.create({
url: links[i],
windowId: window.id
}, (tab) => {
// 存储新创建的标签页ID
if (tab) {
openedTabs.push(tab.id);
}
});
}, i * delay); // 每个链接之间的延迟递增
}
});
}
/**
* 在当前窗口中打开链接
* @param {Array<string>} links - 要打开的链接数组
* @param {number} delay - 链接打开之间的延迟时间(毫秒)
*/
function openLinksInCurrentWindow(links, delay = 20) {
if (!links || links.length === 0) return;
// 清空之前存储的标签页ID
openedTabs = [];
// 获取当前窗口
chrome.windows.getCurrent((window) => {
if (window) {
// 打开所有链接作为新标签页,添加延迟
for (let i = 0; i < links.length; i++) {
setTimeout(() => {
chrome.tabs.create({
url: links[i],
windowId: window.id
}, (tab) => {
// 存储新创建的标签页ID
if (tab) {
openedTabs.push(tab.id);
}
});
}, i * delay); // 每个链接之间的延迟递增
}
}
});
}
/**
* 关闭之前打开的所有标签页
*/
function closeOpenedTabs() {
if (openedTabs.length > 0) {
// 过滤掉无效的标签页ID(可能已经被关闭)
const validTabs = openedTabs.filter(tabId => tabId);
if (validTabs.length > 0) {
chrome.tabs.remove(validTabs, () => {
// 清空存储的标签页ID
openedTabs = [];
});
}
}
}
/**
* 为当前页面批量打开链接
* @param {Object} info - 右键菜单信息
* @param {Object} tab - 当前标签页
*/
async function openCurrentPageLinks(info, tab) {
try {
// 向content.js发送消息,请求获取链接
const links = await chrome.tabs.sendMessage(tab.id, { action: 'getLinks' });
if (links && links.length > 0) {
// 打开链接,使用默认延迟时间
openLinksInNewWindow(links);
}
} catch (error) {
console.error('获取链接失败:', error);
}
}
/**
* 创建右键菜单
*/
function createContextMenu() {
// 创建右键菜单项
chrome.contextMenus.create({
id: 'openAllLinks',
title: '批量打开此页全部链接',
contexts: ['page'], // 在页面上右键点击时显示
documentUrlPatterns: ['http://*/*', 'https://*/*'] // 只在http/https页面显示
});
}
/**
* 监听来自popup.js的消息
*/
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.action === 'openLinksInNewWindow') {
// 打开链接
openLinksInNewWindow(request.links, request.delay);
sendResponse({ success: true });
} else if (request.action === 'openLinksInCurrentWindow') {
// 在当前窗口打开链接
openLinksInCurrentWindow(request.links, request.delay);
sendResponse({ success: true });
} else if (request.action === 'closeOpenedTabs') {
// 关闭之前打开的标签页
closeOpenedTabs();
sendResponse({ success: true });
}
return true;
});
/**
* 监听右键菜单点击事件
*/
chrome.contextMenus.onClicked.addListener((info, tab) => {
if (info.menuItemId === 'openAllLinks') {
// 批量打开当前页面的链接
openCurrentPageLinks(info, tab);
}
});
/**
* 扩展安装或更新时创建右键菜单
*/
chrome.runtime.onInstalled.addListener(() => {
createContextMenu();
});