Chrome 50 淘汰和移除 API

在幾乎每個版本的 Chrome 中,我們都會看到產品、效能以及網路平台的大量更新和改善項目。

Chrome 50 (預估 Beta 版發布日期:3 月 10 日至 17 日) 中,Chrome 有許多變更。這份清單隨時可能變更。

在安全性不足的情況下淘汰 AppCache

重點摘要:為防範跨網站指令碼攻擊,我們會淘汰不安全來源的 AppCache。我們預期在 Chrome 52 中,這項功能只會在透過 HTTPS 提供內容的來源上運作。

Intent to Remove | Chromestatus 追蹤工具 | Chromium 錯誤

AppCache 是一項可讓您離線並持續存取來源的功能,這也是跨網站指令碼攻擊的強大權限提升機制。這是移除不安全來源上的強大功能的一部分。

Chrome 會透過只允許透過 HTTPS 進行驗證,移除這個攻擊媒介。我們即將淘汰 Chrome 50 的 HTTP 支援,並預計在 Chrome 52 中完全移除。

已移除 Document.defaultCharset

重點摘要document.defaultCharset 已移除,以改善規格相容性。

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

document.defaultCharset 已在 Chrome 49 中淘汰,這是一個唯讀屬性,可根據使用者的區域設定,傳回使用者系統的預設字元編碼。由於瀏覽器會使用 HTTP 回應或網頁中嵌入的中繼標記,以便使用字元編碼資訊,因此我們發現維持這個值並無實用之處。

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

如要進一步瞭解不特別說明的理由,請參閱這個 GitHub 問題

重點摘要:移除 HTMLLinkElementrel 屬性支援 subresource 值。

Intent to Remove | Chromestatus 追蹤工具 | 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() 現在需要錯誤處理程序和成功處理程序。過去,您只能使用成功處理常式呼叫這些方法。這項用法已淘汰。

Intent to Remove | Chromestatus 追蹤工具 | 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

重點摘要XMLHttpRequestProgressEvent 介面將會移除,連同屬性 positiontotalSize 一併移除。

Intent to Remove | Chromestatus 追蹤工具 | 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

重點摘要:已移除前置詞加密媒體擴充功能,改用以規格為準的無前置詞替代方案。

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

在 Chrome 42 版中,我們推出規格型的未加前置字串版本加密媒體擴充功能。這個 API 可用於探索、選取及與數位版權管理系統互動,以便與 HTMLMediaElement 搭配使用。

那是將近一年前的事。由於不含前置字串的版本比含前置字串的版本具備更多功能,因此是時候移除 API 的含前置字串版本了。

停止支援 SVGElement.offset 屬性

TL;DR:SVGElement 的偏移屬性已遭淘汰,改為使用 HTMLElement 上更廣泛支援的屬性。

Intent to Remove | Chromestatus 追蹤工具 | Chromium 錯誤

HTMLElementSVGElement 長期以來都支援偏移屬性,但 Gecko 和 Edge 僅在 HTMLElement 上支援這些屬性。為提升瀏覽器之間的一致性,這些屬性已在 Chrome 48 中淘汰,並將在近期移除。

雖然等效屬性是 HTMLElement 的一部分,但開發人員如果想尋找替代方案,也可以使用 getBoundingClientRect()