fix(webkit): returnByValue returns undefined for objects with symbols

This commit is contained in:
Dmitry Gozman 2020-01-03 13:46:51 -08:00
parent 32edca7395
commit 109b4f827e
3 changed files with 18 additions and 4 deletions

View file

@ -219,9 +219,15 @@ export class WKExecutionContext implements js.ExecutionContextDelegate {
}
private _returnObjectByValue(objectId: Protocol.Runtime.RemoteObjectId) {
const serializeFunction = function(stringify: (o: any) => string) {
const serializeFunction = function(stringify: (o: any, replacer: (key: any, value: any) => any) => string) {
try {
return stringify(this);
let hasSymbol = false;
const result = stringify(this, (key, value) => {
if (typeof value === 'symbol')
hasSymbol = true;
return value;
});
return hasSymbol ? undefined : result;
} catch (e) {
if (e instanceof TypeError)
return void 0;

View file

@ -61,8 +61,16 @@ module.exports.describe = function({testRunner, expect, FFOX, CHROME, WEBKIT}) {
await page.goto(server.PREFIX + '/global-var.html');
expect(await page.evaluate('globalVar')).toBe(123);
});
it.skip(FFOX || WEBKIT)('should return undefined for objects with symbols', async({page, server}) => {
it.skip(FFOX)('should return undefined for objects with symbols', async({page, server}) => {
expect(await page.evaluate(() => [Symbol('foo4')])).toBe(undefined);
expect(await page.evaluate(() => {
const a = { };
a[Symbol('foo4')] = 42;
return a;
})).toEqual({});
expect(await page.evaluate(() => {
return { foo: [{ a: Symbol('foo4') }] };
})).toBe(undefined);
});
it('should work with function shorthands', async({page, server}) => {
const a = {

View file

@ -172,7 +172,7 @@ module.exports.describe = function({testRunner, expect, headless, playwright, FF
expect(await page.evaluate(() => !!window.opener)).toBe(false);
expect(await popup.evaluate(() => !!window.opener)).toBe(false);
});
it.skip(WEBKIT || FFOX)('should not treat navigations as new popups', async({page, server}) => {
it('should not treat navigations as new popups', async({page, server}) => {
await page.goto(server.EMPTY_PAGE);
await page.setContent('<a target=_blank rel=noopener href="/one-style.html">yo</a>');
const [popup] = await Promise.all([