Chrome 50 中的 API 弃用和移除情况

Joe Medley
Joe Medley

在几乎每个版本的 Chrome 中,我们都看到了针对产品及其性能以及网络平台功能的大量更新和改进。

在 Chrome 50(预计 Beta 版日期:3 月 10 日至 17 日)中,Chrome 发生了一些变化。此列表随时可能发生变化。

在不安全的上下文中废弃了 AppCache

要点:为了阻止跨站脚本攻击,我们即将针对不安全的源弃用 AppCache。我们预计,在 Chrome 52 中,它仅适用于通过 HTTPS 提供内容的源。

意图移除 | Chromestatus Tracker | Chromium 错误

AppCache 功能允许离线和持续访问源,是针对跨站脚本攻击的强大提权。我们致力于移除不安全的源的强大功能

Chrome 将仅允许通过 HTTPS 访问此攻击途径,从而消除了此攻击途径。我们即将弃用 Chrome 50 中的 HTTP 支持,并预计在 Chrome 52 中完全移除该功能。

移除了 Document.defaultCharset

要点document.defaultCharset 已被移除,以更好地符合规范要求。

意图移除 | Chromestatus Tracker | CRBug 问题

Chrome 49 中已废弃的 document.defaultCharset 属于只读属性,会根据用户的区域设置返回用户系统的默认字符编码。由于浏览器会在 HTTP 响应或网页中内嵌的元标记中使用字符编码信息,因此保留此值没有帮助。

请改为使用 document.characterSet 获取 HTTP 标头中指定的第一个值。如果该属性不存在,您将获得在 <meta> 元素的 charset 属性中指定的值(例如 <meta charset="utf-8">)。最后,如果它们都不可用,document.characterSet 将是用户的系统设置。

您可以阅读此 GitHub 问题,详细了解不明确指定这一点的原因

TL;DR:取消对 HTMLLinkElementrel 属性的 subresource 值的支持。

意图移除 | Chromestatus Tracker | Chromium 错误

<link> 上的 subresource 属性用于在浏览器空闲期间预提取资源。浏览器下载某个网页后,就可以预先下载其他网页等资源,以便用户在发出请求时能够轻松地从浏览器缓存中检索这些资源。

subresource 属性存在很多问题。首先,它 无法按预期运行以低优先级下载引用的资源。除 Chrome 外,系统从未在任何其他浏览器中实现该属性。Chrome 实现存在一个 bug,导致资源被下载两次。

如果开发者希望通过预加载内容来改善用户体验,可以采用多种选项,其中自定义最多的选项是构建 Service Worker,以利用预缓存和 Caches API。其他解决方案包括 rel 属性的其他值,包括 preconnectprefetchpreloadprerender。其中一些选项处于实验阶段,可能并未得到广泛支持。

移除不安全的 TLS 版本回退功能

TL;DR:移除了强制服务器使用安全性较低或不安全的 TLS 版本返回数据的机制。

意图移除 | Chromestatus Tracker | Chromium 错误

传输层安全协议 (TLS) 支持协商版本的机制,允许在不破坏兼容性的情况下引入新的 TLS 版本。某些服务器通过以下方式实现这一点:浏览器需要使用不安全的端点作为后备方式。因此,攻击者可以迫使任何网站(而不仅仅是配置不正确的网站)协商使用安全系数较低的 TLS 版本。

受影响的网站将无法与 ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION 建立连接。管理员应确保其服务器软件是最新版本。如果仍未解决,请与服务器软件供应商联系,看看是否有修复方案。

移除了 KeyboardEvent.prototype.keyLocation

TL;DR:移除 Keyboard.prototype.location 属性不需要的别名。

意图移除 | Chromestatus Tracker | Chromium 错误

此属性只是 Keyboard.prototype.location 属性的别名,可用于消除位于键盘上多个位置的按键之间的歧义。例如,这两个属性都允许开发者区分扩展键盘上的两个 Enter 键。

RTCPeerConnection 方法所需的错误和成功处理程序

要点WebRTC RTCPeerConnection 方法 createOffer()createAnswer() 现在需要错误处理程序和成功处理程序。以前,您可以只使用成功处理程序来调用这些方法。该用法已弃用。

意图移除 | Chromestatus Tracker | Chromium 错误

在 Chrome 49 中,我们在未提供错误处理程序的情况下调用 setLocalDescription()setRemoteDescription() 时添加了一条警告。从 Chrome 50 开始,必须使用错误处理程序参数。

这是按照 WebRTC 规范的要求,阐明在这些方法中引入 promise 的方式之一。

以下是 WebRTC RTCPeerConnection 演示中的示例(main.js,第 126 行):

    function onCreateOfferSuccess(desc) {
      pc1.setLocalDescription(desc, function() {
         onSetLocalSuccess(pc1);
      }, onSetSessionDescriptionError);
      pc2.setRemoteDescription(desc, function() {
        onSetRemoteSuccess(pc2);
      }, onSetSessionDescriptionError);
      pc2.createAnswer(onCreateAnswerSuccess, onCreateSessionDescriptionError);
    }

请注意,setLocalDescription()setRemoteDescription() 都有一个错误处理程序。只需要成功处理程序的旧版浏览器会直接忽略错误处理程序参数(如果存在);在旧版浏览器中调用此代码不会引发异常。

一般来说,对于生产环境中的 WebRTC 应用,我们建议您使用 adapter.js(一个由 WebRTC 项目维护的 shim),使应用免受规范更改和前缀差异的影响。

XMLHttpRequestProgressEvent 不再受支持

TL;DR:系统将移除 XMLHttpRequestProgressEvent 接口以及 positiontotalSize 属性。

意图移除 | Chromestatus Tracker | Chromium 错误

此事件是为了支持 Gecko 兼容性属性 positiontotalSize 的存在。Mozilla 22 已停止支持这三种方法,并且该功能长期以来已被 ProgressEvent 所取代。

     var progressBar = document.getElementById("p"),
          client = new XMLHttpRequest()
      client.open("GET", "magical-unicorns")
      client.onprogress = function(pe) {
        if(pe.lengthComputable) {
          progressBar.max = pe.total
          progressBar.value = pe.loaded
        }
      }

移除带前缀的 Encrypted Media Extensions

TL;DR:移除了有前缀的加密媒体扩展,取而代之的是基于规范、无前缀的替换。

意图移除 | Chromestatus Tracker | Chromium 错误

在 Chrome 42 中,我们发布了基于规范、不带前缀的加密媒体扩展版本。此 API 用于发现和选择与 HTMLMediaElement 搭配使用的数字版权管理系统,并与之互动。

那是将近一年前的事情了。由于不带前缀的版本比带前缀的版本具有更多功能,是时候移除带前缀的 API 版本了。

取消了对 SVGElement.offset 属性的支持

TL;DR:SVGElement 的偏移属性已被舍弃,取而代之的是 HTMLElement 上受支持范围更广的属性。

意图移除 | Chromestatus Tracker | Chromium 错误

长期以来,HTMLElementSVGElement 都支持偏移属性;不过,Gecko 和 Edge 仅在 HTMLElement 上支持它们。为了提高浏览器之间的一致性,这些属性在 Chrome 48 中已废弃,且现正被移除。

虽然 HTMLElement 中包含等效属性,但寻找替代属性的开发者也可以使用 getBoundingClientRect()