浏览器会为iframe提供一个单独的JavaScript线程吗?

jed*_*atu 53 javascript browser multithreading

Web浏览器是否在iframe中为JavaScript使用单独的执行线程?

我相信Chrome会为每个标签使用单独的线程,因此我猜测iframe中的JavaScript会与其父窗口共享相同的线程,但是,这似乎也是一种安全风险.

mxr*_*xro 19

总结其他答案:不,iFrames通常在与主页面相同的线程/进程中运行.

但是,Chromium团队似乎正在进一步孤立这个领域:

Chromium问题99379:进程中的iframe [抱歉,链接不起作用 - 如果你能找到有效问题的链接,请告诉我]

进程外iframe的设计计划


Rob*_*key 18

在Chrome出现之前,任何浏览器的所有选项卡都共享同一个JavaScript线程.Chrome在这里加强了游戏,其他一些人也纷纷效仿.

这是一个浏览器实现细节,因此没有可靠的答案.旧版浏览器肯定不会.我不知道任何浏览器肯定使用iframe的另一个线程,但说实话,我从来没有真正调查过它.

这不是安全风险,因为线程执行不会带来任何对象.

  • 看起来这真的是正确的答案。我可能会尝试创建一个测试来演示它并验证每个浏览器中的行为。 (2认同)
  • 只是想评论一下,有一些非常深奥的方式可能会带来安全风险。我不是安全专家,但请查看 https://blog.sheddow.xyz/css-timing-attack/ (2认同)

Rel*_*ros 11

在检查任何现有答案之前,我今晚自己也有同样的问题.在我正在工作的项目中,我们必须加载一个使用不同框架的iFrame,如果iFrame可能以某种方式阻止线程并影响我的应用程序,那我就很好奇.答案是肯定的,它可以.

我的测试是在Chrome中完成的.在父母我加载了一个孩子iFrame.在父级中,我每隔金额时间为console.log设置一个文本间隔.然后在iFrame中我使用了超时来启动阻止线程的'while'.答案:iFrame使用相同的线程.

例:

在父母:

setInterval(() => {
  console.log('iFrame still using the thread');
}, 3000)
Run Code Online (Sandbox Code Playgroud)

在iFrame中:

setTimeout(() => {
  console.log('now the thread is not working in the iFrame anymore');
  while (true) {
  }
}, 10000)
Run Code Online (Sandbox Code Playgroud)


joe*_*joe 10

2021 年更新:

现在的Origin-Agent-Cluster标头允许您为 iframe 请求专用资源。目前它在 Chrome (88+) 上受支持,并受到 Mozilla 和 Safari 的积极欢迎。

Origin-Agent-Cluster 是一个新的 HTTP 响应头,它指示浏览器阻止同站点跨源页面之间的同步脚本访问。浏览器还可以使用 Origin-Agent-Cluster 作为提示,表明您的源应该拥有自己的独立资源,例如专用进程。

[...] 例如,如果https://customerservicewidget.example.com预计使用大量资源进行视频聊天,并且将在整个过程中嵌入到各种源中https://*.example.com,则维护该小部件的团队可以使用 Origin-Agent-Cluster 标头来尝试减少其对性能的影响嵌入器。

要使用 Origin-Agent-Cluster 标头,请将 Web 服务器配置为发送以下 HTTP 响应标头:Origin-Agent-Cluster: ?1的值?1是布尔 true 值的结构化标头语法。

更多详细信息请参见: https: //web.dev/origin-agent-cluster/


Wea*_*key 9

最近测试了在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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)


mat*_*pop 6

迟到了,但是...好点,因为iframe js似乎在Firefox 16中并发.
尝试使用提醒功能(阻塞),你会看到对话框一起打开.
你不会在Chrome或IE中看到它.
iframe js可以像往常一样访问Firefox 16中的父窗口,因此我可以想到可能出现的竞争条件.

  • "警报""测试"并不一定意味着多线程,只有合作的多任务,这是给定的. (3认同)

Joe*_*eyP 5

今天在Ubuntu的Chrome 28中做了一些实验.使用此命令查看Chrome的线程和进程

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

看起来Chrome不会为iframe生成新的线程或进程.一个有趣的说明是它确实为开发工具窗格生成了一个新进程.

  • 不要混合线程和进程。您可以用一个进程模拟多个线程,如果我没记错的话,这正是 Firefox 所做的(不过 e10s 会改变这一点)。 (2认同)

Eyl*_*tan 5

特尔;博士:

只有 chrome 桌面(不,不是移动)是分离线程。

Firefox 计划在 2021H1 这样做 https://wiki.mozilla.org/Project_Fission#Milestones


我创建了一个小页面,它在主页面的间隔中运行长循环,并在主页面和 iframe 中显示动画。您可以从要查看的浏览器访问该站点。

如果较低的动画(在“crossorigin”下)不停地运行,则它有一个单独的线程。

https://eylonsu.github.io/browser_thread/