Ошибка: Permission denied для доступа к обработчику свойств '

У меня есть greasemonkey script для Firefox, который вчера работал отлично. Я попытался использовать его сегодня (код не был изменен), и я заметил, что он перестает работать. При дальнейшем осмотре script теперь выдает следующую ошибку:

Error: Permission denied to access property 'handler'

Эта ошибка генерируется в следующем блоке кода:

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

Эта ошибка волшебным образом начала происходить сегодня, когда вчера script работал отлично. Я не понимаю, почему эта ошибка происходит, когда вы пытаетесь сделать что-то такое основное, например, добавить обработчик событий в jQuery.

My script использует jQuery, который уже используется на странице, на которой выполняется script, поэтому я использовал этот код, чтобы сделать его доступным для GM:

var $ = unsafeWindow.jQuery;

Для справки, если нужно, вот следующие функции Greasemonkey, которые я использую в script:

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

Я попытался изучить эту ошибку, и я не могу найти ответа. Все вопросы, которые выглядят так, как они могут быть полезны, включают в себя iframe, и в моем коде или на веб-сайте, на котором он работает, нет ни одного iframe. Я также попытался удалить и переустановить script, и это не помогло решить проблему.

Ответ 1

Greasemonkey 2.0 только что нажал на все браузеры Firefox, настроенные на автоматическое обновление. (GM 2 был выпущен 17 июня 2014 года, но через процесс обзора может пройти несколько недель.)

Greasemonkey 2.0 радикально изменил обработку unsafeWindow:

Непротиворечивые изменения:

  • Для обеспечения стабильности, надежности и безопасности привилегированная песочница была обновлена ​​в соответствии с новыми изменениями в unsafeWindow для SDK Add-on. Чтобы записать значения в unsafeWindow, вам нужно будет использовать новые методы cloneInto(), exportFunction() и/или createObjectIn().
  • Режим @grant none теперь по умолчанию, и гранты больше не будут подразумеваться, если они явно не указаны. Подробнее см. Сообщение Изменения API Sandbox в Greasemonkey 2.0.

Обычно для доступа к функции или переменной страницы вы можете переключиться на новые методы, но в вашем случае вы используете var $ = unsafeWindow.jQuery; - это всегда было плохой практикой.

jQuery - это особый случай, и клонирование его вперед и назад будет нарушать вещи.
@require jQuery вместо этого, 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==
...

Ответ 2

Вы используете unsafeWindow - что, как следует из названия, не является необходимым "безопасным" для использования - проблема, вероятно, связана с этим; в Firefox было внесено изменение об объектах в отсеках:

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

В блоге упоминается SDK Add-on, но изменения находятся на платформе, поэтому он также повлияет на Greasemonkey.

Итак, вы в основном пытаетесь получить объект из одного отсека (jQuery, из "unsafeWindow" ) и использовать в своей изолированной песочнице greasemonkey. То, как вы сейчас делаете, вероятно, больше не может работать. Вы можете попробовать использовать API, упомянутый в статье, но я боюсь, что целая библиотека, например jQuery, может клонировать какую-то проблему. Фактически, лучший способ - это, вероятно, загрузить jQuery также в ваш отсек Greasemonkey вместо повторного использования одного из первой.

Ошибка, вероятно, началась "волшебно", потому что вы обновили свою версию Firefox, или она получила автоучет.

Ответ 3

На этой странице объясняется, как загрузить jQuery в Greasemonkey script: 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 для вашего script не будет мешать странице.

Смотрите также: jQuery в Greasemonkey 1.0 конфликтует с сайтами, использующими jQuery