fix(page): fallback to default in exposeFunction when using imported module (#6365)

This commit is contained in:
Josh Grime 2021-09-29 17:32:49 +01:00 committed by GitHub
parent b4ba9c803d
commit 44c9ec67c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 3 deletions

View File

@ -1875,7 +1875,7 @@ await page.evaluateOnNewDocument(preloadFile);
#### page.exposeFunction(name, puppeteerFunction) #### page.exposeFunction(name, puppeteerFunction)
- `name` <[string]> Name of the function on the window object - `name` <[string]> Name of the function on the window object
- `puppeteerFunction` <[function]> Callback function which will be called in Puppeteer's context. - `puppeteerFunction` <[function]> Callback function which will be called in Puppeteer's context. Can also be a module with a default export.
- returns: <[Promise]> - returns: <[Promise]>
The method adds a function called `name` on the page's `window` object. The method adds a function called `name` on the page's `window` object.

View File

@ -1364,13 +1364,25 @@ export class Page extends EventEmitter {
*/ */
async exposeFunction( async exposeFunction(
name: string, name: string,
puppeteerFunction: Function puppeteerFunction: Function | { default: Function }
): Promise<void> { ): Promise<void> {
if (this._pageBindings.has(name)) if (this._pageBindings.has(name))
throw new Error( throw new Error(
`Failed to add page binding with name ${name}: window['${name}'] already exists!` `Failed to add page binding with name ${name}: window['${name}'] already exists!`
); );
this._pageBindings.set(name, puppeteerFunction);
let exposedFunction: Function;
if (typeof puppeteerFunction === 'function') {
exposedFunction = puppeteerFunction;
} else if (typeof puppeteerFunction.default === 'function') {
exposedFunction = puppeteerFunction.default;
} else {
throw new Error(
`Failed to add page binding with name ${name}: ${puppeteerFunction} is not a function or a module with a default export.`
);
}
this._pageBindings.set(name, exposedFunction);
const expression = helper.pageBindingInitString('exposedFun', name); const expression = helper.pageBindingInitString('exposedFun', name);
await this._client.send('Runtime.addBinding', { name: name }); await this._client.send('Runtime.addBinding', { name: name });

View File

@ -1029,6 +1029,20 @@ describe('Page', function () {
); );
expect(result.x).toBe(7); expect(result.x).toBe(7);
}); });
it('should fallback to default export when passed a module object', async () => {
const { page, server } = getTestState();
const moduleObject = {
default: function (a, b) {
return a * b;
},
};
await page.goto(server.EMPTY_PAGE);
await page.exposeFunction('compute', moduleObject);
const result = await page.evaluate(async function () {
return await globalThis.compute(9, 4);
});
expect(result).toBe(36);
});
}); });
describeFailsFirefox('Page.Events.PageError', function () { describeFailsFirefox('Page.Events.PageError', function () {