fix(exposeFunction): exposeFunction should not leak client side BindingCalls (#28163)
This should already make it a bit better. There is more going on tho. https://github.com/microsoft/playwright/issues/28146
This commit is contained in:
parent
557f3afd74
commit
b66839b039
|
|
@ -364,9 +364,11 @@ export class BindingCallDispatcher extends Dispatcher<{ guid: string }, channels
|
||||||
|
|
||||||
async resolve(params: channels.BindingCallResolveParams, metadata: CallMetadata): Promise<void> {
|
async resolve(params: channels.BindingCallResolveParams, metadata: CallMetadata): Promise<void> {
|
||||||
this._resolve!(parseArgument(params.result));
|
this._resolve!(parseArgument(params.result));
|
||||||
|
this._dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
async reject(params: channels.BindingCallRejectParams, metadata: CallMetadata): Promise<void> {
|
async reject(params: channels.BindingCallRejectParams, metadata: CallMetadata): Promise<void> {
|
||||||
this._reject!(parseError(params.error));
|
this._reject!(parseError(params.error));
|
||||||
|
this._dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -256,6 +256,89 @@ it('should work with the domain module', async ({ browserType, server, browserNa
|
||||||
throw err;
|
throw err;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('exposeFunction should not leak', async ({ page, expectScopeState, server }) => {
|
||||||
|
await page.goto(server.EMPTY_PAGE);
|
||||||
|
let called = 0;
|
||||||
|
await page.exposeFunction('myFunction', () => ++called);
|
||||||
|
for (let i = 0; i < 10; ++i)
|
||||||
|
await page.evaluate(() => (window as any).myFunction({ foo: 'bar' }));
|
||||||
|
expect(called).toBe(10);
|
||||||
|
expectScopeState(page, {
|
||||||
|
'_guid': '',
|
||||||
|
'objects': [
|
||||||
|
{
|
||||||
|
'_guid': 'android',
|
||||||
|
'objects': [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'_guid': 'browser-type',
|
||||||
|
'objects': [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'_guid': 'browser-type',
|
||||||
|
'objects': [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'_guid': 'browser-type',
|
||||||
|
'objects': [
|
||||||
|
{
|
||||||
|
'_guid': 'browser',
|
||||||
|
'objects': [
|
||||||
|
{
|
||||||
|
'_guid': 'browser-context',
|
||||||
|
'objects': [
|
||||||
|
{
|
||||||
|
'_guid': 'page',
|
||||||
|
'objects': [
|
||||||
|
{
|
||||||
|
'_guid': 'frame',
|
||||||
|
'objects': [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'_guid': 'request',
|
||||||
|
'objects': [
|
||||||
|
{
|
||||||
|
'_guid': 'response',
|
||||||
|
'objects': [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'_guid': 'request-context',
|
||||||
|
'objects': [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'_guid': 'tracing',
|
||||||
|
'objects': [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'_guid': 'electron',
|
||||||
|
'objects': [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'_guid': 'localUtils',
|
||||||
|
'objects': [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'_guid': 'Playwright',
|
||||||
|
'objects': [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'_guid': 'selectors',
|
||||||
|
'objects': [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
function compareObjects(a, b) {
|
function compareObjects(a, b) {
|
||||||
if (a._guid !== b._guid)
|
if (a._guid !== b._guid)
|
||||||
return a._guid.localeCompare(b._guid);
|
return a._guid.localeCompare(b._guid);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue