@@ -36,7 +36,10 @@ function mkDiv(): HTMLDivElement {
3636}
3737
3838afterEach ( ( ) => {
39- // 局部桩纪律(R3.2):谁装谁 `restore()`;这里再兜一次,防某条用例中途失败留下全局残留
39+ // 局部桩纪律(R3.2):🔴 本模块**不做自动清理** —— 每条用例必须自己 `restore()`(写进 `try/finally`)。
40+ // 下一行**兜不住**本桩(T13b 按合并评审 M-3 逐字更正旧注释「这里再兜一次」):`installMatchMediaStub`
41+ // 是**直接赋值** `window.matchMedia`,没有 vi 的登记项可复原(实测见 V2e);它只对将来用
42+ // `vi.stubGlobal` 装的全局量有效。泄漏的 canary = V2a 首行 + V2d 收尾两条 `undefined` 断言。
4043 vi . unstubAllGlobals ( ) ;
4144 for ( const el of [ ...document . body . children ] ) {
4245 gsap . killTweensOf ( el ) ;
@@ -130,6 +133,25 @@ describe("V2 `matchMedia` 桩必须走 legacy 分支(R3.2 · 尖刺 S2.8③)
130133 expect ( typeof window . matchMedia ) . toBe ( "undefined" ) ;
131134 expect ( "matchMedia" in window , "restore 必须 delete 掉自建属性,而不是留一个 `undefined`" ) . toBe ( false ) ;
132135 } ) ;
136+
137+ /* T13b 追加(合并评审 M-3):旧 `afterEach` 注释自称 `vi.unstubAllGlobals()`「这里再兜一次」,
138+ * 实测**为假** —— 桩是**直接赋值** `window.matchMedia`,vi 没有登记项可复原。本条把那一次实测
139+ * 常驻化:装桩 → 就地调 afterEach 里那句 → 泄漏**原样留存**;只有 `restore()` 能 `delete` 掉它。
140+ * ⚠️ 它**故意钉住**「直接赋值」这个形态(R28 ③ 已裁定沿用、波 B/C 复用同一支桩):若将来把桩迁到
141+ * `vi.stubGlobal`,本条会红 —— 那是**有意的**,迁移时必须连同 afterEach 的语义一起改,
142+ * 否则这句「只能靠逐条 restore()」会静默变成假话。 */
143+ it ( "V2e 泄漏**可见**(不是「兜一次」):`unstubAllGlobals()` 复原不了直接赋值形态 ⇒ 只能逐条 `restore()`" , ( ) => {
144+ const leaked = installMatchMediaStub ( { reduce : true } ) ;
145+ try {
146+ vi . unstubAllGlobals ( ) ; // ← afterEach 里那一句,就地复现
147+ expect ( typeof window . matchMedia , "直接赋值没进 vi 的登记表 ⇒ unstubAllGlobals 无从复原,泄漏留存" ) . toBe ( "function" ) ;
148+ expect ( "matchMedia" in window , "自建属性仍在 window 上 ⇒ 下一条用例会读到它" ) . toBe ( true ) ;
149+ } finally {
150+ leaked . restore ( ) ; // 唯一复原手段
151+ }
152+ expect ( typeof window . matchMedia , "`restore()` 必须把自建属性 delete 回 undefined" ) . toBe ( "undefined" ) ;
153+ expect ( "matchMedia" in window , "`restore()` 后不得留 `undefined` 残值" ) . toBe ( false ) ;
154+ } ) ;
133155} ) ;
134156
135157describe ( "V3 属性集合读取(R8.4 的代理判据口径)" , ( ) => {
0 commit comments