Ошибка: 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