Greasemonkey: 允许安装本地文件

创建于 2017-10-12  ·  44评论  ·  资料来源: greasemonkey/greasemonkey

在过去,您可以 File>Open a .user.js并安装它。 到目前为止,在 4.0 中,它什么都不做,只是打开文件。

所有44条评论

也许这个(匹配模式文档)? 在该方案的匹配选择器中使用*仅通向 http 或 https。 建议为file://添加一个额外的匹配项。

那个或<all_urls>选择器。

添加匹配模式来检测file:///脚本只会导致我们启动一个无法读取该 URL 内容的 XHR,这令人惊讶。

我一直在研究这个。 我得出了两个结论。 该问题可能与不允许文件系统访问 WebExtensions 相关,即使通过 XHR 只读(没有直接来源;编辑:最底部)。 或者它可能与同源策略有关

从 Gecko 1.9 开始,文件只能读取某些其他文件。 具体来说,只有当原始文件的父目录是目标文件的祖先目录时,一个文件才能读取另一个文件。

可能值得在错误报告中提出允许文件系统访问使用file://协议在清单中定义的路径。

是的,这可能是“无文件”规则。 不知道从哪里获得官方指导,但我现在考虑一下,我知道这是真的。 你只会得到非常特殊的例外,比如用于制作新文件的下载 API。

我们可以尝试找到一种解决方法,例如直接处理拖放操作,或者(大声笑)读取已经打开的选项卡的内容。 但是我们无法获取相关的图标/资源/要求,所以它仍然不会去,没有更多的解决方法。

在导航到安装页面之前,您不能使用storage.local来缓存使用 url 作为键的内容吗? 您已经拥有变量中的内容。 当然,一旦安装/坚决不安装,就必须清除缓存。 如果 WebExtensions 有某种临时存储,这样他们就不必手动处理驱逐,那会更方便。

我一直在胡说八道,这并不像我想象的那么简单。 首先,任何用户脚本都可以访问browser.storage.local因此对于像 Greasemonkey 这样的插件来说,它本质上是一个不安全的存储空间。 其次,通过消息将内容发送到后台脚本也是如此。 我不太确定如何保护它以确保消息仅从script-detect.js 。 由于脚本的异步性质,我不确定script-detect.js在用户脚本之前运行(我将对此进行一些测试)。

当然,除非我弄错了,否则后台脚本不会在任何导航侦听器中收到对 DOM / 内容的任何引用?

事实证明,您可以使用onBeforeRequest['*://*/*.user.js']上的匹配来获取页面内容,然后创建一个StreamFilter 。 我已经在我最近发布的分支中实现了一些代码测试,目前没有拉取请求,因为它没有_修复_任何东西。 但是,它确实避免了我在上一篇文章中提出的安全问题。

不幸的是,它没有解决所讨论的文件问题。 上面有一些 bugzilla 票:
https://bugzilla.mozilla.org/show_bug.cgi?id=1341341
https://bugzilla.mozilla.org/show_bug.cgi?id=1266960

我是从 #2671 被引导到这里的

如果此线程是关于从本地文件导入.... 那么...
为什么要使用 XHR 读取本地文件? 它会导致起源和权限的各种复杂情况。
最简单的方法是从input type="file"的结果中使用new FileReader() input type="file"

如果这个线程是关于将file:///.....user.js URL 识别为脚本并安装它们,那是不同的问题和不同的解决方案。

简单的方法是从 input type="file" 的结果中使用 new FileReader()

啊,这可以工作。 它不像导航到file://路径并让扩展为您做所有事情那么优雅,但它可以工作。 大部分工作流程可以保持不变。

import script -> script selected -> contents cached in backend -> install dialog prompt -> retrieve content from backend -> continue install as usual

它比我在尝试保持导航工作流程时尝试使用的方法安全得多。

使用“input type="file"”找到了一个工作的 webextension 示例。 好像不用缓存,直接导入即可:
https://github.com/mdn/webextensions-examples/pull/171/files/6c066cfff4e8c662984f704cb17c8b39211ed062#diff -098de1750b345156f3cfd46f8199aa3

好像不用缓存,直接导入即可

这不是缓存是_需要的_,而是一种安全措施。 就像当您导航到 .user.js 时,弹出的对话框会告诉您有关脚本的一些信息。 我认为在您进行导入时应该会发生同样的情况。 因此,您需要将脚本内容存储在不在普通数据库中的某个位置,以便用户单击安装按钮时,您仍然可以使用它,而无需再次提示用户。

无论是使用存储 API 缓存还是仅缓存在某个全局对象中,对于工作流来说都没有特别重要的意义。

我还想说,导入功能应该成为重中之重[1],因为它可以帮助有迁移问题的人。 他们只能从 3.x 导入文件。

[1] 如果@arantius对流程应该如何工作有一些想法,我会调查一下。

如果需要示例,我在许多插件中都有 import./Export 。

导入是用户启动的,因此不需要额外的预防措施/弹出窗口/通知/警告。

