|
16 | 16 | */ |
17 | 17 |
|
18 | 18 | import { test as it, expect } from './pageTest'; |
| 19 | +import type { ServerResponse } from 'http'; |
19 | 20 |
|
20 | 21 | it('ER-001 should fire', { |
21 | 22 | annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/43450' }, |
@@ -284,3 +285,31 @@ it('ER-013 should fire illegal character error', { |
284 | 285 | else |
285 | 286 | expect(error.message).toContain('illegal character'); |
286 | 287 | }); |
| 288 | + |
| 289 | +it('ER-022 should not fire for a caught fetch rejected by a pending navigation', { |
| 290 | + annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/44015' }, |
| 291 | +}, async ({ page, server }) => { |
| 292 | + await page.goto(server.EMPTY_PAGE); |
| 293 | + const errors: string[] = []; |
| 294 | + page.on('pageerror', error => errors.push(error.message)); |
| 295 | + const waitResponse = new Promise<ServerResponse>(resolve => server.setRoute('/wait', (req, res) => resolve(res))); |
| 296 | + const replacementResponse = new Promise<ServerResponse>(resolve => server.setRoute('/replacement', (req, res) => resolve(res))); |
| 297 | + const fetchDone = page.waitForEvent('console', message => message.text() === 'fetch done'); |
| 298 | + // Chromium does not run evaluate during a pending navigation, so the page starts the second fetch. |
| 299 | + await page.evaluate(() => { |
| 300 | + void fetch('/wait').catch(() => {}).then(() => fetch('/empty.html')).catch(() => {}).then(() => console.log('fetch done')); |
| 301 | + }); |
| 302 | + const navigation = page.goto(server.PREFIX + '/replacement'); |
| 303 | + const response = await replacementResponse; |
| 304 | + // WebKit rejects the second fetch, because the document is about to go away. |
| 305 | + (await waitResponse).end(); |
| 306 | + await fetchDone; |
| 307 | + response.end('replacement'); |
| 308 | + await navigation; |
| 309 | + const [error] = await Promise.all([ |
| 310 | + page.waitForEvent('pageerror'), |
| 311 | + page.evaluate(() => setTimeout(() => { throw new Error('genuine error'); }, 0)), |
| 312 | + ]); |
| 313 | + expect(error.message).toBe('genuine error'); |
| 314 | + expect(errors).toEqual(['genuine error']); |
| 315 | +}); |
0 commit comments