ここのクロスポストによると、問題は実際に開いたウィンドウに一意のオリジンが与えられていることです。これは、標準ワーキング グループ (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.
...
});