1

<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_xmlhttpRequestGMコンテキストで独自に作成すると、アラートとログメッセージの両方が表示されます。

問題は、私がやろうとしていることは可能でさえあるのかということです。または、同じことを達成する別の方法はありますか?

4

1 に答える 1

1

あはは!回答は同様の質問に投稿されています。

Greasemonkeyはこれを非常に意図的に行い、 0.7.20080121.0互換性ページで簡単な回避策を提供します。

unsafeWindow.foo = function() {
  window.setTimeout(GM_xmlhttpRequest, 0, {
    // ...
  });
};

それはうまくいきます。

于 2009-06-10T19:49:50.467 に答える