У меня есть пользовательский скрипт Greasemonkey, который выполняет большую часть своего кода в непривилегированном контексте, вставляя тег <script>
так:
function code {
...
}
var script = document.createElement("script");
script.type = "application/javascript";
script.innerHTML = "(" + code + ")();";
document.body.appendChild(script);
Это позволяет избежать необходимости делать опасные вещи с помощью unsafeWindow
.
Однако, мне мой код должен получить информацию от API в другом домене, который не поддерживает JSONP. GM_xmlhttpRequest
может обращаться к другим доменам, но доступен только в привилегированном контексте Greasemonkey.
Я хотел бы написать функцию, которая предоставляет ограниченный интерфейс и делает именно вызов API, который мне нужен, используя GM_xmlhttpRequest
, а затем выставлять эту (теоретически безопасную) функцию в обычный контекст страницы. Моя первая попытка в этом была чем-то вроде:
unsafeWindow.foo = function() {
console.log("Foo!");
console.log(GM_xmlhttpRequest.toString());
GM_xmlhttpRequest({
method: "GET",
url: "http://www.example.net/",
headers: {
"User-Agent": navigator.userAgent,
"Accept": "text/html"
},
onload: function(response) {
console.log(response);
unsafeWindow.console.log(response);
alert(response);
unsafeWindow.alert(response);
}
});
console.log("Bar!");
};
Интересно, что когда я вызываю foo()
из контекста страницы, я вижу "Foo!", стробированный GM_xmlhttpRequest
и "Bar!". в журнале консоли. Тем не менее, я никогда не получаю ответ в консоли или в предупреждении. Если я сам создаю GM_xmlhttpRequest
в контексте GM, я получаю предупреждения и сообщения журнала.
Вопрос в том, что я пытаюсь сделать даже возможно? Или есть другой способ выполнить одно и то же?
Ага! Ответ был отправлен на аналогичный вопрос.
Greasemonkey делает это очень преднамеренно и обеспечивает простой способ обхода 0.7.20080121.0.:
unsafeWindow.foo = function() {
window.setTimeout(GM_xmlhttpRequest, 0, {
// ...
});
};
Это работает.