У меня есть пользовательский скрипт 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, я получаю и предупреждения, и сообщения журнала.
Вопрос: возможно ли то, что я пытаюсь сделать? Или есть другой способ сделать то же самое?