@@ -143,4 +143,85 @@ describe('not leaking', async () => {
143
143
} ,
144
144
E2E_TIMEOUT ,
145
145
)
146
+
147
+ // https://github.com/element-plus/element-plus/issues/21408
148
+ test (
149
+ 'cached text nodes in Fragment should not retaining detached DOM nodes' ,
150
+ async ( ) => {
151
+ const client = await page ( ) . createCDPSession ( )
152
+ await page ( ) . evaluate ( async ( ) => {
153
+ const { createApp, ref } = ( window as any ) . Vue
154
+ createApp ( {
155
+ components : {
156
+ Comp : {
157
+ template : `<div>{{ test.length }}</div>` ,
158
+ setup ( ) {
159
+ const test = ref ( [ ...Array ( 3000 ) ] . map ( ( _ , i ) => ( { i } ) ) )
160
+ // @ts -expect-error
161
+ window . __REF__ = new WeakRef ( test )
162
+
163
+ return { test }
164
+ } ,
165
+ } ,
166
+ } ,
167
+ template : `
168
+ <button id="addBtn" @click="add">add</button>
169
+ <button id="toggleBtn" @click="click">button</button>
170
+ <div v-if="toggle">
171
+ <template v-for="item in items" :key="item">
172
+ text
173
+ <div>{{ item }}</div>
174
+ </template>
175
+ <Comp/>
176
+ </div>
177
+ ` ,
178
+ setup ( ) {
179
+ const toggle = ref ( true )
180
+ const items = ref ( [ 1 ] )
181
+ const click = ( ) => ( toggle . value = ! toggle . value )
182
+ const add = ( ) => items . value . push ( 2 )
183
+ return { toggle, click, items, add }
184
+ } ,
185
+ } ) . mount ( '#app' )
186
+ } )
187
+
188
+ expect ( await html ( '#app' ) ) . toBe (
189
+ `<button id="addBtn">add</button>` +
190
+ `<button id="toggleBtn">button</button>` +
191
+ `<div>` +
192
+ ` text ` +
193
+ `<div>1</div>` +
194
+ `<div>3000</div></div>` ,
195
+ )
196
+
197
+ await click ( '#addBtn' )
198
+ expect ( await html ( '#app' ) ) . toBe (
199
+ `<button id="addBtn">add</button>` +
200
+ `<button id="toggleBtn">button</button>` +
201
+ `<div>` +
202
+ ` text ` +
203
+ `<div>1</div>` +
204
+ ` text ` +
205
+ `<div>2</div>` +
206
+ `<div>3000</div></div>` ,
207
+ )
208
+
209
+ await click ( '#toggleBtn' )
210
+ expect ( await html ( '#app' ) ) . toBe (
211
+ `<button id="addBtn">add</button>` +
212
+ `<button id="toggleBtn">button</button><!--v-if-->` ,
213
+ )
214
+
215
+ const isCollected = async ( ) =>
216
+ // @ts -expect-error
217
+ await page ( ) . evaluate ( ( ) => window . __REF__ . deref ( ) === undefined )
218
+
219
+ while ( ( await isCollected ( ) ) === false ) {
220
+ await client . send ( 'HeapProfiler.collectGarbage' )
221
+ }
222
+
223
+ expect ( await isCollected ( ) ) . toBe ( true )
224
+ } ,
225
+ E2E_TIMEOUT ,
226
+ )
146
227
} )
0 commit comments