From afc1ac70638be1bc39f0d42a17d794c8f6e6ff9e Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Tue, 19 Dec 2023 10:47:43 -0800 Subject: [PATCH] fix: errors in evaluate should be JavaScriptErrorInEvaluate (#28706) Fixes https://github.com/microsoft/playwright/issues/28690 --- packages/playwright-core/src/server/javascript.ts | 4 ++-- tests/page/page-dispatchevent.spec.ts | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/playwright-core/src/server/javascript.ts b/packages/playwright-core/src/server/javascript.ts index bfc77ea98b..a1c52cc42b 100644 --- a/packages/playwright-core/src/server/javascript.ts +++ b/packages/playwright-core/src/server/javascript.ts @@ -272,7 +272,7 @@ export async function evaluateExpression(context: ExecutionContext, expression: if (!handle._objectId) return { fallThrough: handle._value }; if (handle._disposed) - throw new Error('JSHandle is disposed!'); + throw new JavaScriptErrorInEvaluate('JSHandle is disposed!'); const adopted = context.adoptIfNeeded(handle); if (adopted === null) return { h: pushHandle(Promise.resolve(handle)) }; @@ -285,7 +285,7 @@ export async function evaluateExpression(context: ExecutionContext, expression: const utilityScriptObjectIds: ObjectId[] = []; for (const handle of await Promise.all(handles)) { if (handle._context !== context) - throw new Error('JSHandles can be evaluated only in the context they were created!'); + throw new JavaScriptErrorInEvaluate('JSHandles can be evaluated only in the context they were created!'); utilityScriptObjectIds.push(handle._objectId!); } diff --git a/tests/page/page-dispatchevent.spec.ts b/tests/page/page-dispatchevent.spec.ts index a6562b5976..3486eb3b1e 100644 --- a/tests/page/page-dispatchevent.spec.ts +++ b/tests/page/page-dispatchevent.spec.ts @@ -215,3 +215,17 @@ it('should dispatch device motion event', async ({ page, server, isAndroid }) => expect(await page.evaluate('rotationRate.gamma')).toBe(15); expect(await page.evaluate('interval')).toBe(16); }); + +it('should throw if argument is from different frame', async ({ page, server }) => { + it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/28690' }); + await page.goto(server.PREFIX + '/frames/one-frame.html'); + { + const dataTransfer = await page.frames()[1].evaluateHandle(() => new DataTransfer()); + await page.frameLocator('iframe').locator('div').dispatchEvent('drop', { dataTransfer }); + } + { + const dataTransfer = await page.evaluateHandle(() => new DataTransfer()); + await expect(page.frameLocator('iframe').locator('div').dispatchEvent('drop', { dataTransfer })) + .rejects.toThrow('JSHandles can be evaluated only in the context they were created!'); + } +});