From: Evan You Date: Thu, 27 May 2021 21:25:34 +0000 (-0400) Subject: fix(compiler-dom): fix in-browser attribute value decoding w/ html tags X-Git-Tag: v3.1.0-beta.6~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=669037277b03bb8e67f517faf2811a8668ea86d6;p=thirdparty%2Fvuejs%2Fcore.git fix(compiler-dom): fix in-browser attribute value decoding w/ html tags fix #3001 --- diff --git a/packages/compiler-dom/__tests__/decoderHtmlBrowser.spec.ts b/packages/compiler-dom/__tests__/decoderHtmlBrowser.spec.ts new file mode 100644 index 0000000000..9100927def --- /dev/null +++ b/packages/compiler-dom/__tests__/decoderHtmlBrowser.spec.ts @@ -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('&')).toBe('&') + expect(decodeHtmlBrowser('&amp;')).toBe('&') + + expect(decodeHtmlBrowser('<')).toBe('<') + expect(decodeHtmlBrowser('<')).toBe('<') + expect(decodeHtmlBrowser('&lt;')).toBe('<') + + expect(decodeHtmlBrowser('>')).toBe('>') + expect(decodeHtmlBrowser('>')).toBe('>') + expect(decodeHtmlBrowser('&gt;')).toBe('>') + + expect(decodeHtmlBrowser(' ')).toBe('\u00a0') + expect(decodeHtmlBrowser('"')).toBe('"') + expect(decodeHtmlBrowser(''')).toBe("'") + + expect(decodeHtmlBrowser('É')).toBe('\u00c9') + expect(decodeHtmlBrowser('É')).toBe('\u00c9') + expect(decodeHtmlBrowser('É')).toBe('\u00c9') + + // #3001 html tags inside attribute values + expect(decodeHtmlBrowser('Text', true)).toBe( + 'Text' + ) + expect(decodeHtmlBrowser('&', true)).toBe( + '&' + ) + expect( + decodeHtmlBrowser( + '<strong>&</strong>', + true + ) + ).toBe('&') + }) +}) diff --git a/packages/compiler-dom/src/decodeHtmlBrowser.ts b/packages/compiler-dom/src/decodeHtmlBrowser.ts index 7ee93c0b8d..cca3bb12a6 100644 --- a/packages/compiler-dom/src/decodeHtmlBrowser.ts +++ b/packages/compiler-dom/src/decodeHtmlBrowser.ts @@ -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 = `
` + return decoder.children[0].getAttribute('foo') as string + } else { + decoder.innerHTML = raw + return decoder.textContent as string + } }