0

(ここにクロス投稿)

やあ、

拡張機能のバックグラウンド ページの iframe に読み込まれるサンドボックス ページ (マニフェストで指定) があります。サンドボックス化されたページ内から、新しいウィンドウを開いて書き込みたいと思います。

var win = window.open(); win.document.write('<p>Hello!</p>');

これは、拡張機能のバックグラウンド ページと通常の Web ページから機能しますが、コンテンツ スクリプトまたはサンドボックス化されたページのいずれかから呼び出すと、ウィンドウが開きますが、win オブジェクトにアクセスできません (定義されていますが、空です---console.log が出力します)窓 {}")。

これは、同一オリジン ポリシー (サンドボックス環境内ですべてのウィンドウに独自のオリジンが与えられている) によるものだと思います。ただし、ウィンドウが about:blank ページを開くため、これが問題になる理由がわかりません。

これは機能ですか?これを回避するためにマニフェストに追加できるパラメーターはありますか? また、postMessage を使用してバックグラウンド ページに戻る必要のない回避策を知っている人はいますか? 私の理想的な解決策は、サンドボックス化されたスクリプトで新しいウィンドウを開いて、メッセージの受け渡しではなく直接操作することです。

必要に応じて完全な例を提供できますが、誰かが頭のてっぺんから知っていることを願っています。Mac では Chrome 24.0.1312.57 を、Ubuntu では 24.0.1312.68 を実行しています。

ありがとう、

ハンク

4

2 に答える 2

0

ここのクロスポストによると、問題は実際に開いたウィンドウに一意のオリジンが与えられていることです。これは、標準ワーキング グループ (SWG) のメンバーが、サンドボックスの起源を継承する about:blank ページの例外を作成しない方がより安全であると感じたため、意図的なものでした。

ただし、この問題を回避するには、少なくとも私の目的のために、次の方法を使用できます。まず、サンドボックスを忘れてください。この回避策では、背景ページに埋め込まれた iframe を使用し、src url を に設定しdata:text/html,...ます。これにより、iframe に一意のオリジンが与えられるため、拡張スペースにはなくなります。つまり、eval は使用でき、chrome API にはアクセスできません。サンドボックスとは異なり、iframe から開かれたウィンドウは iframe と同じオリジンを共有するため、作成されたウィンドウにアクセスできます。例えば:

バックグラウンド HTML ページ:

<html>
<head>
    ...
    <script src="background.js"></script>
    ...
</head>
<body>
    ...
    <iframe id="myframe"></iframe>
    ...
</body>
</html>

background.js で:

...
document.getElementById('myframe').setAttribute('src', 'data:text/html,'+ 
    encodeURI('<html><head>'+
    '<script src='+chrome.extension.getURL('jquery.js')+'></script>'+
    '<script src='+chrome.extension.getURL('myscript.js')+'></script>'+
    ...
    '</head><body></body></html>'
));
...

myscript.js で

jQuery(document).ready(function(){
    ...
    // To receive messages from background.js.
    window.addEventListener('message', function(e){ ... } );

    // To send messages to background.js.
    parent.postMessage({...}, '*');

    // To open AND ACCESS a window.
    var win = window.open();
    win.document.write('Hello'); // Fails in sandbox, works here.

    // Eval code, if you want. Can't do this from an extension
    // page loaded normally unless you allow eval in your manifest.
    // Here, it's okay!
    eval( 'var x = window.open(); x.document.write("Hi!")' );

    // No chrome apis.
    chrome.log( chrome.extension ); // -> undefined
    chrome.log( chrome.windows ); // -> undefined

    // No direct access to background page (e.g., parent).
    chrome.log( parent ); // -> Window with no properties.
    ...
});
于 2013-02-16T16:58:51.917 に答える
0

定義上、コンテンツ スクリプトは、ロードする外部の通常の Web ページの一部であるため、コンテンツ スクリプトではなく、「通常の Web ページ」でスクリプトがどのように機能するかはよくわかりません。コードを自分のページに埋め込むと機能するが、コンテンツ スクリプトを介して他のページには機能しないということですか?

いずれにせよ、スクリプトがバックグラウンド ページから適切に機能している場合は、いつでもメッセージを送信してみてください。(詳細はこちら: http://developer.chrome.com/extensions/messaging.html )

サンドボックス/コンテンツ スクリプトのスクリプト:

//send message to background page
chrome.extension.sendMessage({todo: "newWindow"}); 

バックグラウンド ページ:

//create a listener
chrome.extension.onMessage.addListener(
  function(request, sender) {   
    if (request.todo === "newWindow") {
    //do your stuff here
        var win = window.open(); win.document.write('<p&gtHello!</p>');
    }
  });
于 2013-02-16T15:29:32.713 に答える