Skip to content

Commit 0d9ba53

Browse files
committed
✨ 优化安装、权限等的打开窗口交互
1 parent cd0d383 commit 0d9ba53

9 files changed

Lines changed: 44 additions & 19 deletions

File tree

.github/ISSUE_TEMPLATE/feature_request.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
name: "新功能请求"
33
about: 期望能够增加的功能
4-
title: "[Feature]"
4+
title: "[Feature] "
55
labels: "enhancement"
66
assignees: ""
77
---

.github/ISSUE_TEMPLATE/feature_request_en.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
name: "Feature Request"
33
about: Features you would like to see added
4-
title: "[Feature]"
4+
title: "[Feature] "
55
labels: "enhancement"
66
assignees: ""
77
---

packages/message/extension_message.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ export class ExtensionMessageConnect implements MessageConnect {
149149
onDisconnect(callback: () => void) {
150150
this.con.onDisconnect.addListener(callback);
151151
}
152+
153+
getPort(): chrome.runtime.Port {
154+
return this.con;
155+
}
152156
}
153157

154158
export class ExtensionContentMessageSend extends ExtensionMessageSend {

packages/message/server.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { MessageSender, MessageConnect, ExtMessageSender, Message, MessageSend } from "./types";
22
import LoggerCore from "@App/app/logger/core";
33
import { connect, sendMessage } from "./client";
4+
import { ExtensionMessageConnect } from "./extension_message";
45

56
export class GetSender {
67
constructor(private sender: MessageConnect | MessageSender) {}
@@ -10,6 +11,14 @@ export class GetSender {
1011
}
1112

1213
getExtMessageSender(): ExtMessageSender {
14+
if (this.sender instanceof ExtensionMessageConnect) {
15+
const con = this.sender.getPort();
16+
return {
17+
tabId: con.sender?.tab?.id || -1, // -1表示后台脚本
18+
frameId: con.sender?.frameId,
19+
documentId: con.sender?.documentId,
20+
};
21+
}
1322
const sender = this.sender as MessageSender;
1423
return {
1524
tabId: sender.tab?.id || -1, // -1表示后台脚本

src/app/service/service_worker/client.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -309,9 +309,7 @@ export class SynchronizeClient extends Client {
309309
url: url,
310310
});
311311
// 打开导入窗口,用cache实现数据交互
312-
chrome.tabs.create({
313-
url: `/src/import.html?uuid=${uuid}`,
314-
});
312+
window.open(chrome.runtime.getURL(`/src/import.html?uuid=${uuid}`), "_blank");
315313
}
316314

317315
importResources(

src/app/service/service_worker/gm_api.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ export default class GMApi {
142142
}
143143
const req = await this.parseRequest(data);
144144
try {
145-
await this.permissionVerify.verify(req, api);
145+
await this.permissionVerify.verify(req, api, sender);
146146
} catch (e) {
147147
this.logger.error("verify error", { api: data.api }, Logger.E(e));
148148
throw e;
@@ -310,10 +310,12 @@ export default class GMApi {
310310
}
311311

312312
@PermissionVerify.API()
313-
CAT_userConfig(request: Request) {
313+
CAT_userConfig(request: Request, sender: GetSender): void {
314+
const tabId = sender.getExtMessageSender().tabId;
314315
chrome.tabs.create({
315316
url: `/src/options.html#/?userConfig=${request.uuid}`,
316317
active: true,
318+
openerTabId: tabId === -1 ? undefined : tabId,
317319
});
318320
}
319321

@@ -337,12 +339,14 @@ export default class GMApi {
337339
} as ConfirmParam;
338340
},
339341
})
340-
async CAT_fileStorage(request: Request): Promise<{ action: string; data: any } | boolean> {
342+
async CAT_fileStorage(request: Request, sender: GetSender): Promise<{ action: string; data: any } | boolean> {
341343
const [action, details] = request.params;
342344
if (action === "config") {
345+
const tabId = sender.getExtMessageSender().tabId;
343346
chrome.tabs.create({
344347
url: `/src/options.html#/setting`,
345348
active: true,
349+
openerTabId: tabId === -1 ? undefined : tabId,
346350
});
347351
return true;
348352
}
@@ -811,7 +815,12 @@ export default class GMApi {
811815
return false;
812816
}
813817
} else {
814-
const tab = await chrome.tabs.create({ url, active: options.active });
818+
const tabId = sender.getExtMessageSender().tabId;
819+
const tab = await chrome.tabs.create({
820+
url,
821+
active: options.active,
822+
openerTabId: tabId === -1 ? undefined : tabId,
823+
});
815824
await Cache.getInstance().set(`GM_openInTab:${tab.id}`, {
816825
uuid: request.uuid,
817826
sender: sender.getExtMessageSender(),

src/app/service/service_worker/permission_verify.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// gm api 权限验证
22
import type { Script } from "@App/app/repo/scripts";
33
import { type Permission, PermissionDAO } from "@App/app/repo/permission";
4+
import type { GetSender } from "@Packages/message/server";
45
import { type Group } from "@Packages/message/server";
56
import { type MessageQueue } from "@Packages/message/message_queue";
67
import type { Api, Request } from "./types";
@@ -97,6 +98,7 @@ export default class PermissionVerify {
9798
confirm: ConfirmParam | boolean;
9899
resolve: (value: boolean) => void;
99100
reject: (reason: any) => void;
101+
sender: GetSender;
100102
}> = new Queue();
101103

102104
private permissionDAO: PermissionDAO = new PermissionDAO();
@@ -109,7 +111,7 @@ export default class PermissionVerify {
109111
}
110112

111113
// 验证是否有权限
112-
async verify(request: Request, api: ApiValue): Promise<boolean> {
114+
async verify(request: Request, api: ApiValue, sender: GetSender): Promise<boolean> {
113115
const { alias, link, confirm } = api.param;
114116
if (api.param.default) {
115117
return true;
@@ -132,7 +134,7 @@ export default class PermissionVerify {
132134
// 需要用户确认
133135
let result = true;
134136
if (confirm) {
135-
result = await this.pushConfirmQueue(request, confirm);
137+
result = await this.pushConfirmQueue(request, confirm, sender);
136138
}
137139
return result;
138140
}
@@ -148,7 +150,7 @@ export default class PermissionVerify {
148150
return;
149151
}
150152
try {
151-
const ret = await this.confirm(data.request, data.confirm);
153+
const ret = await this.confirm(data.request, data.confirm, data.sender);
152154
data.resolve(ret);
153155
} catch (e) {
154156
data.reject(e);
@@ -157,17 +159,17 @@ export default class PermissionVerify {
157159
}
158160

159161
// 确认队列,为了防止一次性打开过多的窗口
160-
async pushConfirmQueue(request: Request, confirmFn: ApiParamConfirmFn): Promise<boolean> {
162+
async pushConfirmQueue(request: Request, confirmFn: ApiParamConfirmFn, sender: GetSender): Promise<boolean> {
161163
const confirm = await confirmFn(request);
162164
if (confirm === true) {
163165
return true;
164166
}
165167
return await new Promise((resolve, reject) => {
166-
this.confirmQueue.push({ request, confirm, resolve, reject });
168+
this.confirmQueue.push({ request, confirm, resolve, reject, sender });
167169
});
168170
}
169171

170-
async confirm(request: Request, confirm: boolean | ConfirmParam): Promise<boolean> {
172+
async confirm(request: Request, confirm: boolean | ConfirmParam, sender: GetSender): Promise<boolean> {
171173
if (typeof confirm === "boolean") {
172174
return confirm;
173175
}
@@ -192,7 +194,7 @@ export default class PermissionVerify {
192194
throw new Error("permission denied");
193195
}
194196
// 没有权限,则弹出页面让用户进行确认
195-
const userConfirm = await this.confirmWindow(request.script, confirm);
197+
const userConfirm = await this.confirmWindow(request.script, confirm, sender);
196198
// 成功存入数据库
197199
const model: Permission = {
198200
uuid: request.uuid,
@@ -248,7 +250,7 @@ export default class PermissionVerify {
248250
> = new Map();
249251

250252
// 弹出窗口让用户进行确认
251-
async confirmWindow(script: Script, confirm: ConfirmParam): Promise<UserConfirm> {
253+
async confirmWindow(script: Script, confirm: ConfirmParam, sender: GetSender): Promise<UserConfirm> {
252254
return new Promise((resolve, reject) => {
253255
const uuid = uuidv4();
254256
// 超时处理
@@ -267,8 +269,10 @@ export default class PermissionVerify {
267269
reject,
268270
});
269271
// 打开窗口
272+
const tabId = sender.getExtMessageSender().tabId;
270273
chrome.tabs.create({
271274
url: chrome.runtime.getURL(`src/confirm.html?uuid=${uuid}`),
275+
openerTabId: tabId === -1 ? undefined : tabId, // 如果是后台脚本,则不设置openerTabId
272276
});
273277
});
274278
}

src/app/service/service_worker/script.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ export class ScriptService {
3636

3737
listenerScriptInstall() {
3838
// 初始化脚本安装监听
39-
chrome.webRequest.onBeforeSendHeaders.addListener(
40-
(req: chrome.webRequest.OnBeforeSendHeadersDetails) => {
39+
chrome.webRequest.onResponseStarted.addListener(
40+
(req: chrome.webRequest.OnResponseStartedDetails) => {
4141
// 处理url, 实现安装脚本
4242
if (req.method !== "GET") {
4343
return undefined;

src/pkg/utils/utils.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ export function openInCurrentTab(url: string) {
112112
if (tabs.length) {
113113
chrome.tabs.create({
114114
url,
115+
openerTabId: tabs[0].id,
115116
index: tabs[0].index + 1,
116117
});
117118
} else {

0 commit comments

Comments
 (0)