4

クロスドメイン iframe では contentWindow プロパティにアクセスできないため、純粋な Firefox では機能します。この問題を分離するコードの束を次に示します。

  1. ローカル サーバーに 3 つのファイルを作成します。

test.html

<SCRIPT language="JavaScript" SRC="http://localhost/postmsg.js"></SCRIPT>
<iframe src="http://127.0.0.1/iframe.htm" id="iframe"></iframe>
<div>Click anywhere on this page to see message from embedded iframe,
which do not need to be on the same domain</div>

iframe.html

<SCRIPT language="JavaScript" SRC="http://127.0.0.1/postmsg.js"></SCRIPT>
<div id="message"></div>

postmsg.js

// ==UserScript==
// @include       *
// ==/UserScript==

alert('script loaded')
window.addEventListener('click', 
    function() {
        frame = document.getElementsByTagName("iframe")[0]
        cwindow = frame.contentWindow //here comes the error anything after this line won't execute in greasemonkey
        alert("this won't show in greasemonkey");
        cwindow.postMessage("hello, iframe!","*")
    },
true);

window.addEventListener("message", function(e){
        alert("message from iframe: main window was clicked!  " +e.data);
        document.getElementById('message').textContent += "message from iframe: main window was clicked!\n"
}, true);

この js ファイルは、標準のインクルード ファイル html として機能し、最初のコメントは無視されますが、拡張子を user.js に変更すると、グリースモンキーにインストールでき、contentWindow が呼び出されると次の行で機能しなくなります。

メインとフレーム化されたhtmlがjsインタープリターの同じサーバー上にある場合でも、jsインタープリターはlocalhostと127.0.0.1が同一であることを認識しないため、これらのファイルは異なるドメインにあることに注意してください

「@include *」を入れたので、別の Web サイトで確認できます。このエラーは、クロス ドメインの iframe にのみ存在するようです。translate.google.com にアクセスすると、複数の iframe があり、すべてが同じドメインにある場合、このスクリプトは期待どおりに機能します。

問題は、グリースモンキーでクロスドメインセキュリティチェックが何をしているのかということです。これは、このツールの使用法と矛盾します。悪意のある Web サイトはスクリプトをインストールできません。ユーザーはそれに同意する必要があります。クロスドメインiframeに表示されているプロパティが実際にはブラウザのjsエンジンで利用できないことをfirebugが示していなかったため、私はこれに長い間行き詰まりました。

4

0 に答える 0