我有通過插入<script>
標籤,像這樣運行大部分在非特權上下文代碼的Greasemonkey的userscript:如何爲我的頁面的Javascript提供Greasemonkey的GM_xmlhttpRequest的有限接口?
function code {
...
}
var script = document.createElement("script");
script.type = "application/javascript";
script.innerHTML = "(" + code + ")();";
document.body.appendChild(script);
這避免了需要做危險的事情與unsafeWindow
。
但是,我的代碼需要從另一個不支持JSONP的域上的API獲取信息。 GM_xmlhttpRequest
可以訪問其他域,但僅在特權Greasemonkey上下文中可用。
我想寫一個函數,它提供了一個有限的接口,並使用GM_xmlhttpRequest
完成我需要的API調用,然後將這個(理論上安全的)函數暴露給正常的頁面上下文。我在第一次嘗試是這樣的:
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()
從頁面上下文中,我看到的,字符串化GM_xmlhttpRequest
和「Foo!」「吧!」在控制檯日誌中。但是,我從來沒有在控制檯或警報中獲得響應。如果我在GM上下文中自行創建GM_xmlhttpRequest
,則會同時收到警報和日誌消息。
問題是:我試圖做甚至可能嗎?還是有另一種方式來完成同樣的事情?
爲什麼你要在一個無特權的環境中運行你的代碼? – rampion 2009-06-10 20:04:59