[READ-ONLY] Mirror of https://github.com/vitest-dev/vitest. Next generation testing framework powered by Vite. vitest.dev
test testing-tools vite
12

Configure Feed

Select the types of activity you want to include in your feed.

fix(browser): log `ErrorEvent.message` when unhandled `ErrorEvent.error` is null (#9322)

authored by

Hiroshi Ogawa and committed by
GitHub
(Dec 23, 2025, 2:47 PM +0100) 5d84eeb9 23ff7c30

+61 -2
+3 -1
test/browser/settings.ts
··· 20 20 const playwrightInstances: BrowserInstanceOption[] = [ 21 21 { browser: 'chromium' }, 22 22 { browser: 'firefox' }, 23 - { browser: 'webkit' }, 23 + // hard to setup playwright webkit on some machines (e.g. ArchLinux) 24 + // this allows skipping it locally by BROWSER_NO_WEBKIT=true 25 + ...(process.env.BROWSER_NO_WEBKIT ? [] : [{ browser: 'webkit' as const }]), 24 26 ] 25 27 26 28 const webdriverioInstances: BrowserInstanceOption[] = [
+14
test/browser/specs/unhandled.test.ts
··· 37 37 }) 38 38 expect(stderr).toBe('') 39 39 }) 40 + 41 + test('print unhandled non error', async () => { 42 + const { testTree, stderr } = await runBrowserTests({ 43 + root: './fixtures/unhandled-non-error', 44 + }) 45 + expect(stderr).toContain('[Error: ResizeObserver loop completed with undelivered notifications.]') 46 + expect(testTree()).toMatchInlineSnapshot(` 47 + { 48 + "basic.test.ts": { 49 + "ResizeObserver error": "passed", 50 + }, 51 + } 52 + `) 53 + })
+24
test/browser/fixtures/unhandled-non-error/basic.test.ts
··· 1 + import { test } from "vitest"; 2 + 3 + test("ResizeObserver error", async () => { 4 + const divElem = document.createElement("div"); 5 + divElem.style.width = "100px"; 6 + divElem.style.height = "100px"; 7 + document.body.appendChild(divElem); 8 + 9 + const resizeObserver = new ResizeObserver((entries) => { 10 + for (const entry of entries) { 11 + (entry.target as HTMLElement).style.width = 12 + `${entry.contentBoxSize[0].inlineSize + 10}px`; 13 + } 14 + }); 15 + const promise = Promise.withResolvers(); 16 + window.addEventListener("error", (event) => { 17 + if (event.message.includes("ResizeObserver loop")) { 18 + promise.resolve(null); 19 + } 20 + }); 21 + resizeObserver.observe(divElem); 22 + await promise.promise; 23 + resizeObserver.unobserve(divElem); 24 + });
+15
test/browser/fixtures/unhandled-non-error/vitest.config.ts
··· 1 + import { fileURLToPath } from 'node:url' 2 + import { defineConfig } from 'vitest/config' 3 + import { instances, provider } from '../../settings' 4 + 5 + export default defineConfig({ 6 + cacheDir: fileURLToPath(new URL("./node_modules/.vite", import.meta.url)), 7 + test: { 8 + browser: { 9 + enabled: true, 10 + provider, 11 + instances, 12 + headless: true, 13 + }, 14 + }, 15 + })
+5 -1
packages/browser/src/client/public/error-catcher.js
··· 31 31 cb(e) 32 32 } 33 33 else { 34 - console.error(e[prop]) 34 + // `ErrorEvent` doesn't necessary have `ErrotEvent.error` defined 35 + // but some has `ErrorEvent.message` defined, e.g. ResizeObserver error. 36 + // https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent/error 37 + // https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver#observation_errors 38 + console.error(e.message ? new Error(e.message) : e) 35 39 } 36 40 } 37 41 const addEventListener = window.addEventListener.bind(window)