UserScript
UserScript copied to clipboard
[Github 增强 - 高速下载] Raw文件加速 失效(在使用Firefox+Violentmonkey时)
问题描述
问题及复现步骤:
在使用 Firefox+Violentmonkey 时,从项目仓库(例如:https://github.com/XIU2/UserScript ) 左键单击 打开任意一个文件,Raw文件加速会失效;
此时,若 Ctrl+R 刷新界面,则Raw文件加速正常生效;
如果是从项目仓库 新标签页打开链接,则Raw文件加速也可以正常生效。
打开任意文件后,点击左边“Code”一栏切换文件时,Raw文件加速也会失效,依旧保持着上一个文件的加速链接(若上个文件没生效,则也不会生效)。
补充:
我测试过 Firefox+Tampermonkey、Chrome+Tampermonkey、Chrome+Violentmonkey ,Raw文件加速均可正常生效;
但仅在使用 Firefox+Violentmonkey 时,需要刷新界面才能生效。
我尝试 禁用其他扩展和脚本、删除重装该脚本(已从回收站彻底删除),但问题依旧。
到这里,由于我个人水平有限,无法继续进行有效的测试来排查了,希望大佬能帮忙,指出一些我漏掉的还需要排查的问题。
最后,感谢大佬的脚本,实实在在帮助了我。
附加截图
Firefox(国际版)和Violentmonkey版本如下:
一些出问题时的截图:
我测试了下,结果大致符合你的描述。 不同的点在于,我这边 Chrome+Violentmonkey 下,直接点击文件后不会显示 Raw 加速按钮,但是我点击左侧列表里的其他文件后,就可以正确显示出来了(当然显示的是新文件的加速 URL),其他的都和你说的差不多。
初步判断是 Violentmonkey 与 Tampermonkey 的差异导致的,毕竟我主用 Tampermonkey,Violentmonkey 也就是因为兼容 Tampermonkey 所以才适配了的,但这两者在细微之处存在差异。
我会研究下原因的。
谢谢大佬回复,以及抱歉没有仔细测试 Chrome+Violentmonkey 的情况。
我刚刚又试了未登录时的情况:
Chrome+Violentmonkey,未登录时 直接点击文件后可以显示Raw加速按钮。(已关闭uBlock)
但 Firefox +Violentmonkey 未登录时就不行
已登录、未登录 其实对应的就是 新版界面、旧版界面。
我测试的情况是,在 Chrome+Violentmonkey 下,新版界面不正常(已登录,情况如我楼上所说),旧版界面正常(未登录)。 而 Firefox+Violentmonkey 下,则都不正常。
根据我以前的经验,Violentmonkey 在加载脚本时间上存在差异,于是我尝试延迟加载 addRawFile() 函数(该函数就是加 Raw 加速按钮的),Chrome+Violentmonkey 新版界面下正常了,但 Firefox+Violentmonkey 依然不行。
调试了下,似乎是监听网页 URL 变化的代码方面的问题,因为 Tampermonkey 自带了该函数(监听网页 URL 变化),而为了兼容 Violentmonkey 等其他脚本管理器,我需要一个类似功能的函数,但因为 Tampermonkey 不是开源的,因此我是自己仿造的该功能函数。 我刚刚测试该函数,在 Chrome 上是可以工作正常的,在 Firefox 上似乎有点问题,可能又是可恶的兼容性问题吧,我研究研究吧。。。
我这边测试只需要将脚本 145 行的代码:
addRawFile();
改为这样:
if (GM_info.scriptHandler === 'Tampermonkey') {addRawFile();} else {setTimeout(addRawFile, 1000);}
Chrome+Violentmonkey 新版界面下就会完全工作正常了。
即非 Tampermonkey 的都延迟 1 秒后再执行函数。
但这个改动对 Firefox+Violentmonkey 无效,因为这个组合下我排查后问题还是出在 监听网页 URL 变化 的代码上。 Chrome+Tampermonkey、Firefox+Tampermonkey 用的都是 Tampermonkey 自带的函数来监听网页 URL 变化的,都没有问题。 而 Chrome+Violentmonkey、Firefox+Violentmonkey 用的是我仿写的函数来监听网页 URL 变化的,而该函数在 Chrome+Tampermonkey/Violentmonkey 上工作正常,但在 Firefox 上工作不正常(无论是哪个脚本管理器),但我把该函数手动在 Firefox 浏览器开发者工具中执行又能正常工作。
所以问题就是出在 Firefox 与 我仿写的这个函数 之间了。
研究后发现,似乎不算是兼容性问题,而是 Firefox 存在一些限制。
我仿写的函数会覆盖 window.history 函数来监听网页 URL 变化,但在 Firefox 浏览器上,无论是什么脚本管理器均无法覆盖,哪怕我加上 // @grant unsafeWindow
也不行(该标识让脚本可以完全控制网页内的变量等等),而在 Firefox 浏览器开发者工具下手动运行该函数覆盖的话,却可以正常工作(脚本功能也恢复正常)。
好像确实是有限制。
我看了下 Violentmonkey 的注入方式说明: https://violentmonkey.github.io/posts/inject-into-context/ 想要脚本影响网页,就需要 page 方式注入,但这又会导致脚本被 Github 的 CSP 限制注入。
// @inject-into page
而使用其他方式,不会被 Github 的 CSP 限制注入,但却会导致我仿写的 监听网页 URL 变化 函数无法生效。。。
Tampermonkey 也有类似的东西,即我脚本里写的:
// @sandbox JavaScript
也是专门解决 Firefox 浏览器的该类问题(上述所说的)。
研究了半天,也问了问 ChatGPT,依然没找到解决方案。。。该问题陷入僵局。。。
想要脚本影响网页,就需要 page 方式注入,但这又会导致脚本被 Github 的 CSP 限制注入。
Firefox 在 content 方式注入有办法影响网页的:https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Sharing_objects_with_page_scripts
之前折腾过,忘记了。如果我没记错的话,本质上是把需要注入 page 的部分分离,用那些 API 去注入。我记得还有些权限问题,比如 https://github.com/syhyz1990/baiduyun/pull/223/files 记不清楚为什么了。