Evan You 9 лет назад
Родитель
Сommit
4b8eb75c7a

+ 4 - 6
src/platforms/web/runtime/class-util.js

@@ -1,14 +1,12 @@
 /* @flow */
 
-import { warn } from 'core/util/index'
-
 /**
  * Add class with compatibility for SVG since classList is not supported on
  * SVG elements in IE
  */
 export function addClass (el: Element, cls: ?string) {
-  if (!cls || cls.trim() === '') {
-    process.env.NODE_ENV !== 'production' && warn('Ignoring empty class name.')
+  /* istanbul ignore if */
+  if (!cls || !cls.trim()) {
     return
   }
 
@@ -32,8 +30,8 @@ export function addClass (el: Element, cls: ?string) {
  * SVG elements in IE
  */
 export function removeClass (el: Element, cls: ?string) {
-  if (!cls || cls.trim() === '') {
-    process.env.NODE_ENV !== 'production' && warn('Ignoring empty class name.')
+  /* istanbul ignore if */
+  if (!cls || !cls.trim()) {
     return
   }
 

+ 12 - 2
src/platforms/web/runtime/modules/style.js

@@ -2,6 +2,16 @@
 
 import { cached, extend, camelize, toObject } from 'shared/util'
 
+const cssVarRE = /^--/
+const setProp = (el, name, val) => {
+  /* istanbul ignore if */
+  if (cssVarRE.test(name)) {
+    el.style.setProperty(name, val)
+  } else {
+    el.style[normalize(name)] = val
+  }
+}
+
 const prefixes = ['Webkit', 'Moz', 'ms']
 
 let testEl
@@ -50,14 +60,14 @@ function updateStyle (oldVnode: VNodeWithData, vnode: VNodeWithData) {
 
   for (name in oldStyle) {
     if (style[name] == null) {
-      el.style[normalize(name)] = ''
+      setProp(el, name, '')
     }
   }
   for (name in style) {
     cur = style[name]
     if (cur !== oldStyle[name]) {
       // ie9 setting to null has no effect, must use empty string
-      el.style[normalize(name)] = cur == null ? '' : cur
+      setProp(el, name, cur == null ? '' : cur)
     }
   }
 }

+ 1 - 0
src/platforms/web/runtime/transition-util.js

@@ -131,6 +131,7 @@ export function getTransitionInfo (el: Element, expectedType?: ?string): {
 }
 
 function getTimeout (delays: Array<string>, durations: Array<string>): number {
+  /* istanbul ignore next */
   while (delays.length < durations.length) {
     delays = delays.concat(delays)
   }

+ 2 - 1
src/platforms/web/util/attrs.js

@@ -33,13 +33,14 @@ const isAttr = makeMap(
 )
 
 /* istanbul ignore next */
-export const isRenderableAttr = (name: string): boolean => {
+const isRenderableAttr = (name: string): boolean => {
   return (
     isAttr(name) ||
     name.indexOf('data-') === 0 ||
     name.indexOf('aria-') === 0
   )
 }
+export { isRenderableAttr }
 
 export const propsToAttrMap = {
   acceptCharset: 'accept-charset',

+ 1 - 0
src/platforms/web/util/model.js

@@ -30,6 +30,7 @@ export default function parseModel (val: string): Object {
 
   while (!eof()) {
     chr = next()
+    /* istanbul ignore if */
     if (isStringStart(chr)) {
       parseString(chr)
     } else if (chr === 0x5B) {

+ 21 - 0
test/unit/features/directives/model-parse.spec.js

@@ -0,0 +1,21 @@
+import parseModel from 'web/util/model'
+
+describe('model expression parser', () => {
+  it('parse string in brackets', () => {
+    const res = parseModel('a["b"][c]')
+    expect(res.exp).toBe('a["b"]')
+    expect(res.idx).toBe('c')
+  })
+
+  it('parse nested brackets', () => {
+    const res = parseModel('a[i[c]]')
+    expect(res.exp).toBe('a')
+    expect(res.idx).toBe('i[c]')
+  })
+
+  it('combined', () => {
+    const res = parseModel('test.xxx.a["asa"][test1[idx]]')
+    expect(res.exp).toBe('test.xxx.a["asa"]')
+    expect(res.idx).toBe('test1[idx]')
+  })
+})

+ 15 - 0
test/unit/features/directives/style.spec.js

@@ -151,4 +151,19 @@ describe('Directive v-bind:style', () => {
       expect(vm.$el.style.fontSize).toBe('16px')
     }).then(done)
   })
+
+  const supportCssVariable = () => {
+    const el = document.createElement('div')
+    el.style.setProperty('--color', 'red')
+    return el.style.getPropertyValue('--color') === 'red'
+  }
+
+  if (supportCssVariable()) {
+    it('CSS variables', done => {
+      vm.styles = { '--color': 'red' }
+      waitForUpdate(() => {
+        expect(vm.$el.style.getPropertyValue('--color')).toBe('red')
+      }).then(done)
+    })
+  }
 })