Skip to content

Commit 85bdcda

Browse files
authoredJul 13, 2023
feat(client): close vite-error-overlay with Escape key (#13795)
1 parent 72a6985 commit 85bdcda

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed
 

‎packages/vite/src/client/overlay.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ const codeframeRE = /^(?:>?\s+\d+\s+\|.*|\s+\|\s*\^.*)\r?\n/gm
140140
const { HTMLElement = class {} as typeof globalThis.HTMLElement } = globalThis
141141
export class ErrorOverlay extends HTMLElement {
142142
root: ShadowRoot
143+
closeOnEsc: (e: KeyboardEvent) => void
143144

144145
constructor(err: ErrorPayload['err'], links = true) {
145146
super()
@@ -171,9 +172,18 @@ export class ErrorOverlay extends HTMLElement {
171172
this.root.querySelector('.window')!.addEventListener('click', (e) => {
172173
e.stopPropagation()
173174
})
175+
174176
this.addEventListener('click', () => {
175177
this.close()
176178
})
179+
180+
this.closeOnEsc = (e: KeyboardEvent) => {
181+
if (e.key === 'Escape' || e.code === 'Escape') {
182+
this.close()
183+
}
184+
}
185+
186+
document.addEventListener('keydown', this.closeOnEsc)
177187
}
178188

179189
text(selector: string, text: string, linkFiles = false): void {
@@ -201,9 +211,9 @@ export class ErrorOverlay extends HTMLElement {
201211
}
202212
}
203213
}
204-
205214
close(): void {
206215
this.parentNode?.removeChild(this)
216+
document.removeEventListener('keydown', this.closeOnEsc)
207217
}
208218
}
209219

‎playground/html/__tests__/html.spec.ts

+20
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,26 @@ describe.runIf(isServe)('invalid', () => {
245245
expect(message).toMatch(/^Unable to parse HTML/)
246246
})
247247

248+
test('should close overlay when clicked away', async () => {
249+
await page.goto(viteTestUrl + '/invalid.html')
250+
const errorOverlay = await page.waitForSelector('vite-error-overlay')
251+
expect(errorOverlay).toBeTruthy()
252+
253+
await page.click('html')
254+
const isVisbleOverlay = await errorOverlay.isVisible()
255+
expect(isVisbleOverlay).toBeFalsy()
256+
})
257+
258+
test('should close overlay when escape key is pressed', async () => {
259+
await page.goto(viteTestUrl + '/invalid.html')
260+
const errorOverlay = await page.waitForSelector('vite-error-overlay')
261+
expect(errorOverlay).toBeTruthy()
262+
263+
await page.keyboard.press('Escape')
264+
const isVisbleOverlay = await errorOverlay.isVisible()
265+
expect(isVisbleOverlay).toBeFalsy()
266+
})
267+
248268
test('should reload when fixed', async () => {
249269
await page.goto(viteTestUrl + '/invalid.html')
250270
await editFile('invalid.html', (content) => {

0 commit comments

Comments
 (0)
Please sign in to comment.