Ответ 1
Фон
Не добавляет ли Greasemonkey мои расширения JavaScript? Может кто-нибудь прояснить это для меня, пожалуйста.
Greasemonkey выполняет ваши скрипты в sandbox, которая является ограниченной средой без прямого доступа к JavaScript на странице. Более ранние версии Greasemonkey вводили скрипты непосредственно на страницу, но это приводило к серьезным уязвимостям безопасности. В старой модели скрипты выполнялись с повышенными правами браузера chrome, что позволяло удаленным страницам получать доступ к встроенным функциям Greasemonkey с помощью (источник)
Когда вы получаете доступ к объекту window
из Greasemonkey script сегодня, то вы получаете объект , который косвенно ссылается на фактический window
свойства. Этот объект-обертку можно безопасно модифицировать, но важные ограничения. Доступ к фактическому объекту окна обеспечивается unsafeWindow
(сокращенное обозначение window.wrappedJSObject
). Использование unsafeWindow
повторно открывает все исходные проблемы безопасности Greasemonkey и недоступно в Chrome. Его следует избегать, когда это возможно.
Хорошая новость: существует безопасный способ работы с новой безопасностью модели Greasemonkey по крайней мере двумя способами.
Script Инъекция
Теперь, когда скрипты Greasemonkey могут безопасно обращаться к DOM, тривиально: вставить тег <script>
в <head>
целевого документа, Создайте такую функцию:
function exec(fn) {
var script = document.createElement('script');
script.setAttribute("type", "application/javascript");
script.textContent = '(' + fn + ')();';
document.body.appendChild(script); // run the script
document.body.removeChild(script); // clean up
}
Прост в использовании:
exec(function() {
return Grooveshark.playNextSong();
});
Местоположение Hack
Script В некоторых случаях инъекция может быть чрезмерной, особенно если вам нужно только изменить значение переменной на странице или выполнить одну функцию. Location Hack использует javascript:
URL для доступа к коду в содержимом документа. Это очень похоже на запуск букмарклета из Greasemonkey script.
location.assign("javascript:Grooveshark.playNextSong();void(0)");
Бонус Script
Здесь представлен полный Greasemonkey script, который демонстрирует приведенные выше примеры. Вы можете запустить его на этой странице.
// ==UserScript==
// @name Content Function Test
// @namespace lwburk
// @include http://stackoverflow.com/questions/5006460/userscripts-greasemonkey-calling-a-websites-javascript-functions
// ==/UserScript==
function exec(fn) {
var script = document.createElement('script');
script.setAttribute("type", "application/javascript");
script.textContent = '(' + fn + ')();';
document.body.appendChild(script); // run the script
document.body.removeChild(script); // clean up
}
window.addEventListener("load", function() {
// script injection
exec(function() {
// alerts true if you're registered with Stack Overflow
alert('registered? ' + isRegistered);
});
// location hack
location.assign("javascript:alert('registered? ' + isRegistered);void(0)");
}, false);