ecmascript浏览器支持-厉害了Chrome浏览器(13):Chrome 100支持多屏应用!

2022年3月29日发布的Chrome 100将带来哪些新功能?

TL;TR

弃用 document.domain setter 是一个影响较大的重大变更,请不要关注排查风险。 定于今年9月发布的Chrome 106将不再支持更改document.domain以避免同源策略(same originpolicy)的限制。 Chrome 100开始在控制台的Issues中复制警告信息。

多屏幕窗口放置API是一个非常有趣的功能,Web应用程序也支持多屏幕! 可用于文档演示等场景。 可惜的是 Firefox 和 Safari 还不感兴趣,只有 Chrome 支持。

数组分组提案是一个非常简单实用的功能,我们为什么不直接将Lodash的所有常用工具功能添加到ECMAScript中呢?

Reduce User Agent字符串信息试用即将结束,即将发布。 这件事对各种监控脚本的影响还是蛮大的,需要注意排查风险。

多屏窗口投放API详解

Chrome 100即将发布多屏窗口放置API,可用于查询设备连接的多个屏幕的信息,并在指定屏幕上打开页面内容。 核心API如下:

简单来说ecmascript浏览器支持,Chrome支持多屏应用程序。

一张图片胜过千言万语。 当我使用Keynote播放PPT时,它会在外接显示器上显示PPT内容,并在MacBook显示器上显示下一页内容和当前时间。 这样演讲者就可以掌握演讲的时间节奏,提前计划谈论下一页的内容(请忽略我的PTT水平……):

那么,对于Google Docs、语雀、Shimo文档等文档应用,不妨使用多屏窗口放置API来实现类似Keynote的效果进行演示场景。

事实上,在金融、设计工具、游戏等应用中,多屏窗口放置插座可以用来在不同的屏幕上显示不同的内容,提高用户体验和工作效率。

Twitter、Discourse、Google Slides、itrix 等团队都表示对多屏窗口放置 API 感兴趣,但目前还没有看到实际案例,而且 Chrome 团队提供的 demo 过于简单。

Multi-Screen Window Placement 提案还是很有趣的,但是它并没有成为即将推出的标准,也没有得到 Firefox 和 Safari 的支持,这就很尴尬了。 。 。

数组分组建议

Chrome 100 开放了 ECMAScript 提案 Array Grouping 提案的开发者试用版(devloper Trial),目前处于第 3 阶段,在链表中添加了 groupBy 和 groupByToMap 方法:

const array = [1, 2, 3, 4, 5];
// 返回值:{ odd: [1, 3, 5], even: [2, 4] }
array.groupBy((num) => {
  return num % 2 === 0 ? "even" : "odd";
});
const odd = { odd: true };
const even = { even: true };
// 返回值:  Map { {odd: true}: [1, 3, 5], {even: true}: [2, 4] }
array.groupByToMap((num, index, array) => {
  return num % 2 === 0 ? even : odd;
});

根据 Web Almanac 2021 报告,Lodash 的使用率仅次于 jQuery 和 Modernizr,高于 React。 可见goupBy等工具函数还是很常用的:

如果有一天 Lodash 的常用功能成为 ECMAScript 的提案,没有人应该感到惊讶。 。 。

减少用户代理字符串信息

Chrome 95开始试用减少用户代理字符串信息功能,试用期将在Chrome 100结束,具体结束日期为2022年4月19日。从Chrome 101开始,减少用户代理字符串信息功能将逐步发布。

减少User-Agent字符串信息致力于简化User-Agent字符串,减少信息量,减轻使用User-Agent字符串作为用户指纹的情况ecmascript浏览器支持,更好地保护用户隐私。 同时,引导开发者使用越来越保护用户隐私的User-Agent Client Hints来获取浏览器信息,减少对User-Agent字符串的依赖。

Chrome计划在Chrome 113中完成User Agent字符串的简化,但从最终结果来看,User-Agent的变化其实很小。

对于 Chrome Windows 用户,旧的 User-Agent 字符串是这样的:

