Skip to content

Commit 216a78c

Browse files
CodFrmcyfung1031Copilot
authored
🚑 修复其他扩展注入 chrome.runtime 导致环境误判的问题 #1280 (#1281)
* 🐛 修复其他扩展注入 chrome.runtime 导致环境误判的问题 #1280 移除 isContent 运行时检测,改为通过 CustomEventMessage.envTag 在构建入口确定环境, 避免其他扩展(如大学搜题酱)向页面注入 chrome.runtime 对象导致 inject 环境被误判为 content 环境。 * Update src/app/service/content/gm_api/gm_api.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * update * 删除不必要的isconnect * 将 typecheck 集成到 lint/lint-fix 脚本中 * 修复引用 * 删除test-results --------- Co-authored-by: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent cc402df commit 216a78c

File tree

8 files changed

+27
-22
lines changed

8 files changed

+27
-22
lines changed

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "scriptcat",
3-
"version": "1.3.0",
3+
"version": "1.3.1",
44
"description": "脚本猫,一个可以执行用户脚本的浏览器扩展,万物皆可脚本化,让你的浏览器可以做更多的事情!",
55
"author": "CodFrm",
66
"license": "GPLv3",
@@ -18,9 +18,9 @@
1818
"dev:noMap": "cross-env NODE_ENV=development NO_MAP=true rspack",
1919
"pack": "node ./scripts/pack.js",
2020
"format": "prettier --write .",
21-
"lint": "eslint .",
22-
"lint:ci": "eslint . --cache --cache-location .eslintcache",
23-
"lint-fix": "eslint --fix .",
21+
"lint": "tsc --noEmit && eslint .",
22+
"lint:ci": "tsc --noEmit && eslint . --cache --cache-location .eslintcache",
23+
"lint-fix": "tsc --noEmit && eslint --fix .",
2424
"changlog": "node ./scripts/changlog.js",
2525
"crowdin": "crowdin",
2626
"crowdin:download": "node ./scripts/crowdin-download.js",

packages/message/common.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@ export const CustomEventClone = CustomEvent;
66

77
const performanceClone = (process.env.VI_TESTING === "true" ? new EventTarget() : performance) as Performance;
88

9-
// 判断当前是否运行在 USER_SCRIPT 环境 (content环境)
10-
export const isContent = typeof chrome === "object" && typeof chrome?.runtime?.sendMessage === "function";
11-
129
// 避免页面载入后改动 EventTarget.prototype 的方法导致消息传递失败
1310
export const pageDispatchEvent = performanceClone.dispatchEvent.bind(performanceClone);
1411
export const pageAddEventListener = performanceClone.addEventListener.bind(performanceClone);

packages/message/custom_event_message.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
createMouseEvent,
1313
} from "@Packages/message/common";
1414
import { ReadyWrap } from "@App/pkg/utils/ready-wrap";
15+
import type { ScriptEnvTag } from "@Packages/message/consts";
1516

