Greasemonkey: 弹出安装对话框时不要导航到脚本

创建于 2018-01-26  ·  20评论  ·  资料来源: greasemonkey/greasemonkey

如果我没记错的话,即使是 3.x 也是这样。 我们应该仍然能够使用 WebExt API:

  1. 如果检测到导航到任何.user.js ,则中止导航。
  2. 在后台重新启动该 URL 的下载。
  3. 如果该下载导致不匹配的 MIME,请重新启动导航 - 已过滤,因此我们不会中止它。
  4. 否则,弹出安装对话框并继续所有下载。

最有用的评论

如果审查源代码的可能性没有恢复,我会非常难过。 通过浏览代码,我总是感觉更舒服。 如果有@require包含不指向众所周知的库(官方托管的 jQuery 等),我总是持怀疑态度,通常会中止安装,除非我真的需要该脚本(在这种情况下,我会略读@require的内容也)。

但即使我是一个例外,大多数人不看或不理解代码,我认为脚本编写者在安装时知道源代码是有预防作用的。

如果您仍然决定不显示源代码,那么请在安装脚本时添加易于访问的 view-source: 指向源代码的链接(最好还包括任何@require脚本)。

所有20条评论

我真的认为这应该重新考虑。 VM 和 TM 的行为都与此相反。 导航到脚本时,您会看到一个页面,其中包含脚本内容/源和安装按钮。 虽然您在技术上被“重定向”,但本质上您仍在“导航”到用户脚本。 也许这应该在-users-dev邮件列表中提出并查看其他人的意见?

我支持社区讨论。

就我个人而言,我认为~没有人审查源代码,因此向所有用户展示它是一件愚蠢的事情,包括大多数甚至无法理解它的用户。

并且:仅查看主要来源,当还有@require ,完成的很少。

如果审查源代码的可能性没有恢复,我会非常难过。 通过浏览代码,我总是感觉更舒服。 如果有@require包含不指向众所周知的库(官方托管的 jQuery 等),我总是持怀疑态度,通常会中止安装,除非我真的需要该脚本(在这种情况下,我会略读@require的内容也)。

但即使我是一个例外,大多数人不看或不理解代码,我认为脚本编写者在安装时知道源代码是有预防作用的。

如果您仍然决定不显示源代码,那么请在安装脚本时添加易于访问的 view-source: 指向源代码的链接(最好还包括任何@require脚本)。

如前所述,我也很看重审查能力。 对于想要它的少数人。 我只是希望它像 #2567 一样工作,以便您可以查看来源的_所有_。 您只需在安装后单击编辑,即可看到所有源代码和文本资源。 根据您的选择启用或卸载。

需要多个网络请求有一些性能影响。 具体来说,在你的3.4.有“下载到我们有一个有效元区块的点,所以我们可以弹出安装对话框”。

