Return remote object description for unserializable objects

This patch starts handling unserializable objects by returning their
description.

Fixes #86.
This commit is contained in:
Andrey Lushnikov 2017-07-18 00:03:52 -07:00
parent 72b7e50f9e
commit 6c1c3a0c45
2 changed files with 26 additions and 7 deletions

View File

@ -75,13 +75,21 @@ class Helper {
}
if (!remoteObject.objectId)
return remoteObject.value;
let response = await client.send('Runtime.callFunctionOn', {
objectId: remoteObject.objectId,
functionDeclaration: 'function() { return this; }',
returnByValue: true,
});
client.send('Runtime.releaseObject', {objectId: remoteObject.objectId});
return response.result.value;
try {
let response = await client.send('Runtime.callFunctionOn', {
objectId: remoteObject.objectId,
functionDeclaration: 'function() { return this; }',
returnByValue: true,
});
return response.result.value;
} catch (e) {
// Return description for unserializable object, e.g. 'window'.
return remoteObject.description;
} finally {
client.send('Runtime.releaseObject', {objectId: remoteObject.objectId}).catch(e => {
// While we were serializing object, the page might've navigated.
});
}
}
}

View File

@ -128,6 +128,10 @@ describe('Puppeteer', function() {
let result = await page.evaluate(() => -Infinity);
expect(Object.is(result, -Infinity)).toBe(true);
}));
it('should not fail for window object', SX(async function() {
let result = await page.evaluate(() => window);
expect(result).toBe('Window');
}));
});
describe('Page.injectFile', function() {
@ -256,6 +260,13 @@ describe('Puppeteer', function() {
'calling console.error',
]);
}));
it('should not fail for window object', SX(async function() {
let windowObj = null;
page.once('console', arg => windowObj = arg);
page.evaluate(() => console.error(window));
await waitForEvents(page, 'console');
expect(windowObj).toBe('Window');
}));
});
describe('Page.navigate', function() {