在其中一个对话框中添加导入按钮(文件输入)
一旦用户点击它,文件选择器打开..用户选择所需的文件并点击打开(所有内置的HTML5)
文件被读取和解析
如果它符合用户脚本,则将其添加到 IDB
然后更新正在运行的侦听器

就这些....

我在导入/导出首选项、主题数据(最多 500kb)和许多其他具有导入/导出功能的附加组件中执行相同操作。

我还想说导入功能应该成为重中之重[1]

确实......这使脚本编写者能够编写新脚本并导入以运行或测试,并且在 GM3 -> 4 升级的情况下,添加丢失的脚本。

代码和功能非常简单……几行代码,一个小时就可以搞定。
如果您愿意,可以使用我的代码作为基础。

...导入是用户启动的,因此不需要额外的预防措施/弹出窗口/通知/警告。 ...如果它符合用户脚本,则将其添加到 IDB

我不确定这一点。 我不是特别喜欢跳过标准安装对话框。 也许@arantius可以就他希望在插件中看到的内容提供一些见解。

我不确定这一点。 我不是特别喜欢跳过标准安装对话框。

当用户遇到来自远程源的用户脚本时,使用标准对话。 然后需要确认对话。

在用户启动导入的情况下:

  • 用户决定导入脚本
  • 用户点击导入按钮
  • 用户导航到用户选择的脚本
  • 是否需要通过对话再次询问用户“您真的要安装此脚本吗?” :)
    这看起来很烦人。 但是,在出现错误时发出警告是必要的。
  • 用户导航到用户选择的脚本

但这不是它的方式......安装是通过回调(在*.user.js上触发)......

但这不是它的方式......安装是通过回调(在*.user.js上触发)......

目前,是的。 但是可以为本地文件添加导入按钮。 并且不要在导航上安装file://

啊,好吧,对于本地文件,这是非常合适的。 不适用于远程文件! ;-)

但这不是它的方式......安装是通过回调(在*.user.js上触发)......

如前所述,我们正在讨论使用文件输入的手动导入

是的,我知道了。 对于本地文件,这对我来说没问题(见上文)...

我认为可以将 .user.js 拖放到 Greasemonkey 窗口中以将脚本代码加载到其中吗?
因为这绝对适用于 Firefox 本身(即我可以将文件上传到网站,如 imgur,或通过删除它的 megaupload)

有没有一种方法(甚至是笨拙的非拖放方法)允许我导入本地 GM 脚本?

脚本最终应该放在哪个“缓存”目录中? 我在 Firefox 配置文件中发现了几个“缓存”文件

我认为可以将 .user.js 拖放到 Greasemonkey 窗口中以将脚本代码加载到其中吗?

这是可能的,就像任何其他下拉框一样(以我的 IMGoolge 为例)。 然而,直接的文件输入将是最简单的方法,不需要额外的监听器和进程。

Mozilla 更新了文档(上面例子的总结):
https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Working_with_files

  1. 使用文件选择器打开扩展名中的文件
  2. 使用拖放打开扩展中的文件

实现此功能后,我们将拥有与 GM3 中相同的行为。

那么,对于手动安装未以适当的在线形式提供的脚本,有什么可能的建议吗?

@Samizdata目前最简单的方法是获取 GM 测试版(https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/versions/beta),打开猴子菜单 --> 新脚本。

