Skip to content

Commit 87d1e5f

Browse files
committed
test: add tests
1 parent 91537c8 commit 87d1e5f

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed

packages/vue/__tests__/e2e/memory-leak.spec.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,4 +143,85 @@ describe('not leaking', async () => {
143143
},
144144
E2E_TIMEOUT,
145145
)
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+
)
146227
})

0 commit comments

Comments
 (0)