Webブラウザーはiframe内のJavaScriptに対して個別の実行スレッドを使用しますか?
Chromeはタブごとに個別のスレッドを使用するため、iframe内のJavaScriptは親ウィンドウと同じスレッドを共有すると思いますが、これもセキュリティ上のリスクのようです。
chromeが登場する前は、すべてのブラウザのすべてのタブがJavaScriptの同じシングルスレッドを共有していました。Chromeここでゲームをアップしました。
これはブラウザ実装の詳細なので、確実な答えはありません。古いブラウザは間違いなくそうではありません。 iframeに別のスレッドを確実に使用しているブラウザーについては知りませんが、正直なところ、実際に調べたことはありません。
スレッドの実行に伴ってオブジェクトがもたらされることはないため、これはセキュリティリスクではありません。
他の回答を要約すると、いいえ、iFrameは通常、メインページと同じスレッド/プロセスで実行されます。
ただし、Chromiumチームはこの分野でのさらなる分離に取り組んでいるようです。
Chromium Issue 99379:Out of process iframes [申し訳ありませんが、リンクが機能していません-機能する問題へのリンクが見つかった場合は、お知らせください]
今夜、既存の回答を確認する前に、同じ質問をしました。私が現在取り組んでいるプロジェクトでは、別のフレームワークを使用するiFrameをロードする必要があります。そのiFrameがスレッドをブロックしてアプリに影響を与える可能性がある場合、私は好奇心をそそられました。答えは「はい」です。
私のテストはChromeで行われました。親には、子iFrameをロードしました。親では、間隔ごとにconsole.logテキストに間隔を設定しました。次に、iFrameでタイムアウトを使用して、スレッドをブロックする「while」を起動しました。答え:iFrameは同じスレッドを使用します。
例:
親では:
setInterval(() => {
console.log('iFrame still using the thread');
}, 3000)
IFrame内:
setTimeout(() => {
console.log('now the thread is not working in the iFrame anymore');
while (true) {
}
}, 10000)
これについては後で説明しますが、Firefox 16ではiframe jsが同時に発生しているようです。
アラート機能(ブロッキング)を使用すると、ダイアログが一緒に開くのがわかります。
ChromeまたはIEには表示されません。
iframe jsは通常どおりFirefox 16の親ウィンドウにアクセスする可能性があるため、発生する可能性のある競合状態を考えることができます。
Chrome 28)でこれを試してみました。このコマンドを使用してChromeのスレッドとプロセスを確認しました
ps axo pid,nlwp,cmd | grep "chrome"
Chromeはiframeの新しいスレッドまたはプロセスを生成しません。興味深いことに、開発ツールペインの新しいプロセスを生成します。
最近iFrameで実行されているJavaScriptがJavaScriptを親ウィンドウで実行できないようにするかどうかをテストしました。
親と同じドメインのiFrame:
親として別のドメインのiFrame
parent.html:
<body>
<div id="count"></div>
<iframe src="./spin.html"></iframe>
<script>
let i = 0;
let div = document.getElementById("count");
setInterval(() => {
div.innerText = i++;
}, 100);
</script>
</body>
spin.html:
<body>
<button id="spin">spin</button>
<script>
const spin = document.getElementById("spin");
spin.addEventListener('click', () => {
const start = Date.now();
while (Date.now() - start < 1000) { }
})
</script>
</body>
IFrameの場合、違います。ただし、JavaScriptでスレッドを使用する場合は、Webワーカーを使用できます。Webワーカーは、新しいブラウザーでサポートされているhtml5ドラフトです。 http://www.w3.org/TR/2009/WD-workers-20091029/