Skip to content

fix: 修复缺少站点访问权限时跨域请求异常的问题#1477

Open
cyfung1031 wants to merge 3 commits into
mainfrom
fix/site-access-grant/001
Open

fix: 修复缺少站点访问权限时跨域请求异常的问题#1477
cyfung1031 wants to merge 3 commits into
mainfrom
fix/site-access-grant/001

Conversation

@cyfung1031
Copy link
Copy Markdown
Collaborator

@cyfung1031 cyfung1031 commented May 28, 2026

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

Description / 描述

Close #1476

修复在浏览器未授予 ScriptCat 对目标站点的访问权限时,脚本发起跨域请求可能出现非预期错误的问题。

本次改动会在处理 GM.xmlHttpRequest / 跨域请求权限确认时,先检查扩展是否已拥有目标 origin 的站点访问权限。如果尚未授权,则在确认页面引导用户通过浏览器权限弹窗授予对应站点访问权限,授权成功后再继续执行请求;如果用户拒绝授权,则本次请求会被拒绝。

主要改动

  • 在跨域请求权限校验中增加对 chrome.permissions.contains 的检查。
  • 当缺少目标站点访问权限时,返回新的 extension-site-access 确认类型。
  • 在确认页面中调用 chrome.permissions.request,通过用户手势请求站点访问权限。
  • 针对站点访问权限确认场景,简化确认页面按钮,只显示“请求权限”。
  • 为多语言文件补充“ScriptCat 需要站点访问权限”相关文案。
  • 保留原有 CORS / @connect 权限判断逻辑,并在已允许 CORS 但缺少站点访问权限时继续请求浏览器站点权限。

测试

已验证以下场景:

  • 未授予站点访问权限时,会弹出 ScriptCat 的站点访问权限确认页面。
  • 用户点击请求权限后,会触发浏览器的站点访问权限授权弹窗。
  • 用户拒绝授权时,请求会被正确拒绝。
  • 用户允许授权后,请求可以继续执行。
  • 原有 CORS 权限确认流程仍可正常工作。

Screenshots / 截图

Screenshot 2026-05-29 at 0 45 34 Screenshot 2026-05-29 at 0 45 39

DENY

Screenshot 2026-05-29 at 0 45 48

ALLOW

Screenshot 2026-05-29 at 0 46 01 Screenshot 2026-05-29 at 0 46 10

m501a.user.js
m501b.user.js
server.zip

@cyfung1031 cyfung1031 changed the title fix site-access-grant fix: 修复缺少站点访问权限时跨域请求异常的问题 May 28, 2026
@cyfung1031 cyfung1031 requested a review from CodFrm May 28, 2026 16:14
@CodFrm CodFrm requested a review from Copilot May 28, 2026 16:16
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

该 PR 旨在修复当浏览器未授予扩展对目标站点的“站点访问权限”时,脚本发起 GM.xmlHttpRequest / GM_xmlhttpRequest 跨域请求可能出现非预期异常的问题。整体思路是在原有 @connect / CORS 确认链路之外,增加对扩展“站点访问权限(Site access)”的检测与引导授权,从而避免在权限被浏览器侧拦截时产生不可控错误。

Changes:

  • 在 Service Worker 侧为 XHR 跨域请求增加 chrome.permissions.contains 检测,并在缺少站点访问权限时返回新的确认类型 extension-site-access
  • 在确认页面中增加 chrome.permissions.request({ origins }) 的用户手势授权流程,并为 extension-site-access 场景简化按钮 UI
  • 为多语言资源补充“需要站点访问权限”的标题/描述/内容文案

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/pages/confirm/App.tsx 确认页新增站点访问权限请求逻辑,并对 extension-site-access 场景简化按钮
src/app/service/service_worker/permission_verify.ts 扩展 ConfirmParam,增加 extensionSiteAccessOrigins 字段用于确认页触发权限申请
src/app/service/service_worker/gm_api/gm_api.ts XHR 权限确认前新增站点访问权限检测,必要时返回 extension-site-access 确认
src/locales/zh-TW/translation.json 新增站点访问权限相关文案(繁中)
src/locales/zh-CN/translation.json 新增站点访问权限相关文案(简中)
src/locales/vi-VN/translation.json 新增站点访问权限相关文案(越南语)
src/locales/ru-RU/translation.json 新增站点访问权限相关文案(俄语)
src/locales/ja-JP/translation.json 新增站点访问权限相关文案(日语)
src/locales/en-US/translation.json 新增站点访问权限相关文案(英语)
src/locales/de-DE/translation.json 新增站点访问权限相关文案(德语)

Comment thread src/pages/confirm/App.tsx
Comment on lines +48 to +62
if (allow && confirm?.extensionSiteAccessOrigins?.length) {
const granted = await chrome.permissions.request({
origins: confirm.extensionSiteAccessOrigins,
});
if (!granted) {
await permissionClient
.confirm(uuid, {
allow: false,
type,
})
.catch(() => {});
window.close();
return;
}
}
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

only 1

Comment on lines +810 to +817
const originPattern = `${url.origin}/*`;
let hasOriginPermission = false;
try {
hasOriginPermission = await chrome.permissions.contains({ origins: [originPattern] });
} catch (e) {
console.warn(e);
}
const extensionSiteAccessOrigins = hasOriginPermission ? undefined : [originPattern];
Copy link
Copy Markdown
Collaborator Author

@cyfung1031 cyfung1031 May 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 要包括 port
  2. file:/// 暂不理会 36ad338
  3. fixed about:blank, data:text/html,... in 408f0e3

@cyfung1031
Copy link
Copy Markdown
Collaborator Author

@CodFrm 你知不知道有什么情况才会有由「所有网络」变成「特定网站」的情况吗? 脚本安装页弹出也是用 DNR,如果是「特定网站」的情况下就会失效...

@CodFrm
Copy link
Copy Markdown
Member

CodFrm commented May 31, 2026

@CodFrm 你知不知道有什么情况才会有由「所有网络」变成「特定网站」的情况吗? 脚本安装页弹出也是用 DNR,如果是「特定网站」的情况下就会失效...

一般是用户自己设定吧,其它情况我也不清楚了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P0 🚑 需要紧急处理的内容

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] 缺少扩展站点访问权限时 GM_xmlhttpRequest 跨域请求会出现非预期错误

3 participants