<script>
次のようなタグを挿入することで、ほとんどのコードを非特権コンテキストで実行するGreasemonkeyユーザースクリプトがあります。
function code {
...
}
var script = document.createElement("script");
script.type = "application/javascript";
script.innerHTML = "(" + code + ")();";
document.body.appendChild(script);
これにより、で危険なことを行う必要がなくなりますunsafeWindow
。
ただし、私のコードは、JSONPをサポートしていない別のドメインのAPIから情報を取得する必要があります。 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()
ページコンテキストから呼び出すと、文字列化GM_xmlhttpRequest
された「Bar!」である「Foo!」が表示されます。コンソールログにあります。ただし、コンソールやアラートで応答を受け取ることはありません。GM_xmlhttpRequest
GMコンテキストで独自に作成すると、アラートとログメッセージの両方が表示されます。
問題は、私がやろうとしていることは可能でさえあるのかということです。または、同じことを達成する別の方法はありますか?