From fc2a10440f7c54a745566f7b240d51a0faffb698 Mon Sep 17 00:00:00 2001 From: Andrey Lushnikov Date: Thu, 22 Feb 2018 19:10:17 -0800 Subject: [PATCH] fix(evaluate): throw error when page reloads during page.evaluate. (#2073) Fixes #2021. --- lib/ExecutionContext.js | 6 +++++- test/test.js | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/ExecutionContext.js b/lib/ExecutionContext.js index ff313be3..2150924a 100644 --- a/lib/ExecutionContext.js +++ b/lib/ExecutionContext.js @@ -44,7 +44,11 @@ class ExecutionContext { */ async evaluate(pageFunction, ...args) { const handle = await this.evaluateHandle(pageFunction, ...args); - const result = await handle.jsonValue().catch(error => undefined); + const result = await handle.jsonValue().catch(error => { + if (error.message.includes('Object reference chain is too long')) + return; + throw error; + }); await handle.dispose(); return result; } diff --git a/test/test.js b/test/test.js index 98944985..00d23cf6 100644 --- a/test/test.js +++ b/test/test.js @@ -425,6 +425,16 @@ describe('Page', function() { const result = await page.evaluate(() => 7 * 3); expect(result).toBe(21); }); + it('should throw when evaluation triggers reload', async({page, server}) => { + let error = null; + await page.evaluate(() => { + location.reload(); + return new Promise(resolve => { + setTimeout(() => resolve(1), 0); + }); + }).catch(e => error = e); + expect(error.message).toContain('Protocol error'); + }); it('should await promise', async({page, server}) => { const result = await page.evaluate(() => Promise.resolve(8 * 7)); expect(result).toBe(56); @@ -486,6 +496,15 @@ describe('Page', function() { const result = await page.evaluate(() => window); expect(result).toBe(undefined); }); + it('should fail for circular object', async({page, server}) => { + const result = await page.evaluate(() => { + const a = {}; + const b = {a}; + a.b = b; + return a; + }); + expect(result).toBe(undefined); + }); it('should accept a string', async({page, server}) => { const result = await page.evaluate('1 + 2'); expect(result).toBe(3);