Skip to content

Commit

Permalink
Fix presentation when onerror receives an event without error (#74643)
Browse files Browse the repository at this point in the history
  • Loading branch information
huozhi committed Jan 17, 2025
1 parent 1882acb commit 79bdd86
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,11 @@ function onUnhandledError(event: WindowEventMap['error']): void | boolean {
event.preventDefault()
return false
}
handleClientError(event.error, [])
// When there's an error property present, we log the error to error overlay.
// Otherwise we don't do anything as it's not logging in the console either.
if (event.error) {
handleClientError(event.error, [])
}
}

function onUnhandledRejection(ev: WindowEventMap['unhandledrejection']): void {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
'use client'

export default function Page() {
return (
<button
onClick={() => {
// Create an ErrorEvent with only a message
const errorEvent = new ErrorEvent('error', {
message: 'dummy error message', // Message for the event
// Omit the `error` property to ensure it is not included
})

// Dispatch the event
window.dispatchEvent(errorEvent)
}}
>
click to trigger error event
</button>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import {
getRedboxTotalErrorCount,
openRedbox,
hasRedboxCallStack,
assertNoRedbox,
assertNoConsoleErrors,
} from 'next-test-utils'

async function getRedboxResult(browser: any) {
Expand Down Expand Up @@ -315,4 +317,12 @@ describe('app-dir - capture-console-error', () => {
`)
}
})

it('should display the error message in error event when event.error is not present', async () => {
const browser = await next.browser('/browser/error-event')
await browser.elementByCss('button').click()

await assertNoRedbox(browser)
await assertNoConsoleErrors(browser)
})
})
38 changes: 38 additions & 0 deletions test/lib/next-test-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1522,3 +1522,41 @@ export async function toggleCollapseCallStackFrames(browser: BrowserInterface) {
expect(currExpanded).not.toBe(lastExpanded)
})
}

/**
* Encodes the params into a URLSearchParams object using the format that the
* now builder uses for route matches (adding the `nxtP` prefix to the keys).
*
* @param params - The params to encode.
* @param extraQueryParams - The extra query params to encode (without the `nxtP` prefix).
* @returns The encoded URLSearchParams object.
*/
export function createNowRouteMatches(
params: Record<string, string>,
extraQueryParams: Record<string, string> = {}
): URLSearchParams {
const urlSearchParams = new URLSearchParams()
for (const [key, value] of Object.entries(params)) {
urlSearchParams.append(`nxtP${key}`, value)
}
for (const [key, value] of Object.entries(extraQueryParams)) {
urlSearchParams.append(key, value)
}

return urlSearchParams
}

export async function assertNoConsoleErrors(browser: BrowserInterface) {
const logs = await browser.log()
const warningsAndErrors = logs.filter((log) => {
return (
log.source === 'warning' ||
(log.source === 'error' &&
// These are expected when we visit 404 pages.
log.message !==
'Failed to load resource: the server responded with a status of 404 (Not Found)')
)
})

expect(warningsAndErrors).toEqual([])
}

0 comments on commit 79bdd86

Please sign in to comment.