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')