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

在几乎每个版本的 Chrome 中,我们都会看到相应产品、其性能以及 Web 平台的功能都有大量的更新和改进。

Chrome 50(预计 Beta 版发布日期:3 月 10 日至 17 日)对 Chrome 进行了多项更改。 此列表随时都可能发生变化。

AppCache 已在不安全情境中废弃

要点:为防范跨站脚本攻击,我们将弃用不安全来源的 AppCache。我们预计,在 Chrome 52 中,该功能仅适用于通过 HTTPS 提供内容的来源。

移除意图 | Chromestatus 跟踪器 | Chromium bug

AppCache 是一项功能,可让您离线且持久地访问某个源,这对于跨站脚本攻击来说是一项强大的权限提升功能。这是我们为从不安全的来源中移除强大功能的更大计划的一部分。

Chrome 正在通过仅允许通过 HTTPS 传输此攻击媒介来消除这种攻击途径。我们将在 Chrome 50 中弃用 HTTP 支持,并希望在 Chrome 52 中完全移除它。

移除了 Document.defaultCharset

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

移除意图 | Chromestatus 跟踪器 | CRBug 问题

Chrome 49 中已废弃的 document.defaultCharset 是一个只读属性,根据用户系统的区域设置返回其系统的默认字符编码。由于浏览器使用 HTTP 响应或网页中嵌入的元标记中的字符编码信息的方式,因此维护此值没有用处。

请改用 document.characterSet 获取 HTTP 标头中指定的第一个值。如果没有,您将获得 <meta> 元素的 charset 属性中指定的值(例如 <meta charset="utf-8">)。最后,如果没有任何值可用,document.characterSet 将是用户的系统设置。

如需详细了解不对此进行规范的原因,请参阅此 GitHub 问题

要点:移除了对 HTMLLinkElementrel 属性的 subresource 值的支持。

移除意图 | Chromestatus 跟踪器 | Chromium bug

<link> 上的 subresource 属性的用途是在浏览器空闲时预加载资源。浏览器下载网页后,可以预先下载其他网页等资源,以便在用户请求这些资源时,只需从浏览器缓存中检索即可。

subresource 属性存在许多问题。首先,它从来没有按预期运行。系统以低优先级下载了引用的资源。除了 Chrome 之外,任何浏览器都未实现此属性。Chrome 实现存在一个 bug,会导致资源下载两次。

希望通过预加载内容来改善用户体验的开发者有多种选择,其中最具可定制性的是构建服务工作器,以利用预缓存和 Caches API。其他解决方案包括rel 属性的其他值,包括 preconnectprefetchpreloadprerender。其中一些选项属于实验性选项,可能不受广泛支持。

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

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

移除意图 | Chromestatus 跟踪器 | Chromium bug

传输层安全协议 (TLS) 支持协商版本的机制,可在不破坏兼容性的情况下引入新的 TLS 版本。某些服务器以这样的方式实现这一点,使得浏览器必须使用不安全的端点作为后备。因此,攻击者可以强制任何网站(而不仅仅是配置错误的网站)协商使用较弱的 TLS 版本。

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

移除了 KeyboardEvent.prototype.keyLocation

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

意图移除 | Chrome 状态跟踪器 | Chromium bug

此属性只是 Keyboard.prototype.location 属性的别名,可用于在键盘上多个位置的按键之间进行区分。例如,借助这两个属性,开发者可以区分扩展键盘上的两个 Enter 键。

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

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

移除意图 | Chromestatus 跟踪器 | Chromium bug

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

这是为了为在这些方法中引入 Promise 扫清障碍,以满足 WebRTC 规范的要求。

以下是 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 已不再受支持

要点:系统将移除 XMLHttpRequestProgressEvent 接口以及 positiontotalSize 属性。

移除意图 | Chromestatus 跟踪器 | Chromium bug

此事件用于支持 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
        }
      }

移除了带前缀的加密媒体扩展

要点:我们移除了带有前缀的加密媒体扩展,改用基于规范的无前缀替代扩展。

移除意图 | Chromestatus 跟踪器 | Chromium bug

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

那已经是差不多一年以前的事了。由于不带前缀的版本比带前缀的版本具有更多功能,因此现在是时候移除带前缀的 API 版本了。

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

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

意图移除 | Chrome 状态跟踪器 | Chromium bug

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

虽然等效属性是 HTMLElement 的一部分,但寻求替代属性的开发者也可以使用 getBoundingClientRect()