Skip to content

Commit 184b682

Browse files
committed
Merge branch 'main' into pr/cyfung1031/943
2 parents 9cc7661 + b9268e7 commit 184b682

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+5264
-1196
lines changed

example/tests/gm_xhr_test.js

Lines changed: 1292 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,8 @@
1+
import EventEmitter from "eventemitter3";
2+
13
export default class WebRequest {
24
sendHeader?: (details: chrome.webRequest.OnSendHeadersDetails) => chrome.webRequest.BlockingResponse | void;
35

4-
mockXhr(xhr: any): any {
5-
return () => {
6-
const ret = new xhr();
7-
const header: chrome.webRequest.HttpHeader[] = [];
8-
ret.setRequestHeader = (k: string, v: string) => {
9-
header.push({
10-
name: k,
11-
value: v,
12-
});
13-
};
14-
const oldSend = ret.send.bind(ret);
15-
ret.send = (data: any) => {
16-
header.push({
17-
name: "cookie",
18-
value: "website=example.com",
19-
});
20-
const resp = this.sendHeader?.({
21-
method: ret.method,
22-
url: ret.url,
23-
requestHeaders: header,
24-
initiator: chrome.runtime.getURL(""),
25-
} as chrome.webRequest.OnSendHeadersDetails) as chrome.webRequest.BlockingResponse;
26-
resp.requestHeaders?.forEach((h) => {
27-
ret._authorRequestHeaders!.addHeader(h.name, h.value);
28-
});
29-
oldSend(data);
30-
};
31-
return ret;
32-
};
33-
}
34-
356
onBeforeSendHeaders = {
367
addListener: (callback: any) => {
378
this.sendHeader = callback;
@@ -49,4 +20,27 @@ export default class WebRequest {
4920
// TODO
5021
},
5122
};
23+
24+
onBeforeRequest = {
25+
counter: 0,
26+
EE: new EventEmitter<string, any>(),
27+
addListener: function (callback: (...args: any[]) => any) {
28+
this.EE.addListener("onBeforeRequest", (params) => {
29+
callback(params);
30+
});
31+
// TODO
32+
},
33+
};
34+
35+
onBeforeRedirect = {
36+
addListener: () => {
37+
// TODO
38+
},
39+
};
40+
41+
onErrorOccurred = {
42+
addListener: () => {
43+
// TODO
44+
},
45+
};
5246
}

packages/message/custom_event_message.ts

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { v4 as uuidv4 } from "uuid";
33
import { type PostMessage, type WindowMessageBody, WindowMessageConnect } from "./window_message";
44
import LoggerCore from "@App/app/logger/core";
55
import EventEmitter from "eventemitter3";
6+
import { DefinedFlags } from "@App/app/service/service_worker/runtime.consts";
67

78
export class CustomEventPostMessage implements PostMessage {
89
constructor(private send: CustomEventMessage) {}
@@ -15,23 +16,20 @@ export class CustomEventPostMessage implements PostMessage {
1516
// 使用CustomEvent来进行通讯, 可以在content与inject中传递一些dom对象
1617
export class CustomEventMessage implements Message {
1718
EE = new EventEmitter<string, any>();
19+
readonly receiveFlag: string;
20+
readonly sendFlag: string;
1821

1922
// 关联dom目标
2023
relatedTarget: Map<number, EventTarget> = new Map();
2124

22-
protected flags: {
23-
injectFlag: string;
24-
contentFlag: string;
25-
messageFlag: string;
26-
};
27-
2825
constructor(
29-
flags: typeof CustomEventMessage.prototype.flags | string,
30-
protected isContent: boolean
26+
flags: MessageFlags | string,
27+
protected readonly isContent: boolean
3128
) {
32-
flags = typeof flags === "string" ? { injectFlag: "inject", contentFlag: "content", messageFlag: flags } : flags;
33-
this.flags = flags;
34-
window.addEventListener((isContent ? flags.contentFlag : flags.injectFlag) + flags.messageFlag, (event) => {
29+
const messageFlag = typeof flags === "string" ? flags : flags.messageFlag;
30+
this.receiveFlag = `evt${messageFlag}${isContent ? DefinedFlags.contentFlag : DefinedFlags.injectFlag}${DefinedFlags.domEvent}`;
31+
this.sendFlag = `evt${messageFlag}${isContent ? DefinedFlags.injectFlag : DefinedFlags.contentFlag}${DefinedFlags.domEvent}`;
32+
window.addEventListener(this.receiveFlag, (event) => {
3533
if (event instanceof MouseEvent && event.movementX && event.relatedTarget) {
3634
this.relatedTarget.set(event.movementX, event.relatedTarget!);
3735
} else if (event instanceof CustomEvent) {
@@ -103,16 +101,12 @@ export class CustomEventMessage implements Message {
103101
}
104102
}
105103

106-
const ev = new CustomEvent(this.sendEventName(), {
104+
const ev = new CustomEvent(this.sendFlag, {
107105
detail,
108106
});
109107
window.dispatchEvent(ev);
110108
}
111109

112-
sendEventName(): string {
113-
return (this.isContent ? this.flags.injectFlag : this.flags.contentFlag) + this.flags.messageFlag;
114-
}
115-
116110
sendMessage<T = any>(data: TMessage): Promise<T> {
117111
return new Promise((resolve: ((value: T) => void) | null) => {
118112
const messageId = uuidv4();
@@ -160,7 +154,7 @@ export class CustomEventMessage implements Message {
160154
// 先将relatedTarget转换成id发送过去
161155
const id = ++this.relateId;
162156
// 可以使用此种方式交互element
163-
const ev = new MouseEvent(this.sendEventName(), {
157+
const ev = new MouseEvent(this.sendFlag, {
164158
movementX: id,
165159
relatedTarget: target,
166160
});

packages/message/server.test.ts

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { describe, expect, it, beforeEach, vi, afterEach } from "vitest";
22
import { GetSenderType, SenderConnect, SenderRuntime, Server, type IGetSender } from "./server";
33
import { CustomEventMessage } from "./custom_event_message";
44
import type { MessageConnect, RuntimeMessageSender } from "./types";
5+
import { DefinedFlags } from "@App/app/service/service_worker/runtime.consts";
56

67
let contentMessage: CustomEventMessage;
78
let injectMessage: CustomEventMessage;
@@ -11,11 +12,7 @@ let client: CustomEventMessage;
1112
const nextTick = () => Promise.resolve().then(() => {});
1213

1314
const setupGlobal = () => {
14-
const flags = {
15-
contentFlag: "ct",
16-
injectFlag: "fd",
17-
messageFlag: "test",
18-
};
15+
const flags = { messageFlag: "-test.server" };
1916
// 创建 content 和 inject 之间的消息通道
2017
contentMessage = new CustomEventMessage(flags, true); // content 端
2118
injectMessage = new CustomEventMessage(flags, false); // inject 端
@@ -36,35 +33,35 @@ const setupGlobal = () => {
3633
vi.fn().mockImplementation((event: Event) => {
3734
if (event instanceof CustomEvent) {
3835
const eventType = event.type;
39-
if (eventType.includes("test")) {
36+
if (eventType.includes("-test.server")) {
37+
let targetEventType: string;
38+
let messageThis: CustomEventMessage;
39+
let messageThat: CustomEventMessage;
4040
// 根据事件类型确定目标消息处理器
41-
if (eventType.startsWith("ct")) {
41+
if (eventType.includes(DefinedFlags.contentFlag)) {
4242
// inject -> content
43-
nextTick().then(() => {
44-
contentMessage.messageHandle(event.detail, {
45-
postMessage: (data: any) => {
46-
// content -> inject 的响应
47-
const responseEvent = new CustomEvent("fd" + "test", { detail: data });
48-
injectMessage.messageHandle(responseEvent.detail, {
49-
postMessage: vi.fn(),
50-
});
51-
},
52-
});
53-
});
54-
} else if (eventType.startsWith("fd")) {
43+
targetEventType = eventType.replace(DefinedFlags.contentFlag, DefinedFlags.injectFlag);
44+
messageThis = contentMessage;
45+
messageThat = injectMessage;
46+
} else if (eventType.includes(DefinedFlags.injectFlag)) {
5547
// content -> inject
56-
nextTick().then(() => {
57-
injectMessage.messageHandle(event.detail, {
58-
postMessage: (data: any) => {
59-
// inject -> content 的响应
60-
const responseEvent = new CustomEvent("ct" + "test", { detail: data });
61-
contentMessage.messageHandle(responseEvent.detail, {
62-
postMessage: vi.fn(),
63-
});
64-
},
65-
});
66-
});
48+
targetEventType = eventType.replace(DefinedFlags.injectFlag, DefinedFlags.contentFlag);
49+
messageThis = injectMessage;
50+
messageThat = contentMessage;
51+
} else {
52+
throw new Error("test mock failed");
6753
}
54+
nextTick().then(() => {
55+
messageThis.messageHandle(event.detail, {
56+
postMessage: (data: any) => {
57+
// 响应
58+
const responseEvent = new CustomEvent(targetEventType, { detail: data });
59+
messageThat.messageHandle(responseEvent.detail, {
60+
postMessage: vi.fn(),
61+
});
62+
},
63+
});
64+
});
6865
}
6966
}
7067
return true;

src/app/service/content/create_context.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import { type ScriptRunResource } from "@App/app/repo/scripts";
22
import { v4 as uuidv4 } from "uuid";
33
import type { Message } from "@Packages/message/types";
44
import EventEmitter from "eventemitter3";
5-
import { GMContextApiGet } from "./gm_context";
6-
import { createGMBase } from "./gm_api";
7-
import { protect } from "./gm_context";
5+
import { GMContextApiGet } from "./gm_api/gm_context";
6+
import { protect } from "./gm_api/gm_context";
87
import { isEarlyStartScript } from "./utils";
98
import { ListenerManager } from "./listener_manager";
9+
import { createGMBase } from "./gm_api/gm_api";
1010

1111
// 构建沙盒上下文
1212
export const createContext = (

src/app/service/content/exec_script.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import { compileScript } from "./utils";
66
import type { Message } from "@Packages/message/types";
77
import type { ScriptLoadInfo } from "../service_worker/types";
88
import type { ValueUpdateDataEncoded } from "./types";
9-
import { evaluateGMInfo } from "./gm_info";
10-
import { type IGM_Base } from "./gm_api";
9+
import { evaluateGMInfo } from "./gm_api/gm_info";
10+
import type { IGM_Base } from "./gm_api/gm_api";
1111

1212
// 执行脚本,控制脚本执行与停止
1313
export default class ExecScript {

src/app/service/content/gm_api.test.ts renamed to src/app/service/content/gm_api/gm_api.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { describe, expect, it, vi } from "vitest";
2-
import ExecScript from "./exec_script";
3-
import type { ScriptLoadInfo } from "../service_worker/types";
4-
import type { GMInfoEnv, ScriptFunc } from "./types";
5-
import { compileScript, compileScriptCode } from "./utils";
2+
import ExecScript from "../exec_script";
3+
import type { ScriptLoadInfo } from "@App/app/service/service_worker/types";
4+
import type { GMInfoEnv, ScriptFunc } from "../types";
5+
import { compileScript, compileScriptCode } from "../utils";
66
import type { Message } from "@Packages/message/types";
77
import { encodeMessage } from "@App/pkg/utils/message_value";
88
import { v4 as uuidv4 } from "uuid";

0 commit comments

Comments
 (0)