Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 24 additions & 14 deletions packages/message/extension_message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,35 +38,43 @@ export class ExtensionMessage implements Message {
};

onConnect(callback: (data: TMessage, con: MessageConnect) => void) {
chrome.runtime.onConnect.addListener((port: chrome.runtime.Port | null) => {
chrome.runtime.onConnect.addListener((port: chrome.runtime.Port) => {
let myPort: chrome.runtime.Port | null = port;
const lastError = chrome.runtime.lastError;
if (lastError) {
console.error("chrome.runtime.lastError in chrome.runtime.onConnect", lastError);
// 消息API发生错误因此不继续执行
}
const handler = (msg: TMessage) => {
port!.onMessage.removeListener(handler);
callback(msg, new ExtensionMessageConnect(port!));
port = null;
const port = myPort;
if (port !== null) {
myPort = null;
port.onMessage.removeListener(handler);
callback(msg, new ExtensionMessageConnect(port));
}
};
port!.onMessage.addListener(handler);
myPort.onMessage.addListener(handler);
});

if (this.backgroundPrimary) {
let addUserScriptConnectionListener: (() => void) | null = () => {
try {
// 监听用户脚本的连接
chrome.runtime.onUserScriptConnect.addListener((port: chrome.runtime.Port | null) => {
chrome.runtime.onUserScriptConnect.addListener((port: chrome.runtime.Port) => {
let myPort: chrome.runtime.Port | null = port;
const lastError = chrome.runtime.lastError;
if (lastError) {
console.error("chrome.runtime.lastError in chrome.runtime.onUserScriptConnect:", lastError);
}
const handler = (msg: TMessage) => {
port!.onMessage.removeListener(handler);
callback(msg, new ExtensionMessageConnect(port!));
port = null;
const port = myPort;
if (port !== null) {
myPort = null;
port.onMessage.removeListener(handler);
callback(msg, new ExtensionMessageConnect(port));
}
};
port!.onMessage.addListener(handler);
myPort.onMessage.addListener(handler);
});
addUserScriptConnectionListener = null;
} catch {
Expand Down Expand Up @@ -157,8 +165,9 @@ export class ExtensionMessageConnect implements MessageConnect {
const handler = (msg: TMessage, _con: chrome.runtime.Port) => {
listenerMgr.emit(`onMessage:${this.listenerId}`, msg);
};
const cleanup = (con: chrome.runtime.Port) => {
if (this.con) {
const cleanup = () => {
const con = this.con;
if (con !== null) {
this.con = null;
listenerMgr.removeAllListeners(`cleanup:${this.listenerId}`);
con.onMessage.removeListener(handler);
Expand All @@ -179,7 +188,7 @@ export class ExtensionMessageConnect implements MessageConnect {
// 無法 sendMessage 不应该屏蔽错误
throw new Error("Attempted to sendMessage on a disconnected port.");
}
this.con?.postMessage(data);
this.con.postMessage(data);
}

onMessage(callback: (data: TMessage) => void) {
Expand All @@ -191,8 +200,9 @@ export class ExtensionMessageConnect implements MessageConnect {
listenerMgr.addListener(`onMessage:${this.listenerId}`, callback);
}

disconnect() {
disconnect(ignoreAlreadyDisconnected?: boolean) {
if (!this.con) {
if (ignoreAlreadyDisconnected) return;
console.warn("Attempted to disconnect on a disconnected port.");
// 重复 disconnect() 不应该屏蔽错误
throw new Error("Attempted to disconnect on a disconnected port.");
Expand Down
32 changes: 29 additions & 3 deletions packages/message/mock_message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,49 @@ import EventEmitter from "eventemitter3";
import { sleep } from "@App/pkg/utils/utils";

export class MockMessageConnect implements MessageConnect {
constructor(protected EE: EventEmitter<string, any>) {}
EE: EventEmitter<string, any> | null;
constructor(EE: EventEmitter<string, any>) {
this.EE = EE;
}

onMessage(callback: (data: TMessage) => void): void {
if (!this.EE) {
console.error("onMessage Invalid MockConnection");
// 無法監聽的話不应该屏蔽错误
throw new Error("onMessage Invalid MockConnection");
}
this.EE.on("message", (data: any) => {
callback(data);
});
}

sendMessage(data: TMessage): void {
if (!this.EE) {
console.warn("Attempted to sendMessage on a disconnected MockConnection.");
// 無法 sendMessage 不应该屏蔽错误
throw new Error("Attempted to sendMessage on a disconnected MockConnection.");
}
this.EE.emit("message", data);
}

disconnect(): void {
this.EE.emit("disconnect", true); // MockMessageConnect 未有模拟由另一端触发 disconnect() 的情况
disconnect(ignoreAlreadyDisconnected?: boolean): void {
if (!this.EE) {
if (ignoreAlreadyDisconnected) return;
console.warn("Attempted to disconnect on a disconnected MockConnection.");
// 重复 disconnect() 不应该屏蔽错误
throw new Error("Attempted to disconnect on a disconnected MockConnection.");
}
const EE = this.EE;
this.EE = null;
EE?.emit("disconnect", true); // MockMessageConnect 未有模拟由另一端触发 disconnect() 的情况
}

onDisconnect(callback: (isSelfDisconnected: boolean) => void) {
if (!this.EE) {
console.error("onDisconnect Invalid MockConnection.");
// 無法監聽的話不应该屏蔽错误
throw new Error("onDisconnect Invalid MockConnection.");
}
this.EE.once("disconnect", callback);
}
}
Expand Down
2 changes: 1 addition & 1 deletion packages/message/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ export interface MessageSend {
export interface MessageConnect {
onMessage(callback: (data: TMessage) => void): void;
sendMessage(data: TMessage): void;
disconnect(): void;
disconnect(ignoreAlreadyDisconnected?: boolean): void;
onDisconnect(callback: (isSelfDisconnected: boolean) => void): void;
}

Expand Down
3 changes: 2 additions & 1 deletion packages/message/window_message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,9 @@ export class WindowMessageConnect implements MessageConnect {
listenerMgr.addListener(`onMessage:${this.listenerId}`, callback);
}

disconnect() {
disconnect(ignoreAlreadyDisconnected: boolean = false) {
if (!this.target) {
if (ignoreAlreadyDisconnected) return;
console.warn("Attempted to disconnect on a disconnected Target.");
// 重复 disconnect() 不应该屏蔽错误
throw new Error("Attempted to disconnect on a disconnected Target.");
Expand Down
2 changes: 1 addition & 1 deletion src/app/service/content/gm_api/gm_xhr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ export function GM_xmlhttpRequest(
onMessageHandler = null;
doAbort = null;
refCleanup = null;
connect?.disconnect(); // 确保 connect 断开
connect?.disconnect(true); // 确保 connect 断开
connect = null;
};

Expand Down
11 changes: 6 additions & 5 deletions src/app/service/service_worker/gm_api/gm_api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -774,10 +774,11 @@ export default class GMApi {
throw new Error("GM_xmlhttpRequest ERROR: msgConn is undefined");
}
// conn 为 nested scope 内 local 存取
let throwErrorFn: ((error: string) => Error) | null = ((conn: MessageConnect | null) => {
let throwErrorFn: ((error: string) => Error) | null = ((conn: MessageConnect) => {
let myConn: MessageConnect | null = conn;
let errorOccur: string | null = null;
const doLoadEnd = () => {
conn?.sendMessage({
myConn?.sendMessage({
action: "onloadend",
data: {
status: 0,
Expand All @@ -786,12 +787,12 @@ export default class GMApi {
readyState: 4, // ERROR. DONE.
},
});
conn?.disconnect(); // 断开连结
conn = null; // 释放
myConn?.disconnect(); // 断开连结
myConn = null; // 释放
};
return (error: string) => {
errorOccur = error;
conn?.sendMessage({
myConn?.sendMessage({
action: "onerror",
data: {
status: 0,
Expand Down
Loading