Chrome 60 淘汰與移除功能

Joe Medley
Joe Medley

在幾乎所有版本的 Chrome 中,我們都看到產品、效能和網路平台功能的更新和改善幅度相當顯著。本文將說明 Chrome 60 中已淘汰和移除的功能,該版本目前處於 Beta 版階段,並於 6 月 8 日推出。這份清單內容隨時可能有所變動。

安全性

crypto.subtle 現在需要安全的來源

自 Chrome 37 起就支援的 Web Crypto API 一向在非安全來源中運作。由於 Chrome 長期以來的政策是優先為安全的來源提供強大功能,因此 crypto.subtle 不僅會顯示在安全的來源上。

Intent to Remove | Chromium Bug

移除由內容啟動的頂層框架導覽至資料網址

由於非技術背景的瀏覽器使用者不熟悉這些字元,我們發現 data: 架構越來越常用於假冒和網路釣魚攻擊。為避免這種情況發生,我們會禁止網頁在頂端框架中載入 data: 網址。這項規定適用於 <a> 標記、window.openwindow.location 和類似機制。data: 配置仍可用於頁面載入的資源。

這項功能已在 Chrome 58 版淘汰,目前已移除。

Intent to Remove | Chromestatus Tracker | Chromium Bug

暫時停用部分 blob 的 navigator.sendBeacon()

navigator.sendBeacon() 函式自 Chrome 第 39 版起開放使用。如同最初實作時,函式的 data 引數可包含任何任意 Blob,其類型不屬於 CORS 安全清單。我們認為這是潛在的安全威脅,但目前尚未有人嘗試利用這項漏洞。由於我們暫時沒有合理的即時修正方式,因此 sendBeacon() 無法再針對類型不在 CORS 安全清單中的 Blob 叫用。

雖然這項異動已在 Chrome 60 中實施,但後來已合併回 Chrome 59。

Chromium 錯誤

CSS

讓陰影穿透式子項組合函式像子項組合函式一樣運作

陰影穿透子項組合函式 (>>>) 是 CSS 範圍設定模組第 1 級 的一部分,旨在比對特定祖系元素的子項,即使這些子項出現在陰影樹狀結構中也一樣。這項方法有一定的限制。首先,根據規格,它只能用於 querySelector() 等 JavaScript 呼叫,無法在樣式表中使用。更重要的是,瀏覽器供應商無法讓這項功能在 Shadow DOM 的多個層級中運作。

因此,子項組合器已從相關規格 (包括 Shadow DOM v1) 中移除。我們選擇將陰影穿透式子項組合器別名為子項組合器,而不是從 Chromium 中移除這個選取器,以免導致網頁中斷。原始行為已在 Chrome 45 中淘汰。新行為已在 Chrome 61 版中實作。

Intent to Remove | Chromestatus Tracker | Chromium Bug

JavaScript

淘汰並移除 RTCPeerConnection.getStreamById()

getStreamById() 在近兩年前從 WebRTC 規格中移除。大多數其他瀏覽器已從其實作中移除此功能。雖然這項功能的使用率不高,但在 Edge 和 WebKit 瀏覽器 (除了 Safari,因為 Safari 仍支援 getStreamById()) 中,也存在一些輕微的互通性風險。需要其他實作方式的開發人員,可以在下方的「移除意圖」中找到程式碼範例。

這項功能已在 Chrome 62 版中移除。

Intent to Remove | Chromestatus Tracker | Chromium Bug

淘汰 SVGPathElement.getPathSegAtLength

getPathSegAtLength() 已在兩年前從 SVG 規格中移除。由於 httparchive 中只有少數幾個命中此方法,因此已在 Chrome 60 中淘汰。我們預計在 10 月初或中旬推出的 Chrome 62 版中移除這項功能。

Intent to Deprecate | Chromestatus Tracker | Chromium Bug

將 getContextAttributes() 移至標記後方

自 2013 年起,CanvasRenderingContext2D 就支援 getContextAttributes() 函式。不過,這項功能並未納入任何標準,且自那時起也未納入任何標準。這項功能應已在 --enable-experimental-canvas-features 指令列旗標後方實作,但實際上並未實作。在 Chrome 60 中,這項疏失已修正。我們認為這項變更是安全的,因為沒有任何資料顯示有人使用該方法。

Chromium 錯誤

移除 Headers.prototype.getAll()

根據最新版的 Fetch 規格Headers.prototype.getAll() 函式已遭到移除。

Intent to Remove | Chromestatus Tracker | Chromium Bug

移除 indexedDB.webkitGetDatabaseNames()

我們在 Chrome 中新增了這項功能,當時 Indexed DB 還算是新功能,而前置字串也相當熱門。API 會以非同步方式傳回來源中現有資料庫名稱的清單,這似乎相當合理。

很遺憾,這項設計有缺陷,因為結果可能在傳回後立即失效,因此只能用於記錄,而非嚴肅的應用程式邏輯。GitHub 問題追蹤/連結至先前討論的替代方案,這些方案需要採用不同的方法。雖然開發人員偶爾會對此感興趣,但由於跨瀏覽器的進度不足,程式庫作者已解決這個問題。

需要這項功能的開發人員必須自行開發解決方案。舉例來說,Dexie.js 等程式庫會使用全域資料表,而全域資料表本身就是另一個用來追蹤資料庫名稱的資料庫。

這項功能已在 Chrome 58 版淘汰,目前已移除。

Intent to Remove | Chromestatus Tracker | Chromium Bug

移除 WEBKIT_KEYFRAMES_RULE 和 WEBKIT_KEYFRAME_RULE

非標準的 WEBKIT_KEYFRAMES_RULEWEBKIT_KEYFRAME_RULE 常數已從 CSS 規則中移除。開發人員應改用 KEYFRAMES_RULEKEYFRAME_RULE

Intent to Remove | Chromestatus Tracker | Chromium Bug

使用者介面

要求使用者手勢才能顯示 beforeunload 對話方塊

從 Chrome 60 起,只有在嘗試顯示該對話方塊的框架收到使用者手勢或互動 (或任何嵌入式框架收到此類手勢) 時,才會顯示 beforeunload 對話方塊。請注意,這並不會變更 beforeunload 事件的調度作業。這只是變更對話方塊是否顯示。

beforeunload 對話方塊是應用程式模態對話方塊。因此,這類內容本質上不利於使用者,也就是說,這類內容會針對使用者導覽做出回應,質疑使用者的決定。這項功能也有正面用途。例如,當使用者在導覽時可能會遺失資料時,系統通常會發出警告。

雖然網頁提供 beforeunload 對話方塊的文字功能已在一段時間前移除,但 beforeunload 對話方塊仍是濫用行為的媒介。特別是 beforeunload 對話方塊是詐騙網站的元素,其中自動播放的音訊和威脅性文字會提供背景資訊,讓 Chromium 提供的「確定要離開這個網頁嗎?」訊息變得令人擔心。

我們希望能精準地執行這項政策,只允許妥善使用 beforeunload 對話方塊。使用對話方塊的好時機,是當使用者有可能遺失的狀態時。如果使用者從未與網頁互動,就不會有任何可能遺失的狀態,因此在這種情況下,我們可以抑制對話方塊,不會導致使用者資料遺失。