Skip to content

Commit 5df10a2

Browse files
committed
Add iframe title to improve, add new test, bump version #38
1 parent c599ee3 commit 5df10a2

File tree

6 files changed

+33
-12
lines changed

6 files changed

+33
-12
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ import 'pdfjs-viewer-element'
8585

8686
`viewer-path` - Path to PDF.js [prebuilt](http://mozilla.github.io/pdf.js/getting_started/)
8787

88+
`iframe-title` - The title of the `iframe` element, required for better accessibility
89+
8890
`page` - Page number.
8991

9092
`nameddest` - Go to a named destination.
@@ -184,6 +186,10 @@ const viewerApp = await viewer.initialize()
184186
viewerApp.open({ data: pdfData })
185187
```
186188

189+
## Accessablity
190+
191+
Use `iframe-title` to add a title to the `iframe` element and improve accessibility.
192+
187193
## Known issues
188194

189195
### The `.mjs` files support

index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
</pdfjs-viewer-element>
1616
<pdfjs-viewer-element
1717
id="hideOpenFileViewer"
18+
iframe-title="Custom title"
1819
src="/sample-pdf-with-images.pdf"
1920
viewer-path="/pdfjs-5.3.93-dist"
2021
locale="de"

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "pdfjs-viewer-element",
3-
"version": "2.7.3",
3+
"version": "2.7.4",
44
"license": "MIT",
55
"author": {
66
"name": "Oleksandr Shevchuk",

src/pdfjs-viewer-element.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { elementReady } from "./elementReady";
1+
import { elementReady } from './elementReady'
22
import { debounce } from 'perfect-debounce'
33

44
const DEFAULTS = {
55
viewerPath: '/pdfjs',
66
viewerEntry: '/web/viewer.html',
77
src: '',
8+
iframeTitle: 'PDF viewer window',
89
page: '',
910
search: '',
1011
phrase: '',
@@ -43,7 +44,7 @@ export class PdfjsViewerElement extends HTMLElement {
4344
const template = document.createElement('template')
4445
template.innerHTML = `
4546
<style>:host{width:100%;display:block;overflow:hidden}:host iframe{height:100%}</style>
46-
<iframe frameborder="0" width="100%" loading="lazy"></iframe>
47+
<iframe frameborder="0" width="100%" loading="lazy" title="${this.getAttribute('iframe-title') || DEFAULTS.iframeTitle}"></iframe>
4748
`
4849
shadowRoot.appendChild(template.content.cloneNode(true))
4950
}
@@ -54,12 +55,12 @@ export class PdfjsViewerElement extends HTMLElement {
5455
return [
5556
'src', 'viewer-path', 'page', 'search', 'phrase', 'zoom', 'pagemode',
5657
'disable-worker', 'text-layer', 'disable-font-face', 'disable-range', 'disable-stream', 'disable-auto-fetch', 'verbosity', 'locale',
57-
'viewer-css-theme', 'viewer-extra-styles', 'viewer-extra-styles-urls', 'nameddest'
58+
'viewer-css-theme', 'viewer-extra-styles', 'viewer-extra-styles-urls', 'nameddest', 'iframe-title'
5859
]
5960
}
6061

6162
connectedCallback() {
62-
this.iframe = this.shadowRoot!.querySelector('iframe') as PdfjsViewerElementIframe
63+
this.iframe = this.shadowRoot?.querySelector('iframe') as PdfjsViewerElementIframe
6364
document.addEventListener('webviewerloaded', async () => {
6465
this.setCssTheme(this.getCssThemeOption())
6566
this.injectExtraStylesLinks(this.getAttribute('viewer-extra-styles-urls') ?? DEFAULTS.viewerExtraStylesUrls)
@@ -68,7 +69,7 @@ export class PdfjsViewerElement extends HTMLElement {
6869
this.iframe.contentWindow?.PDFViewerApplicationOptions?.set('disablePreferences', true)
6970
this.iframe.contentWindow?.PDFViewerApplicationOptions?.set('pdfBugEnabled', true)
7071
this.iframe.contentWindow?.PDFViewerApplicationOptions?.set('eventBusDispatchToDOM', true)
71-
});
72+
})
7273
}
7374

7475
attributeChangedCallback(name: string) {
@@ -126,9 +127,10 @@ ${nameddest ? '&nameddest=' + nameddest : ''}`
126127

127128
private mountViewer(src: string) {
128129
if (!src || !this.iframe) return
129-
this.shadowRoot!.replaceChild(this.iframe.cloneNode(), this.iframe)
130-
this.iframe = this.shadowRoot!.querySelector('iframe') as PdfjsViewerElementIframe
130+
this.shadowRoot?.replaceChild(this.iframe.cloneNode(), this.iframe)
131+
this.iframe = this.shadowRoot?.querySelector('iframe') as PdfjsViewerElementIframe
131132
this.iframe.src = src
133+
this.iframe.setAttribute('title', this.getAttribute('iframe-title') || DEFAULTS.iframeTitle)
132134
}
133135

134136
private getFullPath(path: string) {
@@ -161,7 +163,7 @@ ${nameddest ? '&nameddest=' + nameddest : ''}`
161163
else {
162164
this.iframe.contentDocument?.head.querySelector('style[theme]')?.remove()
163165
}
164-
this.iframe.contentWindow?.PDFViewerApplicationOptions.set('viewerCssTheme', theme)
166+
this.iframe.contentWindow?.PDFViewerApplicationOptions?.set('viewerCssTheme', theme)
165167
}
166168

167169
private setViewerExtraStyles = (styles?: string | null, id = 'extra') => {
@@ -190,7 +192,7 @@ ${nameddest ? '&nameddest=' + nameddest : ''}`
190192
}
191193

192194
public initialize = (): Promise<PdfjsViewerElementIframeWindow['PDFViewerApplication']> => new Promise(async (resolve) => {
193-
await elementReady('iframe', this.shadowRoot!)
195+
await elementReady('iframe', this.shadowRoot as ShadowRoot)
194196
this.iframe?.addEventListener('load', async () => {
195197
await this.iframe.contentWindow?.PDFViewerApplication?.initializedPromise
196198
resolve(this.iframe.contentWindow?.PDFViewerApplication)

tests/basic.test.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { describe, expect, it } from 'vitest'
2-
import { getFileData, getViewerElement, mountViewer } from './utils'
2+
import { getFileData, getViewerElement, mountViewer, getIframe } from './utils'
33
import '../src/pdfjs-viewer-element'
44

55
describe('Basic tests', async () => {
@@ -80,4 +80,16 @@ describe('Basic tests', async () => {
8080
expect(getViewerElement()).exist
8181
expect(getComputedStyle(getViewerElement('#downloadButton')!).display).eq('none')
8282
})
83+
84+
it('should add a title attribute to the iframe', async () => {
85+
const viewerApp = await mountViewer(`
86+
<pdfjs-viewer-element
87+
src="/sample-pdf-10MB.pdf"
88+
viewer-path="/pdfjs-5.3.93-dist"
89+
iframe-title="Custom title"
90+
></pdfjs-viewer-element>`
91+
)
92+
expect(getViewerElement()).exist
93+
expect(getIframe().title).eq('Custom title')
94+
})
8395
})

vite.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export default defineConfig({
2222
enabled: true,
2323
// at least one instance is required
2424
instances: [
25-
{ browser: 'chrome' }
25+
{ browser: 'firefox' }
2626
]
2727
}
2828
},

0 commit comments

Comments
 (0)