diff --git a/tests/page/page-evaluate.spec.ts b/tests/page/page-evaluate.spec.ts index 3227171ff2..61d5823d6f 100644 --- a/tests/page/page-evaluate.spec.ts +++ b/tests/page/page-evaluate.spec.ts @@ -662,3 +662,21 @@ it('should throw when frame is detached', async ({ page, server }) => { expect(error).toBeTruthy(); expect(error.message).toMatch(/frame.evaluate: (Frame was detached|Execution context was destroyed)/); }); + +it('should work with overridden Object.defineProperty', async ({ page, server }) => { + server.setRoute('/test', (req, res) => { + res.writeHead(200, { + 'content-type': 'text/html', + }); + res.end(``); + }); + await page.goto(server.PREFIX + '/test'); + expect(await page.evaluate('1+2')).toBe(3); +}); diff --git a/utils/generate_injected.js b/utils/generate_injected.js index 455b2f615e..3656fb3c53 100644 --- a/utils/generate_injected.js +++ b/utils/generate_injected.js @@ -29,6 +29,40 @@ const injectedScripts = [ path.join(ROOT, 'packages', 'playwright-core', 'src', 'server', 'injected', 'recorder.ts'), ]; +const modulePrefix = `"use strict"; +let __export = (target, all) => { + for (var name in all) + target[name] = all[name]; +}; +let __commonJS = cb => function __require() { + let fn; + for (const name in cb) { + fn = cb[name]; + break; + } + const exports = {}; + fn(exports); + return exports; +}; +let __toESM = mod => ({ ...mod, 'default': mod }); +let __toCommonJS = mod => ({ ...mod, __esModule: true }); +`; + +async function replaceEsbuildHeader(content, outFileJs) { + const sourcesStart = content.indexOf('// packages/playwright-core/src/server'); + if (sourcesStart === -1) + throw new Error(`Did not find start of bundled code in ${outFileJs}`); + + const preambule = content.substring(0, sourcesStart); + // Replace standard esbuild definition with our own which do not depend on builtins. + // See https://github.com/microsoft/playwright/issues/17029 + if (preambule.indexOf('__toESM') !== -1 || preambule.indexOf('__toCommonJS') !== -1) { + content = modulePrefix + content.substring(sourcesStart); + await fs.promises.writeFile(outFileJs, content); + } + return content; +} + (async () => { const generatedFolder = path.join(ROOT, 'packages', 'playwright-core', 'src', 'generated'); await fs.promises.mkdir(generatedFolder, { recursive: true }); @@ -43,7 +77,9 @@ const injectedScripts = [ target: 'ES2019' }); const baseName = path.basename(injected); - const content = await fs.promises.readFile(path.join(outdir, baseName.replace('.ts', '.js')), 'utf-8'); + const outFileJs = path.join(outdir, baseName.replace('.ts', '.js')); + let content = await fs.promises.readFile(outFileJs, 'utf-8'); + content = await replaceEsbuildHeader(content, outFileJs); const newContent = `export const source = ${JSON.stringify(content)};`; await fs.promises.writeFile(path.join(generatedFolder, baseName.replace('.ts', 'Source.ts')), newContent); }