Mozilla/5.0(Windows NT 6.3;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/93.0.1234.56 Safari/537.36

简化后,最终的 User-Agent 字符串是这样的:

Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/93.0.0.0 Safari/537.36

Windows NT 6.3 变成了 Windows NT 10.0,Chrome/93.0.1234.56 变成了 Chrome/93.0.0.0,仅此而已。 Windows的版本号固定为10.0,即使用户更新操作系统也不会改变; Chrome的版本号只保留主版本号,省略次版本号。 也就是说,我们仍然可以通过User-Agent字符串获取浏览器的名称及其大版本号、操作系统的名称以及区分桌面端和移动端。 但是我们很难通过User-Agent字符串获取浏览器的次版本号和操作系统的版本。 另外,对于Android端,不再提供手机的品牌和型号。

User-Agent字符串提供的浏览器信息变得越来越模糊,有利于保护用户隐私。

如果开发者需要获取更准确的浏览器信息,则需要使用 User-Agent Client Hints,该功能已在 Chrome 89 中推出。User-Agent Client Hints 对应的 HTTP 请求头数组如下:

请求标头值示例

Sec-CH-UA

“铬”;v =“84”,“谷歌浏览器”;v =“84”

Sec-CH-UA-移动

Sec-CH-UA-完整版

“84.0.4143.2”

Sec-CH-UA-平台

“安卓”

Sec-CH-UA-平台版本

“10”

Sec-CH-UA-Arch

“手臂”

Sec-CH-UA-模型

《像素3》

Sec-CH-UA-Bitness

“64”

默认情况下,浏览器只发送Sec-CH-UA、Sec-CH-UA-Mobile和Sec-CH-UA-Platform,与User-Agent提供的信息量一致。 如果服务器需要获取其他User-Agent Client Hints数组的话,则需要明确指定所需的数组。 这样做的好处是浏览器默认提供的用户信息较少,同时浏览器和Web应用理论上可以记录和审核服务器请求的信息量,可以更主动地保护用户隐私。

Web端监控服务,如ARMS、Fundebug、Sentry等,如果需要获取更准确的客户端信息,则需要使用User-Agent Client Hints。 当然,建议使用User-Agent Client Hints来获取用户的授权。 插件和应用程序不应该替用户做决定,否则这个功能在保护用户隐私方面就没有实际意义。

弃用该文档。 域名设置者

定于今年9月发布的Chrome 106将不再支持更改document.domain以避免同源策略(same originpolicy)的限制。 Chrome 100开始在控制台的Issues中复制警告信息。

例如,访问时,其原始值为 document.domain,我将其更改为 google.com 后,Issues 上会出现 Deprecated Feature Use 信息:

通过设置“document.domain”来放宽同源策略已被弃用,并将在 2022 年 9 月左右的 M106 中默认禁用。要继续使用此功能,请通过发送 Origin- 选择退出原始密钥代理集群Agent-Cluster:?0 标头以及文档和框架的 HTTP 响应。 请参阅了解更多详情。

好奇的孩子可能要问了,document.domain应该不支持更改吧,谁认真的就改这个吧!

是这样的,当我们从in中嵌入iframe页面时,两者的主域名都是example.com,但是子域名不同,所以不是同源(same-origin),如果文档两者的.domain都是,如果设置为example.com,则两者同源。 所以修改document.domain的目的是为了避免同源策略的限制,让主页面和iframe页面可以互相读取和改变DOM,比如减少嵌入视频的autoplay属性。

开启同源策略(same originpolicy)是Web应用程序最基本的安全基础之一,那么一行代码就能轻松避开吗?

这实际上是一种hack方式,违背了同源策略的初衷,存在安全风险。 例如,对于 GitHub Pages 等网络托管服务,每个用户的子域名不同,而主域名相同。 理论上,通过改变document.domain可以避免同源策略的限制。

因此,Chrome决定封堵这个安全漏洞,修改document.domain将无法绕过同源策略的限制,Firefox也表示支持。

如果您仍然需要通信,可以使用 postMessage() 或 Channel Messaging API。

如果仍然需要通过更改document.domain来绕过同源策略的限制,或者已经来不及翻新,可以在返回HTML文件时添加以下Header:

Origin-Agent-Cluster: ?0

Chrome 致力于让网络更加安全。 为了这个目标,不断地折腾着全世界的Web开发者。 立即更改 document.domain!

根据Chrome Platform Status的数据,大约0.5%的页面加载通过改变document.domain来避免同源策略的限制。 这个比例很低,但考虑到Chrome的市场份额,绝对数量相当大。 受影响的用户和开发者并不多:

总结

2008年,秘密开发了两年的Chrome即将发布。 14年过去了,Chrome的版本号达到了100个。Chrome的UI设计基本上没有太大变化,但其核心已经焕然一新,Web技术也受益于Chrome的进步,取得了长足的进步。

我相信 Chrome 100 只是一个起点。 随着WebAssembly、WebGPU、HTTP/3等各种Web新技术的应用,未来的Web将会更加精彩!

在这里,让我们模仿阿特伍德定律:

任何可以用 Web 编写的应用程序最终都将用 Web 编写。

我们已经听说AutoCAD、Google Earth、Phontoshop、Figama等重量级应用程序出现在Web上,性能困境将逐渐被打破。 未来,视频编辑、游戏、VR/VA等应用将会越来越多。

我已经快两个月没有更新 Chrome 博客了。 其实Chrome 98和Chrome 99的博客都快写完了,但是由于元旦周末和疫情的原因,没有及时发布。 按时更新Chrome博客是一件困难的事情,但我还没准备好放弃,继续吧!

我才疏学浅,所以写的东西难免有错误。 欢迎批评指正,敬请原谅。 有兴趣的朋友可以和Momo交流:KiwenLau。

欢迎关注瀚言Talk公众号,关注“伟大的Chrome浏览器”系列博客,和我一起见证大后端的星辰大海!

参考