如果您有@require本地文件的脚本,则只能以艰难的方式进行。 例如获取 Proxomitron ( http://www.proxomitron.info/files/ ),运行它,配置 FF 使用代理 127.0.0.1:8080,将您的文件放在 Proxomitron HTML 文件夹中,然后在 FF 中使用“ http: //bweb..local.ptron/YOURFILE.user.js ".

@kekkc ,我认为修复了远程资源问题的新版本已推送到 AMO。

干杯。 大功告成, @kekkc

@kekkc ,我认为修复了远程资源问题的新版本已推送到 AMO。
还没有。。据我所知

@Sxderp我们指的是 #2707 吗?

@Eselce ,是的。 这_应该_解决使用“新脚本”按钮创建新脚本然后将@require标记应用于脚本时出现的问题。

要在本地提供.user.js或所需的脚本,有多种可能性。 但最简单的方法是在命令行中使用这个 Python one-liner:

  • 对于 Python 2.x:
    python -m SimpleHTTPServer

  • 对于 Python 3.x:
    python -m http.server

...它立即开始为您运行它的目录中的所有文件提供服务,位于http://127.0.0.1:8000/

(_注意 8000 是默认端口;您可以更改它;见下文_)

这就是我如何将我的本地.user.js和 require 文件放在本地 http 服务器中。 我为 Greasemonkey 和 Tampermonkey 这样做。

Python 默认安装在 Linux 和 MacOs 中。 如果您将使用 Windows 并且不会安装它并且仍然计划继续称自己为开发人员,那么... _认真的?! 你怎么了?_你的麻烦比你开始意识到的要严重得多! 我建议园艺 :seedling: 或将编织作为爱好而不是计算机给你 :wink:(_嘿,开玩笑!_)

没有必要安装任何奇怪的程序——你_可以_,但那_绝对没有必要_。 Python 不是“应用程序”,它是一种基本的编程语言。 但是您甚至不需要为这个解决方案“说”Python,所以现在不要退出或急于使用您的编织工具!

琐碎的程序:

  1. cd进入包含.user.js和/或需要文件的目录。 比如说, requiredFile1.jsrequiredFile2.js

  2. 从该目录:对于 Python 2.x,运行

python -m SimpleHTTPServer

或者:对于 Phython 3.x,运行

python -m http.server

  1. 确保您的@require行如下所示:
// <strong i="42">@require</strong>  http://127.0.0.1:8000/requiredFile1.js
// <strong i="43">@require</strong>  http://127.0.0.1:8000/requiredFile2.js

...其中requiredFile1.jsrequiredFile2.js是您想要提供的任何所需的本地文件。

  1. 当您的greasemonkey 脚本触发时,它会正确地获取Python 提供的需求。

完毕。

要关闭本地服务器,只需转到运行 python 命令的控制台并按<Ctrl><C>

另外,-_-并且我希望这对您来说非常明显_--,请不要忘记运行您的 Python HTTP 服务器命令行,然后再期望 Greasemonkey 或 Tampermonkey 能够找到文件...

提示:如果您想使用默认8000以外的端口,只需在您的命令中键入所需的数字(有效端口号),如下所示:

  • 对于 Python 2.x:
    python -m SimpleHTTPServer 12345

  • 对于 Python 3.x:
    python -m http.server 12345

...并自然地使用该数字而不是 8000 更新@require网址。

好的,假设我单击 GM 工具栏图标并选择“新用户脚本....”

新的相应选项卡自动命名为“未命名脚本 821696”

然后我将本地文件 GM 代码粘贴到选项卡窗格中,然后单击左上角的“保存”图标。

我以后在哪里可以找到这个脚本? 阅读:以后如何编辑此脚本?

如何将脚本名称更改为例如“foobar”?

@bsto Name 将取自脚本@name。
所有新脚本都将出现在“新用户脚本...”上方。
要删除或编辑一个你点击脚本的标题,将会有子菜单。

好的谢谢。

还有一个问题:

11 月 25 日,用户 kekkc 在他的帖子(见上文)中告诉我们,Mozilla 提供了一种拖放文件的方法(来自 WinExplorer)。

所以现在应该可以拖放用户文件了。

我对吗?

它什么时候在 GM 中实现(可用于拖放 *.user.js 文件)?

FWIW 我认为我们可以/应该检测到file://.../anything.user.js导航,并附加一个页面操作,该操作可以使用我们可以使用的任何类型的文件浏览器打开 UI。

我们可以检测导航事件但无法获取内容(可能在内容脚本中)

虽然我发现导航到file://只是为了打开文件浏览器很愚蠢(我认为除了文件选择器输入之外我们什么也做不了)。

虽然我发现导航到 file:// 只是为了打开文件浏览器很愚蠢(我认为除了文件选择器输入之外我们什么也做不了)。

是的,我们已经筋疲力尽了。 但是我们可以检测意图并在我们有限的环境中尽可能提供帮助。

我的 2 美分...

FWIW 我认为我们可以/应该检测到file://.../anything.user.js 的导航,
我们可以检测导航事件但无法获取内容(可能在内容脚本中)

正如 Sxderp 所提到的,这是可能的,但有点凌乱......

  • 添加一个监听器(比如tabs.onUpdated.addListener因为你无论如何都需要内容)
  • 让页面加载显示脚本
  • 注入内容脚本抓取页面内容并传递给 bg 脚本
  • 关闭页面/标签

选择 ....

  • 添加导航侦听器
  • 停止页面加载并显示通知以使用导入选项 ... 或 .... 弹出窗口显示用户必须单击以启动文件选择器的导入选项

就我个人而言,如果是我,我会选择不添加额外的侦听器,而只是将 IMPORT 选项添加到 browserAction 弹出窗口中

此外,自 GM4 以来,我一直没有使用.user.js格式,我认为它可以被抛在后面。 ;)

就我个人而言,如果是我,我会选择不添加额外的听众,而只是 ..

这就是我的意思。 不过,我可能会将 UI 注入内容页面。 如果您在 GM 被禁用时导航到一个脚本,我们曾经弹出一个信息栏; 诸如此类的事情。

此外,自 GM4 以来,我一直没有使用 .user.js 格式,我认为它可能会被抛在后面。 ;)

这是什么意思?

这是什么意思?

GM3 要求将脚本命名为abc.user.js以便它们可以被识别为 GM 脚本。

在 GM4 中,脚本被保存到 IndexedDB 并且脚本名称并不重要,因为它从@name获取名称。 因此,我一直在将我的脚本(在计算机上)创建并保存为abc.js (没有.user )并复制/粘贴到 GM 中。

手动导入,我想不需要绑定到.user命名格式。

这方面有什么进展吗?

FireMonkey 扩展可以做到这一点:

https://addons.mozilla.org/en-US/firefox/addon/firemonkey/

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