fix: throw an error when object reference chain is to long to serialize

Reference https://github.com/microsoft/playwright/issues/33997
This commit is contained in:
Yury Semikhatsky 2024-12-13 11:05:14 -08:00
parent 258881bea1
commit 2b072f8482
3 changed files with 18 additions and 1 deletions

View file

@ -96,7 +96,7 @@ export class CRExecutionContext implements js.ExecutionContextDelegate {
function rewriteError(error: Error): Protocol.Runtime.evaluateReturnValue { function rewriteError(error: Error): Protocol.Runtime.evaluateReturnValue {
if (error.message.includes('Object reference chain is too long')) if (error.message.includes('Object reference chain is too long'))
return { result: { type: 'undefined' } }; throw new Error('Cannot serialize result: object reference chain is too long.');
if (error.message.includes('Object couldn\'t be returned by value')) if (error.message.includes('Object couldn\'t be returned by value'))
return { result: { type: 'undefined' } }; return { result: { type: 'undefined' } };

View file

@ -115,6 +115,8 @@ function potentiallyUnserializableValue(remoteObject: Protocol.Runtime.RemoteObj
} }
function rewriteError(error: Error): Error { function rewriteError(error: Error): Error {
if (error.message.includes('Object has too long reference chain'))
throw new Error('Cannot serialize result: object reference chain is too long.');
if (!js.isJavaScriptErrorInEvaluate(error) && !isSessionClosedError(error)) if (!js.isJavaScriptErrorInEvaluate(error) && !isSessionClosedError(error))
return new Error('Execution context was destroyed, most likely because of a navigation.'); return new Error('Execution context was destroyed, most likely because of a navigation.');
return error; return error;

View file

@ -400,6 +400,21 @@ it('should return undefined for non-serializable objects', async ({ page }) => {
expect(await page.evaluate(() => function() {})).toBe(undefined); expect(await page.evaluate(() => function() {})).toBe(undefined);
}); });
it('should throw for too deep reference chain', {
annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/33997' }
}, async ({ page, browserName }) => {
it.fixme(browserName === 'firefox', 'Firefox does not throw on long chain yet.');
await expect(page.evaluate((depth) => {
const obj = {};
let temp = obj;
for (let i = 0; i < depth; i++) {
temp[i] = {};
temp = temp[i];
}
return obj
}, 1000)).rejects.toThrow('Cannot serialize result: object reference chain is too long.');
});
it('should alias Window, Document and Node', async ({ page }) => { it('should alias Window, Document and Node', async ({ page }) => {
const object = await page.evaluate('[window, document, document.body]'); const object = await page.evaluate('[window, document, document.body]');
expect(object).toEqual(['ref: <Window>', 'ref: <Document>', 'ref: <Node>']); expect(object).toEqual(['ref: <Window>', 'ref: <Document>', 'ref: <Node>']);