假设该文件不是实际的用户脚本并且没有有效的元区块。 安装对话框永远不会弹出。 我看到的唯一行动方案是恢复导航。 一旦导航恢复,文件必须重新下载。 一个不必要的请求(#2830 通过扩展onHeadersReceived当前正在做的事情来解决这个问题)。

你以前已经提出过这一点,应该考虑一下。 如果连接速度慢会怎样? 例如,假设下载文件需要 10 秒。 当 GM 尝试下载以寻找脚本时,用户将有 10 秒的无反馈时间。 它失败并将其交给浏览器以继续导航。 再过 10 秒下载文件以供显示。

我不会说没有办法解决这个问题。 例如,数据可以被缓存等等,然后在实际导航中覆盖输出。 但我觉得这会导致不必要的代码复杂性,只是为了屏蔽用户。

或者,您无论如何都可以打开安装对话框,只是无法安装非脚本文件(VM 会这样做)。 我会认为糟糕的用户体验。

如果有人可以在没有额外要求的情况下提出一种干净的方法,那就太好了。 否则,如果没有_实际_好处,我就无法支持。 [1]

[1] 由于#2567,您已经提到“能够查看_所有_源代码”是一个潜在的好处。 但我不同意。 我觉得#2567 应该是一个功能_不管源代码是否在安装时可用。


我不知道。 在其他话题上,经过一些讨论,我已经能够解决。 但这是我没有“看到”的。

从我的角度来看,我并不真正关心脚本是否立即可见,但我认为如果我取消安装或者我应该能够看到原始文件,就像没有安装油脂猴一样。 我真的不在乎它是否在默认情况下隐藏或其他什么,但某种方式来关闭安装对话框并返回到脚本似乎很重要。

我认为打破查看名为*.user.js东西是没有意义的。 这是删除浏览器功能。

我认为用户脚本更像是一个扩展而不是网页。 您也永远不会浏览到扩展程序。 你下载/安装它,或者你不。

我认为打破查看名为 *.user.js 的东西是没有意义的。 这是删除浏览器功能。

它也像以前版本的 GM 一样做事——包括在禁用时不触摸导航。 如果您非常需要在浏览器中看到此内容,请先关闭 GM。

我认为用户脚本更像是一个扩展而不是网页。 您也永远不会浏览到扩展程序。 你下载/安装它,或者你不。

我不同意这个推理。 扩展是一个存档的文件包。 用户脚本不是。 你可以就@requires@resources进行争论,但我认为这是微不足道的。 并非所有人都使用这些,其中很多只是纯文本。 当您导航到原始文本页面时,您通常(假设未设置附件/下载标题......我也觉得很烦人)在查看之前不需要下载它。

它也像以前版本的 GM 一样做事

当然,但我不认为这是支持或反对任何特定功能的重要论据。 以前的版本可以提供一个基线,但我认为一切都应该在新的背景下重新审视。 这包括代码复杂性、它提供或没有灌输的好处、优点等。

您也永远不会浏览到扩展程序。 你下载/安装它,或者你不。

作为文本文件确实有所作为。 例如,github 有一个“查看原始”选项,现在已损坏。

包括禁用时不触摸导航。

很高兴知道这一点。 我想我可能已经猜到了,但这真的不明显。 我只是很慌张,因为我试图查看一个文件但它不会呈现。 也许我们可以向用户提供一个提示,当他们遇到它时可以这样做,而不是显示一个空白页面。

我重视为大多数用户提供最大价值的设计决策,因此我重视输入。

然而,这将是一种罕见的情况,我将脚踏实地。 不要打扰辩论的方法。 我想要的行为是:有一个指向有效用户脚本的链接,我单击该链接,我看到(仅)安装对话框,我从不导航到文本文件,实际上从未看到源。 我将尽一切努力让 Greasemonkey 以这种方式行事。 时期。


在 WebExt 之前,我们通过使用http-on-modify-request来尽快暂停任何用户脚本请求。 我们将触发安装对话框,并启动RemoteScript操作以下载所有部分,全部在新请求中。 如果这在看起来像用户脚本的 URL 上检测到非用户脚本(即 HTML)内容,它将取消它拥有的请求,并且......某些东西会重新启动导航(我认为通过完全恢复频道,但是我找不到那个)。

对于慢速脚本,一开始什么也不会发生——一旦加载了==UserScript==部分,就会出现安装对话框,然后在下载其余部分时它的进度条就会填满——脚本的其余部分,即资源,需要, 等等。

它确实设法通过与服务器的一个连接来下载脚本。


在 WebExt 下,当然所有的 API 都不同,但是 HEAD _似乎_ 中已经存在的阻塞/过滤onHeadersReceived事件是最好的使用方法。 我还得做研究。

我想要的行为是:有一个指向有效用户脚本的链接,我单击该链接,我看到(仅)安装对话框,我从不导航到文本文件,实际上从未看到源。 我将尽一切努力让 Greasemonkey 以这种方式行事。

但这是对旧行为的改变。 GM 3.x 我可以选择单击查看源代码而不是安装,然后什么也没有安装,但是我得到了一个显示脚本源代码的选项卡。 从那里我可以安装或关闭选项卡而不做任何事情。 这将是我至少希望再次看到的行为。 对我来说,没有必要总是显示源代码,但是我像之前检查它的选项会很棒。

这个请求的原因是我看到了恶意脚本可能造成的危害,因此我总是在安装任何东西之前检查源代码。 这就是为什么我也将静默自动更新视为一个问题的原因,因为它可能会给用户带来新的恶意代码。

使用webRequest您可以返回一个虚假的 URL来中止加载并使浏览器停留在原来的位置。 但是这样做会立即中止连接,您也不能使用过滤器来观察/解析/更改内容,因此您需要启动一个新连接。 我认为在这种情况下这很好,因为我们已经在范围内获得了我们需要的所有数据(请求方法、响应标头),因此我们可以对这是否真的是用户脚本做出自信的决定,而且它也是在请求周期的早期。

在我安装任何东西之前,我可以选择......检查它......

2567

如果它看起来像一个用户脚本,但它不是呢? 例如,如果您以慢速加载为例,只需删除初始的// ==UserScript== 。 在 3.x 中打开它,安装对话框永远不会打开(正确),然后将文本内容写入选项卡/页面。 使用 WebEx,如果您在后台创建新连接,我看不到如何将内容写入页面。 据我所知,在后台将一些内容写入页面的唯一直接方法是通过流过滤器。

我可以想出一些方法来“解决”这个问题。 再次没有好的解决方案。 将数据传递给内容脚本,该脚本只会回显内容(我认为应该可行)。 重定向到扩展页面,但这会破坏历史记录。 或者使 FF 重新启动请求并设置一些标志以忽略脚本检查。 但这是第三个请求..

也许我错过了一些东西..

在 3.x 中打开它,安装对话框永远不会打开(正确),然后将文本内容写入选项卡/页面。

呃,我想纠正这一点。 我错了,我最初测试时在user有一个错字。

@Sxderp让我重复一遍,我非常重视您迄今为止所做的贡献,并希望您能继续。

但是为了更清楚地说明我上面概述的决定:我已经清理了我正在进行的工作; 首先,我将一些不相关的工作移到单独的提交中。 剩下的是文件重命名,然后是这个大提交,只有+ 425 -491。

Downloader类封装了有关(下载和)安装脚本的所有逻辑,无论来源如何。 您只需要设置输入——只是安装的 URL,还有主脚本源和可能需要/资源内容(如果已知)(对于编辑案例),它会下载任何其他缺失的内容(即在新的 require 中编辑) /resource) 并将始终相同的格式传递给user-script-regstry ,它仅以一种方式保留它。 整个downloader.js不到 250 行。 因此,在后台/内容之间传递的消息较少,并且没有新端口。

有时将一大段复杂的代码分解成更小、更简单的代码段是很有意义的。 但 IMO 并非如此。 流动的数据是相同的,无论我们是安装“新”脚本,还是更新脚本,或者就地编辑脚本。 只有很小的事情发生了变化(我们是否已经知道已安装脚本的 UUID?我们是否已经知道或需要下载这个或那个?)。

这是否也解决了parsedDetails的递归结构(某处有问题,没时间去找)?

我不知道。 我对此表示怀疑?

这是否也解决了parsedDetails的递归结构(某处有问题,没时间去找)?

你是说#2806?

此页面是否有帮助?
0 / 5 - 0 等级