1617
// 避免页面载入后改动 Map.prototype 导致消息传递失败
1718
const relatedTargetMap = new Map<number, EventTarget>();
@@ -41,9 +42,11 @@ export class CustomEventMessage implements Message {
4142
readyWrap: ReadyWrap = new ReadyWrap();
4243

4344
constructor(
44-
messageFlag: string,
45-
protected readonly isInbound: boolean
45+
eventFlag: string,
46+
protected readonly isInbound: boolean,
47+
public readonly envTag: ScriptEnvTag | "" = ""
4648
) {
49+
const messageFlag = `${eventFlag}${envTag}`;
4750
this.receiveFlag = `${messageFlag}${isInbound ? DefinedFlags.inboundFlag : DefinedFlags.outboundFlag}${DefinedFlags.domEvent}`;
4851
this.sendFlag = `${messageFlag}${isInbound ? DefinedFlags.outboundFlag : DefinedFlags.inboundFlag}${DefinedFlags.domEvent}`;
4952
pageAddEventListener(this.receiveFlag, (event: Event) => {

src/app/service/content/gm_api/gm_api.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ import GMContext from "./gm_context";
1818
import { type ScriptRunResource } from "@App/app/repo/scripts";
1919
import type { ValueUpdateDataEncoded } from "../types";
2020
import { connect, sendMessage } from "@Packages/message/client";
21-
import { isContent } from "@Packages/message/common";
2221
import { getStorageName } from "@App/pkg/utils/utils";
2322
import { ListenerManager } from "../listener_manager";
2423
import { decodeRValue, encodeRValue, type REncoded } from "@App/pkg/utils/message_value";
2524
import { type TGMKeyValue } from "@App/app/repo/value";
2625
import type { ContextType } from "./gm_xhr";
2726
import { convObjectToURL, GM_xmlhttpRequest, toBlobURL, urlToDocumentInContentPage } from "./gm_xhr";
27+
import { ScriptEnvTag } from "@Packages/message/consts";
2828

2929
// 内部函数呼叫定义
3030
export interface IGM_Base {
@@ -526,7 +526,12 @@ export default class GMApi extends GM_Base {
526526

527527
@GMContext.API()
528528
public async CAT_fetchDocument(url: string): Promise<Document | undefined> {
529-
return urlToDocumentInContentPage(this, url, isContent);
529+
// 上下文已失效时直接返回,避免访问已释放的 message 造成异常
530+
if (this.isInvalidContext()) return undefined;
531+
532+
const message = this.message as CustomEventMessage | null;
533+
const isContentEnv = !!message && message.envTag === ScriptEnvTag.content;
534+
return urlToDocumentInContentPage(this, url, isContentEnv);
530535
}
531536

532537
static _GM_cookie(

src/content.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ import { CustomEventMessage } from "@Packages/message/custom_event_message";
44
import { Server } from "@Packages/message/server";
55
import { ScriptExecutor } from "./app/service/content/script_executor";
66
import type { Message } from "@Packages/message/types";
7-
import { getEventFlag, isContent } from "@Packages/message/common";
7+
import { getEventFlag } from "@Packages/message/common";
88
import { ScriptRuntime } from "./app/service/content/script_runtime";
99
import { ScriptEnvTag } from "@Packages/message/consts";
1010

1111
const messageFlag = process.env.SC_RANDOM_KEY!;
1212

1313
getEventFlag(messageFlag, (eventFlag: string) => {
14-
const scriptEnvTag = isContent ? ScriptEnvTag.content : ScriptEnvTag.inject;
14+
const scriptEnvTag = ScriptEnvTag.content;
1515

16-
const msg: Message = new CustomEventMessage(`${eventFlag}${scriptEnvTag}`, false);
16+
const msg: Message = new CustomEventMessage(eventFlag, false, scriptEnvTag);
1717

1818
// 初始化日志组件
1919
const logger = new LoggerCore({
@@ -25,7 +25,7 @@ getEventFlag(messageFlag, (eventFlag: string) => {
2525
logger.logger().debug("content start");
2626

2727
const server = new Server("content", msg);
28-
const scriptExecutor = new ScriptExecutor(msg, new CustomEventMessage(`${eventFlag}${scriptEnvTag}`, true));
28+
const scriptExecutor = new ScriptExecutor(msg, new CustomEventMessage(eventFlag, true, scriptEnvTag));
2929
const runtime = new ScriptRuntime(scriptEnvTag, server, msg, scriptExecutor);
3030
runtime.contentInit();
3131
runtime.init();

src/inject.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ import { CustomEventMessage } from "@Packages/message/custom_event_message";
44
import { Server } from "@Packages/message/server";
55
import { ScriptExecutor } from "./app/service/content/script_executor";
66
import type { Message } from "@Packages/message/types";
7-
import { getEventFlag, isContent } from "@Packages/message/common";
7+
import { getEventFlag } from "@Packages/message/common";
88
import { ScriptRuntime } from "./app/service/content/script_runtime";
99
import { ScriptEnvTag } from "@Packages/message/consts";
1010

1111
const messageFlag = process.env.SC_RANDOM_KEY!;
1212

1313
getEventFlag(messageFlag, (eventFlag: string) => {
14-
const scriptEnvTag = isContent ? ScriptEnvTag.content : ScriptEnvTag.inject;
14+
const scriptEnvTag = ScriptEnvTag.inject;
1515

16-
const msg: Message = new CustomEventMessage(`${eventFlag}${scriptEnvTag}`, false);
16+
const msg: Message = new CustomEventMessage(eventFlag, false, scriptEnvTag);
1717

1818
// 初始化日志组件
1919
const logger = new LoggerCore({
@@ -25,7 +25,7 @@ getEventFlag(messageFlag, (eventFlag: string) => {
2525
logger.logger().debug("inject start");
2626

2727
const server = new Server("inject", msg);
28-
const scriptExecutor = new ScriptExecutor(msg, new CustomEventMessage(`${eventFlag}${ScriptEnvTag.content}`, true));
28+
const scriptExecutor = new ScriptExecutor(msg, new CustomEventMessage(eventFlag, true, ScriptEnvTag.content));
2929
const runtime = new ScriptRuntime(scriptEnvTag, server, msg, scriptExecutor);
3030
runtime.init();
3131

src/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"manifest_version": 3,
33
"name": "__MSG_scriptcat__",
4-
"version": "1.3.0",
4+
"version": "1.3.1",
55
"author": "CodFrm",
66
"description": "__MSG_scriptcat_description__",
77
"options_ui": {

src/scripting.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ negotiateEventFlag(messageFlag, 2, (eventFlag) => {
2222

2323
logger.logger().debug("scripting start");
2424

25-
const contentMsg = new CustomEventMessage(`${eventFlag}${ScriptEnvTag.content}`, true);
26-
const injectMsg = new CustomEventMessage(`${eventFlag}${ScriptEnvTag.inject}`, true);
25+
const contentMsg = new CustomEventMessage(eventFlag, true, ScriptEnvTag.content);
26+
const injectMsg = new CustomEventMessage(eventFlag, true, ScriptEnvTag.inject);
2727

2828
const server = new Server("scripting", [contentMsg, injectMsg]);
2929

0 commit comments

Comments
 (0)