Skip to content

Commit 6690372

Browse files
committed
fix(compiler-dom): fix in-browser attribute value decoding w/ html tags
fix #3001
1 parent a641eb2 commit 6690372

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { decodeHtmlBrowser } from '../src/decodeHtmlBrowser'
2+
3+
describe('decodeHtmlBrowser', () => {
4+
it('should decode HTML correctly', () => {
5+
expect(decodeHtmlBrowser(' abc 123 ')).toBe(' abc 123 ')
6+
7+
expect(decodeHtmlBrowser('&')).toBe('&')
8+
expect(decodeHtmlBrowser('&')).toBe('&')
9+
expect(decodeHtmlBrowser('&')).toBe('&')
10+
11+
expect(decodeHtmlBrowser('<')).toBe('<')
12+
expect(decodeHtmlBrowser('&lt;')).toBe('<')
13+
expect(decodeHtmlBrowser('&amp;lt;')).toBe('&lt;')
14+
15+
expect(decodeHtmlBrowser('>')).toBe('>')
16+
expect(decodeHtmlBrowser('&gt;')).toBe('>')
17+
expect(decodeHtmlBrowser('&amp;gt;')).toBe('&gt;')
18+
19+
expect(decodeHtmlBrowser('&nbsp;')).toBe('\u00a0')
20+
expect(decodeHtmlBrowser('&quot;')).toBe('"')
21+
expect(decodeHtmlBrowser('&apos;')).toBe("'")
22+
23+
expect(decodeHtmlBrowser('&Eacute;')).toBe('\u00c9')
24+
expect(decodeHtmlBrowser('&#xc9;')).toBe('\u00c9')
25+
expect(decodeHtmlBrowser('&#201;')).toBe('\u00c9')
26+
27+
// #3001 html tags inside attribute values
28+
expect(decodeHtmlBrowser('<strong>Text</strong>', true)).toBe(
29+
'<strong>Text</strong>'
30+
)
31+
expect(decodeHtmlBrowser('<strong>&amp;</strong>', true)).toBe(
32+
'<strong>&</strong>'
33+
)
34+
expect(
35+
decodeHtmlBrowser(
36+
'<strong>&lt;strong&gt;&amp;&lt;/strong&gt;</strong>',
37+
true
38+
)
39+
).toBe('<strong><strong>&</strong></strong>')
40+
})
41+
})

packages/compiler-dom/src/decodeHtmlBrowser.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,15 @@
22

33
let decoder: HTMLDivElement
44

5-
export function decodeHtmlBrowser(raw: string): string {
6-
;(decoder || (decoder = document.createElement('div'))).innerHTML = raw
7-
return decoder.textContent as string
5+
export function decodeHtmlBrowser(raw: string, asAttr = false): string {
6+
if (!decoder) {
7+
decoder = document.createElement('div')
8+
}
9+
if (asAttr) {
10+
decoder.innerHTML = `<div foo="${raw.replace(/"/g, '&quot;')}">`
11+
return decoder.children[0].getAttribute('foo') as string
12+
} else {
13+
decoder.innerHTML = raw
14+
return decoder.textContent as string
15+
}
816
}

0 commit comments

Comments
 (0)