错误:访问属性“处理程序”的权限被拒绝

IT技术 javascript jquery firefox greasemonkey
2021-03-16 14:06:23

我有一个用于 Firefox 的油脂猴脚本,昨天运行良好。我今天尝试使用它(没有修改代码),我注意到它停止工作。经过进一步检查,脚本现在抛出以下错误:

Error: Permission denied to access property 'handler'

在以下代码块中抛出此错误:

$('body').click(function() {
    // code here
});

当脚本昨天运行得很好时,这个错误今天神奇地开始发生。我不明白为什么在尝试做一些如此基本的事情时会发生这个错误,比如在 jQuery 中添加一个事件处理程序。

我的脚本使用 jQuery,该脚本已在执行脚本的页面中使用,因此我使用此代码使其可供 GM 访问:

var $ = unsafeWindow.jQuery;

如果需要,作为参考,以下是我在脚本中使用的以下 Greasemonkey 函数:

// @grant       GM_getResourceText
// @grant       GM_addStyle
// @grant       GM_xmlhttpRequest
// @grant       GM_getResourceURL

我曾尝试研究此错误,但找不到任何答案。所有看起来可能有用的问题都涉及 iframe,并且在我的代码或运行它的网站中找不到单个 iframe。我也试过删除并重新安装脚本,但没有解决问题。

3个回答

Greasemonkey 2.0 刚刚被推送到所有设置为自动更新的 Firefox 浏览器。(GM 2 于 2014 年 6 月 17 日发布,但可能需要几周时间才能完成审核过程。)

Greasemonkey 2.0 从根本上改变了unsafeWindow处理方式

向后不兼容的更改:

通常,要对页面函数或变量进行现场访问,您可以切换到新方法,但是,在您使用的情况下var $ = unsafeWindow.jQuery;——这始终是一种不好的做法。

jQuery 是一个特例,来回克隆它会破坏事情。
@requirejQuery 代替,EG:

// ==UserScript==
// @name        _YOUR_SCRIPT_NAME
// @include     http://YOUR_SERVER.COM/YOUR_PATH/*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant       GM_getResourceText
// @grant       GM_addStyle
// @grant       GM_xmlhttpRequest
// @grant       GM_getResourceURL
// ==/UserScript==
...
MDN 链接已损坏,因此只需将其添加为使用嵌套函数 ( foo = {bar: function(){..})注入对象的快速示例unsafeWindow.foo = cloneInto({}, unsafeWindow); unsafeWindow.foo["bar"] = exportFunction(function() {}, unsafeWindow.foo);
2021-04-22 14:06:23
2021-04-24 14:06:23
谢谢!cloneInto() 为我工作。在我的例子中,我试图将一个对象从我的 GM 脚本传递给另一个脚本,当另一个脚本试图访问它时,它抛出了一个权限被拒绝的错误。
2021-05-08 14:06:23

您正在使用unsafeWindow- 正如名称所暗示的那样,使用不一定“安全” - 问题可能依赖于此;在 Firefox 中对跨隔间的对象进行了更改:

https://blog.mozilla.org/addons/2014/04/10/changes-to-unsafewindow-for-the-add-on-sdk/

博文提到了Add-on SDK,但变化是在平台上的,所以它也会影响Greasemonkey。

因此,您基本上尝试从一个隔间(jQuery,来自“unsafeWindow”)中获取一个对象并在您的油脂猴沙箱中使用。你现在的做法可能已经行不通了。您可以尝试使用文章中提到的 API,但我担心像 jQuery 这样的整个库可能会有一些问题需要克隆。事实上,最好的方法可能是在您的 Greasemonkey 隔间中也加载 jQuery,而不是重用页面中的那个隔间。

该错误可能是“神奇地”开始的,因为您已经更新了 Firefox 版本 - 或者它会自动更新。

另外,重要的是要注意:FF 30 没有破坏这些unsafeWindow脚本。GM 2.0 做到了。
2021-04-22 14:06:23
这不是 SDK 更改,是影响 SDK 工作方式的平台更改,实际上文章指定的使用wrappedJSObject也受到影响——这意味着,无论 SDK 是什么。我知道这一点,因为我所在的团队做出了这种改变。我不太了解 GM,但如前所述,这是一个平台变化,而 GM 是建立在它之上的。我不知道他们是如何决定处理这种新限制的,但不管是 GM 还是 SDK。
2021-05-03 14:06:23
wrappedJSObject文档显示没有这样的变化。AFAICT,Scriptish 不会以同样的方式受到影响。那篇文章专门讨论了 SDK 的更改,它没有提到 Firefox 本身的任何更改——尽管我们知道这 3 个Components.utils功能是新的。
2021-05-04 14:06:23
你说得对。FF 的(即将到来的)变化推动了 SDK 的变化,进而推动了 GM 的变化。因此,即使 GM 暂时不必破坏某些东西(或以这种安装基础瘫痪的方式),无论如何变化都会发生。
2021-05-04 14:06:23
可能是文档wrappedJSObject过时了,我会与我的队友核对。请注意,此更改专门针对具有不同权限的不同隔间,例如 SDK 或 GM 等沙盒环境以及内容环境。这篇文章的重点是 SDK,因为我们在那里产生了重大影响 - GM 不是由 Mozilla 开发的。可能是 Scriptish 与这种情况不符。您可以在 Firefox 平台的 Core/XPConnect 下的 Bugzilla 中找到大量关于此的更改。同样,这不是 SDK 更改;在我们的案例中,它主要影响 SDK。
2021-05-15 14:06:23

此页面解释了如何在 Greasemonkey 脚本中加载 jQuery:http : //wiki.greasespot.net/Third-Party_Libraries

相关部分是:

// @require       http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
...
this.$ = this.jQuery = jQuery.noConflict(true);

根据文档,jQuery.noConflict()将确保您的脚本的 jQuery 版本不会干扰页面。

另请参阅:Greasemonkey 1.0 中的 jQuery 与使用 jQuery 的网站发生冲突

您上次评论中的问题不清楚。unsafeWindow.$如果@grant设置了 a,则过去半年没有工作错误信息可能会有所不同。如果需要,请打开一个新问题。
2021-05-10 14:06:23
@BrockAdams:这不再适用于最新的 Firefox(34?35?)和 GM。我有@grant,我可以访问unsafeWindowunsafeWindow.$unsafeWindow.$.each()现在因“call()从不同的上下文访问”失败我的猜测是官方文档在这方面已经过时了。
2021-05-11 14:06:23
“官方”的解决方案说,你可以任意使用noConflict(true) 使用适当的@grant值。这个问题是一个授予{大量}的场景,因此该代码是在浪费时间,并且在以后的审查中可能会“头疼”。
2021-05-16 14:06:23
@BrockAdams:我的理解是,无论@grant启用了哪些,上面的代码始终有效我的问题的重要部分是这是官方解决方案。
2021-05-19 14:06:23
noConflict当使用@grantother than时是多余的none——就像在这个问题的情况下一样。@require已经包含在我的答案中。
2021-05-20 14:06:23