Skip to content

Commit 2bbb9ba

Browse files
authored
fix: improve accessibility of rich in-app messages (#157)
* fix: focus iframe content window on load allows screen readers to read the popup content * fix: add title to iframe element notifies screen reader that there's a popup * style: lint
1 parent 78f2874 commit 2bbb9ba

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

src/Messages.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ export default class Messages {
294294
} else {
295295
iframe.style.top = '0'
296296
}
297+
iframe.contentWindow.focus()
297298

298299
context.track()
299300
break
@@ -339,6 +340,7 @@ export default class Messages {
339340
const vars = JSON.stringify(options.message)
340341
const iframe = document.createElement('iframe') as MessageFrame
341342
iframe.setAttribute('id', `lp-message-${messageId}`)
343+
iframe.setAttribute('title', 'Popup')
342344
iframe.style.cssText = [
343345
'border-width: 0',
344346
'position: fixed',

test/specs/Messages.test.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1189,11 +1189,12 @@ describe(Messages, () => {
11891189
})
11901190

11911191
it("shows the message on loadFinished events", () => {
1192-
const renderedMessage = createMockMessageRender()
1192+
const renderedMessage = createMockMessageRender() as any
11931193

11941194
messages.processMessageEvent("123", "http://leanplum/loadFinished")
11951195

11961196
expect(renderedMessage.style.visibility).toEqual("visible")
1197+
expect(renderedMessage.contentWindow.focus).toHaveBeenCalledTimes(1)
11971198
})
11981199

11991200
it("removes the message on close events", () => {
@@ -1250,7 +1251,10 @@ describe(Messages, () => {
12501251
expect(renderedMessage.style.top).toEqual("")
12511252
})
12521253

1253-
type RenderedMessage = HTMLElement & { metadata: any }
1254+
type RenderedMessage = HTMLElement & {
1255+
metadata: any,
1256+
contentWindow: Window
1257+
}
12541258

12551259
function createMockMessageRender(message: any = {}): RenderedMessage {
12561260
const renderedMessage = document.createElement('a') as unknown as RenderedMessage
@@ -1266,6 +1270,7 @@ describe(Messages, () => {
12661270
runTrackedActionNamed: jest.fn()
12671271
}
12681272
}
1273+
jest.spyOn(renderedMessage.contentWindow, 'focus').mockImplementation(() => { /* noop */ })
12691274
jest.spyOn(document, 'getElementById').mockReturnValue(renderedMessage)
12701275

12711276
return renderedMessage

0 commit comments

Comments
 (0)