web-dev-qa-db-ja.com

ブラウザはiframeにJavaScriptの別のスレッドを提供しますか?

Webブラウザーはiframe内のJavaScriptに対して個別の実行スレッドを使用しますか?

Chromeはタブごとに個別のスレッドを使用するため、iframe内のJavaScriptは親ウィンドウと同じスレッドを共有すると思いますが、これもセキュリティ上のリスクのようです。

56
jedatu

chromeが登場する前は、すべてのブラウザのすべてのタブがJavaScriptの同じシングルスレッドを共有していました。Chromeここでゲームをアップしました。

これはブラウザ実装の詳細なので、確実な答えはありません。古いブラウザは間違いなくそうではありません。 iframeに別のスレッドを確実に使用しているブラウザーについては知りませんが、正直なところ、実際に調べたことはありません。

スレッドの実行に伴ってオブジェクトがもたらされることはないため、これはセキュリティリスクではありません。

18
Rob Trickey

他の回答を要約すると、いいえ、iFrameは通常、メインページと同じスレッド/プロセスで実行されます

ただし、Chromiumチームはこの分野でのさらなる分離に取り組んでいるようです。

Chromium Issue 99379:Out of process iframes [申し訳ありませんが、リンクが機能していません-機能する問題へのリンクが見つかった場合は、お知らせください]

アウトプロセスiframeの設計計画

19
mxro

今夜、既存の回答を確認する前に、同じ質問をしました。私が現在取り組んでいるプロジェクトでは、別のフレームワークを使用する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)
11
Relu Mesaros

これについては後で説明しますが、Firefox 16ではiframe jsが同時に発生しているようです。
アラート機能(ブロッキング)を使用すると、ダイアログが一緒に開くのがわかります。
ChromeまたはIEには表示されません。
iframe jsは通常どおりFirefox 16の親ウィンドウにアクセスする可能性があるため、発生する可能性のある競合状態を考えることができます。

6
matpop

Chrome 28)でこれを試してみました。このコマンドを使用してChromeのスレッドとプロセスを確認しました

ps axo pid,nlwp,cmd | grep "chrome"

Chromeはiframeの新しいスレッドまたはプロセスを生成しません。興味深いことに、開発ツールペインの新しいプロセスを生成します。

5
JoeyP

最近iFrameで実行されているJavaScriptがJavaScriptを親ウィンドウで実行できないようにするかどうかをテストしました。

親と同じドメインのiFrame:

  • Chrome 68.0.3440.84:ブロック
  • Safari 11.0.2(13604.4.7.1.3):ブロック
  • Firefox 61.0.1:ブロック

親として別のドメインのiFrame

  • Chrome 68.0.3440.84:ブロックしません
  • Safari 11.0.2(13604.4.7.1.3):ブロック
  • Firefox 61.0.1:ブロック

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>
5
WearyMonkey

IFrameの場合、違います。ただし、JavaScriptでスレッドを使用する場合は、Webワーカーを使用できます。Webワーカーは、新しいブラウザーでサポートされているhtml5ドラフトです。 http://www.w3.org/TR/2009/WD-workers-20091029/

0
Stev0