fix(eval): be able to throw protocol like errors (#4551)
This commit is contained in:
parent
6a50888d34
commit
b2f94909a1
@ -42,18 +42,10 @@ class ExecutionContext {
|
|||||||
/**
|
/**
|
||||||
* @param {Function|string} pageFunction
|
* @param {Function|string} pageFunction
|
||||||
* @param {...*} args
|
* @param {...*} args
|
||||||
* @return {!Promise<(!Object|undefined)>}
|
* @return {!Promise<*>}
|
||||||
*/
|
*/
|
||||||
async evaluate(pageFunction, ...args) {
|
async evaluate(pageFunction, ...args) {
|
||||||
try {
|
|
||||||
return await this._evaluateInternal(true /* returnByValue */, pageFunction, ...args);
|
return await this._evaluateInternal(true /* returnByValue */, pageFunction, ...args);
|
||||||
} catch (error) {
|
|
||||||
if (error.message.includes('Object reference chain is too long'))
|
|
||||||
return;
|
|
||||||
if (error.message.includes('Object couldn\'t be returned by value'))
|
|
||||||
return;
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -66,9 +58,10 @@ class ExecutionContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @param {boolean} returnByValue
|
||||||
* @param {Function|string} pageFunction
|
* @param {Function|string} pageFunction
|
||||||
* @param {...*} args
|
* @param {...*} args
|
||||||
* @return {!Promise<!JSHandle>}
|
* @return {!Promise<*>}
|
||||||
*/
|
*/
|
||||||
async _evaluateInternal(returnByValue, pageFunction, ...args) {
|
async _evaluateInternal(returnByValue, pageFunction, ...args) {
|
||||||
const suffix = `//# sourceURL=${EVALUATION_SCRIPT_URL}`;
|
const suffix = `//# sourceURL=${EVALUATION_SCRIPT_URL}`;
|
||||||
@ -165,6 +158,11 @@ class ExecutionContext {
|
|||||||
* @return {!Protocol.Runtime.evaluateReturnValue}
|
* @return {!Protocol.Runtime.evaluateReturnValue}
|
||||||
*/
|
*/
|
||||||
function rewriteError(error) {
|
function rewriteError(error) {
|
||||||
|
if (error.message.includes('Object reference chain is too long'))
|
||||||
|
return {result: {type: 'undefined'}};
|
||||||
|
if (error.message.includes('Object couldn\'t be returned by value'))
|
||||||
|
return {result: {type: 'undefined'}};
|
||||||
|
|
||||||
if (error.message.endsWith('Cannot find context with specified id'))
|
if (error.message.endsWith('Cannot find context with specified id'))
|
||||||
throw new Error('Execution context was destroyed, most likely because of a navigation.');
|
throw new Error('Execution context was destroyed, most likely because of a navigation.');
|
||||||
throw error;
|
throw error;
|
||||||
|
@ -182,6 +182,14 @@ module.exports.addTests = function({testRunner, expect}) {
|
|||||||
});
|
});
|
||||||
expect(result).toBe(undefined);
|
expect(result).toBe(undefined);
|
||||||
});
|
});
|
||||||
|
it_fails_ffox('should be able to throw a tricky error', async({page, server}) => {
|
||||||
|
const windowHandle = await page.evaluateHandle(() => window);
|
||||||
|
const errorText = await windowHandle.jsonValue().catch(e => e.message);
|
||||||
|
const error = await page.evaluate(errorText => {
|
||||||
|
throw new Error(errorText);
|
||||||
|
}, errorText).catch(e => e);
|
||||||
|
expect(error.message).toContain(errorText);
|
||||||
|
});
|
||||||
it('should accept a string', async({page, server}) => {
|
it('should accept a string', async({page, server}) => {
|
||||||
const result = await page.evaluate('1 + 2');
|
const result = await page.evaluate('1 + 2');
|
||||||
expect(result).toBe(3);
|
expect(result).toBe(3);
|
||||||
|
Loading…
Reference in New Issue
Block a user