From 3dd49459bba32b21b7a61cb4cc5ee2da53261c40 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Tue, 10 Mar 2020 16:19:01 -0700 Subject: [PATCH] fix(chromium): install binding function during initialization (#1320) --- src/chromium/crPage.ts | 15 ++++++++++----- src/page.ts | 3 +++ test/browsercontext.spec.js | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/chromium/crPage.ts b/src/chromium/crPage.ts index 1830df6f84..b342eaf44f 100644 --- a/src/chromium/crPage.ts +++ b/src/chromium/crPage.ts @@ -92,11 +92,16 @@ export class CRPage implements PageDelegate { helper.addEventListener(this._client, 'Target.attachedToTarget', event => this._onAttachedToTarget(event)), helper.addEventListener(this._client, 'Target.detachedFromTarget', event => this._onDetachedFromTarget(event)), ]; - this._page.frames().map(frame => this._client.send('Page.createIsolatedWorld', { - frameId: frame._id, - grantUniveralAccess: true, - worldName: UTILITY_WORLD_NAME, - }).catch(debugError)); // frames might be removed before we send this. + for (const frame of this._page.frames()) { + // Note: frames might be removed before we send these. + this._client.send('Page.createIsolatedWorld', { + frameId: frame._id, + grantUniveralAccess: true, + worldName: UTILITY_WORLD_NAME, + }).catch(debugError); + for (const binding of this._browserContext._pageBindings.values()) + frame.evaluate(binding.source).catch(debugError); + } }), this._client.send('Log.enable', {}), this._client.send('Page.setLifecycleEventsEnabled', { enabled: true }), diff --git a/src/page.ts b/src/page.ts index 2658f627aa..a66bb65a65 100644 --- a/src/page.ts +++ b/src/page.ts @@ -612,6 +612,8 @@ export class PageBinding { function addPageBinding(bindingName: string) { const binding = (window as any)[bindingName]; + if (binding.__installed) + return; (window as any)[bindingName] = (...args: any[]) => { const me = (window as any)[bindingName]; let callbacks = me['callbacks']; @@ -625,4 +627,5 @@ function addPageBinding(bindingName: string) { binding(JSON.stringify({name: bindingName, seq, args})); return promise; }; + (window as any)[bindingName].__installed = true; } diff --git a/test/browsercontext.spec.js b/test/browsercontext.spec.js index f7c4c80138..019f965b45 100644 --- a/test/browsercontext.spec.js +++ b/test/browsercontext.spec.js @@ -326,7 +326,7 @@ module.exports.describe = function({testRunner, expect, playwright, CHROMIUM, FF }); describe('BrowserContext.exposeFunction', () => { - it.fail(CHROMIUM || FFOX)('should work', async({browser, server}) => { + it.fail(FFOX)('should work', async({browser, server}) => { const context = await browser.newContext(); await context.exposeFunction('add', (a, b) => a + b); const page = await context.newPage();