mirror of
https://github.com/microsoft/playwright.git
synced 2025-01-05 19:04:43 +03:00
chore: don't leak from waitFor (#22465)
Fixes https://github.com/microsoft/playwright/issues/22458
This commit is contained in:
parent
4e9faba34d
commit
d45efe881f
1
package-lock.json
generated
1
package-lock.json
generated
@ -6199,6 +6199,7 @@
|
||||
}
|
||||
},
|
||||
"packages/playwright-ct-core": {
|
||||
"name": "@playwright/experimental-ct-core",
|
||||
"version": "1.33.0-next",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
|
@ -815,6 +815,10 @@ export class Frame extends SdkObject {
|
||||
result.dispose();
|
||||
return continuePolling;
|
||||
}
|
||||
if (options.omitReturnValue) {
|
||||
result.dispose();
|
||||
return null;
|
||||
}
|
||||
const element = state === 'attached' || state === 'visible' ? await result.evaluateHandle(r => r.element) : null;
|
||||
result.dispose();
|
||||
if (!element)
|
||||
|
@ -25,7 +25,7 @@ export type StrictOptions = {
|
||||
|
||||
export type QueryOnSelectorOptions = StrictOptions & TimeoutOptions;
|
||||
|
||||
export type WaitForElementOptions = TimeoutOptions & StrictOptions & { state?: 'attached' | 'detached' | 'visible' | 'hidden' };
|
||||
export type WaitForElementOptions = TimeoutOptions & StrictOptions & { state?: 'attached' | 'detached' | 'visible' | 'hidden' } & { omitReturnValue?: boolean };
|
||||
|
||||
export type WaitForFunctionOptions = TimeoutOptions & { pollingInterval?: number };
|
||||
|
||||
|
@ -149,3 +149,33 @@ test('expect should not leak', async ({ page, mode, browserName, toImpl }) => {
|
||||
expect(counts.main + counts.utility).toBeLessThan(25);
|
||||
}
|
||||
});
|
||||
|
||||
test('waitFor should not leak', async ({ page, mode, browserName, toImpl }) => {
|
||||
test.skip(mode !== 'default');
|
||||
|
||||
await page.setContent(`
|
||||
<button>static button 1</button>
|
||||
<button>static button 2</button>
|
||||
<div id="buttons"></div>
|
||||
`);
|
||||
|
||||
for (let i = 0; i < 25; ++i) {
|
||||
await page.evaluate(i => {
|
||||
const element = document.createElement('button');
|
||||
element.textContent = 'dynamic ' + i;
|
||||
document.getElementById('buttons').appendChild(element);
|
||||
}, i);
|
||||
await page.locator('#buttons > button').waitFor();
|
||||
await page.evaluate(() => {
|
||||
document.getElementById('buttons').textContent = '';
|
||||
});
|
||||
}
|
||||
|
||||
expect(leakedJSHandles()).toBeFalsy();
|
||||
|
||||
if (browserName === 'chromium') {
|
||||
const counts = await objectCounts(toImpl(page), 'HTMLButtonElement');
|
||||
expect(counts.main + counts.utility).toBeGreaterThanOrEqual(2);
|
||||
expect(counts.main + counts.utility).toBeLessThan(25);
|
||||
}
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user