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#12885 與 whatwg/html#12881。
背景
HTML 規格建立 Document 物件時,需要知道該文件對應的回應是否曾在網路層經過跨源重新導向,這項資訊過去由 Fetch 規格提供的布林值 has-cross-origin-redirects 決定。Fetch 後來以 whatwg/fetch#1807 移除這個布林值,改用更細緻的 redirect taint 列舉取代,值分為 same-origin、same-site、cross-site 三種,能區分重新導向鏈是完全同源、同站但跨源,還是完全跨站。HTML 規格原本引用的識別碼因此變成懸空參照,由 issue #12885 記錄下來。
另一方面,DOM 規格早已讓 createDocument()、createHTMLDocument() 與 Document 建構式建立的文件繼承呼叫端的來源,但 HTML 規格新增的三個解析 API 卻始終沒有補上同樣的步驟,導致這些 API 建立的文件一律拿到不透明來源(opaque origin)。這個落差分別記錄在 whatwg/html#11429 與 whatwg/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-site 與 cross-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 這個識別碼已經不存在。第二筆修正則會實際影響瀏覽器行為:待各家引擎跟進實作後,以 DOMParser 或 parseHTML()/parseHTMLUnsafe() 產生的文件將可以正常設定 document.domain,也能作為 document.open() 的合法目標,不再單純因為來源不透明而被判定跨源。