diff --git a/src/compiler/parser/html-parser.js b/src/compiler/parser/html-parser.js index e317dfa8..522e373b 100644 --- a/src/compiler/parser/html-parser.js +++ b/src/compiler/parser/html-parser.js @@ -46,7 +46,7 @@ let IS_REGEX_CAPTURING_BROKEN = false }) // Special Elements (can contain anything) -const isPlainTextElement = makeMap('script,style,textarea', true) +export const isPlainTextElement = makeMap('script,style,textarea', true) const reCache = {} const decodingMap = { diff --git a/src/compiler/parser/index.js b/src/compiler/parser/index.js index 4e9506ba..c49491b4 100644 --- a/src/compiler/parser/index.js +++ b/src/compiler/parser/index.js @@ -252,7 +252,7 @@ export function parse ( } const children = currentParent.children text = inPre || text.trim() - ? decodeHTMLCached(text) + ? isTextTag(currentParent) ? text : decodeHTMLCached(text) // only preserve whitespace if its not right after a starting tag : preserveWhitespace && children.length ? ' ' : '' if (text) { @@ -544,6 +544,11 @@ function makeAttrsMap (attrs: Array): Object { return map } +// for script (e.g. type="x/template") or style, do not decode content +function isTextTag (el): boolean { + return el.tag === 'script' || el.tag === 'style' +} + function isForbiddenTag (el): boolean { return ( el.tag === 'style' || diff --git a/test/unit/modules/compiler/parser.spec.js b/test/unit/modules/compiler/parser.spec.js index 487f0ac4..ffbd73e4 100644 --- a/test/unit/modules/compiler/parser.spec.js +++ b/test/unit/modules/compiler/parser.spec.js @@ -541,4 +541,11 @@ describe('parser', () => { expect(comment.children[0].type).toBe(3) expect(comment.children[0].text).toBe('') }) + + // #5526 + it('should not decode text in script tags', () => { + const options = extend({}, baseOptions) + const ast = parse(``, options) + expect(ast.children[0].text).toBe(`><`) + }) })