一、概述
(1)在默认情况下,如果打开一个标签页,那么浏览器会默认为其创建一个渲染进程。
(2)如果从一个标签页中打开了另一个新标签页,当新标签页和当前标签页属于同一站点(相同协议、相同根域名)的话,那么新标签页会复用当前标签页的渲染进程。
二、标签页之间的连接
(1)通过<a>标签
<a href="https://time.geekbang.org/" target="_blank" class="">升升省</a>
点击该链接会打开新的b标签页,新标签页中的 window.opener 的值就是指向a标签页中的 window,这样就可以在新的b标签页中通过 opener 来操作a标签页了。这样我们可以说,这两个标签页是有连接的。
(2)通过 JavaScript 中的 window.open 方法来和新标签页建立连接
new_window = window.open("http://time.geekbang.org")
通过上面这种方式,可以在当前标签页中通过 new_window 来控制新标签页,还可以在新标签页中通过 window.opener 来控制当前标签页。所以我们也可以说,如果从 A 标签页中通过 window.open 的方式打开 B 标签页,那么 A 和 B 标签页也是有连接的。
(3)其实通过上述两种方式打开的新标签页,不论这两个标签页是否属于同一站点,他们之间都能通过 opener 来建立连接,所以他们之间是有联系的。在 WhatWG 规范中,把这一类具有相互连接关系的标签页称为浏览上下文组 ( browsing context group)。
三、浏览上下文组
(1)通常情况下,我们把一个标签页所包含的内容,诸如 window 对象,历史记录,滚动条位置等信息称为浏览上下文。这些通过脚本相互连接起来的浏览上下文就是浏览上下文组。
(2)Chrome 浏览器会将浏览上下文组中属于同一站点的标签分配到同一个渲染进程中
这是因为如果一组标签页,既在同一个浏览上下文组中,又属于同一站点,那么它们可能需要在对方的标签页中执行脚本。因此,它们必须运行在同一渲染进程中。
(3)计算标签页使用的渲染进程数目:
(4) Chrome 浏览器为标签页分配渲染进程的策略
- 如果两个标签页都位于同一个浏览上下文组,且属于同一站点,那么这两个标签页会被浏览器分配到同一个渲染进程中。
- 如果这两个条件不能同时满足,那么这两个标签页会分别使用不同的渲染进程来渲染。
(5) 如果从 A 标签页中打开 B 标签页,那我们能肯定 A 标签页和 B 标签页属于同一浏览上下文组吗?答案是否。
如果在链接中加入了 rel=noopener 属性,那么通过链接打开的新标签页和源标签页之间就不会建立连接关系了。
(6)计算 iframe 所使用的渲染进程数目(站点隔离)
如果 A 标签页中的 iframe 和 A 标签页属于同一站点,那么该 iframe 和 A 标签页会共用同一个渲染进程,如果不是,则该 iframe 会使用单独的渲染进程。
(7)同源策略对同一站点的限制
虽然 Chrome 会让有连接且属于同一站点的标签页运行在同一个渲染进程中,不过如果 A 标签页和 B 标签页属于同一站点,却不属于同源站点,那么你依然无法通过 opener 来操作父标签页中的 DOM,这依然会受到同源策略的限制。
四、问题
(1)Chrome 为什么使用同一站点划分渲染进程,而不是使用同源策略来划分渲染进程?
1、通常同一站点安全性是有保障的。
2、资源的复用。