Chrome 50 淘汰和移除 API

喬梅利
Joe Medley

在絕大多數的 Chrome 版本中,我們都發現大量的更新和改善項目,包含產品、效能和網路平台的功能。

在 Chrome 50 版 (預估的 Beta 版日期:3 月 10 日至 17 日) 中,Chrome 有一些異動。 這份清單隨時可能有所變動。

AppCache 已不適用於不安全的內容

TL;DR:為了檢索跨網站指令碼,我們正在針對不安全的來源淘汰 AppCache。在 Chrome 52 版中,我們預計這項限制僅適用於透過 HTTPS 提供內容的來源。

意圖移除 | Chrome 狀態追蹤工具 | Chromium 錯誤

AppCache 是一項可離線且永久存取來源的功能,對跨網站指令碼攻擊攻擊而言,這個強大的權限提升功能是一項強大的權限。為了移除不安全來源中的強大功能

Chrome 將僅透過 HTTPS 允許連線,藉此移除這個攻擊向量。我們將在 Chrome 50 版中淘汰 HTTP 支援,並預計在 Chrome 52 中完全移除此支援。

已移除 Document.defaultCharset

重點摘要:我們已移除 document.defaultCharset,以提升規格法規遵循度。

意圖移除 | Chrome 狀態追蹤工具 | CRBug 問題

在 Chrome 49 版中淘汰的 document.defaultCharset 是一種唯讀屬性,可根據使用者的地區設定傳回系統的預設字元編碼。對保留這個值並沒有幫助,這個情況因瀏覽器在 HTTP 回應或嵌入網頁的中繼標記中會使用字元編碼資訊。

請改用 document.characterSet 取得 HTTP 標頭中指定的第一個值。如未提供,則會收到 <meta> 元素的 charset 屬性中指定的值 (例如 <meta charset="utf-8">)。最後,如果上述兩者都沒有,document.characterSet 就會是使用者的系統設定。

您可以前往這個 GitHub 問題,進一步瞭解客戶不需要考量的理由

TL;DR:移除對 HTMLLinkElementrel 屬性 subresource 值的支援。

意圖移除 | Chrome 狀態追蹤工具 | Chromium 錯誤

<link> 上 subresource 屬性的意圖是在瀏覽器閒置期間預先擷取資源。瀏覽器下載網頁後,就能預先下載其他網頁等資源,在使用者提出要求時,即可直接從瀏覽器快取中擷取。

subresource 屬性發生了許多問題。首先,這項功能無法正常運作系統會以低優先順序下載參照資源。且未在 Chrome 以外的任何瀏覽器中導入該屬性。Chrome 實作項目發生錯誤,導致資源被下載兩次。

想要透過預先載入內容改善使用者體驗的開發人員有許多選項,其中最可供自訂的選項,就是建構服務工作站來充分利用預先快取和 Caches API。其他解決方案包括 rel 屬性的其他值,包括 preconnectprefetchpreloadprerender。其中部分選項仍在實驗階段,不一定支援廣泛支援。

移除不安全的傳輸層安全標準 (TLS) 版本備用設定

TL;DR:移除強制伺服器以較不安全或不安全的 TLS 版本傳回資料的機制。

意圖移除 | Chrome 狀態追蹤工具 | Chromium 錯誤

傳輸層安全標準 (TLS) 支援協商版本的機制,提供新的 TLS 版本,同時兼顧相容性。部分伺服器會以這種方式實作,讓瀏覽器必須使用不安全的端點做為備用機制。因此,攻擊者可能會強制「任何」網站 (而不只是設定有誤的網站) 交涉到較弱的 TLS 版本。

受影響的網站無法與 ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION 連線。管理員應確保伺服器軟體為最新版本。如果還是無法解決問題,請與伺服器軟體供應商聯絡,看看是否有可用的修正方法。

移除 KeyboardEvent.prototype.keyLocation

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

意圖移除 | Chrome 狀態追蹤工具 | Chromium 錯誤

這個屬性只是 Keyboard.prototype.location 屬性的別名,有助於區分鍵盤上多個地點的鍵。例如,這兩種屬性都可讓開發人員區分擴充鍵盤上的兩個 Enter 鍵。

RTCPeerConnection 方法需要的錯誤和成功處理常式

TL;DRWebRTC RTCPeerConnection 方法 createOffer()createAnswer(),現在需要錯誤處理常式和成功處理常式。以前,可以只使用成功處理常式呼叫這些方法。這種使用率已淘汰。

意圖移除 | Chrome 狀態追蹤工具 | Chromium 錯誤

在 Chrome 49 版中,如果您在沒有提供錯誤處理常式的情況下呼叫 setLocalDescription()setRemoteDescription(),我們新增了警告。從 Chrome 50 版開始,請務必提供錯誤處理常式引數。

按照 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 專案維護的填充碼,防止應用程式與規格變更和前置字串差異造成問題。

系統不再支援 XMLHttpRequestProgressEvent

TL;DR:系統會移除 XMLHttpRequestProgressEvent 介面以及 positiontotalSize 屬性。

意圖移除 | Chrome 狀態追蹤工具 | 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:我們已移除預先修正的加密媒體擴充功能,以便改用以規格為基礎的未加上前置字元取代項目。

意圖移除 | Chrome 狀態追蹤工具 | Chromium 錯誤

在 Chrome 42 版中,我們為加密媒體擴充功能提供規格型的未加上前綴版本。這個 API 可用於探索、選取數位版權管理系統,並與 HTMLMediaElement 互動。

距離現在已經近一年前。由於未前置字串的版本具備比前置字串版本更多的功能,因此建議您移除加上前置字串的 API 版本。

移除對 SVGElement.offset 屬性的支援功能

TL;DR:系統已捨棄 SVGElement 的偏移屬性,並改用 HTMLElement 上更全面支援的屬性。

意圖移除 | Chrome 狀態追蹤工具 | Chromium 錯誤

一直以來,HTMLElementSVGElement 都支援 Offset 屬性,但 Gecko 和 Edge 只支援 HTMLElement 上的這些屬性。為提高瀏覽器之間的一致性,這些屬性已在 Chrome 48 中淘汰,現在則是移除。

雖然對等屬性屬於 HTMLElement 的一部分,但是需要替代方案的開發人員也可以使用 getBoundingClientRect()