diff --git a/src/compiler/parser/index.js b/src/compiler/parser/index.js index cba12d1cd47..c4554dbbecc 100644 --- a/src/compiler/parser/index.js +++ b/src/compiler/parser/index.js @@ -556,6 +556,13 @@ function processAttrs (el) { } } addAttr(el, name, JSON.stringify(value)) + // #6887 firefox doesn't update muted state if set via attribute + // even immediately after element creation + if (!el.component && + platformMustUseProp(el.tag, el.attrsMap.type, name) && + name === 'muted') { + addProp(el, name, 'true') + } } } } diff --git a/test/ssr/ssr-string.spec.js b/test/ssr/ssr-string.spec.js index e52d34ffe5d..60c801fab01 100644 --- a/test/ssr/ssr-string.spec.js +++ b/test/ssr/ssr-string.spec.js @@ -1000,6 +1000,15 @@ describe('SSR: renderToString', () => { done() }) }) + + it('render muted properly', done => { + renderVmWithOptions({ + template: '' + }, result => { + expect(result).toContain('') + done() + }) + }) }) function renderVmWithOptions (options, cb) { diff --git a/test/unit/modules/compiler/parser.spec.js b/test/unit/modules/compiler/parser.spec.js index c2bb6c25129..c06ac5ba2f3 100644 --- a/test/unit/modules/compiler/parser.spec.js +++ b/test/unit/modules/compiler/parser.spec.js @@ -395,6 +395,15 @@ describe('parser', () => { expect(ast.props[0].value).toBe('msg') }) + // #6887 + it('special case static attribute that must be props', () => { + const ast = parse('', baseOptions) + expect(ast.attrs[0].name).toBe('muted') + expect(ast.attrs[0].value).toBe('""') + expect(ast.props[0].name).toBe('muted') + expect(ast.props[0].value).toBe('true') + }) + it('attribute with v-on', () => { const ast = parse('', baseOptions) expect(ast.events.input.value).toBe('onInput')