Как получить доступ к объектам `window` (целевой странице), когда установлены значения @grant?

Допустим, я работаю со следующей веб-страницей:

<html>
<body>
<span id="click">click me</span>
<script>
var hello = function() {
    alert('hello');
}

document.getElementById('click').addEventListener('click', function(e) {
    hello();
});
</script>
</body>
</html>

и мой скрипт Greasemonkey:

// ==UserScript==
// @name        My Script
// @include     http://example.com/hello.html
// @version     1
// @grant       none
// ==/UserScript==

window.hello = function() {
    alert('goodbye');
}

С отключенным скриптом Greasemonkey, нажав#click элемент на странице отображает предупреждение «привет». Если скрипт включен, при щелчке на элементе появляется предупреждение «до свидания».

Достаточно просто.hello функция с веб-страницы заменяется функцией в скрипте Greasemonkey.

Теперь предположим, что я хочу использовать API Greasemonkey. Когда я установил@grant значение к действительному значению, отличному от 'none' (например,// @grant GM_setClipboard) [что заставляет Greasemonkey запускать сценарий как «сценарий содержимого», а не в области видимости страницы, как в случае с «none»], сценарий Greasemonkey не работает.

window.hello больше не нацеливается на правильный объект на странице.

Заменаwindow.hello сunsafeWindow.hello похоже, это будет работать, но вместо этого в консоли JS выдается следующая ошибка:

Ошибка: в доступе отказано в доступе к объекту

Как я могу переписать сценарий Greasemonkey, имея@grant GM_setClipboard установить на цель и заменить оригиналhello функция на странице?

Системная информация:

Windows 7 64-битнаяFirefox 32.0Greasemonkey 2.2

Ответы на вопрос(1)

Ваш ответ на вопрос