前端前線 2026 年 9 月 3 日

2026-09-03 WHATWG HTML 同步 Fetch 重新導向汙染列舉,並為解析 API 文件補上來源

primary=https://github.com/whatwg/html/commit/d57dd09ce7592f5c299c0b7d7c2257092525a3dd primary=https://github.com/whatwg/html/commit/0b51f73766465eccf3752be57470b4ef7e81add9 primary=https://github.com/whatwg/html/pull/12881 primary=https://github.com/whatwg/html/issues/12885

WHATWG HTML 規格雙修正:重新導向汙染判斷比照 Fetch、解析 API 文件補齊來源

whatwg/html commit · 2026-09-02

WHATWG 的 whatwg/html 規格倉庫在 2026-09-02 合併兩筆各自獨立的修正:commit d57dd09 讓 HTML 規格改用 Fetch 新的「重新導向汙染(redirect taint)」列舉,取代舊有的布林值判斷;commit 0b51f73 則替 DOMParser.parseFromString()Document.parseHTML()Document.parseHTMLUnsafe() 產生的文件補上原本缺失的來源(origin)。兩者都屬於規格層級的修正,分別對應 whatwg/html#12885whatwg/html#12881

背景

HTML 規格建立 Document 物件時,需要知道該文件對應的回應是否曾在網路層經過跨源重新導向,這項資訊過去由 Fetch 規格提供的布林值 has-cross-origin-redirects 決定。Fetch 後來以 whatwg/fetch#1807 移除這個布林值,改用更細緻的 redirect taint 列舉取代,值分為 same-originsame-sitecross-site 三種,能區分重新導向鏈是完全同源、同站但跨源,還是完全跨站。HTML 規格原本引用的識別碼因此變成懸空參照,由 issue #12885 記錄下來。

另一方面,DOM 規格早已讓 createDocument()createHTMLDocument()Document 建構式建立的文件繼承呼叫端的來源,但 HTML 規格新增的三個解析 API 卻始終沒有補上同樣的步驟,導致這些 API 建立的文件一律拿到不透明來源(opaque origin)。這個落差分別記錄在 whatwg/html#11429whatwg/html#12878 兩則 issue 中,最終由 PR #12881 一併處理。

核心改動一:重新導向汙染判斷

d57dd09 只修改 source 這一份規格原始檔,新增 7 行、刪除 6 行,屬於純編輯性修正,不改變任何既有實作行為。變動內容是把規格中判斷「文件是否經由跨源重新導向建立」的條件式,從檢查 has-cross-origin-redirects 是否為真,換成檢查 redirect taint 是否不等於 same-origin,邏輯結果相同。

- was created via cross-origin redirects:
-   true if navigationParams's response's
-   has-cross-origin-redirects is true
+ was created via cross-origin redirects:
+   true if navigationParams's response's
+   redirect taint is not "same-origin"

這段條件位於文件建立的共用基礎流程中,用來設定文件的「是否經由跨源重新導向建立」內部屬性。由於 same-sitecross-site 兩種新列舉值都不等於 same-origin,所以判斷結果與舊的布林值完全一致,只是措辭跟上 Fetch 最新定義。

核心改動二:解析 API 補上文件來源

0b51f73 同樣只動 source 檔案,新增 16 行、刪除 5 行,但這次是實質行為修正。三個受影響的 API 是:

  • DOMParser.parseFromString()
  • Document.parseHTML()
  • Document.parseHTMLUnsafe()

修正前,這三個方法建立的新文件一律拿到不透明來源,導致透過它們建立的文件無法設定 document.domain,呼叫 document.open() 時也會因為來源與呼叫端文件不相符而拋出 SecurityError。修正後,parseFromString() 會取用呼叫時「相關文件(relevant document)」的來源指派給新文件,另外兩個方法則直接繼承建立它們的文件的來源。

審查者 noamr 在 PR 中核准變更前,要求補齊涵蓋 document.domain 等可觀察行為的Web Platform Tests,作者隨後新增測試(對應 web-platform-tests/wpt#62388)。PR 已於 2026-09-02 合併進 main

影響範圍

項目commit性質對應 issue/PR行為是否改變
重新導向汙染判斷d57dd09編輯性#12885否,僅措辭同步
解析 API 來源0b51f73行為修正#12881#11429#12878是,消除 SecurityError

第一筆修正純粹是規格文字對齊,瀏覽器不需要調整程式碼,但撰寫或審閱規格、或維護規格對照表的人需要知道 has-cross-origin-redirects 這個識別碼已經不存在。第二筆修正則會實際影響瀏覽器行為:待各家引擎跟進實作後,以 DOMParserparseHTML()/parseHTMLUnsafe() 產生的文件將可以正常設定 document.domain,也能作為 document.open() 的合法目標,不再單純因為來源不透明而被判定跨源。

原始來源:whatwg/html commit d57dd09whatwg/html commit 0b51f73


End of article
0
Would love your thoughts, please comment.x
()
x