]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-dom): fix in-browser attribute value decoding w/ html tags
authorEvan You <yyx990803@gmail.com>
Thu, 27 May 2021 21:25:34 +0000 (17:25 -0400)
committerEvan You <yyx990803@gmail.com>
Thu, 27 May 2021 21:25:34 +0000 (17:25 -0400)
fix #3001

packages/compiler-dom/__tests__/decoderHtmlBrowser.spec.ts [new file with mode: 0644]
packages/compiler-dom/src/decodeHtmlBrowser.ts

diff --git a/packages/compiler-dom/__tests__/decoderHtmlBrowser.spec.ts b/packages/compiler-dom/__tests__/decoderHtmlBrowser.spec.ts
new file mode 100644 (file)
index 0000000..9100927
--- /dev/null
@@ -0,0 +1,41 @@
+import { decodeHtmlBrowser } from '../src/decodeHtmlBrowser'
+
+describe('decodeHtmlBrowser', () => {
+  it('should decode HTML correctly', () => {
+    expect(decodeHtmlBrowser(' abc  123 ')).toBe(' abc  123 ')
+
+    expect(decodeHtmlBrowser('&')).toBe('&')
+    expect(decodeHtmlBrowser('&amp;')).toBe('&')
+    expect(decodeHtmlBrowser('&amp;amp;')).toBe('&amp;')
+
+    expect(decodeHtmlBrowser('<')).toBe('<')
+    expect(decodeHtmlBrowser('&lt;')).toBe('<')
+    expect(decodeHtmlBrowser('&amp;lt;')).toBe('&lt;')
+
+    expect(decodeHtmlBrowser('>')).toBe('>')
+    expect(decodeHtmlBrowser('&gt;')).toBe('>')
+    expect(decodeHtmlBrowser('&amp;gt;')).toBe('&gt;')
+
+    expect(decodeHtmlBrowser('&nbsp;')).toBe('\u00a0')
+    expect(decodeHtmlBrowser('&quot;')).toBe('"')
+    expect(decodeHtmlBrowser('&apos;')).toBe("'")
+
+    expect(decodeHtmlBrowser('&Eacute;')).toBe('\u00c9')
+    expect(decodeHtmlBrowser('&#xc9;')).toBe('\u00c9')
+    expect(decodeHtmlBrowser('&#201;')).toBe('\u00c9')
+
+    // #3001 html tags inside attribute values
+    expect(decodeHtmlBrowser('<strong>Text</strong>', true)).toBe(
+      '<strong>Text</strong>'
+    )
+    expect(decodeHtmlBrowser('<strong>&amp;</strong>', true)).toBe(
+      '<strong>&</strong>'
+    )
+    expect(
+      decodeHtmlBrowser(
+        '<strong>&lt;strong&gt;&amp;&lt;/strong&gt;</strong>',
+        true
+      )
+    ).toBe('<strong><strong>&</strong></strong>')
+  })
+})
index 7ee93c0b8dbfc324afaa4e84331377057ff7f5d4..cca3bb12a6eed8d0dfddc349a7792843edec307e 100644 (file)
@@ -2,7 +2,15 @@
 
 let decoder: HTMLDivElement
 
-export function decodeHtmlBrowser(raw: string): string {
-  ;(decoder || (decoder = document.createElement('div'))).innerHTML = raw
-  return decoder.textContent as string
+export function decodeHtmlBrowser(raw: string, asAttr = false): string {
+  if (!decoder) {
+    decoder = document.createElement('div')
+  }
+  if (asAttr) {
+    decoder.innerHTML = `<div foo="${raw.replace(/"/g, '&quot;')}">`
+    return decoder.children[0].getAttribute('foo') as string
+  } else {
+    decoder.innerHTML = raw
+    return decoder.textContent as string
+  }
 }