You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ha...@apache.org on 2017/12/28 05:27:01 UTC

[04/20] incubator-weex git commit: [WEEX-181] rm web renderer codes and scripts (resolve #958)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/render/vue/utils/style.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/utils/style.js b/html5/render/vue/utils/style.js
deleted file mode 100644
index 5f823d7..0000000
--- a/html5/render/vue/utils/style.js
+++ /dev/null
@@ -1,370 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// @flow
-
-import { getViewportInfo } from '../env/viewport'
-import addPrefix from 'inline-style-prefixer/static/index'
-
-const noUnitsNumberKeys = [
-  'flex',
-  'opacity',
-  'zIndex',
-  'fontWeight',
-  'lines'
-]
-
-// whether to support using 0.5px to paint 1px width border.
-let _supportHairlines: ?boolean
-export function supportHairlines () {
-  if (typeof _supportHairlines === 'undefined') {
-    const dpr = window.devicePixelRatio
-    if (dpr && dpr >= 2 && document.documentElement) {
-      const docElm = document.documentElement
-      const testElm = document.createElement('div')
-      const fakeBody = document.createElement('body')
-      const beforeNode = docElm.firstElementChild || docElm.firstChild
-      testElm.style.border = '0.5px solid transparent'
-      fakeBody.appendChild(testElm)
-      docElm.insertBefore(fakeBody, beforeNode)
-      _supportHairlines = testElm.offsetHeight === 1
-      docElm.removeChild(fakeBody)
-    }
-    else {
-      _supportHairlines = false
-    }
-  }
-  return _supportHairlines
-}
-
-/**
- * remove comments from a cssText.
- */
-export function trimComment (cssText: string): string {
-  return cssText.replace(/(?:\/\*)[\s\S]*?\*\//g, '')
-}
-
-let support: boolean | null = null
-
-export function supportSticky (): boolean {
-  if (support !== null) {
-    return support
-  }
-  const element = window.document.createElement('div')
-  const elementStyle = element.style
-  elementStyle.cssText = 'position:-webkit-sticky;position:sticky;'
-  support = elementStyle.position.indexOf('sticky') !== -1
-  return support
-}
-
-const regPercentage = /^[+-]?\d+(\.\d+)?%$/
-export function isPercentage (val: string) {
-  return regPercentage.test(val)
-}
-
-const regUnitsNum = /^([+-]?\d+(?:\.\d+)?)([p,w]x)?$/ // support units: px, wx.
-export function normalizeUnitsNum (val: string): string {
-  const match = val.match(regUnitsNum)
-  if (!match) { return '' }
-  let unit = 'px' // px by default.
-  if (match[2]) {
-    unit = match[2]
-  }
-  return parseScale(parseFloat(match[1]), unit)
-}
-
-function getUnitScaleMap () {
-  const { scale } = getViewportInfo()
-  return {
-    px: scale,
-    wx: 1 // use px straight, not adaptable to screens.
-  }
-}
-
-function limitScale (val, limit) {
-  limit = limit || 1
-  const sign = val === 0 ? 0 : val > 0 ? 1 : -1
-  let newVal = Math.abs(val) > limit ? val : sign * limit
-  // support 1px device width.
-  if (newVal === 1 && val < 1 && supportHairlines()) {
-    newVal = 0.5
-  }
-  return newVal
-}
-
-function parseScale (val: number, unit: string): string {
-  const unitScaleMap = getUnitScaleMap()
-  return limitScale(val * unitScaleMap[unit]) + 'px'
-}
-
-export function normalizeString (styleKey: string, styleVal: string): string {
-  if (isPercentage(styleVal)) {
-    return styleVal
-  }
-
-  /**
-   * 1. test if is a regular scale css. e.g. `width: 100px;`
-   *  this should be a standalone number value with or without unit, otherwise
-   *  it shouldn't be changed.
-   */
-  const unitsNum = normalizeUnitsNum(styleVal)
-  if (unitsNum) { return unitsNum }
-
-  /**
-   * 2. if a string contains multiple px values, than they should be all normalized.
-   *  values should have wx or px units, otherwise they should be left unchanged.
-   *  e.g.
-   *    transform: translate(10px, 6px, 0)
-   *    border: 2px solid red
-   */
-  const numReg = /([+-]?[\d.]+)([p,w]x)/ig
-  if (numReg.test(styleVal)) {
-    const unitScaleMap = getUnitScaleMap()
-    const val = styleVal.replace(numReg, function (m, $0, $1) {
-      const res = parseFloat($0) * unitScaleMap[$1]
-      return limitScale(res) + 'px'
-    })
-    return val
-  }
-
-  // otherwise
-  return styleVal
-}
-
-export function autoPrefix (style: {}): {} {
-  const prefixed = addPrefix(style)
-  // flex only added WebkitFlex. Should add WebkitBoxFlex also.
-  const flex = prefixed.flex
-  if (flex) {
-    prefixed.WebkitBoxFlex = flex
-    prefixed.MozBoxFlex = flex
-    prefixed.MsFlex = flex
-  }
-  return prefixed
-}
-
-export function normalizeNumber (styleKey: string, styleVal: number): string {
-  const { scale } = getViewportInfo()
-  return styleVal * scale + 'px'
-}
-
-/**
- * normalize style to adapte to current viewport by multiply current scale.
- * @param  {object} style: should be camelCase.
- */
-export function normalizeStyle (style: {}) {
-  const res = {}
-  for (const key in style) {
-    const val = style[key]
-    if (noUnitsNumberKeys.indexOf(key) > -1) {
-      res[key] = val
-      continue
-    }
-    switch (typeof val) {
-      case 'string':
-        res[key] = normalizeString(key, val)
-        break
-      case 'number':
-        res[key] = normalizeNumber(key, val)
-        break
-      default:
-        res[key] = val
-        break
-    }
-  }
-  return res
-}
-
-/**
- * get transformObj
- */
-export function getTransformObj (elm: HTMLElement): any {
-  let styleObj = {}
-  if (!elm) { return styleObj }
-  const transformStr = elm.style.webkitTransform
-    || elm.style.mozTransform
-    || elm.style.transform
-  if (transformStr && transformStr.match(/(?: *(?:translate|rotate|scale)[^(]*\([^(]+\))+/i)) {
-    styleObj = transformStr.trim().replace(/, +/g, ',').split(' ').reduce(function (pre, str) {
-      ['translate', 'scale', 'rotate'].forEach(function (name) {
-        if (new RegExp(name, 'i').test(str)) {
-          pre[name] = str
-        }
-      })
-      return pre
-    }, {})
-  }
-  return styleObj
-}
-
-/**
- * translate a transform string from a transformObj.
- */
-export function getTransformStr (obj: {}): string {
-  return Object.keys(obj).reduce(function (pre, key) {
-    return pre + obj[key] + ' '
-  }, '')
-}
-
-/**
- * add transform style to element.
- * @param {HTMLElement} elm
- * @param {object} style: transform object, format is like this:
- *   {
- *     translate: 'translate3d(2px, 2px, 2px)',
- *     scale: 'scale(0.2)',
- *     rotate: 'rotate(30deg)'
- *   }
- * @param {boolean} replace: whether to replace all transform properties.
- */
-export function addTransform (elm: HTMLElement, style: {}, replace: boolean): void {
-  if (!style) { return }
-  let styleObj = {}
-  if (!replace) {
-    styleObj = getTransformObj(elm)
-  }
-  for (const key in style) {
-    const val = style[key]
-    if (val) {
-      styleObj[key] = val
-    }
-  }
-  const resStr = getTransformStr(styleObj)
-  elm.style.webkitTransform = resStr
-  elm.style.mozTransform = resStr
-  elm.style.transform = resStr
-}
-
-/**
- * add translate X to the element.
- */
-export function addTranslateX (elm: HTMLElement, toAdd: number): void {
-  if (!toAdd) { return }
-  const styleObj = getTransformObj(elm)
-  if (!styleObj.translate) {
-    styleObj.translate = 'translate3d(0px, 0px, 0px)'
-  }
-  styleObj.translate = styleObj.translate.replace(/[+-\d.]+[pw]x/, function ($0) {
-    return (parseFloat($0) + toAdd) + 'px'
-  })
-  const resStr = getTransformStr(styleObj)
-  elm.style.webkitTransform = resStr
-  elm.style.mozTransform = resStr
-  elm.style.transform = resStr
-}
-
-/**
- * copy a transform behaviour from one element to another.
- * key could be: 'translate' | 'scale' | 'rotate'
- */
-export function copyTransform (from: HTMLElement, to: HTMLElement, key: string | void): void {
-  let str
-  if (!key) {
-    str = from.style.webkitTransform
-      || from.style.mozTransform
-      || from.style.transform
-  }
-  else {
-    const fromObj = getTransformObj(from)
-    if (!fromObj[key]) { return }
-    const toObj = getTransformObj(to)
-    toObj[key] = fromObj[key]
-    str = getTransformStr(toObj)
-  }
-  to.style.webkitTransform = str
-  to.style.mozTransform = str
-  to.style.transform = str
-}
-
-/**
- * get color's r, g, b value.
- * @param {string} color support all kinds of value of color.
- */
-export function getRgb (color: string) {
-  const haxReg = /#([\da-fA-F]{2})([\da-fA-F]{2})([\da-fA-F]{2})/
-  const rgbReg = /rgb\((\d+),\s*(\d+),\s*(\d+)\)/
-  const span = document.createElement('span')
-  const body = document.body
-  span.style.cssText = `color: ${color}; width: 0px; height: 0px;`
-  body && body.appendChild(span)
-  color = window.getComputedStyle(span).color + ''
-  body && body.removeChild(span)
-
-  let match
-  match = color.match(haxReg)
-  if (match) {
-    return {
-      r: parseInt(match[1], 16),
-      g: parseInt(match[2], 16),
-      b: parseInt(match[3], 16)
-    }
-  }
-  match = color.match(rgbReg)
-  if (match) {
-    return {
-      r: parseInt(match[1]),
-      g: parseInt(match[2]),
-      b: parseInt(match[3])
-    }
-  }
-}
-
-/**
- * get style sheet with owner node's id
- * @param {string} id owner node id.
- */
-export function getStyleSheetById (id?: string) {
-  if (!id) { return }
-  const styleSheets = document.styleSheets
-  const len = styleSheets.length
-  for (let i = 0; i < len; i++) {
-    const styleSheet = styleSheets[i]
-    if (styleSheet.ownerNode.id === id) {
-      return styleSheet
-    }
-  }
-}
-
-function getChildrenTotalWidth (children) {
-  const len = children.length
-  let total = 0
-  for (let i = 0; i < len; i++) {
-    total += children[i].getBoundingClientRect().width
-  }
-  return total
-}
-/**
- * get total content width of the element.
- * @param {HTMLElement} elm
- */
-export function getRangeWidth (elm: HTMLElement) {
-  const children = elm.children
-  if (!children) {
-    return elm.getBoundingClientRect().width
-  }
-  if (!Range) {
-    return getChildrenTotalWidth(children)
-  }
-  const range = document.createRange()
-  if (!range.selectNodeContents) {
-    return getChildrenTotalWidth(children)
-  }
-  range.selectNodeContents(elm)
-  return range.getBoundingClientRect().width
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/render/vue/utils/type.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/utils/type.js b/html5/render/vue/utils/type.js
deleted file mode 100644
index 32216a6..0000000
--- a/html5/render/vue/utils/type.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// @flow
-
-const toString = Object.prototype.toString
-
-/**
- * Strict object type check. Only returns true
- * for plain JavaScript objects.
- *
- * @param {*} obj
- * @return {Boolean}
- */
-const OBJECT_STRING = '[object Object]'
-export function isPlainObject (obj?: mixed): boolean {
-  return toString.call(obj) === OBJECT_STRING
-}
-
-const ARRAY_STRING = '[object Array]'
-export function isArray (arr?: mixed): boolean {
-  return toString.call(arr) === ARRAY_STRING
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/render/vue/validator/check.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/validator/check.js b/html5/render/vue/validator/check.js
deleted file mode 100644
index 5a85006..0000000
--- a/html5/render/vue/validator/check.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-const supportedProperties = {
-  '@common': [
-    'id', 'ref', 'style', 'class', 'append'
-  ]
-}
-
-const supportedStyles = {
-  '*': [
-    '@box-model', '@border', '@position', '@flexbox', '@font', '@text', '@bg',
-    'lines', 'item-size', 'item-color', 'item-selected-color'
-  ],
-  '@box-model': [
-    'width', 'height', 'position',
-    'padding-top', 'padding-bottom', 'padding-left', 'padding-right',
-    'margin-top', 'margin-bottom', 'margin-left', 'margin-right'
-  ],
-  '@border': [
-    'border-style', 'border-width', 'border-color', 'border-radius',
-    'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style',
-    'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width',
-    'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color',
-    'border-top-left-radius', 'border-top-right-radius', 'border-bottom-left-radius', 'border-bottom-right-radius'
-  ],
-  '@position': ['position', 'top', 'left', 'right', 'bottom'],
-  '@flexbox': [
-    'flex', 'flex-direction', 'justify-content', 'align-items', 'flex-wrap'
-  ],
-  '@font': ['font-size', 'font-weight', 'font-style', 'font-family', 'line-height'],
-  '@text': ['text-align', 'text-decoration', 'text-overflow', 'color'],
-  '@bg': ['background-color', 'opacity'],
-
-  'a': ['@box-model', '@border', '@position', '@flexbox', '@bg'],
-  'div': ['@box-model', '@border', '@position', '@flexbox', '@bg'],
-  'text': ['@box-model', '@border', '@position', '@font', '@text', '@bg', 'lines'],
-  'slider': ['@box-model', '@border', '@position', '@flexbox', '@bg'],
-  'switch': ['@box-model', '@border', '@position', '@flexbox', '@bg'],
-  'indicator': ['@box-model', '@border', '@position', '@flexbox', '@bg', 'item-size', 'item-color', 'item-selected-color'],
-  'input': ['@box-model', '@border', '@position', '@font', '@text', '@bg'],
-  'textarea': ['@box-model', '@border', '@position', '@font', '@text', '@bg', 'rows'],
-  'scroller': ['@box-model', '@border', '@position', '@flexbox', '@bg'],
-  'loading': ['@box-model', '@border', '@position', '@flexbox', '@bg'],
-  'refresh': ['@box-model', '@border', '@position', '@flexbox', '@bg'],
-  'list': ['@box-model', '@border', '@position', '@flexbox', '@bg'],
-  'cell': ['@box-model', '@border', '@position', '@flexbox', '@bg'],
-  'video': ['@box-model', '@border', '@position', '@flexbox', '@bg'],
-  'web': ['@box-model', '@border', '@position', '@flexbox', '@bg']
-}
-
-/**
- * Flatten a multiple dimension array.
- */
-export function flatten (array) {
-  return array.reduce((dist, item) => {
-    return dist.concat(Array.isArray(item) ? flatten(item) : item)
-  }, [])
-}
-
-/**
- * Check if the value is in the list.
- * @param {String} type
- * @param {String} value
- * @param {Object} dict
- */
-export function checkSupported (type, value, dict = {}) {
-  const tagType = dict[type] ? type : '*'
-  if (Array.isArray(dict[tagType])) {
-    return flatten(dict[tagType].map(k => dict[k] || k)).indexOf(value) !== -1
-  }
-  return false
-}
-
-/**
- * Check if the style is supported for the component.
- * @param {String} type
- * @param {String} style
- */
-export function isSupportedStyle (type, style) {
-  return checkSupported(type, style, supportedStyles)
-}
-
-/**
- * Check if the property is supported for the component.
- * @param {String} type
- * @param {String} property
- */
-export function isSupportedProp (type, prop) {
-  return checkSupported(type, prop, supportedProperties)
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/render/vue/validator/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/validator/index.js b/html5/render/vue/validator/index.js
deleted file mode 100644
index d17c9dc..0000000
--- a/html5/render/vue/validator/index.js
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-import * as styleValidator from './style'
-import * as propValidator from './prop'
-import { hyphenate, camelize, isPlainObject } from '../utils'
-import { isSupportedStyle } from './check'
-
-let onfail = function nope () {}
-let showConsole = true
-
-function warn (...args) {
-  const message = args.join(' ')
-  showConsole && console.warn(message)
-  onfail(message)
-  return message
-}
-
-/**
- * Configure the validator.
- * @param {Object} configs
- */
-export function configure (configs = {}) {
-  showConsole = !configs.silent
-  if (typeof configs.onfail === 'function') {
-    onfail = configs.onfail
-  }
-}
-
-/**
- * Validate the styles of the component.
- * @param {String} type
- * @param {Object} styles
- */
-export function validateStyles (type, styles = {}) {
-  let isValid = true
-
-  if (isPlainObject(type)) {
-    styles = type
-    type = '*'
-  }
-
-  for (const key in styles) {
-    if (!isSupportedStyle(type, hyphenate(key))) {
-      isValid = false
-      warn((type === '*')
-        ? `[Style Validator] Not support to use the "${key}" style property.`
-        : `[Style Validator] <${type}> is not support to use the "${key}" style property.`
-      )
-    }
-    else {
-      const validator = styleValidator[camelize(key)] || styleValidator.common
-      if (!validator(styles[key], hyphenate(key))) {
-        isValid = false
-        warn(`[Style Validator] The style "${key}" is not support the "${styles[key]}" value.`)
-      }
-    }
-  }
-  return isValid
-}
-
-/**
- * Validate the properties of the component.
- * @param {String} type
- * @param {Object} props
- */
-export function validateProps (type, props = {}) {
-  let isValid = true
-  for (const key in props) {
-    const validator = propValidator[camelize(key)]
-    if (validator && !validator(props[key])) {
-      isValid = false
-      warn(`[Property Validator] The property "${key}" is not support the "${props[key]}" value.`)
-    }
-  }
-  return isValid
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/render/vue/validator/prop.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/validator/prop.js b/html5/render/vue/validator/prop.js
deleted file mode 100644
index f2eb1ba..0000000
--- a/html5/render/vue/validator/prop.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-export function isString (value) {
-  return Object.prototype.toString.call(value) === '[object String]'
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/render/vue/validator/style.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/validator/style.js b/html5/render/vue/validator/style.js
deleted file mode 100644
index 2e6b128..0000000
--- a/html5/render/vue/validator/style.js
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/**
- * Validate the CSS color value.
- */
-export function isCSSColor (value) {
-  return /^[a-z]+$/i.test(value) // match color name
-    || /^#([a-f0-9]{3}){1,2}$/i.test(value) // match #ABCDEF
-    || /^rgb\s*\((\s*[0-9.]+\s*,){2}\s*[0-9.]+\s*\)/i.test(value) // match rgb(0,0,0)
-    || /^rgba\s*\((\s*[0-9.]+\s*,){3}\s*[0-9.]+\s*\)/i.test(value) // match rgba(0,0,0,0)
-}
-
-export function isCSSLength (value) {
-  return /^[+-]?[0-9]+.?([0-9]+)?(px|%)?$/.test(String(value))
-}
-
-export function position (value) {
-  return ['absolute', 'relative', 'fixed', 'sticky'].indexOf(value) !== -1
-}
-
-export function opacity (value) {
-  const count = parseFloat(value)
-  return count >= 0 && count <= 1
-}
-
-export function display (value) {
-  return ['flex'].indexOf(value) !== -1
-}
-
-export function flexDirection (value) {
-  return ['row', 'column'].indexOf(value) !== -1
-}
-
-export function justifyContent (value) {
-  return ['flex-start', 'flex-end', 'center', 'space-between'].indexOf(value) !== -1
-}
-
-export function alignItems (value) {
-  return ['stretch', 'flex-start', 'flex-end', 'center'].indexOf(value) !== -1
-}
-
-export function flex (value) {
-  return /^\d{1,3}$/.test(String(value))
-}
-
-export function fontStyle (value) {
-  return ['normal', 'italic', 'oblique'].indexOf(value) !== -1
-}
-
-export function fontWeight (value) {
-  return ['normal', 'bold', 'light', 'bolder', 'lighter'].indexOf(value) !== -1
-}
-
-export function textDecoration (value) {
-  return ['none', 'underline', 'line-through'].indexOf(value) !== -1
-}
-
-export function textAlign (value) {
-  return ['left', 'center', 'right'].indexOf(value) !== -1
-}
-
-export function overflow (value) {
-  return ['visible', 'hidden'].indexOf(value) !== -1
-}
-
-export function textOverflow (value) {
-  return ['clip', 'ellipsis'].indexOf(value) !== -1
-}
-
-/**
- * Common style validator.
- * @param {any} value
- * @param {String} key
- */
-export function common (value, key) {
-  if (/^[\w-]*color$/.test(String(key))) {
-    return isCSSColor(value)
-  }
-
-  // check width and height
-  if (/^(width|height)$/.test(String(key))) {
-    return isCSSLength(value)
-  }
-
-  // check postions
-  if (/^(top|right|bottom|left)$/.test(String(key))) {
-    return isCSSLength(value)
-  }
-
-  // checkout border-radius
-  if (/^border-((top|right|bottom|left)-){0,2}(width|radius)$/.test(String(key))) {
-    return isCSSLength(value)
-  }
-
-  // check border-style
-  if (/border-((top|right|bottom|left)-)?style/.test(String(key))) {
-    return ['solid', 'dashed', 'dotted'].indexOf(value) !== -1
-  }
-
-  // check margins and paddings
-  if (/^((margin|padding)-)?(top|right|bottom|left)/.test(String(key))) {
-    return isCSSLength(value)
-  }
-
-  switch (String(key)) {
-    case 'font-size': return isCSSLength(value)
-  }
-
-  return true
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/e2e/runner.js
----------------------------------------------------------------------
diff --git a/html5/test/e2e/runner.js b/html5/test/e2e/runner.js
deleted file mode 100644
index bf4758f..0000000
--- a/html5/test/e2e/runner.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* eslint-disable */
-
-var path = require('path')
-var spawn = require('cross-spawn')
-var httpServer = require('http-server')
-var server = httpServer.createServer({
-  root: path.resolve(__dirname, '../../../')
-})
-
-server.listen(8088)
-
-var args = process.argv.slice(2)
-if (args.indexOf('--config') === -1) {
-  args = args.concat(['--config', 'build/nightwatch.config.js'])
-}
-if (args.indexOf('--env') === -1) {
-  args = args.concat(['--env', 'phantomjs'])
-}
-var i = args.indexOf('--test')
-if (i > -1) {
-  args[i + 1] = 'html5/test/e2e/specs/' + args[i + 1]
-}
-
-var runner = spawn('nightwatch', args, {
-  stdio: 'inherit'
-})
-
-runner.on('exit', function (code) {
-  server.close()
-  process.exit(code)
-})
-
-runner.on('error', function (err) {
-  server.close()
-  throw err
-})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/e2e/specs/index.js
----------------------------------------------------------------------
diff --git a/html5/test/e2e/specs/index.js b/html5/test/e2e/specs/index.js
deleted file mode 100644
index 9a57acc..0000000
--- a/html5/test/e2e/specs/index.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-module.exports = {
-  'index page': function (browser) {
-    browser.url('http://localhost:8088/index.html')
-    browser.expect.element('#weex').to.be.present
-    browser.end()
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/components/a.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/components/a.js b/html5/test/render/vue/components/a.js
deleted file mode 100644
index 974d9a8..0000000
--- a/html5/test/render/vue/components/a.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-import { init } from '../helper'
-import a from '../../../../render/vue/components/a'
-import div from '../../../../render/vue/components/div'
-
-init('<a> component', (Vue, helper) => {
-  const { compile, utils } = helper
-
-  before(() => {
-    helper.register('a', a)
-    helper.register('div', div)
-  })
-
-  it('simple <a> component', () => {
-    const vm = compile(`<a>abc</a>`)
-    const el = vm.$el
-    expect(el.tagName.toLowerCase()).to.equal('a')
-    const classListArr = utils.toArray(el.classList)
-    expect('weex-a').to.be.oneOf(classListArr)
-    expect('weex-ct').to.be.oneOf(classListArr)
-    expect(el.getAttribute('weex-type')).to.be.equal('a')
-    expect(el.innerHTML).to.be.equal('')
-  })
-
-  it('<a> with href', () => {
-    const href = '//m.taobao.com'
-    const vm = compile(`<a href="${href}"></a>`)
-    expect(vm.$el.getAttribute('href')).to.be.equal(href)
-  })
-
-  it('<a> with children <div>', () => {
-    const href = '//m.taobao.com'
-    const vm = compile(`<a href="${href}"><div></div></a>`)
-    const el = vm.$el
-    expect(el.children.length).to.be.equal(1)
-    expect(el.children[0].tagName).to.match(/^(?:html:)?div$/i)
-    expect(el.children[0].getAttribute('weex-type')).to.be.equal('div')
-  })
-})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/components/div.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/components/div.js b/html5/test/render/vue/components/div.js
deleted file mode 100644
index c1e6eee..0000000
--- a/html5/test/render/vue/components/div.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-import { init } from '../helper'
-import div from '../../../../render/vue/components/div'
-
-init('<div> component', (Vue, helper) => {
-  const { compile, utils } = helper
-
-  before(() => {
-    helper.register('div', div)
-  })
-
-  it('simple <div> component', () => {
-    const vm = compile(`<div>abc</div>`)
-    const el = vm.$el
-    expect(el.tagName.toLowerCase()).to.equal('div')
-    const classListArr = utils.toArray(el.classList)
-    expect('weex-div').to.be.oneOf(classListArr)
-    expect('weex-ct').to.be.oneOf(classListArr)
-    expect(el.getAttribute('weex-type')).to.be.equal('div')
-    expect(el.innerHTML).to.be.equal('')
-  })
-
-  it('<div> with children <div>', () => {
-    const vm = compile(`<div><div></div></div>`)
-    const el = vm.$el
-    expect(el.children.length).to.be.equal(1)
-    expect(el.children[0].tagName).to.match(/^(?:html:)?div$/i)
-    expect(el.children[0].getAttribute('weex-type')).to.be.equal('div')
-  })
-})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/components/image.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/components/image.js b/html5/test/render/vue/components/image.js
deleted file mode 100644
index 7779525..0000000
--- a/html5/test/render/vue/components/image.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-import { init } from '../helper'
-import image from '../../../../render/vue/components/image'
-
-init('<image> component', (Vue, helper) => {
-  const { compile, utils } = helper
-
-  before(() => {
-    helper.register('image', image)
-  })
-
-  it('simple <image> component', () => {
-    const vm = compile(`<image>abc</image>`)
-    const el = vm.$el
-    expect(el.tagName.toLowerCase()).to.be.equal('figure')
-    expect(utils.toArray(el.classList)).to.include.members(['weex-image', 'weex-el'])
-    expect(el.getAttribute('weex-type')).to.be.equal('image')
-  })
-
-  it('<image> with src', () => {
-    const src = '//vuejs.org/images/logo.png'
-    const vm = compile(`<image src="${src}"></image>`)
-    expect(vm.$el.getAttribute('img-src')).to.be.equal(`${src}`)
-  })
-
-  it('<image> with placeholder', () => {
-    const placeholder = '//vuejs.org/images/logo.png'
-    const vm = compile(`<image placeholder="${placeholder}"></image>`)
-    expect(vm.$el.getAttribute('img-placeholder')).to.be.equal(`${placeholder}`)
-  })
-
-  it('<image> resize="cover"', () => {
-    const vm = compile(`<image resize="cover"></image>`)
-    expect(vm.$el.style.backgroundSize).to.be.equal('cover')
-  })
-
-  it('<image> resize="contain"', () => {
-    const vm = compile(`<image resize="contain"></image>`)
-    expect(vm.$el.style.backgroundSize).to.be.equal('contain')
-  })
-
-  it('<image> resize="stretch"', () => {
-    const vm = compile(`<image resize="stretch"></image>`)
-    expect(vm.$el.style.backgroundSize).to.contain('100%')
-  })
-
-  it('<image> unknown resize', () => {
-    const vm = compile(`<image resize="unknown"></image>`)
-    expect(vm.$el.style.backgroundSize).to.be.contain('100%')
-  })
-})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/components/list.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/components/list.js b/html5/test/render/vue/components/list.js
deleted file mode 100644
index 6cb3b16..0000000
--- a/html5/test/render/vue/components/list.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-import { init } from '../helper'
-import list from '../../../../render/vue/components/scrollable/list'
-import cell from '../../../../render/vue/components/scrollable/cell'
-
-init('<list> component', (Vue, helper) => {
-  const { utils, compile } = helper
-
-  before(() => {
-    helper.register('list', list)
-    helper.register('cell', cell)
-  })
-
-  it('create simple list component', () => {
-    const vm = compile(`<list><cell></cell></list>`)
-    expect(vm.$el.tagName.toLowerCase()).to.be.equal('main')
-    expect(utils.toArray(vm.$el.classList)).to.include.members(['weex-list', 'weex-list-wrapper', 'weex-ct'])
-  })
-})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/components/switch.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/components/switch.js b/html5/test/render/vue/components/switch.js
deleted file mode 100644
index f7c2ab8..0000000
--- a/html5/test/render/vue/components/switch.js
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-import { init } from '../helper'
-import _switch from '../../../../render/vue/components/switch'
-
-init('<switch> component', (Vue, helper) => {
-  const { utils, compile } = helper
-
-  before(() => {
-    helper.register('switch', _switch)
-  })
-
-  it('simple <switch> component', () => {
-    const vm = compile(`<switch></switch>`)
-    expect(vm.$el.tagName.toLowerCase()).to.be.equal('span')
-    expect(utils.toArray(vm.$el.classList)).to.include('weex-switch')
-  })
-
-  it('disabled <switch>', () => {
-    const vmA = compile(`<switch disabled="true"></switch>`)
-    const vmB = compile(`<switch disabled></switch>`)
-    const vmC = compile(`<switch disabled="disabled"></switch>`)
-    expect(vmA.$el.className).to.match(/weex\-switch\-disabled/)
-    expect(vmB.$el.className).to.match(/weex\-switch\-disabled/)
-    expect(vmC.$el.className).to.match(/weex\-switch\-disabled/)
-  })
-
-  it('enabled <switch>', () => {
-    const vmA = compile(`<switch></switch>`)
-    const vmB = compile(`<switch disabled="false"></switch>`)
-
-    expect(vmA.$el.className).to.match(/weex-switch/)
-    expect(vmB.$el.className).to.match(/weex-switch/)
-  })
-
-  it('checked <switch>', () => {
-    const vmA = compile(`<switch checked="true"></switch>`)
-    const vmB = compile(`<switch checked></switch>`)
-    const vmC = compile(`<switch checked="checked"></switch>`)
-
-    expect(vmA.$el.className).to.match(/weex\-switch\-checked/)
-    expect(vmB.$el.className).to.match(/weex\-switch\-checked/)
-    expect(vmC.$el.className).to.match(/weex\-switch\-checked/)
-  })
-
-  it('toggle <switch>', () => {
-    const vm = compile(`<switch ref="switch"></switch>`).$refs.switch
-    expect(vm.isChecked).to.not.be.true
-    vm.toggle()
-    expect(vm.isChecked).to.be.true
-    vm.toggle()
-    expect(vm.isChecked).to.not.be.true
-  })
-
-  it('toggle & disabled <switch>', () => {
-    const vm = compile(`<switch ref="switch"></switch>`).$refs.switch
-    vm.isDisabled = true
-
-    expect(vm.isChecked).to.not.be.true
-    vm.toggle()
-    expect(vm.isChecked).to.not.be.true
-  })
-
-  it('unchecked <switch>', () => {
-    const vmA = compile(`<switch></switch>`)
-    const vmB = compile(`<switch checked="false"></switch>`)
-
-    expect(vmA.$el.className).to.match(/weex-switch/)
-    expect(vmB.$el.className).to.match(/weex-switch/)
-  })
-
-  it('disabled & checked <switch>', () => {
-    const vmA = compile(`<switch disabled checked></switch>`)
-    const vmB = compile(`<switch disabled="disabled" checked="checked"></switch>`)
-
-    expect(vmA.$el.className).to.match(/weex\-switch\-checked/)
-    expect(vmA.$el.className).to.match(/weex\-switch\-disabled/)
-    expect(vmB.$el.className).to.match(/weex\-switch\-checked/)
-    expect(vmB.$el.className).to.match(/weex\-switch\-disabled/)
-  })
-})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/components/text.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/components/text.js b/html5/test/render/vue/components/text.js
deleted file mode 100644
index 6428979..0000000
--- a/html5/test/render/vue/components/text.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-import semver from 'semver'
-import { init } from '../helper'
-import text from '../../../../render/vue/components/text'
-
-init('<text> component', (Vue, helper) => {
-  const { utils, compile } = helper
-
-  before(() => {
-    helper.register('text', text)
-  })
-
-  it('create simple text component', () => {
-    const vm = compile(`<text>abc</text>`)
-
-    expect(vm.$el.tagName.toLowerCase()).to.be.equal('p')
-    expect(vm.$el.textContent).to.be.equal('abc')
-  })
-
-  it('empty text component', () => {
-    const vm = compile(`<text></text>`)
-
-    expect(vm.$el.tagName.toLowerCase()).to.be.equal('p')
-    expect(vm.$el.innerHTML).to.be.equal('')
-  })
-
-  it('lines style', () => {
-    const vm = compile(`<text style="lines:5;">abc</text>`)
-    if (semver.gt(Vue.version, '2.0.8')) {
-      expect(vm.$el.style.overflow).to.be.equal('hidden')
-      expect(vm.$el.style.textOverflow).to.be.equal('ellipsis')
-      expect(vm.$el.style.webkitLineClamp).to.be.equal('5')
-    }
-  })
-
-  it('inline styles', () => {
-    const vm = compile(`<text style="color:blue">abc</text>`)
-
-    if (semver.gt(Vue.version, '2.0.8')) {
-      expect(vm.$el.style.color).to.be.equal('blue')
-    }
-  })
-
-  // Not sure about this feature.
-  it('class property', () => {
-    const vm = compile(`<text class="title"></text>`)
-    expect(utils.toArray(vm.$el.classList)).to.include.members(['weex-text', 'weex-el', 'title'])
-  })
-
-  it('value property', () => {
-    const vm = compile(`<text value="A"></text>`)
-    expect(vm.$el.innerHTML).to.be.equal('A')
-  })
-
-  it('both have value and content', () => {
-    const vm = compile(`<text value="A">B</text>`)
-    expect(vm.$el.innerHTML).to.be.equal('B')
-  })
-
-  // describe.skip('error usage (on native)', () => {
-  //   it('contain other tags', () => {
-  //     const vm = compile(`<text><b>abc</b></text>`)
-  //     const span = vm.$el.children[0]
-
-  //     expect(span.tagName).to.be.equal('SPAN')
-  //     expect(span.innerHTML).to.be.equal('')
-  //   })
-  // })
-})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/components/web.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/components/web.js b/html5/test/render/vue/components/web.js
deleted file mode 100644
index 6ee488f..0000000
--- a/html5/test/render/vue/components/web.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-import { init } from '../helper'
-import web from '../../../../render/vue/components/web'
-
-init('<web> component', (Vue, helper) => {
-  const { utils, compile } = helper
-  before(() => {
-    helper.register('web', web)
-  })
-
-  it('simple <web> component', () => {
-    const vm = compile(`<web></web>`)
-
-    // console.log(vm.$el)
-    expect(vm.$el.tagName.toLowerCase()).to.be.equal('iframe')
-    expect(utils.toArray(vm.$el.classList)).to.include.members(['weex-web', 'weex-el'])
-  })
-
-  it('use src attribute', () => {
-    const vm = compile(`<web src="https://x.cn"></web>`)
-
-    expect(vm.$el.tagName.toLowerCase()).to.be.equal('iframe')
-    expect(vm.$el.getAttribute('src')).to.be.equal('https://x.cn')
-    expect(utils.toArray(vm.$el.classList)).to.include.members(['weex-web', 'weex-el'])
-  })
-})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/core/node.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/core/node.js b/html5/test/render/vue/core/node.js
deleted file mode 100644
index 7235a85..0000000
--- a/html5/test/render/vue/core/node.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* global Event */
-
-import { init } from '../helper/runtime'
-import div from '../../../../render/vue/components/div'
-import eventBubbleBundle from '../data/build/dotvue/event-bubble.js'
-
-init('core node', (Vue, helper) => {
-  const id = 'test-event-bubble'
-  let vm = null
-  let el = null
-  before(() => {
-    helper.register('div', div)
-    vm = helper.createVm(eventBubbleBundle, id)
-    el = vm.$el.querySelector('.event-bubble-outter')
-  })
-
-  describe('stop event bubble', function () {
-    let infoStr = ''
-    function trackerShouldBe (tracker, shouldBe) {
-      shouldBe = infoStr + shouldBe
-      infoStr = shouldBe
-      expect(tracker).to.equal(shouldBe)
-    }
-
-    it('should trigger the closest parent.', function (done) {
-      expect(vm.tracker).to.equal('')
-      /**
-       * click outter div. should trigget event on the outter div.
-       * and should execute handlers by the priority of:
-       * child vnode -> parent vnode.
-       *  e.g.  div -> foo (whoes root element is the div.)
-       */
-      const evt = new Event('tap', { bubbles: true })
-      evt._for = 'weex'
-      el.dispatchEvent(evt)
-
-      helper.registerDone(id, (tracker) => {
-        trackerShouldBe(tracker, ' > in-bar-outter-div > component-bar')
-        done()
-      })
-    })
-
-    it('should not bubble if already triggered.', function (done) {
-      const inner = vm.$el.querySelector('.event-bubble-inner')
-      /**
-       * click inner div. should just trigget the inner handler and
-       * shouldn't bubbe to outter div.
-       */
-      const evt = new Event('tap', { bubbles: false })
-      evt._for = 'weex'
-      inner.dispatchEvent(evt)
-
-      helper.registerDone(id, (tracker) => {
-        trackerShouldBe(tracker, ' > in-bar-inner-div')
-        helper.unregisterDone(id)
-        done()
-      })
-    })
-  })
-})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/core/scope-style-map.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/core/scope-style-map.js b/html5/test/render/vue/core/scope-style-map.js
deleted file mode 100644
index 29bea0c..0000000
--- a/html5/test/render/vue/core/scope-style-map.js
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-import { getHeadStyleMap } from '../../../../render/vue/core/style'
-import '../data/head-css'
-import headMap from '../data/head-map'
-
-function toArray (arr) {
-  return Array.prototype.slice.call(arr)
-}
-
-function getVStyleSheetNodes () {
-  const regVStyleSheets = /((?:,?\s*\.[\w-]+\[data-v-\w+\](?::\w+)?)+)\s*({[^}]+)/
-  const nodes = toArray(document.styleSheets)
-    .filter(function (styleSheet) {
-      return regVStyleSheets.test(styleSheet.ownerNode.textContent)
-    }).map(function (styleSheet) {
-      return styleSheet.ownerNode
-    })
-  return nodes
-}
-
-function getStyleSheetNodes () {
-  return toArray(document.styleSheets)
-    .map(function (styleSheet) {
-      return styleSheet.ownerNode
-    })
-}
-
-describe('style map', () => {
-  let styleSheetNodes
-
-  before(function () {
-    styleSheetNodes = getStyleSheetNodes()
-  })
-
-  it('should get head style map.', () => {
-    /**
-     * before get style map.
-     */
-    const vStyleSheetNodes = getVStyleSheetNodes()
-    const allNodes = getStyleSheetNodes()
-    const vNodesExisted = vStyleSheetNodes.filter(function (node) {
-      return allNodes.indexOf(node) > -1
-    })
-    expect(vNodesExisted).to.have.members(vStyleSheetNodes)
-
-    /**
-     * get style map.
-     */
-    window._no_remove_style_sheets = false
-    // clear mark set in other test cases.
-    Array.from(document.styleSheets).forEach(function (styleSheet) {
-      styleSheet.ownerNode.removeAttribute('weex-scanned')
-    })
-    const styleMap = getHeadStyleMap()
-    window._no_remove_style_sheets = true
-
-    /**
-     * after get style map.
-     */
-    for (const key in headMap) {
-      const expected = headMap[key]
-      const result = styleMap[key]
-      expect(expected).be.deep.equal(result)
-    }
-
-    const nowStyleSheetNodes = getStyleSheetNodes()
-    const vNodesLeft = vStyleSheetNodes.filter(function (node) {
-      return nowStyleSheetNodes.indexOf(node) > -1
-    })
-    expect(vNodesLeft).to.have.lengthOf(0)
-  })
-
-  after(function () {
-    const nodes = getStyleSheetNodes()
-    styleSheetNodes.forEach(function (node) {
-      if (nodes.indexOf(node) === -1) {
-        document.head.appendChild(node)
-      }
-    })
-  })
-})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/core/style.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/core/style.js b/html5/test/render/vue/core/style.js
deleted file mode 100644
index 00bc59a..0000000
--- a/html5/test/render/vue/core/style.js
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-import { init } from '../helper/runtime'
-import div from '../../../../render/vue/components/div'
-import image from '../../../../render/vue/components/image'
-import { init as initViewport } from '../../../../render/vue/env/viewport'
-
-import scopedStyleBundle from '../data/build/dotvue/scoped-style'
-
-// function toArray (arr) {
-//   return Array.prototype.slice.call(arr)
-// }
-
-// function getVStyleSheetNodes () {
-//   const regVStyleSheets = /((?:,?\s*\.[\w-]+\[data-v-\w+\](?::\w+)?)+)\s*({[^}]+)/
-//   const nodes = toArray(document.styleSheets)
-//     .filter(function (styleSheet) {
-//       return regVStyleSheets.test(styleSheet.ownerNode.textContent)
-//     }).map(function (styleSheet) {
-//       return styleSheet.ownerNode
-//     })
-//   return nodes
-// }
-
-init('core style', (Vue, helper) => {
-  const { scale } = initViewport()
-  before(() => {
-    helper.register('div', div)
-    helper.register('image', image)
-  })
-
-  it('should get normalized merged styles.', function (done) {
-    const vm = helper.createVm(scopedStyleBundle)
-    const el = vm.$refs.foo.$el || vm.$refs.foo
-    expect(el).to.be.ok
-    const expectedMap = {
-      width: 200 * scale + 'px',
-      height: 200 * scale + 'px',
-      backgroundColor: 'red'
-    }
-    const expectedDirection = {
-      WebkitBoxDirection: 'normal',
-      WebkitBoxOrient: 'horizontal',
-      WebkitFlexDirection: 'row',
-      flexDirection: 'row'
-    }
-    const expectedTransform = {
-      WebkitTransform: `translate3d(${100 * scale + 'px'}, ${100 * scale + 'px'}, 0px)`,
-      transform: `translate3d(${100 * scale + 'px'}, ${100 * scale + 'px'}, 0px)`
-    }
-
-    for (const k in expectedMap) {
-      expect(el.style[k]).to.equal(expectedMap[k])
-    }
-    const directionRes = []
-    for (const k in expectedDirection) {
-      directionRes.push(el.style[k] === expectedDirection[k])
-    }
-    expect(directionRes).to.include(true)
-
-    const transformRes = []
-    for (const k in expectedTransform) {
-      transformRes.push(el.style[k] === expectedTransform[k])
-    }
-    expect(transformRes).to.include(true)
-
-    const id = 'test-style'
-    helper.registerDone(id, () => {
-      expect(el.style.backgroundImage).to.match(
-        /(?:-webkit-|-moz-|-ms-|-o-)?linear-gradient\(to top, (?:rgb\(245, 254, 253\)|#f5fefd), (?:rgb\(255, 255, 255\)|#ffffff)\)/)
-      expect(['-webkit-box',
-        '-moz-box',
-        '-ms-flexbox',
-        '-webkit-flex',
-        'flex']).to.include(el.style.display)
-      helper.unregisterDone(id)
-      done()
-    })
-  })
-})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/data/css/head1.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head1.css b/html5/test/render/vue/data/css/head1.css
deleted file mode 100644
index f6a818a..0000000
--- a/html5/test/render/vue/data/css/head1.css
+++ /dev/null
@@ -1,38 +0,0 @@
-/*/////////////////////////////////////////////////////////////*/
-
-/* 默认背景色为 #FFFFFF */
-.wrapper[data-v-67763bae] {
-    width: 375px;
-    /*background-color: #586C5D;*/
-    overflow: hidden;
-}
-.module-warning[data-v-67763bae]{
-    text-align: center;
-    font-size: 25px;
-    color: red;
-    font-weight: bold;
-}
-.video[data-v-67763bae]{
-    position: absolute;
-    top: 0;
-    left: 0;
-    width: 375px;
-}
-.first-frame[data-v-67763bae]{
-    position: absolute;
-    top: 0;
-    left: 0;
-    width: 375px;
-}
-.final-image[data-v-67763bae]{
-    position: absolute;
-    top: 0;
-    left: 0;
-    width: 375px;
-}
-.deco-img[data-v-67763bae]{
-    width: 375px;
-    position: absolute;
-    left: 0;
-    bottom: 0;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/data/css/head10.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head10.css b/html5/test/render/vue/data/css/head10.css
deleted file mode 100644
index 06dce95..0000000
--- a/html5/test/render/vue/data/css/head10.css
+++ /dev/null
@@ -1,14 +0,0 @@
-/*/////////////////////////////////////////////////////////////*/
-/* Copyright 2014 Evernote Corporation. All rights reserved. */
-.en-markup-crop-options {
-    top: 18px !important;
-    left: 50% !important;
-    margin-left: -100px !important;
-    width: 200px !important;
-    border: 2px rgba(255,255,255,.38) solid !important;
-    border-radius: 4px !important;
-}
-
-.en-markup-crop-options div div:first-of-type {
-    margin-left: 0px !important;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/data/css/head11.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head11.css b/html5/test/render/vue/data/css/head11.css
deleted file mode 100644
index dbefea4..0000000
--- a/html5/test/render/vue/data/css/head11.css
+++ /dev/null
@@ -1,2 +0,0 @@
-/*/////////////////////////////////////////////////////////////*/
-#J_6820099468 .act-module-title-m {padding-bottom:0;background-color:#34110b}#J_6820099468 .act-module-title-m h3{margin:0 auto 0}#J_6820099468 .act-module-title-m .item-title{color:#333}#J_6820099468 .act-module-title-m .item-title:before,#J_6820099468 .act-module-title-m .item-title:after{background:#333}#J_6820099468 .act-module-title-m .is-img{padding-top:28.26666667%}#J_6820099468 .act-module-title-m .banner-img{height:212}#J_3487624305 .act-module-title-m{padding-bottom:0;background-color:#34110b}#J_3487624305 .act-module-title-m h3{margin:0 auto 0}#J_3487624305 .act-module-title-m .item-title{color:#333}#J_3487624305 .act-module-title-m .item-title:before,#J_3487624305 .act-module-title-m .item-title:after{background:#333}#J_3487624305 .act-module-title-m .is-img{padding-top:28.26666667%}#J_3487624305 .act-module-title-m .banner-img{height:212}#J_1043444990 .zebra-basis-slider{background-color:#4e351f;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-
 box;-o-box-sizing:border-box;-ms-box-sizing:border-box;padding-left:0;padding-right:0}#J_1043444990 .zebra-basis-slider .icons i{background-color:#e6e6e6}#J_1043444990 .zebra-basis-slider .icons i.current{background-color:#DF3434}#J_1043444990 .zebra-basis-slider .slider{min-height:136.17021277px}#J_5774361206 .act-module-title-m{padding-bottom:0;background-color:#34110b}#J_5774361206 .act-module-title-m h3{margin:0 auto 0}#J_5774361206 .act-module-title-m .item-title{color:#333}#J_5774361206 .act-module-title-m .item-title:before,#J_5774361206 .act-module-title-m .item-title:after{background:#333}#J_5774361206 .act-module-title-m .is-img{padding-top:28.26666667%}#J_5774361206 .act-module-title-m .banner-img{height:212}#J_4710936714 .act-module-title-m{padding-bottom:0;background-color:#34110b}#J_4710936714 .act-module-title-m h3{margin:0 auto 0}#J_4710936714 .act-module-title-m .item-title{color:#333}#J_4710936714 .act-module-title-m .item-title:before,#J_4710936714 .act-module-tit
 le-m .item-title:after{background:#333}#J_4710936714 .act-module-title-m .is-img{padding-top:28.26666667%}#J_4710936714 .act-module-title-m .banner-img{height:212}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/data/css/head12.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head12.css b/html5/test/render/vue/data/css/head12.css
deleted file mode 100644
index 8cc067b..0000000
--- a/html5/test/render/vue/data/css/head12.css
+++ /dev/null
@@ -1,2 +0,0 @@
-/*/////////////////////////////////////////////////////////////*/
-.inner-feedback-m{        width: 40px;        height: 40px;        background-size: 50px;        background-image: url(//img.alicdn.com/tps/i3/T1JDlEFg4cXXcu8V6l-64-64.png);        display: block;        position: fixed;        left: 10px;        bottom: 100px;        overflow: hidden;        text-indent: -9999em;        z-index: 9999;        background-color: rgba(0, 0, 0, 0.2);        border-radius: 20px;        background-position: center;    }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/data/css/head13.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head13.css b/html5/test/render/vue/data/css/head13.css
deleted file mode 100644
index 6cf748c..0000000
--- a/html5/test/render/vue/data/css/head13.css
+++ /dev/null
@@ -1,25 +0,0 @@
-.row[data-v-0dad7305] {
-  flex-direction: row;
-}
-.result[data-v-0dad7305] {
-  text-align: right;
-  background-color: #666;
-  font-size: 40px;
-  color: white;
-}
-.btn[data-v-0dad7305] {
-  flex: 1;
-  text-align: center;
-  background-color: #eee;
-  font-size: 36px;
-}
-.btn[data-v-0dad7305], .result[data-v-0dad7305] {
-  height: 100px;
-  padding: 30px;
-  margin: 5px;
-}
-.btn-operator[data-v-0dad7305] {
-  background-color: #669;
-  font-size: 40px;
-  color: white;
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/data/css/head14.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head14.css b/html5/test/render/vue/data/css/head14.css
deleted file mode 100644
index 9865127..0000000
--- a/html5/test/render/vue/data/css/head14.css
+++ /dev/null
@@ -1 +0,0 @@
-@charset "utf-8";@font-face{font-family:zebra-iconfont;src:url(//at.alicdn.com/t/font_5e6zaftfqrggb9.eot);src:url(//at.alicdn.com/t/font_5e6zaftfqrggb9.eot?#iefix) format('embedded-opentype'),url(//at.alicdn.com/t/font_5e6zaftfqrggb9.woff) format('woff'),url(//at.alicdn.com/t/font_5e6zaftfqrggb9.ttf) format('truetype'),url(//at.alicdn.com/t/font_5e6zaftfqrggb9.svg#zebra-iconfont) format('svg')}@font-face{font-family:mui-iconfont;src:url(//at.alicdn.com/t/font_1422363314_6108727.eot);src:url(//at.alicdn.com/t/font_1422363314_6108727.eot?#iefix) format('embedded-opentype'),url(//at.alicdn.com/t/font_1422363314_6108727.woff) format('woff'),url(//at.alicdn.com/t/font_1422363314_6108727.ttf) format('truetype'),url(//at.alicdn.com/t/font_1422363314_6108727.svg#iconfont) format('svg')}.icon{font-family:zebra-iconfont;font-style:normal}.icon-title{display:none}.mui-iconfont{font-family:mui-iconfont;font-style:normal}*{padding:0;margin:0}.mui-zebra-page{padding-bottom:20px}.mui-zebra-page .m
 ui-zebra-module{min-height:50px;position:relative}.mui-zebra-page .mui-zebra-module.ishide>:not(.zebra-toolbar){-webkit-filter:blur(2px);filter:blur(2px)}.mui-zebra-page .mui-zebra-module.ishide .zebra-toolbar .settohide .text{display:none}.mui-zebra-page .mui-zebra-module.ishide .zebra-toolbar .settohide .onhidetext{display:initial}.mui-zebra-page .mui-zebra-module.ishide:after{position:absolute;top:50%;left:50%;margin-top:-15px;margin-left:-60px;width:120px;height:30px;line-height:30px;text-align:center;font-size:14px;content:'already hidden';color:#fff;background-color:rgba(0,0,0,.5);border-radius:3px;pointer-events:none}.pinned{display:block!important}.zebra-toolbar{display:none;position:absolute;top:0;left:0;width:100%;height:100%;min-height:50px;color:#fff;font-size:12px;z-index:2000;box-sizing:border-box;pointer-events:none;border:3px solid #df3434;border-bottom-width:5px;border-top:0;box-shadow:0 1px 5px rgba(0,0,0,.4);-webkit-user-select:none;-moz-user-select:none;-ms-user-
 select:none;user-select:none}.zebra-toolbar *{box-sizing:initial!important}.zebra-toolbar .border{position:absolute;left:-3px;top:-48px;width:100%;height:48px;border-left:3px solid #df3434;border-right:3px solid #df3434}.zebra-toolbar .hd{position:relative;top:-48px;height:32px;line-height:32px;padding:8px 3px;background-color:#df3434}.zebra-toolbar .ft{position:absolute;bottom:-70px;left:50%;width:110px;margin-left:-55px;height:40px;padding:15px 0}.zebra-toolbar .ft,.zebra-toolbar .hd{pointer-events:initial}.zebra-toolbar .title{display:none}.zebra-toolbar i{font-style:normal}.zebra-toolbar .side{position:relative;float:right}.zebra-toolbar .iconbtn{float:left;display:block;width:32px;height:32px;text-align:center;border-radius:50%;overflow:hidden;-webkit-transition:background-color 250ms ease;transition:background-color 250ms ease;font-size:16px;opacity:.8;cursor:pointer}.zebra-toolbar .iconbtn:hover{opacity:1}.zebra-toolbar .iconbtn.active,.zebra-toolbar .iconbtn:active{opacity:1
 !important;background-color:rgba(255,255,255,.25)}.zebra-toolbar .iconbtn.edit{font-size:16px}.zebra-toolbar .info{font-size:18px}.zebra-toolbar .add{display:block;margin:0 auto;width:40px;height:40px;line-height:40px;overflow:hidden;text-align:center;border-radius:50%;background-color:#df3434;box-shadow:0 1px 5px rgba(0,0,0,.4);color:#fff;font-size:18px;cursor:pointer}.zebra-toolbar .arrow{width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #df3434;position:absolute}.zebra-toolbar .moremenus{float:left;position:relative}.zebra-toolbar .moremenus .menus{display:none;position:absolute;top:28px;padding-top:25px;left:-8px;z-index:1}.zebra-toolbar .moremenus .menus .arrow{width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #df3434;position:absolute;top:17px;left:16px}.zebra-toolbar .moremenus .menus ul{padding:10px 0;background-color:#df3434;box-shadow:0 1px 5px rgba(0,0,0
 ,.4)}.zebra-toolbar .moremenus .menus li{height:36px;line-height:36px;padding:0 16px;white-space:nowrap;cursor:pointer;-webkit-transition:background-color 250ms ease;transition:background-color 250ms ease;opacity:.8}.zebra-toolbar .moremenus .menus li:hover{opacity:1;background-color:rgba(0,0,0,.15)}.zebra-toolbar .moremenus .menus .title{display:inline;margin-left:5px}.zebra-toolbar .moremenus .menus .icon{font-size:16px}.zebra-toolbar .pop-info{display:none;position:absolute;right:10px;top:30px;width:200px;color:#fff;font-size:12px;line-height:22px;padding:30px 0 50px;-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto;z-index:1}.zebra-toolbar .pop-info .arrow{top:22px;right:8px;border-bottom:8px solid rgba(0,0,0,.6)}.zebra-toolbar .pop-info .inner{padding:5px;min-height:50px;background-color:rgba(0,0,0,.6)}.zebra-toolbar .pop-info a{color:#12AEFF;text-decoration:underline}.zebra-toolbar .onhidetext{display:none}.pc .zebra-toolbar{width:990px;left:
 50%;margin-left:-495px}.pc .zebra-toolbar .ft{width:200px;margin-left:-100px}.mui-zebra-page>div:first-of-type.mui-zebra-module{min-height:100px}.mui-zebra-page>div:first-of-type.mui-zebra-module .moveup{display:none}.mui-zebra-page>div:first-of-type.mui-zebra-module .zebra-toolbar .border{display:none}.mui-zebra-page>div:first-of-type.mui-zebra-module .zebra-toolbar .hd{top:0}.mui-zebra-page>div:last-of-type .ft,.mui-zebra-page>div:last-of-type .movedown{display:none}.mui-zebra-module.hover{z-index:10000}.mui-zebra-module.hover .zebra-toolbar{display:block}.zebra-toolbar.empty{display:block;position:relative;left:0;padding:0;margin:10px auto 0;text-align:center;max-width:1190px;height:auto;background-color:transparent;pointer-events:initial;border:0;box-shadow:none}.zebra-toolbar.empty.prepend{margin-bottom:60px;margin-top:0;padding-top:10px}.zebra-toolbar.empty.prepend+.zebra-toolbar.empty{display:none}.zebra-toolbar.empty.add-mod .add,.zebra-toolbar.empty.add-more .add{display:no
 ne}.zebra-add-cover,.zebra-add-more-cover{display:none;box-sizing:border-box!important;height:100px;line-height:100px;text-align:center;width:100%;padding:0 10px;margin:20px auto 30px}.zebra-add-cover .text,.zebra-add-more-cover .text{height:100%;font-size:14px;font-weight:700;color:#df3434;background-color:#ffd9d9;border:2px dashed #df3434}.pc .zebra-add-cover.zebra-add-more-cover{padding:0;width:990px}.add-mod .zebra-add-cover{display:block}.add-more .zebra-add-more-cover{display:block}.mui-zebra-nocontent{padding:10px;font-size:18px}.mui-zebra-nocontent p{margin-bottom:10px}.mui-zebra-nocontent a{color:#428bca}.mengban{opacity:0!important}.mengban:hover{opacity:.3!important}.mui-zebra-module.hover .mengban{opacity:.3!important}body.mui-zebra-isSource .zebra-toolbar .add,body.mui-zebra-isSource .zebra-toolbar .iconbtn,body.mui-zebra-isSource .zebra-toolbar.empty{display:none}body.mui-zebra-isSource .zebra-toolbar .iconbtn.info,body.mui-zebra-isSource .zebra-toolbar .iconbtn.mainta
 in{display:block}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/data/css/head2.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head2.css b/html5/test/render/vue/data/css/head2.css
deleted file mode 100644
index 50c718f..0000000
--- a/html5/test/render/vue/data/css/head2.css
+++ /dev/null
@@ -1,11 +0,0 @@
-/*/////////////////////////////////////////////////////////////*/
-
-.wrapper[data-v-16194ed9] {
-    color: #353535;
-}
-.point[data-v-16194ed9] {
-  position: absolute;
-}
-.banner[data-v-16194ed9]{
-  width: 375px;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/data/css/head3.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head3.css b/html5/test/render/vue/data/css/head3.css
deleted file mode 100644
index f8bf724..0000000
--- a/html5/test/render/vue/data/css/head3.css
+++ /dev/null
@@ -1,25 +0,0 @@
-/*/////////////////////////////////////////////////////////////*/
-
-/* 默认背景色为 #FFFFFF */
-.wrapper[data-v-6acf469e] {
-    background-color: transparent;
-    -webkit-box-pack: center;
-    -webkit-justify-content: center;
-        -ms-flex-pack: center;
-            justify-content: center;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-        -ms-flex-align: center;
-            align-items: center;
-    padding-bottom: 9px;
-}
-.items-wrapper[data-v-6acf469e] {
-    width: 357.5px;
-}
-.row[data-v-6acf469e] {
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-    -webkit-flex-direction: row;
-        -ms-flex-direction: row;
-            flex-direction: row;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/data/css/head4.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head4.css b/html5/test/render/vue/data/css/head4.css
deleted file mode 100644
index dfde2dc..0000000
--- a/html5/test/render/vue/data/css/head4.css
+++ /dev/null
@@ -1,56 +0,0 @@
-/*/////////////////////////////////////////////////////////////*/
-
-.item[data-v-553d6ea0] {
-    width: 178px;
-    height: 118px;
-    background-color: #ffffff;
-    margin-bottom: 1px;
-}
-.bgImage[data-v-553d6ea0] {
-    position: absolute;
-    width: 178px;
-    height: 118px;
-}
-.img[data-v-553d6ea0] {
-    position: absolute;
-    width: 90px;
-    height: 90px;
-    top: 14px;
-    left: 3px;
-}
-.right-panel[data-v-553d6ea0] {
-    position: absolute;
-    left: 98px;
-    width: 75px;
-    lines: 1;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-    display: inline-block;
-    overflow: hidden;
-}
-.title[data-v-553d6ea0] {
-    font-weight: bold;
-    font-size: 12px;
-}
-.title-goods[data-v-553d6ea0] {
-    top: 22px;
-}
-.title-shop[data-v-553d6ea0] {
-    top: 40px;
-}
-.subtitle[data-v-553d6ea0] {
-    font-weight: lighter;
-    font-size: 12px;
-    color: #4A4A4A;
-}
-.subtitle-goods[data-v-553d6ea0] {
-    top: 43px;
-}
-.subtitle-shop[data-v-553d6ea0] {
-    top: 61px;
-}
-.price[data-v-553d6ea0] {
-    font-weight: lighter;
-    font-size: 14px;
-    top: 76px;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/data/css/head5.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head5.css b/html5/test/render/vue/data/css/head5.css
deleted file mode 100644
index a0adb55..0000000
--- a/html5/test/render/vue/data/css/head5.css
+++ /dev/null
@@ -1,153 +0,0 @@
-/*/////////////////////////////////////////////////////////////*/
-
-/* 默认背景色为 #FFFFFF */
-.wrapper[data-v-2c9fb3eb] {
-    background-color: transparent;
-}
-.cell-wrap[data-v-2c9fb3eb]{
-}
-.like-row[data-v-2c9fb3eb]{
-    width: 375px;
-    padding-left: 9px;
-    padding-right: 9px;
-    margin-bottom: 9px;
-    box-sizing: border-box;
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-    -webkit-flex-direction: row;
-        -ms-flex-direction: row;
-            flex-direction: row;
-    -webkit-box-pack: justify;
-    -webkit-justify-content: space-between;
-        -ms-flex-pack: justify;
-            justify-content: space-between;
-        }
-.like-item[data-v-2c9fb3eb]{
-    box-sizing: border-box;
-    width: 174px;
-    height: 250px;
-    /*margin-bottom: 18;*/
-    padding-left: 7px;
-    padding-right: 7px;
-    /*padding-top: 348px;*/
-    background-color: #ffffff;
-}
-.item-img[data-v-2c9fb3eb]{
-    /*position: absolute;*/
-    /*top: 0;*/
-    /*left: 0;*/
-    margin-left: -7px;
-    width: 174px;
-    height: 174px;
-}
-.title-ctn[data-v-2c9fb3eb]{
-    margin-top: 12px;
-    /* 348 - 14 * 2 */
-    width: 162px;
-    /*background-color: #eee;*/
-}
-.badge[data-v-2c9fb3eb]{
-    position: absolute;
-    top: 2px;
-    left: 0px;
-    width: 26px;
-    height: 13px;
-    margin-right: 4px;
-}
-.title[data-v-2c9fb3eb]{
-    width: 162px;
-    font-size: 12px;
-    line-height: 15px;
-    /*padding-top: 3;*/
-    color: #333333;
-    /*background-color: #ccc;*/
-
-    overflow: hidden;
-    text-overflow: ellipsis;
-    lines: 2;
-}
-.sub-title[data-v-2c9fb3eb]{
-    position: absolute;
-    /* 348 - 40(own-height)*/
-    bottom: 11px;
-    right: 6px;
-    /*width: 312;*/
-
-    /* totally hack, do not change */
-    font-size: 10px;
-    line-height: 9px;
-    height: 14px;
-    padding-top: 1.5px;
-
-    padding-left: 3px;
-    padding-right: 3px;
-    text-align: center;
-
-    color: #F70E50;
-    text-align: center;
-    border-radius: 3px;
-    border-width: 1px;
-
-    overflow: hidden;
-    text-overflow: ellipsis;
-    lines: 1;
-}
-.sub-title-bg[data-v-2c9fb3eb]{
-    position: absolute;
-    bottom: 11px;
-    right: 6px;
-
-    /* totally hack, do not change */
-    font-size: 10px;
-    line-height: 9px;
-    height: 14px;
-    padding-left: 3px;
-    padding-right: 3px;
-    text-align: center;
-
-    text-align: center;
-    border-radius: 3px;
-    border-width: 1px;
-
-    overflow: hidden;
-    text-overflow: ellipsis;
-    lines: 1;
-
-    border-color: transparent;
-    color: transparent;
-    opacity: 0.15;
-}
-.price-ctn[data-v-2c9fb3eb]{
-    position: absolute;
-    bottom: 11px;
-    left: 6px;
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-    -webkit-flex-direction: row;
-        -ms-flex-direction: row;
-            flex-direction: row;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-        -ms-flex-align: center;
-            align-items: center;
-    /*background-color: #ccc;*/
-}
-.price-title[data-v-2c9fb3eb]{
-    font-size: 12px;
-    /*margin-top: 4px;*/
-}
-.price-unit[data-v-2c9fb3eb]{
-    /*margin-top: 5px;*/
-    font-size: 12px;
-    /*line-height: 26px;*/
-    color: #E71A17;
-    /*background-color: #ccc;*/
-}
-.price-num[data-v-2c9fb3eb]{
-    margin-left: -1px;
-    color: #E71A17;
-    font-size: 15px;
-    /*line-height: 36px;*/
-    font-weight: bold;
-    /*background-color: #ccc;*/
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/data/css/head6.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head6.css b/html5/test/render/vue/data/css/head6.css
deleted file mode 100644
index 38eb47d..0000000
--- a/html5/test/render/vue/data/css/head6.css
+++ /dev/null
@@ -1,4 +0,0 @@
-/*/////////////////////////////////////////////////////////////*/
-.mui-zebra-page{
-  background:#192905
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ceef728d/html5/test/render/vue/data/css/head7.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head7.css b/html5/test/render/vue/data/css/head7.css
deleted file mode 100644
index aab323b..0000000
--- a/html5/test/render/vue/data/css/head7.css
+++ /dev/null
@@ -1,61 +0,0 @@
-/*/////////////////////////////////////////////////////////////*/
-.weex-root,
-.weex-root * {
-  color: initial;
-  cursor: initial;
-  direction: initial;
-  font: initial;
-  font-family: initial;
-  font-size: initial;
-  font-style: initial;
-  font-variant: initial;
-  font-weight: initial;
-  line-height: initial;
-  text-align: initial;
-  text-indent: initial;
-  visibility: initial;
-  white-space: initial;
-  word-spacing: initial;
-  font-family: BlinkMacSystemFont, 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
-}
-
-.weex-root,
-.weex-root *,
-.weex-root *::before,
-.weex-root *::after {
-  box-sizing: border-box;
-  -webkit-text-size-adjust: none;
-      -ms-text-size-adjust: none;
-          text-size-adjust: none;
-      }
-
-.weex-root a,
-.weex-root button,
-.weex-root [role="button"],
-.weex-root input,
-.weex-root label,
-.weex-root select,
-.weex-root textarea {
-  -ms-touch-action: manipulation;
-      touch-action: manipulation;
-  }
-
-.weex-root p,
-.weex-root ol,
-.weex-root ul,
-.weex-root dl {
-  margin: 0;
-  padding: 0;
-}
-
-.weex-root li {
-  list-style: none;
-}
-
-.weex-root figure {
-  margin: 0;
-}
-
-.weex-root textarea {
-  resize: none;
-}
\ No newline at end of file